개발중

This commit is contained in:
2016-08-09 14:42:50 +09:00
parent d41130fcdd
commit 5714cb3388
7 changed files with 336 additions and 194 deletions

31
MainForm.Designer.cs generated
View File

@@ -50,6 +50,7 @@
this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.splitContainer2 = new System.Windows.Forms.SplitContainer(); this.splitContainer2 = new System.Windows.Forms.SplitContainer();
this.splitContainer3 = new System.Windows.Forms.SplitContainer(); this.splitContainer3 = new System.Windows.Forms.SplitContainer();
this.btLogDump = new System.Windows.Forms.Button();
this.btMATest = new System.Windows.Forms.Button(); this.btMATest = new System.Windows.Forms.Button();
this.btTimeSync = new System.Windows.Forms.Button(); this.btTimeSync = new System.Windows.Forms.Button();
this.cbStart = new System.Windows.Forms.CheckBox(); this.cbStart = new System.Windows.Forms.CheckBox();
@@ -62,7 +63,7 @@
this.statusBar1 = new System.Windows.Forms.StatusBar(); this.statusBar1 = new System.Windows.Forms.StatusBar();
this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel(); this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel();
this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel(); this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel();
this.btLogDump = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout();
@@ -288,6 +289,7 @@
// //
// splitContainer2.Panel2 // splitContainer2.Panel2
// //
this.splitContainer2.Panel2.Controls.Add(this.button1);
this.splitContainer2.Panel2.Controls.Add(this.btLogDump); this.splitContainer2.Panel2.Controls.Add(this.btLogDump);
this.splitContainer2.Panel2.Controls.Add(this.btMATest); this.splitContainer2.Panel2.Controls.Add(this.btMATest);
this.splitContainer2.Panel2.Controls.Add(this.btTimeSync); this.splitContainer2.Panel2.Controls.Add(this.btTimeSync);
@@ -330,6 +332,16 @@
this.splitContainer3.SplitterDistance = 256; this.splitContainer3.SplitterDistance = 256;
this.splitContainer3.TabIndex = 0; this.splitContainer3.TabIndex = 0;
// //
// btLogDump
//
this.btLogDump.Location = new System.Drawing.Point(21, 555);
this.btLogDump.Name = "btLogDump";
this.btLogDump.Size = new System.Drawing.Size(75, 35);
this.btLogDump.TabIndex = 25;
this.btLogDump.Text = "Dump Log";
this.btLogDump.UseVisualStyleBackColor = true;
this.btLogDump.Click += new System.EventHandler(this.btLogDump_Click);
//
// btMATest // btMATest
// //
this.btMATest.Location = new System.Drawing.Point(122, 421); this.btMATest.Location = new System.Drawing.Point(122, 421);
@@ -443,15 +455,15 @@
this.statusBarPanel2.Name = "statusBarPanel2"; this.statusBarPanel2.Name = "statusBarPanel2";
this.statusBarPanel2.Width = 120; this.statusBarPanel2.Width = 120;
// //
// btLogDump // button1
// //
this.btLogDump.Location = new System.Drawing.Point(22, 555); this.button1.Location = new System.Drawing.Point(118, 555);
this.btLogDump.Name = "btLogDump"; this.button1.Name = "button1";
this.btLogDump.Size = new System.Drawing.Size(75, 23); this.button1.Size = new System.Drawing.Size(75, 35);
this.btLogDump.TabIndex = 25; this.button1.TabIndex = 25;
this.btLogDump.Text = "Dump Log"; this.button1.Text = "Dump Simulation";
this.btLogDump.UseVisualStyleBackColor = true; this.button1.UseVisualStyleBackColor = true;
this.btLogDump.Click += new System.EventHandler(this.btLogDump_Click); this.button1.Click += new System.EventHandler(this.button1_Click);
// //
// MainForm // MainForm
// //
@@ -516,6 +528,7 @@
private System.Windows.Forms.Label lbCacheBalance; private System.Windows.Forms.Label lbCacheBalance;
private System.Windows.Forms.Label lbEvalProfit; private System.Windows.Forms.Label lbEvalProfit;
private System.Windows.Forms.Button btLogDump; private System.Windows.Forms.Button btLogDump;
private System.Windows.Forms.Button button1;
} }
} }

View File

@@ -4,6 +4,7 @@ using System.Collections;
using System.Reflection; using System.Reflection;
using System.Diagnostics; using System.Diagnostics;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
namespace upper_limit_crawler namespace upper_limit_crawler
{ {
@@ -23,7 +24,7 @@ namespace upper_limit_crawler
{ {
ArrayList m_TraceList = new ArrayList(); ArrayList m_TraceList = new ArrayList();
Timer m_MainTimer = new Timer(); System.Windows.Forms.Timer m_MainTimer = new System.Windows.Forms.Timer();
int m_iLastTime = 0; int m_iLastTime = 0;
static ULDataMgr m_DataMgr = new ULDataMgr(); static ULDataMgr m_DataMgr = new ULDataMgr();
@@ -233,20 +234,71 @@ namespace upper_limit_crawler
List<string> aCodeList = new List<string> { List<string> aCodeList = new List<string> {
"064240", "A064240",
"090410", "A090410",
"208860", "A208860",
"044180", "A044180",
"127160", "A127160",
"123570", "A123570",
"A039420",
"A015020",
"A090850",
"A007660",
"A017180",
"A036810",
"A049950",
"A044480",
"A047310",
"A115610",
"A086060",
"A118000",
"A037400",
"A027580",
"A100090",
"A103130",
"A032790",
"A226350",
"A024800",
"A002630",
"A109740",
"A077970",
"A040350",
"A092870",
"A001140",
"A065130",
"A043340",
"A038010",
"A099410",
"A115440",
"A115960",
"A098120",
"A004380",
"A007120",
"A025820",
"A005980",
"A011810",
"A131100",
"A059090",
"A083470",
"A051170",
"A096350",
"A131400",
"A122800",
"A043910",
"A089590",
"A067990",
"A091970",
"A058450",
"A104040",
"A003070",
}; };
string strPrevDate = "20160729"; string strPrevDate = "20160801";
string strDate = "20160801"; string strDate = "20160802";
int iTotalProfit = 0; int iTotalProfit = 0;
foreach (string code in aCodeList) foreach (string code in aCodeList)
{ {
string strCode = "A" + code; string strCode = code[0] == 'A' ? code : "A"+code;
string strCodeName = ULUtil.GetCodeName(strCode); string strCodeName = ULUtil.GetCodeName(strCode);
Console.WriteLine("{0}({1})", strCodeName, strCode); Console.WriteLine("{0}({1})", strCodeName, strCode);
@@ -263,7 +315,7 @@ namespace upper_limit_crawler
stockChart.SetInputValue(4, 1); stockChart.SetInputValue(4, 1);
stockChart.SetInputValue(5, new int[] { 0, 1, 2, 3, 4, 5, 6, 10, 37 }); stockChart.SetInputValue(5, new int[] { 0, 1, 2, 3, 4, 5, 6, 10, 37 });
stockChart.SetInputValue(6, 'T'); stockChart.SetInputValue(6, 'T');
stockChart.BlockRequest2(1); ULUtil.BlockRequest(stockChart);
int iTimeTest = (int)stockChart.GetDataValue(1, 0); int iTimeTest = (int)stockChart.GetDataValue(1, 0);
int iPrevClosing = stockChart.GetDataValue(5, 0); int iPrevClosing = stockChart.GetDataValue(5, 0);
@@ -274,7 +326,7 @@ namespace upper_limit_crawler
stockChart.SetInputValue(4, 0); stockChart.SetInputValue(4, 0);
stockChart.SetInputValue(5, new int[] { 0, 1, 2, 3, 4, 5, 6, 10, 37 }); stockChart.SetInputValue(5, new int[] { 0, 1, 2, 3, 4, 5, 6, 10, 37 });
stockChart.SetInputValue(6, 'T'); stockChart.SetInputValue(6, 'T');
stockChart.BlockRequest2(1); ULUtil.BlockRequest(stockChart);
int iFieldCnt = stockChart.GetHeaderValue(1); int iFieldCnt = stockChart.GetHeaderValue(1);
string[] astrFieldName = stockChart.GetHeaderValue(2); string[] astrFieldName = stockChart.GetHeaderValue(2);
@@ -293,8 +345,8 @@ namespace upper_limit_crawler
DataList.Add(new chart_data(iTime, iCurPrice)); DataList.Add(new chart_data(iTime, iCurPrice));
} }
if (stockChart.Continue == 1) if(stockChart.Continue == 1)
stockChart.BlockRequest2(1); ULUtil.BlockRequest(stockChart);
else else
break; break;
} }
@@ -352,7 +404,7 @@ namespace upper_limit_crawler
Console.WriteLine("[{0}] [{1}] 조건 매수 {2}원 ({3}) (5MA slop:{4})", iTime, WatchItem.m_strCodeName, WatchItem.m_iCurPrice, fCompRate.ToString("0.00%"), f5MASlope.ToString("0.00%")); Console.WriteLine("[{0}] [{1}] 조건 매수 {2}원 ({3}) (5MA slop:{4})", iTime, WatchItem.m_strCodeName, WatchItem.m_iCurPrice, fCompRate.ToString("0.00%"), f5MASlope.ToString("0.00%"));
ULUtil.TraceCSV(iTime, "[시뮬레이션] 조건 매수", WatchItem.m_strCodeName, WatchItem.m_iCurPrice, fCompRate.ToString("0.00%"), f5MASlope.ToString("0.00%")); ULUtil.TraceCSV(iTime, "[시뮬레이션] 조건 매수", WatchItem.m_strCodeName, WatchItem.m_iCurPrice, fCompRate.ToString("0.00%"), f5MASlope.ToString("0.00%"));
m_DataMgr.AddBidLog(strCode, WatchItem.m_strCodeName, iTime, WatchItem.m_iCurPrice, f5MASlope); m_DataMgr.AddBidLog(strCode, WatchItem.m_strCodeName, iTime, WatchItem.m_iCurPrice, f5MASlope, false);
int iBidCnt = (int)m_DataMgr.m_Setting.m_fBidAmount / iCurPrice; int iBidCnt = (int)m_DataMgr.m_Setting.m_fBidAmount / iCurPrice;
@@ -379,7 +431,7 @@ namespace upper_limit_crawler
Console.WriteLine("[{0}] [{1}] 손절 {2}원 ({3}:{4})", iTime, OwnItem.m_strCodeName, iCurPrice, iProfit, fProfitRate.ToString("0.00%")); Console.WriteLine("[{0}] [{1}] 손절 {2}원 ({3}:{4})", iTime, OwnItem.m_strCodeName, iCurPrice, iProfit, fProfitRate.ToString("0.00%"));
ULUtil.TraceCSV(iTime, "[시뮬레이션] 손절", OwnItem.m_strCodeName, iCurPrice, fProfitRate.ToString("0.00%")); ULUtil.TraceCSV(iTime, "[시뮬레이션] 손절", OwnItem.m_strCodeName, iCurPrice, fProfitRate.ToString("0.00%"));
m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, float.NaN, true, iProfit, fProfitRate); m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, float.NaN, true, iProfit, fProfitRate, false);
iTotalAskPrice += iCurPrice * OwnItem.m_iConclusionBalanceCnt; iTotalAskPrice += iCurPrice * OwnItem.m_iConclusionBalanceCnt;
OwnItem.m_iUnitBEP = 0; OwnItem.m_iUnitBEP = 0;
@@ -408,7 +460,7 @@ namespace upper_limit_crawler
Console.WriteLine("[{0}] [{1}] 트레일링 매도 {2}원 ({3}:{4}) (5MA slop:{5})", iTime, OwnItem.m_strCodeName, iCurPrice, iProfit, fProfitRate.ToString("0.00%"), f5MASlope.ToString("0.00%")); Console.WriteLine("[{0}] [{1}] 트레일링 매도 {2}원 ({3}:{4}) (5MA slop:{5})", iTime, OwnItem.m_strCodeName, iCurPrice, iProfit, fProfitRate.ToString("0.00%"), f5MASlope.ToString("0.00%"));
ULUtil.TraceCSV(iTime, "[시뮬레이션] 트레일링 매도", OwnItem.m_strCodeName, iCurPrice, iProfit, fProfitRate.ToString("0.00%"), f5MASlope.ToString("0.00%")); ULUtil.TraceCSV(iTime, "[시뮬레이션] 트레일링 매도", OwnItem.m_strCodeName, iCurPrice, iProfit, fProfitRate.ToString("0.00%"), f5MASlope.ToString("0.00%"));
m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, f5MASlope, false, iProfit, fProfitRate); m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, f5MASlope, false, iProfit, fProfitRate, false);
iTotalAskPrice += iCurPrice * OwnItem.m_iConclusionBalanceCnt; iTotalAskPrice += iCurPrice * OwnItem.m_iConclusionBalanceCnt;
OwnItem.m_iUnitBEP = 0; OwnItem.m_iUnitBEP = 0;
@@ -462,7 +514,12 @@ namespace upper_limit_crawler
private void btLogDump_Click(object sender, EventArgs e) private void btLogDump_Click(object sender, EventArgs e)
{ {
m_DataMgr.DumpLog(); m_DataMgr.DumpLog(true);
}
private void button1_Click(object sender, EventArgs e)
{
m_DataMgr.DumpLog(false);
} }
} }
} }

View File

@@ -38,7 +38,7 @@ namespace upper_limit_crawler
List<OWN_ITEM> m_OwnList = new List<OWN_ITEM>(); List<OWN_ITEM> m_OwnList = new List<OWN_ITEM>();
Timer m_MainTimer = new Timer(); System.Windows.Forms.Timer m_MainTimer = new System.Windows.Forms.Timer();
int m_iLastTime = 0; int m_iLastTime = 0;
int m_iBalanceDelay = BALANCE_DELAY; int m_iBalanceDelay = BALANCE_DELAY;
@@ -81,7 +81,7 @@ namespace upper_limit_crawler
{ {
m_Td6033.SetInputValue(0, m_DataMgr.GetAccount()); m_Td6033.SetInputValue(0, m_DataMgr.GetAccount());
m_Td6033.SetInputValue(2, 50); m_Td6033.SetInputValue(2, 50);
m_Td6033.BlockRequest2(1); ULUtil.BlockRequest(m_Td6033);
//object[] datalist = new object[] //object[] datalist = new object[]
@@ -177,24 +177,16 @@ namespace upper_limit_crawler
private void RefreshCurPrice() private void RefreshCurPrice()
{ {
Dictionary<string, ULWatchItem> WatchList = m_DataMgr.GetWatchList(); Dictionary<string, ULWatchItem> WatchList = m_DataMgr.GetWatchList();
foreach (ListViewItem lvItem in lvBalance.Items)
{
string strCode = lvItem.SubItems[chCode.Index].Text;
int iTime = ULUtil.GetCurTimeInt();
if (WatchList.ContainsKey(strCode) == true) foreach(KeyValuePair<string, ULWatchItem> WatchPair in WatchList)
{ {
ULWatchItem WatchItem = WatchList[strCode]; string strCode = WatchPair.Key;
ULWatchItem WatchItem = WatchPair.Value;
OWN_ITEM OwnItem = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode); OWN_ITEM OwnItem = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode);
if (OwnItem == null) if(OwnItem == null)
continue; continue;
int iDisplayCurPrice = 0; int iTime = WatchItem.m_iCurTime;
if (lvItem.SubItems[chCurPrice.Index].Text.Length > 0)
iDisplayCurPrice = int.Parse(Regex.Replace(lvItem.SubItems[chCurPrice.Index].Text, @"\D", ""));
if (WatchItem.m_iCurPrice != iDisplayCurPrice)
{
int iCurPrice = WatchItem.m_iCurPrice; int iCurPrice = WatchItem.m_iCurPrice;
int iComp = iCurPrice - (int)OwnItem.m_iUnitBEP; // or OwnItem.m_dConclusionUnitPrice int iComp = iCurPrice - (int)OwnItem.m_iUnitBEP; // or OwnItem.m_dConclusionUnitPrice
@@ -202,27 +194,11 @@ namespace upper_limit_crawler
OwnItem.m_iEvaluationPrice = iCurPrice * OwnItem.m_iConclusionBalanceCnt; OwnItem.m_iEvaluationPrice = iCurPrice * OwnItem.m_iConclusionBalanceCnt;
OwnItem.m_iEvaluationProfit = iComp * OwnItem.m_iConclusionBalanceCnt; OwnItem.m_iEvaluationProfit = iComp * OwnItem.m_iConclusionBalanceCnt;
OwnItem.m_dProfitRate = iComp / (float)OwnItem.m_iUnitBEP; OwnItem.m_dProfitRate = iComp / (float)OwnItem.m_iUnitBEP;
lvItem.SubItems[chCurPrice.Index].Text = iCurPrice.ToString("###,###,##0");
lvItem.SubItems[chEvaluationPrice.Index].Text = OwnItem.m_iEvaluationPrice.ToString("###,###,##0");
lvItem.SubItems[chEvaluationProfit.Index].Text = OwnItem.m_iEvaluationProfit.ToString("###,###,##0");
if (OwnItem.m_iEvaluationProfit > 0)
lvItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Red;
else
lvItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Blue;
lvItem.SubItems[chEvaluationPrice.Index].Text = OwnItem.m_iEvaluationPrice.ToString("###,###,##0");
lvItem.SubItems[chProfitRate.Index].Text = OwnItem.m_dProfitRate.ToString("#,##0.00%");
lvItem.SubItems[chHighestPrice.Index].Text = WatchItem.m_iHighestPrice.ToString("#,##0.00%");
if (OwnItem.m_dProfitRate > 0)
lvItem.SubItems[chProfitRate.Index].ForeColor = Color.Red;
else
lvItem.SubItems[chProfitRate.Index].ForeColor = Color.Blue;
OwnItem.m_iMaxPrice = Math.Max(iCurPrice, OwnItem.m_iMaxPrice); OwnItem.m_iMaxPrice = Math.Max(iCurPrice, OwnItem.m_iMaxPrice);
// loss cut // loss cut
if (iCurPrice <= OwnItem.m_iUnitBEP * (1.0f - m_DataMgr.m_Setting.m_fLossCut)) if(iCurPrice <= OwnItem.m_iUnitBEP * (1.0f - m_DataMgr.m_Setting.m_fLossCut))
{ {
m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance); m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance);
m_OwnList.Remove(OwnItem); m_OwnList.Remove(OwnItem);
@@ -234,19 +210,19 @@ namespace upper_limit_crawler
ULUtil.Trace("[{0}] 손절 {1}원 ({2}) {3}", OwnItem.m_strCodeName, iCurPrice, fProfitRate.ToString("0.00%"), WatchItem.m_iHighestPrice); ULUtil.Trace("[{0}] 손절 {1}원 ({2}) {3}", OwnItem.m_strCodeName, iCurPrice, fProfitRate.ToString("0.00%"), WatchItem.m_iHighestPrice);
ULUtil.TraceCSV("손절", OwnItem.m_strCodeName, iCurPrice, fProfitRate.ToString("0.00%"), WatchItem.m_iHighestPrice); ULUtil.TraceCSV("손절", OwnItem.m_strCodeName, iCurPrice, fProfitRate.ToString("0.00%"), WatchItem.m_iHighestPrice);
m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, float.NaN, true, iProfit, fProfitRate); m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, float.NaN, true, iProfit, fProfitRate, true);
// own에서 삭제하고 미체결 리스트에 넣고, watch에서도 뺀다 // own에서 삭제하고 미체결 리스트에 넣고, watch에서도 뺀다
// 미체결 잔량 취소 // 미체결 잔량 취소
} }
// trailing // trailing
else if (iCurPrice <= OwnItem.m_iMaxPrice - OwnItem.m_iUnitBEP * m_DataMgr.m_Setting.m_fTrailing) else if(iCurPrice <= OwnItem.m_iMaxPrice - OwnItem.m_iUnitBEP * m_DataMgr.m_Setting.m_fTrailing)
{ {
float f5MASlope = WatchItem.GetPrev5MASlope(iTime); float f5MASlope = WatchItem.GetPrev5MASlope(iTime);
if (float.IsNaN(f5MASlope) || f5MASlope > -0.0100f) if(float.IsNaN(f5MASlope) || f5MASlope > -0.0100f)
{ {
//Console.WriteLine(string.Format("[{0}] [{1}] 트레일링 매도 대기. 5ma 상승 중 {2}원 ({3})", iTime, OwnItem.m_strCodeName, iCurPrice, (iCurPrice / (float)OwnItem.m_iUnitBEP - 1.0f).ToString("0.00%"))); Console.WriteLine(string.Format("[{0}] [{1}] 트레일링 매도 대기. 5ma 상승 중 {2}원 ({3})", iTime, OwnItem.m_strCodeName, iCurPrice, (iCurPrice / (float)OwnItem.m_iUnitBEP - 1.0f).ToString("0.00%")));
continue; continue;
} }
@@ -265,10 +241,79 @@ namespace upper_limit_crawler
f5MASlope.ToString("0.00%"), f5MASlope.ToString("0.00%"),
WatchItem.m_iHighestPrice); WatchItem.m_iHighestPrice);
ULUtil.TraceCSV("트레일링 매도", OwnItem.m_strCodeName, iCurPrice, iCurPrice - OwnItem.m_iUnitBEP, fProfitRate.ToString("0.00%"), f5MASlope.ToString("0.00%"), WatchItem.m_iHighestPrice); ULUtil.TraceCSV("트레일링 매도", OwnItem.m_strCodeName, iCurPrice, iCurPrice - OwnItem.m_iUnitBEP, fProfitRate.ToString("0.00%"), f5MASlope.ToString("0.00%"), WatchItem.m_iHighestPrice);
m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, f5MASlope, false, iProfit, fProfitRate); m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, f5MASlope, false, iProfit, fProfitRate, true);
}
ListViewItem lvItem = lvBalance.FindItemWithText(strCode);
if(lvItem != null)
{
lvItem.SubItems[chCurPrice.Index].Text = iCurPrice.ToString("###,###,##0");
lvItem.SubItems[chEvaluationPrice.Index].Text = OwnItem.m_iEvaluationPrice.ToString("###,###,##0");
lvItem.SubItems[chEvaluationProfit.Index].Text = OwnItem.m_iEvaluationProfit.ToString("###,###,##0");
if(OwnItem.m_iEvaluationProfit > 0)
lvItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Red;
else
lvItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Blue;
lvItem.SubItems[chEvaluationPrice.Index].Text = OwnItem.m_iEvaluationPrice.ToString("###,###,##0");
lvItem.SubItems[chProfitRate.Index].Text = OwnItem.m_dProfitRate.ToString("#,##0.00%");
lvItem.SubItems[chHighestPrice.Index].Text = WatchItem.m_iHighestPrice.ToString("###,###,##0");
if(OwnItem.m_dProfitRate > 0)
lvItem.SubItems[chProfitRate.Index].ForeColor = Color.Red;
else
lvItem.SubItems[chProfitRate.Index].ForeColor = Color.Blue;
} }
} }
//foreach (ListViewItem lvItem in lvBalance.Items)
//{
// string strCode = lvItem.SubItems[chCode.Index].Text;
// int iTime = ULUtil.GetCurTimeInt();
// if (WatchList.ContainsKey(strCode) == true)
// {
// ULWatchItem WatchItem = WatchList[strCode];
// OWN_ITEM OwnItem = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode);
// if (OwnItem == null)
// continue;
// int iDisplayCurPrice = 0;
// if (lvItem.SubItems[chCurPrice.Index].Text.Length > 0)
// iDisplayCurPrice = int.Parse(Regex.Replace(lvItem.SubItems[chCurPrice.Index].Text, @"\D", ""));
// if (WatchItem.m_iCurPrice != iDisplayCurPrice)
// {
// int iCurPrice = WatchItem.m_iCurPrice;
// int iComp = iCurPrice - (int)OwnItem.m_iUnitBEP; // or OwnItem.m_dConclusionUnitPrice
// OwnItem.m_iCurPrice = iCurPrice;
// OwnItem.m_iEvaluationPrice = iCurPrice * OwnItem.m_iConclusionBalanceCnt;
// OwnItem.m_iEvaluationProfit = iComp * OwnItem.m_iConclusionBalanceCnt;
// OwnItem.m_dProfitRate = iComp / (float)OwnItem.m_iUnitBEP;
// lvItem.SubItems[chCurPrice.Index].Text = iCurPrice.ToString("###,###,##0");
// lvItem.SubItems[chEvaluationPrice.Index].Text = OwnItem.m_iEvaluationPrice.ToString("###,###,##0");
// lvItem.SubItems[chEvaluationProfit.Index].Text = OwnItem.m_iEvaluationProfit.ToString("###,###,##0");
// if (OwnItem.m_iEvaluationProfit > 0)
// lvItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Red;
// else
// lvItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Blue;
// lvItem.SubItems[chEvaluationPrice.Index].Text = OwnItem.m_iEvaluationPrice.ToString("###,###,##0");
// lvItem.SubItems[chProfitRate.Index].Text = OwnItem.m_dProfitRate.ToString("#,##0.00%");
// lvItem.SubItems[chHighestPrice.Index].Text = WatchItem.m_iHighestPrice.ToString("#,##0.00%");
// if (OwnItem.m_dProfitRate > 0)
// lvItem.SubItems[chProfitRate.Index].ForeColor = Color.Red;
// else
// lvItem.SubItems[chProfitRate.Index].ForeColor = Color.Blue;
// OwnItem.m_iMaxPrice = Math.Max(iCurPrice, OwnItem.m_iMaxPrice);
// }
// steadiness // steadiness
//if (WatchItem.GetAvgDiff(iTime) < WatchItem.m_iPrevClosing*0.01) //if (WatchItem.GetAvgDiff(iTime) < WatchItem.m_iPrevClosing*0.01)
//{ //{
@@ -284,8 +329,8 @@ namespace upper_limit_crawler
// WatchItem.m_iHighestPrice); // WatchItem.m_iHighestPrice);
// ULUtil.TraceCSV("보합 처리", OwnItem.m_strCodeName, WatchItem.m_iCurPrice, WatchItem.m_iCurPrice - OwnItem.m_iUnitBEP, (WatchItem.m_iCurPrice / (float)OwnItem.m_iUnitBEP - 1.0f).ToString("0.00%"), WatchItem.m_iHighestPrice); // ULUtil.TraceCSV("보합 처리", OwnItem.m_strCodeName, WatchItem.m_iCurPrice, WatchItem.m_iCurPrice - OwnItem.m_iUnitBEP, (WatchItem.m_iCurPrice / (float)OwnItem.m_iUnitBEP - 1.0f).ToString("0.00%"), WatchItem.m_iHighestPrice);
//} //}
} // }
} //}
} }
private void RefreshData(object sender, EventArgs e) private void RefreshData(object sender, EventArgs e)
@@ -299,8 +344,7 @@ namespace upper_limit_crawler
int iDeltaT = iCurTime-m_iLastTime; int iDeltaT = iCurTime-m_iLastTime;
m_iBalanceDelay-=iDeltaT; m_iBalanceDelay-=iDeltaT;
if((m_DataMgr.GetTrader().HasConclusion() == true || m_iBalanceDelay<=0) if(m_DataMgr.GetTrader().HasConclusion() == true || m_iBalanceDelay<=0)
&& ULUtil.GetLimitRemainCountRQ() > 20)
{ {
RefreshBalance(); RefreshBalance();
m_iBalanceDelay=BALANCE_DELAY; m_iBalanceDelay=BALANCE_DELAY;

View File

@@ -73,6 +73,9 @@ namespace upper_limit_crawler
List<BID_LOG> m_BidLogs = new List<BID_LOG>(); List<BID_LOG> m_BidLogs = new List<BID_LOG>();
List<ASK_LOG> m_AskLogs = new List<ASK_LOG>(); List<ASK_LOG> m_AskLogs = new List<ASK_LOG>();
List<BID_LOG> m_BidLogsSimul = new List<BID_LOG>();
List<ASK_LOG> m_AskLogsSimul = new List<ASK_LOG>();
long m_iCacheBalance = 0; long m_iCacheBalance = 0;
long m_iEvalProfit = 0; long m_iEvalProfit = 0;
@@ -86,8 +89,10 @@ namespace upper_limit_crawler
else else
m_AvailableList = new List<string>(); m_AvailableList = new List<string>();
m_BidLogs = GetBidLog(m_strToday); m_BidLogs = GetBidLog(m_strToday, true);
m_AskLogs = GetAskLog(m_strToday); m_AskLogs = GetAskLog(m_strToday, true);
m_BidLogsSimul = GetBidLog(m_strToday, false);
m_AskLogsSimul = GetAskLog(m_strToday, false);
} }
public void Init() public void Init()
@@ -223,9 +228,9 @@ namespace upper_limit_crawler
} }
} }
public void AddBidLog(string strCode, string strCodeName, int iTime, int iBidPrice, float f5MAslope) public void AddBidLog(string strCode, string strCodeName, int iTime, int iBidPrice, float f5MAslope, bool bReal)
{ {
string strKey = "bid-"+m_strToday; string strKey = bReal ? "bid-"+m_strToday : "bid-simul-"+m_strToday;
BID_LOG log = new BID_LOG(); BID_LOG log = new BID_LOG();
log.m_strCode = strCode; log.m_strCode = strCode;
@@ -233,23 +238,31 @@ namespace upper_limit_crawler
log.m_iTime = iTime; log.m_iTime = iTime;
log.m_iBidPrice = iBidPrice; log.m_iBidPrice = iBidPrice;
log.m_f5MAslope = f5MAslope; log.m_f5MAslope = f5MAslope;
m_BidLogs.Add(log);
if(bReal == true)
{
m_BidLogs.Add(log);
m_DB.Insert(strKey, m_BidLogs); m_DB.Insert(strKey, m_BidLogs);
} }
else
List<BID_LOG> GetBidLog(string strDate)
{ {
string strKey = "bid-"+strDate; m_BidLogsSimul.Add(log);
m_DB.Insert(strKey, m_BidLogsSimul);
}
}
List<BID_LOG> GetBidLog(string strDate, bool bReal)
{
string strKey = bReal ? "bid-"+m_strToday : "bid-simul-"+m_strToday;
if(m_DB.IsExist(strKey) == true) if(m_DB.IsExist(strKey) == true)
return m_DB.Get<List<BID_LOG>>(strKey); return m_DB.Get<List<BID_LOG>>(strKey);
else else
return new List<BID_LOG>(); return new List<BID_LOG>();
} }
public void AddAskLog(string strCode, string strCodeName, int iTime, int iAskPrice, float f5MAslope, bool bLosscut, int iProfit, float fProfitRate) public void AddAskLog(string strCode, string strCodeName, int iTime, int iAskPrice, float f5MAslope, bool bLosscut, int iProfit, float fProfitRate, bool bReal)
{ {
string strKey = "ask-"+m_strToday; string strKey = bReal ? "ask-"+m_strToday : "ask-simul-"+m_strToday;
ASK_LOG log = new ASK_LOG(); ASK_LOG log = new ASK_LOG();
log.m_strCode = strCode; log.m_strCode = strCode;
@@ -260,33 +273,52 @@ namespace upper_limit_crawler
log.m_bLosscut = bLosscut; log.m_bLosscut = bLosscut;
log.m_iProfit = iProfit; log.m_iProfit = iProfit;
log.m_fProfitRate = fProfitRate; log.m_fProfitRate = fProfitRate;
m_AskLogs.Add(log);
if(bReal == true)
{
m_AskLogs.Add(log);
m_DB.Insert(strKey, m_AskLogs); m_DB.Insert(strKey, m_AskLogs);
} }
else
List<ASK_LOG> GetAskLog(string strDate)
{ {
string strKey = "ask-"+strDate; m_AskLogsSimul.Add(log);
m_DB.Insert(strKey, m_AskLogsSimul);
}
}
List<ASK_LOG> GetAskLog(string strDate, bool bReal)
{
string strKey = bReal ? "ask-"+m_strToday : "ask-simul-"+m_strToday;
if(m_DB.IsExist(strKey) == true) if(m_DB.IsExist(strKey) == true)
return m_DB.Get<List<ASK_LOG>>(strKey); return m_DB.Get<List<ASK_LOG>>(strKey);
else else
return new List<ASK_LOG>(); return new List<ASK_LOG>();
} }
public void DumpLog() public void DumpLog(bool bReal)
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
foreach(string strCode in m_AvailableList) foreach(string strCode in m_AvailableList)
sb.AppendLine(strCode+","); sb.AppendLine("\"" +strCode+ "\",");
if(bReal == true)
{
foreach(BID_LOG log in m_BidLogs) foreach(BID_LOG log in m_BidLogs)
sb.AppendFormat("매수, {0}, {1}, {2}, {3}"+Environment.NewLine, log.m_iTime, log.m_strCodeName, log.m_iBidPrice, log.m_f5MAslope.ToString("0.00%")); sb.AppendFormat("매수, {0}, {1}, {2}, {3}"+Environment.NewLine, log.m_iTime, log.m_strCodeName, log.m_iBidPrice, log.m_f5MAslope.ToString("0.00%"));
foreach(ASK_LOG log in m_AskLogs) foreach(ASK_LOG log in m_AskLogs)
sb.AppendFormat("매도, {0}, {1}, {2}, {3}, {4}, {5}"+Environment.NewLine, log.m_iTime, log.m_strCodeName, log.m_iAskPrice, log.m_f5MAslope.ToString("0.00%"), log.m_iProfit, log.m_fProfitRate.ToString("0.00%")); sb.AppendFormat("매도, {0}, {1}, {2}, {3}, {4}, {5}"+Environment.NewLine, log.m_iTime, log.m_strCodeName, log.m_iAskPrice, log.m_f5MAslope.ToString("0.00%"), log.m_iProfit, log.m_fProfitRate.ToString("0.00%"));
System.IO.File.WriteAllText(ULUtil.GetLogDir()+"dblog-"+m_strToday+".csv", sb.ToString(), Encoding.UTF8); System.IO.File.WriteAllText(ULUtil.GetLogDir()+"dblog-"+m_strToday+".csv", sb.ToString(), Encoding.UTF8);
} }
else
{
foreach(BID_LOG log in m_BidLogsSimul)
sb.AppendFormat("매수, {0}, {1}, {2}, {3}"+Environment.NewLine, log.m_iTime, log.m_strCodeName, log.m_iBidPrice, log.m_f5MAslope.ToString("0.00%"));
foreach(ASK_LOG log in m_AskLogsSimul)
sb.AppendFormat("매도, {0}, {1}, {2}, {3}, {4}, {5}"+Environment.NewLine, log.m_iTime, log.m_strCodeName, log.m_iAskPrice, log.m_f5MAslope.ToString("0.00%"), log.m_iProfit, log.m_fProfitRate.ToString("0.00%"));
System.IO.File.WriteAllText(ULUtil.GetLogDir()+"dblog-simul-"+m_strToday+".csv", sb.ToString(), Encoding.UTF8);
}
}
} }
} }

View File

@@ -17,7 +17,7 @@ namespace upper_limit_crawler
ULDataMgr m_DataMgr; ULDataMgr m_DataMgr;
CPSYSDIBLib.CpSvrNew7043 m_7043 = null; CPSYSDIBLib.CpSvrNew7043 m_7043 = null;
Timer m_Timer = new Timer(); System.Windows.Forms.Timer m_Timer = new System.Windows.Forms.Timer();
int m_iMonitorDelay = 0; int m_iMonitorDelay = 0;
int m_iLastTime = 0; int m_iLastTime = 0;
bool m_bRequesting = false; bool m_bRequesting = false;
@@ -62,13 +62,13 @@ namespace upper_limit_crawler
bool RefreshMonitorItem() bool RefreshMonitorItem()
{ {
if (m_bRequesting == true || ULUtil.GetLimitRemainCountRQ() < 30) if (m_bRequesting == true)
return false; return false;
m_bRequesting = true; m_bRequesting = true;
m_7043.SetInputValue(7, (short)(m_DataMgr.m_Setting.m_fSearchMin * 100)); m_7043.SetInputValue(7, (short)(m_DataMgr.m_Setting.m_fSearchMin * 100));
m_7043.SetInputValue(8, (short)((m_DataMgr.m_Setting.m_fSearchMax + 0.009) * 100)); m_7043.SetInputValue(8, (short)((m_DataMgr.m_Setting.m_fSearchMax + 0.009) * 100));
int iResult = m_7043.BlockRequest2(1); int iResult = ULUtil.BlockRequest(m_7043);
lvWatch.Items.Clear(); lvWatch.Items.Clear();
int iIdx = 1; int iIdx = 1;
@@ -121,8 +121,8 @@ namespace upper_limit_crawler
} }
bContinue = (m_7043.Continue == 1); bContinue = (m_7043.Continue == 1);
if (bContinue == true && ULUtil.GetLimitRemainCountRQ() >= 30) if (bContinue == true)
iResult = m_7043.BlockRequest2(1); iResult = ULUtil.BlockRequest(m_7043);
} }
//foreach (ColumnHeader col in lvWatch.Columns) //foreach (ColumnHeader col in lvWatch.Columns)
@@ -181,7 +181,7 @@ namespace upper_limit_crawler
// bid and add to black list // bid and add to black list
m_DataMgr.GetTrader().Buy(strCode, item.m_iCurPrice, (int)m_DataMgr.m_Setting.m_fBidAmount); m_DataMgr.GetTrader().Buy(strCode, item.m_iCurPrice, (int)m_DataMgr.m_Setting.m_fBidAmount);
m_DataMgr.AddBidLog(strCode, item.m_strCodeName, iTime, item.m_iCurPrice, f5MASlope); m_DataMgr.AddBidLog(strCode, item.m_strCodeName, iTime, item.m_iCurPrice, f5MASlope, true);
m_DataMgr.AddPostphoneItem(iTime, strCode); m_DataMgr.AddPostphoneItem(iTime, strCode);
ULUtil.Trace("[{0}] 조건 매수 {1}원 ({2}) (5MA slop:{3})", ULUtil.Trace("[{0}] 조건 매수 {1}원 ({2}) (5MA slop:{3})",

View File

@@ -143,10 +143,6 @@ namespace upper_limit_crawler
public void Buy(string strCode, int iUnitPrice, int iBidAmount) public void Buy(string strCode, int iUnitPrice, int iBidAmount)
{ {
//lock(lockBuy)
{
while (ULUtil.GetLimitRemainCountRQ() <= 0) ;
int iCnt = iBidAmount / iUnitPrice; int iCnt = iBidAmount / iUnitPrice;
CPTRADELib.CpTd0311 Td0311Bid = new CPTRADELib.CpTd0311(); CPTRADELib.CpTd0311 Td0311Bid = new CPTRADELib.CpTd0311();
@@ -158,17 +154,11 @@ namespace upper_limit_crawler
Td0311Bid.SetInputValue(7, "0"); Td0311Bid.SetInputValue(7, "0");
Td0311Bid.SetInputValue(8, "03"); Td0311Bid.SetInputValue(8, "03");
Td0311Bid.BlockRequest2(1); ULUtil.BlockRequest(Td0311Bid);
}
} }
public void Sell(string strCode, int iUnitPrice, int iCnt) public void Sell(string strCode, int iUnitPrice, int iCnt)
{ {
//lock (lockSell)
{
//long iCnt = (long)Math.Floor(fAskAmount/fCurPrice);
//iCnt=1;
while (ULUtil.GetLimitRemainCountRQ() <= 0) ; while (ULUtil.GetLimitRemainCountRQ() <= 0) ;
CPTRADELib.CpTd0311 Td0311Ask = new CPTRADELib.CpTd0311(); CPTRADELib.CpTd0311 Td0311Ask = new CPTRADELib.CpTd0311();
@@ -181,19 +171,11 @@ namespace upper_limit_crawler
Td0311Ask.SetInputValue(7, "0"); Td0311Ask.SetInputValue(7, "0");
Td0311Ask.SetInputValue(8, "03"); Td0311Ask.SetInputValue(8, "03");
Td0311Ask.BlockRequest2(1); ULUtil.BlockRequest(Td0311Ask);
}
} }
public void SellCurPrice(string strCode, int iCnt) public void SellCurPrice(string strCode, int iCnt)
{ {
//lock (lockSell)
{
//long iCnt = (long)Math.Floor(fAskAmount/fCurPrice);
//iCnt=1;
while (ULUtil.GetLimitRemainCountRQ() <= 0);
CPTRADELib.CpTd0311 Td0311Ask = new CPTRADELib.CpTd0311(); CPTRADELib.CpTd0311 Td0311Ask = new CPTRADELib.CpTd0311();
Td0311Ask.SetInputValue(0, "1"); Td0311Ask.SetInputValue(0, "1");
@@ -204,8 +186,7 @@ namespace upper_limit_crawler
Td0311Ask.SetInputValue(7, "0"); Td0311Ask.SetInputValue(7, "0");
Td0311Ask.SetInputValue(8, "03"); Td0311Ask.SetInputValue(8, "03");
Td0311Ask.BlockRequest2(1); ULUtil.BlockRequest(Td0311Ask);
}
} }
} }
} }

View File

@@ -5,6 +5,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
@@ -282,5 +283,19 @@ namespace upper_limit_crawler
return (iTotalSec2 >= iTotalSec1 && iTotalSec2 - iTotalSec1 <= iMinDiff * 60); return (iTotalSec2 >= iTotalSec1 && iTotalSec2 - iTotalSec1 <= iMinDiff * 60);
} }
public static short BlockRequest(CPTRADELib.ICpTdDib obj)
{
while(GetLimitRemainCountRQ() < 1)
Thread.Sleep(500);
return obj.BlockRequest2(1);
}
public static short BlockRequest(CPSYSDIBLib.ISysDib obj)
{
while(GetLimitRemainCountRQ() < 1)
Thread.Sleep(500);
return obj.BlockRequest2(1);
}
} }
} }