- monitor, balance subscribe로 수정
- UI 개선
This commit is contained in:
203
ULBalanceDlg.cs
203
ULBalanceDlg.cs
@@ -5,6 +5,7 @@ using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
@@ -13,7 +14,6 @@ namespace upper_limit_crawler
|
||||
public partial class ULBalanceDlg : Form
|
||||
{
|
||||
const int BALANCE_DELAY = 10000;
|
||||
const int PRICE_DELAY = 500;
|
||||
|
||||
public class OWN_ITEM
|
||||
{
|
||||
@@ -23,7 +23,7 @@ namespace upper_limit_crawler
|
||||
public int m_iConclusionBalanceCnt;
|
||||
public long m_iEvaluationPrice;
|
||||
public long m_iEvaluationProfit;
|
||||
public double m_dReturn;
|
||||
public double m_dProfitRate;
|
||||
public string m_strCode;
|
||||
public int m_iAskableCnt;
|
||||
public double m_dConclusionUnitPrice;
|
||||
@@ -42,18 +42,18 @@ namespace upper_limit_crawler
|
||||
Timer m_MainTimer = new Timer();
|
||||
int m_iLastTime = 0;
|
||||
int m_iBalanceDelay = BALANCE_DELAY;
|
||||
int m_iPriceDelay = PRICE_DELAY;
|
||||
|
||||
ULDataMgr m_DataMgr = null;
|
||||
|
||||
CPTRADELib.CpTd6033 m_Td6033 = new CPTRADELib.CpTd6033();
|
||||
|
||||
bool m_bRequesting = false;
|
||||
DSCBO1Lib.StockCur m_StockCur = new DSCBO1Lib.StockCur();
|
||||
|
||||
public ULBalanceDlg(ULDataMgr DataMgr)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
MainForm.SetDoubleBuffered(lvBalance);
|
||||
|
||||
this.TopLevel = false;
|
||||
|
||||
m_DataMgr = DataMgr;
|
||||
@@ -83,58 +83,60 @@ namespace upper_limit_crawler
|
||||
int iCnt = m_Td6033.GetHeaderValue(7);
|
||||
for(int i = 0; i<iCnt; i++)
|
||||
{
|
||||
string strCode = m_Td6033.GetDataValue(12, i);
|
||||
string strCodeName = m_Td6033.GetDataValue(0, i);
|
||||
int iPayBalance = m_Td6033.GetDataValue(3, i); // 결제 잔고수량
|
||||
int iPayUnitPrice = m_Td6033.GetDataValue(4, i); // 결제 장부단가
|
||||
int iConclusionBalanceCnt = m_Td6033.GetDataValue(7, i); // 체결 잔고수량
|
||||
int iPayBalance = m_Td6033.GetDataValue(3, i); // 결제 잔고수량
|
||||
int iPayUnitPrice = m_Td6033.GetDataValue(4, i); // 결제 장부단가
|
||||
int iConclusionBalanceCnt = m_Td6033.GetDataValue(7, i);// 체결 잔고수량
|
||||
long iEvaluationPrice = m_Td6033.GetDataValue(9, i); // 평가금액 : 보유수량x현재가
|
||||
long iEvaluationProfit = m_Td6033.GetDataValue(10, i); // 평가손익
|
||||
double dReturn = m_Td6033.GetDataValue(11, i); // 수익률
|
||||
string strCode = m_Td6033.GetDataValue(12, i);
|
||||
int iAskableCnt = m_Td6033.GetDataValue(15, i); // 매도 가능 수량
|
||||
double dConclusionUnitPrice = m_Td6033.GetDataValue(17, i); // 체결 장부단가
|
||||
long iUnitBEP = m_Td6033.GetDataValue(18, i); // 손익단가 : 수수료 포함 순익 분기점 Break-Even Point
|
||||
double dReturn = m_Td6033.GetDataValue(11, i); // 수익률
|
||||
int iAskableCnt = m_Td6033.GetDataValue(15, i); // 매도 가능 수량
|
||||
double dConclusionUnitPrice = m_Td6033.GetDataValue(17, i); // 체결 장부단가
|
||||
long iUnitBEP = m_Td6033.GetDataValue(18, i); // 손익단가 : 수수료 포함 순익 분기점 Break-Even Point
|
||||
|
||||
int iCurPrice = (int)(iEvaluationPrice/iConclusionBalanceCnt);
|
||||
int iCurPrice = 0;
|
||||
|
||||
OWN_ITEM item = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode);
|
||||
if (item == null)
|
||||
m_DataMgr.AddWatch(strCode, strCodeName, iCurPrice, iCurPrice);
|
||||
|
||||
OWN_ITEM OwnItem = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode);
|
||||
if (OwnItem == null)
|
||||
{
|
||||
item = new OWN_ITEM();
|
||||
m_OwnList.Add(item);
|
||||
OwnItem = new OWN_ITEM();
|
||||
m_OwnList.Add(OwnItem);
|
||||
}
|
||||
item.m_strCodeName = strCodeName;
|
||||
item.m_iPayBalance = iPayBalance;
|
||||
item.m_iPayUnitPrice = iPayUnitPrice;
|
||||
item.m_iConclusionBalanceCnt = iConclusionBalanceCnt;
|
||||
item.m_iEvaluationPrice = iEvaluationPrice;
|
||||
item.m_iEvaluationProfit = iEvaluationProfit;
|
||||
item.m_dReturn = dReturn;
|
||||
item.m_strCode = strCode;
|
||||
item.m_iAskableCnt = iAskableCnt;
|
||||
item.m_dConclusionUnitPrice = dConclusionUnitPrice;
|
||||
item.m_iUnitBEP = iUnitBEP;
|
||||
item.m_iCurPrice = iCurPrice;
|
||||
item.m_iMaxPrice = iCurPrice;
|
||||
item.m_bCheck = true;
|
||||
|
||||
OwnItem.m_strCodeName = strCodeName;
|
||||
OwnItem.m_iPayBalance = iPayBalance;
|
||||
OwnItem.m_iPayUnitPrice = iPayUnitPrice;
|
||||
OwnItem.m_iConclusionBalanceCnt = iConclusionBalanceCnt;
|
||||
OwnItem.m_iEvaluationPrice = iEvaluationPrice;
|
||||
OwnItem.m_iEvaluationProfit = iEvaluationProfit;
|
||||
OwnItem.m_dProfitRate = dReturn;
|
||||
OwnItem.m_strCode = strCode;
|
||||
OwnItem.m_iAskableCnt = iAskableCnt;
|
||||
OwnItem.m_dConclusionUnitPrice = dConclusionUnitPrice;
|
||||
OwnItem.m_iUnitBEP = iUnitBEP;
|
||||
OwnItem.m_iCurPrice = iCurPrice;
|
||||
OwnItem.m_iMaxPrice = iCurPrice;
|
||||
OwnItem.m_bCheck = true;
|
||||
|
||||
string[] row = { strCode, strCodeName, dConclusionUnitPrice.ToString("###,###,##0"),
|
||||
ListViewItem listViewItem = new ListViewItem(new string[] { strCode, strCodeName, dConclusionUnitPrice.ToString("###,###,##0"),
|
||||
iUnitBEP.ToString("###,###,##0"), iCurPrice.ToString("###,###,##0"),
|
||||
iEvaluationProfit.ToString("###,###,##0"), iConclusionBalanceCnt.ToString("###,###,##0"),
|
||||
iEvaluationPrice.ToString("###,###,##0"), dReturn.ToString("#,##0.00")+"%" };
|
||||
ListViewItem listViewItem = new ListViewItem(row);
|
||||
iEvaluationProfit.ToString("###,###,##0"), iConclusionBalanceCnt.ToString("###,###,##0"),
|
||||
iEvaluationPrice.ToString("###,###,##0"), dReturn.ToString("#,##0.00")+"%" });
|
||||
listViewItem.UseItemStyleForSubItems = false;
|
||||
|
||||
if(iEvaluationProfit > 0)
|
||||
listViewItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Red;
|
||||
else
|
||||
listViewItem.SubItems[chEvaluationProfit.Index].ForeColor = Color.Blue;
|
||||
|
||||
if (dReturn > 0)
|
||||
listViewItem.SubItems[chProfitRate.Index].ForeColor = Color.Red;
|
||||
else if (dReturn < 0)
|
||||
listViewItem.SubItems[chProfitRate.Index].ForeColor = Color.Blue;
|
||||
lvBalance.Items.Add(listViewItem);
|
||||
|
||||
//UlUtil.Trace(string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10}",
|
||||
// strCodeName, iPayBalance, iPayUnitPrice,
|
||||
// iConclusionBalanceCnt, iEvaluationPrice, iEvaluationProfit,
|
||||
// dReturn, strCode, iAskableCnt, dConclusionUnitPrice, iUnitBEP));
|
||||
lvBalance.Items.Add(listViewItem);
|
||||
}
|
||||
|
||||
m_OwnList.RemoveAll(c => c.m_bCheck = false);
|
||||
@@ -145,59 +147,64 @@ namespace upper_limit_crawler
|
||||
|
||||
private void RefreshCurPrice()
|
||||
{
|
||||
if (m_bRequesting == true)
|
||||
return;
|
||||
m_bRequesting = true;
|
||||
|
||||
if (m_OwnList.Count <= 0)
|
||||
return;
|
||||
|
||||
string strPriceList = "";
|
||||
foreach(OWN_ITEM item in m_OwnList)
|
||||
Dictionary<string, WATCH_ITEM> WatchList = m_DataMgr.GetWatchList();
|
||||
foreach (ListViewItem lvItem in lvBalance.Items)
|
||||
{
|
||||
if (strPriceList.Length > 0)
|
||||
strPriceList += ",";
|
||||
strPriceList += item.m_strCode;
|
||||
}
|
||||
|
||||
|
||||
m_StockMst2.SetInputValue(0, strPriceList);
|
||||
m_StockMst2.BlockRequest2(1);
|
||||
|
||||
int iCnt = m_StockMst2.GetHeaderValue(0);
|
||||
for(int i=0; i<iCnt; i++)
|
||||
{
|
||||
string strCode = m_StockMst2.GetDataValue(0, i);
|
||||
int iCurPrice = m_StockMst2.GetDataValue(3, i);
|
||||
|
||||
// data update
|
||||
OWN_ITEM listItem = m_OwnList.First(item => item.m_strCode == strCode);
|
||||
if (listItem == null)
|
||||
continue;
|
||||
|
||||
listItem.m_iCurPrice = iCurPrice;
|
||||
listItem.m_iMaxPrice = Math.Max(iCurPrice, listItem.m_iMaxPrice);
|
||||
|
||||
ListViewItem lvItem = lvBalance.FindItemWithText(strCode);
|
||||
if (lvItem != null)
|
||||
string strCode = lvItem.SubItems[chCode.Index].Text;
|
||||
if (WatchList.ContainsKey(strCode) == true)
|
||||
{
|
||||
lvItem.SubItems[chCurPrice.Index].Text = iCurPrice.ToString("###,###,##0");
|
||||
lvItem.SubItems[chUnitProfit.Index].Text = (iCurPrice - listItem.m_iUnitBEP).ToString("###,###,##0");
|
||||
lvItem.SubItems[chEvaluationPrice.Index].Text = (iCurPrice*listItem.m_iConclusionBalanceCnt).ToString("###,###,##0");
|
||||
lvItem.SubItems[chProfitRate.Index].Text = (iCurPrice / (float)listItem.m_iUnitBEP - 1.0f).ToString("#,##0.00%");
|
||||
}
|
||||
WATCH_ITEM WatchItem = WatchList[strCode];
|
||||
OWN_ITEM OwnItem = m_OwnList.Find(itemFind => itemFind.m_strCode == strCode);
|
||||
int iDisplayCurPrice = 0;
|
||||
if (lvItem.SubItems[chCurPrice.Index].Text.Length > 0)
|
||||
iDisplayCurPrice = int.Parse(Regex.Replace(lvItem.SubItems[chCurPrice.Index].Text, @"\D", ""));
|
||||
|
||||
// cut loss and trailing
|
||||
if (iCurPrice <= listItem.m_iUnitBEP * (1.0f - m_DataMgr.m_Setting.m_fLossCut) ||
|
||||
iCurPrice <= listItem.m_iMaxPrice * (1.0f - m_DataMgr.m_Setting.m_fTrailing))
|
||||
{
|
||||
m_DataMgr.GetTrader().SellCurPrice(listItem.m_strCode, listItem.m_iPayBalance);
|
||||
|
||||
// 미체결 잔량 취소
|
||||
if (WatchItem.m_iCurPrice != iDisplayCurPrice && iDisplayCurPrice != 0)
|
||||
{
|
||||
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")+"%";
|
||||
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))
|
||||
{
|
||||
UlUtil.Trace(string.Format("[{0}] 손절({1})", OwnItem.m_strCodeName, iCurPrice));
|
||||
m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance);
|
||||
m_OwnList.Remove(OwnItem);
|
||||
|
||||
// 미체결 잔량 취소
|
||||
}
|
||||
// trailing
|
||||
else if (iCurPrice <= OwnItem.m_iMaxPrice - OwnItem.m_iUnitBEP * m_DataMgr.m_Setting.m_fTrailing)
|
||||
{
|
||||
UlUtil.Trace(string.Format("[{0}] 트레일링 매도({1})", OwnItem.m_strCodeName, iCurPrice));
|
||||
m_DataMgr.GetTrader().SellCurPrice(OwnItem.m_strCode, OwnItem.m_iPayBalance);
|
||||
m_OwnList.Remove(OwnItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_bRequesting = false;
|
||||
}
|
||||
|
||||
private void RefreshData(object sender, EventArgs e)
|
||||
@@ -217,13 +224,7 @@ namespace upper_limit_crawler
|
||||
m_iBalanceDelay=BALANCE_DELAY;
|
||||
}
|
||||
|
||||
m_iPriceDelay -= iDeltaT;
|
||||
if(m_iPriceDelay<= 0 && UlUtil.GetLimitRemainCountRQ() >= m_OwnList.Count)
|
||||
{
|
||||
RefreshCurPrice();
|
||||
m_iPriceDelay = PRICE_DELAY;
|
||||
}
|
||||
|
||||
RefreshCurPrice();
|
||||
|
||||
m_iLastTime=iCurTime;
|
||||
}
|
||||
@@ -237,11 +238,11 @@ namespace upper_limit_crawler
|
||||
{
|
||||
foreach(ListViewItem item in lvBalance.SelectedItems)
|
||||
{
|
||||
UlUtil.Trace(string.Format("[{0}] 수동 매도", item.SubItems[chName.Index].Text));
|
||||
|
||||
string strCode = item.SubItems[chCode.Index].Text;
|
||||
int iCnt = int.Parse(item.SubItems[chBalance.Index].Text);
|
||||
m_DataMgr.GetTrader().SellCurPrice(strCode, iCnt);
|
||||
|
||||
UlUtil.Trace("");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,11 +250,11 @@ namespace upper_limit_crawler
|
||||
{
|
||||
foreach (ListViewItem item in lvBalance.Items)
|
||||
{
|
||||
UlUtil.Trace(string.Format("[{0}] 모두 청산", item.SubItems[chName.Index].Text));
|
||||
|
||||
string strCode = item.SubItems[chCode.Index].Text;
|
||||
int iCnt = int.Parse(item.SubItems[chBalance.Index].Text);
|
||||
m_DataMgr.GetTrader().SellCurPrice(strCode, iCnt);
|
||||
|
||||
UlUtil.Trace("");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user