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 upper_limit_crawler { public partial class ULBalanceDlg : Form { const int BALANCE_DELAY = 10000; const int PRICE_DELAY = 500; public class OWN_ITEM { public string m_strCodeName; public int m_iPayBalance; public int m_iPayUnitPrice; public int m_iConclusionBalanceCnt; public long m_iEvaluationPrice; public long m_iEvaluationProfit; public double m_dReturn; public string m_strCode; public int m_iAskableCnt; public double m_dConclusionUnitPrice; public long m_iUnitBEP; public int m_iCurPrice; public int m_iMaxPrice; public bool m_bCheck; }; List m_OwnList = new List(); DSCBO1Lib.StockMst2 m_StockMst2 = new DSCBO1Lib.StockMst2(); 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; public ULBalanceDlg(ULDataMgr DataMgr) { InitializeComponent(); this.TopLevel = false; m_DataMgr = DataMgr; MainForm.SetDoubleBuffered(lvBalance); btSell.Enabled = false; RefreshBalance(); m_MainTimer.Interval=15; m_MainTimer.Tick+=RefreshData; m_MainTimer.Start(); } private void RefreshBalance() { m_Td6033.SetInputValue(0, m_DataMgr.GetAccount()); m_Td6033.SetInputValue(2, 50); m_Td6033.BlockRequest2(1); lvBalance.Items.Clear(); //m_OwnList.Clear(); m_OwnList.All(c => { c.m_bCheck = false; return true; }); int iCnt = m_Td6033.GetHeaderValue(7); for(int i = 0; i itemFind.m_strCode == strCode); if (item == null) { item = new OWN_ITEM(); m_OwnList.Add(item); } 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; string[] row = { 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); listViewItem.UseItemStyleForSubItems = false; 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)); } m_OwnList.RemoveAll(c => c.m_bCheck = false); foreach (ColumnHeader col in lvBalance.Columns) col.Width=-2; } 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) { 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 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) { 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%"); } // 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); // 미체결 잔량 취소 } } m_bRequesting = false; } private void RefreshData(object sender, EventArgs e) { int iCurTime = Environment.TickCount; if(m_iLastTime==0) { m_iLastTime=iCurTime; return; } int iDeltaT = iCurTime-m_iLastTime; m_iBalanceDelay-=iDeltaT; if(m_iBalanceDelay<=0 && UlUtil.GetLimitRemainCountRQ() > 20) { RefreshBalance(); m_iBalanceDelay=BALANCE_DELAY; } m_iPriceDelay -= iDeltaT; if(m_iPriceDelay<= 0 && UlUtil.GetLimitRemainCountRQ() >= m_OwnList.Count) { RefreshCurPrice(); m_iPriceDelay = PRICE_DELAY; } m_iLastTime=iCurTime; } private void btRefresh_Click(object sender, EventArgs e) { RefreshBalance(); } private void btSell_Click(object sender, EventArgs e) { foreach(ListViewItem item in lvBalance.SelectedItems) { string strCode = item.SubItems[chCode.Index].Text; int iCnt = int.Parse(item.SubItems[chBalance.Index].Text); m_DataMgr.GetTrader().SellCurPrice(strCode, iCnt); UlUtil.Trace(""); } } private void btSellAll_Click(object sender, EventArgs e) { foreach (ListViewItem item in lvBalance.Items) { string strCode = item.SubItems[chCode.Index].Text; int iCnt = int.Parse(item.SubItems[chBalance.Index].Text); m_DataMgr.GetTrader().SellCurPrice(strCode, iCnt); UlUtil.Trace(""); } } private void lvBalance_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { btSell.Enabled = (lvBalance.SelectedItems.Count > 0); } } }