This commit is contained in:
kyh
2023-05-09 16:06:40 +09:00
15 changed files with 1303 additions and 20 deletions

View File

@@ -131,7 +131,8 @@ namespace Million
_curIndicatorSetup = (IndicatorCoditionSetup)_curruentIndicatorform.SaveIndicatorSetup(true);
_curIndicatorSetup.ByBuySellType = buySelltype;
var totalIndi = _saveResultData.BuySetupList;
var totalIndi = new List<object>();
totalIndi.AddRange( _saveResultData.BuySetupList);
totalIndi.AddRange(_saveResultData.SellSetupList);
var indexStringList = totalIndi.OfType<IndicatorCoditionSetup>().Select(x=>x.IndexString).ToList();

View File

@@ -68,6 +68,7 @@ namespace Million.HunterSubForm
this.treeListColumn_AnalysisDescrption = new DevExpress.XtraTreeList.Columns.TreeListColumn();
this.treeListColumn_OriginalData = new DevExpress.XtraTreeList.Columns.TreeListColumn();
this.panelControl1 = new DevExpress.XtraEditors.PanelControl();
this.simpleButton_TestBoard = new DevExpress.XtraEditors.SimpleButton();
this.labelControl_WinRateProfitRate = new DevExpress.XtraEditors.LabelControl();
this.labelControl1 = new DevExpress.XtraEditors.LabelControl();
this.textEdit_Description = new DevExpress.XtraEditors.TextEdit();
@@ -393,12 +394,13 @@ namespace Million.HunterSubForm
this.treeList_ResultData.Dock = System.Windows.Forms.DockStyle.Fill;
this.treeList_ResultData.Location = new System.Drawing.Point(0, 275);
this.treeList_ResultData.Name = "treeList_ResultData";
this.treeList_ResultData.OptionsFilter.ShowAllValuesInFilterPopup = true;
this.treeList_ResultData.OptionsSelection.MultiSelect = true;
this.treeList_ResultData.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] {
this.repositoryItemCheckEdit_Inclustion});
this.treeList_ResultData.Size = new System.Drawing.Size(1271, 636);
this.treeList_ResultData.TabIndex = 5;
this.treeList_ResultData.SelectionChanged += new System.EventHandler(this.treeList_ResultData_SelectionChanged);
this.treeList_ResultData.KeyUp += new System.Windows.Forms.KeyEventHandler(this.treeList_ResultData_KeyUp);
this.treeList_ResultData.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.treeList_ResultData_MouseDoubleClick);
//
// treeListColumn_Inclusion
@@ -609,6 +611,7 @@ namespace Million.HunterSubForm
//
// panelControl1
//
this.panelControl1.Controls.Add(this.simpleButton_TestBoard);
this.panelControl1.Controls.Add(this.labelControl_WinRateProfitRate);
this.panelControl1.Controls.Add(this.labelControl1);
this.panelControl1.Controls.Add(this.textEdit_Description);
@@ -622,10 +625,21 @@ namespace Million.HunterSubForm
this.panelControl1.Size = new System.Drawing.Size(1271, 44);
this.panelControl1.TabIndex = 4;
//
// simpleButton_TestBoard
//
this.simpleButton_TestBoard.Appearance.ForeColor = System.Drawing.Color.Teal;
this.simpleButton_TestBoard.Appearance.Options.UseForeColor = true;
this.simpleButton_TestBoard.Location = new System.Drawing.Point(262, 6);
this.simpleButton_TestBoard.Name = "simpleButton_TestBoard";
this.simpleButton_TestBoard.Size = new System.Drawing.Size(101, 32);
this.simpleButton_TestBoard.TabIndex = 3;
this.simpleButton_TestBoard.Text = "테스트보드";
this.simpleButton_TestBoard.Click += new System.EventHandler(this.simpleButton_TestBoard_Click);
//
// labelControl_WinRateProfitRate
//
this.labelControl_WinRateProfitRate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.labelControl_WinRateProfitRate.Location = new System.Drawing.Point(361, 15);
this.labelControl_WinRateProfitRate.Location = new System.Drawing.Point(369, 15);
this.labelControl_WinRateProfitRate.Name = "labelControl_WinRateProfitRate";
this.labelControl_WinRateProfitRate.Size = new System.Drawing.Size(19, 14);
this.labelControl_WinRateProfitRate.TabIndex = 2;
@@ -700,7 +714,7 @@ namespace Million.HunterSubForm
this.Controls.Add(this.panelControl1);
this.Controls.Add(this.panelControl_IndicatorCondition);
this.Name = "ResultViewerForm";
this.Text = "결과 뷰";
this.Text = " ";
((System.ComponentModel.ISupportInitialize)(this.panelControl_IndicatorCondition)).EndInit();
this.panelControl_IndicatorCondition.ResumeLayout(false);
this.groupBox_.ResumeLayout(false);
@@ -781,5 +795,6 @@ namespace Million.HunterSubForm
private DevExpress.XtraEditors.SimpleButton simpleButton_resetData;
private DevExpress.XtraEditors.LabelControl labelControl_WinRateProfitRate;
private DevExpress.XtraEditors.SimpleButton simpleButton_WinRateProfitRate;
public DevExpress.XtraEditors.SimpleButton simpleButton_TestBoard;
}
}

View File

@@ -15,6 +15,7 @@ using DevExpress.XtraTreeList;
using Million.DbManagement;
using Million.IndicatorConditionSetup;
using Million.Manager;
using Million_Hunter.HunterSubForm;
namespace Million.HunterSubForm
{
@@ -28,6 +29,8 @@ namespace Million.HunterSubForm
// Analysis Data 를 Load 하는 경우 저장 변수
public SavedAnalysisData _savedAnalysisData;
public List<IndicatorCoditionSetup> _totalIndicator;
public ResultViewerForm(SavedResultData savedResultData)
{
InitializeComponent();
@@ -53,6 +56,13 @@ namespace Million.HunterSubForm
treeList_SellSetupList.DataSource = _savedResultData.SellSetupList;
treeList_BuySetupList.RefreshDataSource();
var buyIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.BuySetupList);
var sellIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.SellSetupList);
_totalIndicator = new List<IndicatorCoditionSetup>();
_totalIndicator.AddRange(buyIndicatorList);
_totalIndicator.AddRange(sellIndicatorList);
if (_analysisDatas != null)
{
// 메모리 헤제
@@ -95,7 +105,8 @@ namespace Million.HunterSubForm
private void simpleButton_SavaAnalysisData_Click(object sender, EventArgs e)
{
// 결과 반영 체크 && Filter 된 노드만 리스트로 모음
var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true && Convert.ToBoolean(item["Inclusion"]) == true);
//var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true && Convert.ToBoolean(item["Inclusion"]) == true);
var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true);
// 저장할 데이터 리스트
var saveDataList = new List<AnalysisData>();
@@ -120,6 +131,9 @@ namespace Million.HunterSubForm
profitRate += data.EarningRate;
saveDataList.Add(data);
// 비고 저장
//data.Description =
}
winRate = winRate * 100 / nodeList.Count();
@@ -160,9 +174,11 @@ namespace Million.HunterSubForm
// 정상으로 데이터를 로드 하면
if(_savedAnalysisData != null)
{
treeList_ResultData.Nodes.Clear();
treeList_ResultData.DataSource = _savedAnalysisData.AnalysisDataList;
treeList_ResultData.RefreshDataSource();
labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}",
double.Parse(_savedAnalysisData.FirstWinRate.ToString()), double.Parse(_savedAnalysisData.FirstProfitRate.ToString()),
_savedAnalysisData.AnalysisDataList.Count);
@@ -189,16 +205,8 @@ namespace Million.HunterSubForm
var selectedAnalysisData = (AnalysisData)treeList.GetDataRecordByNode(hitInfo.Node);
var buyIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.BuySetupList);
var sellIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.SellSetupList);
var totalIndicator = new List<IndicatorCoditionSetup>();
totalIndicator.AddRange(buyIndicatorList);
totalIndicator.AddRange(sellIndicatorList);
Million.SubForm.ChartViewerForm chartViewerForm = new Million.SubForm.ChartViewerForm(selectedAnalysisData,
totalIndicator);
_totalIndicator);
chartViewerForm.Visible = true;
}
@@ -240,12 +248,32 @@ namespace Million.HunterSubForm
}
labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}",
double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), _analysisDatas.Count());
double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), nodeList.Count());
}
private void treeList_ResultData_KeyUp(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Space:
var selections = treeList_ResultData.Selection;
foreach (var item in selections)
{
item["Inclusion"] = !Convert.ToBoolean(item["Inclusion"]);
}
break;
}
}
private void treeList_ResultData_SelectionChanged(object sender, EventArgs e)
/// <summary>
/// 테스트보드 창 열기
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_TestBoard_Click(object sender, EventArgs e)
{
// 테스트 보드 창 만들기
TestBoardForm testBoard = new TestBoardForm(this);
testBoard.Show();
}
}
}

View File

@@ -0,0 +1,118 @@
namespace Million_Hunter.HunterSubForm
{
partial class TestBoardForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.simpleButton_FullInsertCandle = new DevExpress.XtraEditors.SimpleButton();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.simpleButton_Calc = new DevExpress.XtraEditors.SimpleButton();
this.checkedListBox_Indicator = new System.Windows.Forms.CheckedListBox();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.SuspendLayout();
//
// simpleButton_FullInsertCandle
//
this.simpleButton_FullInsertCandle.Appearance.ForeColor = System.Drawing.Color.Teal;
this.simpleButton_FullInsertCandle.Appearance.Options.UseForeColor = true;
this.simpleButton_FullInsertCandle.Location = new System.Drawing.Point(6, 21);
this.simpleButton_FullInsertCandle.Name = "simpleButton_FullInsertCandle";
this.simpleButton_FullInsertCandle.Size = new System.Drawing.Size(121, 32);
this.simpleButton_FullInsertCandle.TabIndex = 1;
this.simpleButton_FullInsertCandle.Text = "1시간봉 다 채우기";
this.simpleButton_FullInsertCandle.Click += new System.EventHandler(this.simpleButton_FullInsertCandle_Click);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.simpleButton_FullInsertCandle);
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(419, 63);
this.groupBox1.TabIndex = 2;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "데이터 채우기";
//
// groupBox2
//
this.groupBox2.Controls.Add(this.checkedListBox_Indicator);
this.groupBox2.Location = new System.Drawing.Point(12, 90);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(829, 129);
this.groupBox2.TabIndex = 3;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "지표";
//
// simpleButton_Calc
//
this.simpleButton_Calc.Appearance.ForeColor = System.Drawing.Color.Teal;
this.simpleButton_Calc.Appearance.Options.UseForeColor = true;
this.simpleButton_Calc.Location = new System.Drawing.Point(720, 225);
this.simpleButton_Calc.Name = "simpleButton_Calc";
this.simpleButton_Calc.Size = new System.Drawing.Size(121, 32);
this.simpleButton_Calc.TabIndex = 1;
this.simpleButton_Calc.Text = "계산하기";
this.simpleButton_Calc.Click += new System.EventHandler(this.simpleButton_Calc_Click);
//
// checkedListBox_Indicator
//
this.checkedListBox_Indicator.Dock = System.Windows.Forms.DockStyle.Fill;
this.checkedListBox_Indicator.FormattingEnabled = true;
this.checkedListBox_Indicator.Items.AddRange(new object[] {
"구매 시점 이전 봉 40 1 볼린저 값 이하"});
this.checkedListBox_Indicator.Location = new System.Drawing.Point(3, 18);
this.checkedListBox_Indicator.Name = "checkedListBox_Indicator";
this.checkedListBox_Indicator.Size = new System.Drawing.Size(823, 108);
this.checkedListBox_Indicator.TabIndex = 0;
//
// TestBoardForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(853, 297);
this.Controls.Add(this.simpleButton_Calc);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Name = "TestBoardForm";
this.Text = "TestBoard";
this.groupBox1.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private DevExpress.XtraEditors.SimpleButton simpleButton_FullInsertCandle;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.CheckedListBox checkedListBox_Indicator;
private DevExpress.XtraEditors.SimpleButton simpleButton_Calc;
}
}

View File

@@ -0,0 +1,172 @@
using DevExpress.XtraEditors;
using Million;
using Million.Data;
using Million.HunterSubForm;
using Million.IndicatorConditionSetup;
using Million.Manager;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Million_Hunter.HunterSubForm
{
public partial class TestBoardForm : DevExpress.XtraEditors.XtraForm
{
ResultViewerForm parentForm = null;
List<AnalysisData> analysisDatas = null;
CommonProperty.MCandleTimeType MCandleTimeType;
public TestBoardForm(ResultViewerForm resultViewerForm)
{
InitializeComponent();
parentForm = resultViewerForm;
analysisDatas = parentForm._analysisDatas;
}
/// <summary>
/// 한시간 봉 채우기
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_FullInsertCandle_Click(object sender, EventArgs e)
{
// 시간 단위 설정 (AnalysisData에 추가하기)
// 조건식에 포함되는 시간 단위 가져오기 (IndicatorConditionSetup 을 여기에서 밖에 쓸 때가 없음)
var candleTypes = parentForm._totalIndicator.Select(t => t.MCandleTimeType).Distinct().ToList();
#region 기본 Indicator 데이터 생성하기
// Bol(40,1), Bol(40,2), Ichimoku(기본)
var _chartIndicatorCoditionSetups = new List<IndicatorCoditionSetup>();
_chartIndicatorCoditionSetups.Add(new BolingerConditionSetup()
{
IndicatorType = CommonProperty.IndicatorType.볼린저밴드,
Period = 40,
Squared = 1,
Description = "bol40_1",
MCandleTimeType = candleTypes.First()
}); ;
_chartIndicatorCoditionSetups.Add(new BolingerConditionSetup()
{
IndicatorType = CommonProperty.IndicatorType.볼린저밴드,
Period = 40,
Squared = 2,
Description = "bol40_2",
MCandleTimeType = candleTypes.First()
});
_chartIndicatorCoditionSetups.Add(new IchimokuConditionSetup()
{
IndicatorType = CommonProperty.IndicatorType.일목균형표,
ConversionPeriod = 9,
BaselinePeriod = 26,
LaggingSpan2Period = 52,
Displacement = 26,
Description = "ich",
MCandleTimeType = candleTypes.First()
});
#endregion
MCandleTimeType = candleTypes.First();
//차트 Date Time 설정하기
var StartDateInterval = 60;
var EndDateInterval = 100;
foreach(var analysisData in parentForm._analysisDatas)
{
var startDate = analysisData.StartDate;
var endDate = analysisData.EndDate;
var chartStartDate = startDate;
var chartEndDate = endDate;
switch (candleTypes.First())
{
case CommonProperty.MCandleTimeType.H1:
chartStartDate = startDate - new TimeSpan(0, StartDateInterval, 0, 0);
chartEndDate = startDate + new TimeSpan(0, EndDateInterval, 0, 0);
// annotation 추가 시 Datetime 비교를 위해 00분으로 변환
startDate = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd HH:00"));
endDate = Convert.ToDateTime(endDate.ToString("yyyy-MM-dd HH:00"));
break;
case CommonProperty.MCandleTimeType.H4:
chartStartDate = startDate - new TimeSpan(0, StartDateInterval * 4, 0, 0);
chartEndDate = startDate + new TimeSpan(0, EndDateInterval * 4, 0, 0);
startDate = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd HH:00"));
endDate = Convert.ToDateTime(endDate.ToString("yyyy-MM-dd HH:00"));
break;
case CommonProperty.MCandleTimeType.M1:
chartStartDate = startDate - new TimeSpan(0, 0, StartDateInterval, 0);
chartEndDate = startDate + new TimeSpan(0, 0, EndDateInterval, 0);
break;
case CommonProperty.MCandleTimeType.M10:
case CommonProperty.MCandleTimeType.M15:
case CommonProperty.MCandleTimeType.M3:
case CommonProperty.MCandleTimeType.M30:
case CommonProperty.MCandleTimeType.M5:
break;
case CommonProperty.MCandleTimeType.D1:
chartStartDate = startDate - new TimeSpan(StartDateInterval, 0, 0, 0);
chartEndDate = startDate + new TimeSpan(EndDateInterval, 0, 0, 0);
startDate = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd"));
endDate = Convert.ToDateTime(endDate.ToString("yyyy-MM-dd"));
break;
}
var dic = DataManager.GetStandardData(_chartIndicatorCoditionSetups, chartStartDate, chartEndDate, analysisData.OriginalSearchResult.MarketData
, _chartIndicatorCoditionSetups, true, candleTypes);
if(analysisData.CandleDatas != null)
{
analysisData.CandleDatas.Clear();
analysisData.CandleDatas = null;
}
analysisData.CandleDatas = dic;
}
MessageBox.Show("캔들 데이터 불러오기 완료");
}
/// <summary>
/// 추가 조건 계산하기
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_Calc_Click(object sender, EventArgs e)
{
// 구매 시점 이전 봉 40 1 볼린저 값 이하
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = analysisData.StartDate;
var endDate = analysisData.EndDate;
var 구매이전봉 = startDate;
//차트 Date Time 설정하기
var StartDateInterval = -1;
var candleData = analysisData.CandleDatas[MCandleTimeType].Find(item => item.DateTime == 구매이전봉);
var highValue = candleData.HighValue;
var bol402 = candleData.IndicatorDic["Bol402"]?.value ;
if(bol402 != null)
{
if (highValue < bol402) analysisData.Inclusion = true;
else analysisData.Inclusion = false;
}
}
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -41,6 +41,7 @@
<Reference Include="DevExpress.Printing.v18.2.Core, Version=18.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.Sparkline.v18.2.Core, Version=18.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.Utils.v18.2, Version=18.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.XtraBars.v18.2, Version=18.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraEditors.v18.2, Version=18.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraLayout.v18.2, Version=18.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.XtraTreeList.v18.2, Version=18.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
@@ -126,6 +127,12 @@
<Compile Include="HunterMainForm.Designer.cs">
<DependentUpon>HunterMainForm.cs</DependentUpon>
</Compile>
<Compile Include="HunterSubForm\TestBoardForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="HunterSubForm\TestBoardForm.Designer.cs">
<DependentUpon>TestBoardForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="HunterSubForm\LoadAnalysisResultDataForm.resx">
@@ -143,6 +150,9 @@
<EmbeddedResource Include="HunterMainForm.resx">
<DependentUpon>HunterMainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="HunterSubForm\TestBoardForm.resx">
<DependentUpon>TestBoardForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\licenses.licx" />
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>

View File

@@ -46,6 +46,9 @@ namespace Million.Data
// 기타 기입 내용
public string Description { get; set; }
[field: NonSerialized]
public Dictionary<CommonProperty.MCandleTimeType,List<CandleData>> CandleDatas { get; set; }
// 원본 데이터 참조
public SearchResult OriginalSearchResult { get; set; }

View File

@@ -24,7 +24,7 @@ namespace Million.DbManagement
Id int IDENTITY (1,1) NOT NULL,
SavedResultDataId int NOT NULL,
Name nvarchar(50) NOT NULL,
TreeListFilterString nvarchar(50) NOT NULL,
TreeListFilterString nvarchar(MAX) NOT NULL,
AnalysisDataList varbinary(MAX) NOT NULL,
Description nvarchar(MAX) NULL,
ResultDataCount int NOT NULL,

View File

@@ -280,6 +280,12 @@
<Compile Include="SubForm\IndicatorSetupForm\PriceRateSetupUserForm.Designer.cs">
<DependentUpon>PriceRateSetupUserForm.cs</DependentUpon>
</Compile>
<Compile Include="SubForm\IndicatorSetupForm\RemoveTickUserForm.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="SubForm\IndicatorSetupForm\RemoveTickUserForm.Designer.cs">
<DependentUpon>RemoveTickUserForm.cs</DependentUpon>
</Compile>
<Compile Include="WebMangement\BitthumbWerServices.cs" />
<Compile Include="WebMangement\Upbit\ClientHttpClient.cs" />
<Compile Include="WebMangement\Upbit\UpbitAPI.cs" />
@@ -335,6 +341,9 @@
<EmbeddedResource Include="SubForm\IndicatorSetupForm\PriceRateSetupUserForm.resx">
<DependentUpon>PriceRateSetupUserForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SubForm\IndicatorSetupForm\RemoveTickUserForm.resx">
<DependentUpon>RemoveTickUserForm.cs</DependentUpon>
</EmbeddedResource>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>

View File

@@ -50,7 +50,7 @@ namespace Million.SubForm
_chartIndicatorCoditionSetups = chartIndicatorCoditionSetups;
#region 차트 Date Time 설정하기
var StartDateInterval = 10;
var StartDateInterval = 60;
var EndDateInterval = 100;
var startDate = analysisData.StartDate;

View File

@@ -50,6 +50,562 @@ namespace Million.HunterSubForm.IndicatorSetupForm
{
_bolingerConditionSetup = new BolingerConditionSetup();
// 지표 기본값 설정
textEdit_Period.Text = @"40";
textEdit_Squared.Text = @"1";

View File

@@ -0,0 +1,110 @@
namespace Million.SubForm.IndicatorSetupForm
{
partial class RemoveTickUserForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.textEdit_Period = new DevExpress.XtraEditors.TextEdit();
this.labelControl1 = new DevExpress.XtraEditors.LabelControl();
this.labelControl2 = new DevExpress.XtraEditors.LabelControl();
this.textEdit1 = new DevExpress.XtraEditors.TextEdit();
this.listBoxControl1 = new DevExpress.XtraEditors.ListBoxControl();
((System.ComponentModel.ISupportInitialize)(this.textEdit_Period.Properties)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.textEdit1.Properties)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.listBoxControl1)).BeginInit();
this.SuspendLayout();
//
// textEdit_Period
//
this.textEdit_Period.Location = new System.Drawing.Point(52, 17);
this.textEdit_Period.Name = "textEdit_Period";
this.textEdit_Period.Properties.Mask.EditMask = "d";
this.textEdit_Period.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric;
this.textEdit_Period.Size = new System.Drawing.Size(100, 20);
this.textEdit_Period.TabIndex = 3;
//
// labelControl1
//
this.labelControl1.Location = new System.Drawing.Point(14, 20);
this.labelControl1.Name = "labelControl1";
this.labelControl1.Size = new System.Drawing.Size(32, 14);
this.labelControl1.TabIndex = 2;
this.labelControl1.Text = "길이 : ";
//
// labelControl2
//
this.labelControl2.Location = new System.Drawing.Point(14, 46);
this.labelControl2.Name = "labelControl2";
this.labelControl2.Size = new System.Drawing.Size(32, 14);
this.labelControl2.TabIndex = 2;
this.labelControl2.Text = "길이 : ";
//
// textEdit1
//
this.textEdit1.Location = new System.Drawing.Point(52, 43);
this.textEdit1.Name = "textEdit1";
this.textEdit1.Properties.Mask.EditMask = "d";
this.textEdit1.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric;
this.textEdit1.Size = new System.Drawing.Size(100, 20);
this.textEdit1.TabIndex = 3;
//
// listBoxControl1
//
this.listBoxControl1.Location = new System.Drawing.Point(52, 69);
this.listBoxControl1.Name = "listBoxControl1";
this.listBoxControl1.Size = new System.Drawing.Size(214, 118);
this.listBoxControl1.TabIndex = 4;
//
// RemoveTickUserForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.listBoxControl1);
this.Controls.Add(this.textEdit1);
this.Controls.Add(this.labelControl2);
this.Controls.Add(this.textEdit_Period);
this.Controls.Add(this.labelControl1);
this.Name = "RemoveTickUserForm";
this.Size = new System.Drawing.Size(279, 190);
((System.ComponentModel.ISupportInitialize)(this.textEdit_Period.Properties)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.textEdit1.Properties)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.listBoxControl1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private DevExpress.XtraEditors.TextEdit textEdit_Period;
private DevExpress.XtraEditors.LabelControl labelControl1;
private DevExpress.XtraEditors.LabelControl labelControl2;
private DevExpress.XtraEditors.TextEdit textEdit1;
private DevExpress.XtraEditors.ListBoxControl listBoxControl1;
}
}

View File

@@ -0,0 +1,21 @@
using DevExpress.XtraEditors;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Million.SubForm.IndicatorSetupForm
{
public partial class RemoveTickUserForm : DevExpress.XtraEditors.XtraUserControl
{
public RemoveTickUserForm()
{
InitializeComponent();
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>