개발중

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

View File

@@ -38,7 +38,7 @@ namespace upper_limit_crawler
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_iBalanceDelay = BALANCE_DELAY;
@@ -81,7 +81,7 @@ namespace upper_limit_crawler
{
m_Td6033.SetInputValue(0, m_DataMgr.GetAccount());
m_Td6033.SetInputValue(2, 50);
m_Td6033.BlockRequest2(1);
ULUtil.BlockRequest(m_Td6033);
//object[] datalist = new object[]
@@ -177,98 +177,143 @@ namespace upper_limit_crawler
private void RefreshCurPrice()
{
Dictionary<string, ULWatchItem> WatchList = m_DataMgr.GetWatchList();
foreach (ListViewItem lvItem in lvBalance.Items)
foreach(KeyValuePair<string, ULWatchItem> WatchPair in WatchList)
{
string strCode = lvItem.SubItems[chCode.Index].Text;
int iTime = ULUtil.GetCurTimeInt();
string strCode = WatchPair.Key;
ULWatchItem WatchItem = WatchPair.Value;
OWN_ITEM OwnItem = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode);
if(OwnItem == null)
continue;
if (WatchList.ContainsKey(strCode) == true)
int iTime = WatchItem.m_iCurTime;
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;
OwnItem.m_iMaxPrice = Math.Max(iCurPrice, OwnItem.m_iMaxPrice);
// loss cut
if(iCurPrice <= OwnItem.m_iUnitBEP * (1.0f - m_DataMgr.m_Setting.m_fLossCut))
{
ULWatchItem WatchItem = WatchList[strCode];
OWN_ITEM OwnItem = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode);
if (OwnItem == null)
continue;
m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance);
m_OwnList.Remove(OwnItem);
m_DataMgr.RemoveWatch(strCode);
m_DataMgr.AddLosscutItem(strCode);
int iDisplayCurPrice = 0;
if (lvItem.SubItems[chCurPrice.Index].Text.Length > 0)
iDisplayCurPrice = int.Parse(Regex.Replace(lvItem.SubItems[chCurPrice.Index].Text, @"\D", ""));
int iProfit = iCurPrice-(int)OwnItem.m_iUnitBEP;
float fProfitRate = iCurPrice/(float)OwnItem.m_iUnitBEP-1.0f;
if (WatchItem.m_iCurPrice != iDisplayCurPrice)
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);
m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, float.NaN, true, iProfit, fProfitRate, true);
// own에서 삭제하고 미체결 리스트에 넣고, watch에서도 뺀다
// 미체결 잔량 취소
}
// trailing
else if(iCurPrice <= OwnItem.m_iMaxPrice - OwnItem.m_iUnitBEP * m_DataMgr.m_Setting.m_fTrailing)
{
float f5MASlope = WatchItem.GetPrev5MASlope(iTime);
if(float.IsNaN(f5MASlope) || f5MASlope > -0.0100f)
{
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);
// loss cut
if (iCurPrice <= OwnItem.m_iUnitBEP * (1.0f - m_DataMgr.m_Setting.m_fLossCut))
{
m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance);
m_OwnList.Remove(OwnItem);
m_DataMgr.RemoveWatch(strCode);
m_DataMgr.AddLosscutItem(strCode);
int iProfit = iCurPrice-(int)OwnItem.m_iUnitBEP;
float fProfitRate = iCurPrice/(float)OwnItem.m_iUnitBEP-1.0f;
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);
m_DataMgr.AddAskLog(strCode, WatchItem.m_strCodeName, iTime, iCurPrice, float.NaN, true, iProfit, fProfitRate);
// own에서 삭제하고 미체결 리스트에 넣고, watch에서도 뺀다
// 미체결 잔량 취소
}
// trailing
else if (iCurPrice <= OwnItem.m_iMaxPrice - OwnItem.m_iUnitBEP * m_DataMgr.m_Setting.m_fTrailing)
{
float f5MASlope = WatchItem.GetPrev5MASlope(iTime);
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%")));
continue;
}
m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance);
m_OwnList.Remove(OwnItem);
m_DataMgr.RemoveWatch(strCode);
int iProfit = iCurPrice-(int)OwnItem.m_iUnitBEP;
float fProfitRate = iCurPrice/(float)OwnItem.m_iUnitBEP-1.0f;
ULUtil.Trace("[{0}] 트레일링 매도 {1}원 ({2}:{3}) (5MA slop:{4}) {5}",
OwnItem.m_strCodeName,
iCurPrice,
iCurPrice - OwnItem.m_iUnitBEP,
(iCurPrice/(float)OwnItem.m_iUnitBEP-1.0f).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);
}
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;
}
m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance);
m_OwnList.Remove(OwnItem);
m_DataMgr.RemoveWatch(strCode);
int iProfit = iCurPrice-(int)OwnItem.m_iUnitBEP;
float fProfitRate = iCurPrice/(float)OwnItem.m_iUnitBEP-1.0f;
ULUtil.Trace("[{0}] 트레일링 매도 {1}원 ({2}:{3}) (5MA slop:{4}) {5}",
OwnItem.m_strCodeName,
iCurPrice,
iCurPrice - OwnItem.m_iUnitBEP,
(iCurPrice/(float)OwnItem.m_iUnitBEP-1.0f).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, 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
//if (WatchItem.GetAvgDiff(iTime) < WatchItem.m_iPrevClosing*0.01)
//{
@@ -284,8 +329,8 @@ namespace upper_limit_crawler
// 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)
@@ -299,8 +344,7 @@ namespace upper_limit_crawler
int iDeltaT = iCurTime-m_iLastTime;
m_iBalanceDelay-=iDeltaT;
if((m_DataMgr.GetTrader().HasConclusion() == true || m_iBalanceDelay<=0)
&& ULUtil.GetLimitRemainCountRQ() > 20)
if(m_DataMgr.GetTrader().HasConclusion() == true || m_iBalanceDelay<=0)
{
RefreshBalance();
m_iBalanceDelay=BALANCE_DELAY;