From fb1195d8f49b2dba022a5948cb06feed32a7ba8a Mon Sep 17 00:00:00 2001 From: mjjo Date: Thu, 16 Feb 2017 16:35:54 +0900 Subject: [PATCH] =?UTF-8?q?-=20=EC=8B=9C=EB=AE=AC=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AutoSeller.cs | 41 +++--- SimulationHelper.cs | 346 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 357 insertions(+), 30 deletions(-) diff --git a/AutoSeller.cs b/AutoSeller.cs index 4520c7b..eff477d 100644 --- a/AutoSeller.cs +++ b/AutoSeller.cs @@ -367,35 +367,38 @@ namespace AutoSellerNS private void btLoad_Click(object sender, EventArgs e) { SimulationHelper helper = new SimulationHelper(m_CybosHelper, tbSimulationLog); - helper.LoadExcel(); + helper.LoadExcel2(); } private void btSimulate_Click(object sender, EventArgs e) { SimulationHelper helper = new SimulationHelper(m_CybosHelper, tbSimulationLog); + helper.StartSimuation2(); + return; - int iOrgBidCount = Config.GetBidCount(); - float fOrgTrailingRate = Config.GetTrailingRate(); - int iOrgTraililngCount = Config.GetTrailingCnt(); - for(int iBidCount = 4; iBidCount <= 8; iBidCount++) - { - for(float fTrailingRate=2.5f; fTrailingRate <= 5.0f; fTrailingRate += 0.5f) - { - for(int iTrailingCount = 2; iTrailingCount <= 4; iTrailingCount++) - { - Config.SetBidCount(iBidCount); - Config.SetTrailing(fTrailingRate, iTrailingCount); + //int iOrgBidCount = Config.GetBidCount(); + //float fOrgTrailingRate = Config.GetTrailingRate(); + //int iOrgTraililngCount = Config.GetTrailingCnt(); - helper.StartSimuation(); - } - } - } + //for(int iTrailingCount = 2; iTrailingCount <= 4; iTrailingCount++) + //{ + // for(float fTrailingRate=2.5f; fTrailingRate <= 5.0f; fTrailingRate += 0.5f) + // { + // for(int iBidCount = 4; iBidCount <= 8; iBidCount++) + // { + // Config.SetBidCount(iBidCount); + // Config.SetTrailing(fTrailingRate, iTrailingCount); - Config.SetBidCount(iOrgBidCount); - Config.SetTrailing(fOrgTrailingRate, iOrgTraililngCount); + // helper.StartSimuation(); + // } + // } + //} - Console.WriteLine("end"); + //Config.SetBidCount(iOrgBidCount); + //Config.SetTrailing(fOrgTrailingRate, iOrgTraililngCount); + + //Console.WriteLine("end"); } #endregion } diff --git a/SimulationHelper.cs b/SimulationHelper.cs index aecab90..2c5e36e 100644 --- a/SimulationHelper.cs +++ b/SimulationHelper.cs @@ -1,10 +1,13 @@ using CPSYSDIBLib; +using DSCBO1Lib; using OfficeOpenXml; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -147,7 +150,7 @@ namespace AutoSellerNS int iFieldCnt = CPStockChart.GetHeaderValue(1); string[] astrFieldName = CPStockChart.GetHeaderValue(2); List aRow = new List(); - List aRows = new List(); + List aaRows = new List(); Excel = new ExcelHandler(strOutFileName, astrFieldName); @@ -159,7 +162,19 @@ namespace AutoSellerNS { for(int j = 0; j aItems = new List(); + StockBid CPStockBid = new StockBid(); + ExcelHandler Excel = null; + + foreach(string strLine in File.ReadLines(Util.GetSimulationPath()+"/0-input.txt", Encoding.UTF8)) + { + var tokens = strLine.Split('\t'); + + var strDate = tokens[0]; + var strNewTime = tokens[1]; + var strSimulationTime = tokens[2]; + var strCodeName = tokens[3]; + var strCode = tokens[4]; + var strStartPrice = tokens[5]; + + DateTime StartDT; + DateTime.TryParse(strDate+" "+strSimulationTime, out StartDT); + + string strOutFileName = Util.GetSimulationPath() + "/" + strCodeName + "-" + StartDT.ToString("yyyy-MM-dd") + ".xlsx"; + if(File.Exists(strOutFileName) == true) + { + if(StartDT.DayOfYear == DateTime.Now.DayOfYear) + File.Delete(strOutFileName); + else + continue; + } + + CPStockBid.SetInputValue(0, "A"+strCode); + CPStockBid.SetInputValue(2, 20000); + CPStockBid.SetInputValue(3, 'C'); + CPStockBid.SetInputValue(4, "2000"); + CPStockBid.BlockRequest2(0); + + List aaRows = new List(); + + bool bContinue = true; + while(bContinue) + { + int iCnt = CPStockBid.GetHeaderValue(2); + for(int i = 0; i= StartDT && iPrice==iStartPrice) + { bStart = true; + iStartRow = iRow; + } } else { @@ -252,13 +349,15 @@ namespace AutoSellerNS if(iAskCount >= Config.GetBidCount()) { - m_tbLogView.AppendText(string.Format("[{0}] 시뮬레이션 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%)\n", - strCodeName, + m_tbLogView.AppendText(string.Format("[{0,-10}] 조건 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%) (매수 : {6:n0}원, line:{7})\n", + strCodeName, RowDT.ToString("yyyy-MM-dd HH:mm:00"), iRow, iPrice, iPrice-iStartPrice, - (iPrice-iStartPrice)*100/(float)iStartPrice + (iPrice-iStartPrice)*100/(float)iStartPrice, + iStartPrice, + iStartRow )); iTotalProfit += (iPrice-iStartPrice)*iStockCount; iTotalBid += iStartPrice*iStockCount; @@ -273,13 +372,15 @@ namespace AutoSellerNS if(iTrailingCount >= Config.GetTrailingCnt()) { - m_tbLogView.AppendText(string.Format("[{0}] 트레일링 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%)\n", + m_tbLogView.AppendText(string.Format("[{0}] 트레일링 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%) (매수 : {6:n0}원, line:{7})\n", strCodeName, RowDT.ToString("yyyy-MM-dd HH:mm:00"), iRow, iPrice, iPrice-iStartPrice, - (iPrice-iStartPrice)*100/(float)iStartPrice + (iPrice-iStartPrice)*100/(float)iStartPrice, + iStartPrice, + iStartRow )); iTotalProfit += (iPrice-iStartPrice)*iStockCount; iTotalBid += iStartPrice*iStockCount; @@ -287,6 +388,7 @@ namespace AutoSellerNS } } + iPrevPrice = iPrice; iPrevAskCount = iTotalAskCount; iPrevBidCount = iTotalBidCount; } @@ -296,5 +398,227 @@ namespace AutoSellerNS m_tbLogView.SelectionStart = m_tbLogView.TextLength; m_tbLogView.ScrollToCaret(); } + + public void StartSimuation2() + { + m_tbLogView.AppendText(string.Format("[시뮬레이션 시작] 조건 : {0}회, 트레일링 : {1}%, {2}회\n", Config.GetBidCount(), Config.GetTrailingRate(), Config.GetTrailingCnt())); + + int iTotalProfit = 0; + int iTotalBid = 0; + + foreach(string strLine in File.ReadLines(Util.GetSimulationPath()+"/0-input.txt", Encoding.UTF8)) + { + var tokens = strLine.Split('\t'); + + var strDate = tokens[0]; + var strNewTime = tokens[1]; + var strSimulationTime = tokens[2]; + var strCodeName = tokens[3]; + var strCode = tokens[4]; + var strStartPrice = tokens[5]; + + DateTime StartDT; + DateTime.TryParse(strDate+" "+strSimulationTime, out StartDT); + + int iStartPrice; + int.TryParse(strStartPrice, NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out iStartPrice); + + string strFileName = Util.GetSimulationPath() + "/" + strCodeName + "-" + StartDT.ToString("yyyy-MM-dd") + ".xlsx"; + + + FileInfo newFile = new FileInfo(strFileName); + ExcelPackage package = new ExcelPackage(newFile); + ExcelWorksheet Sheet = package.Workbook.Worksheets["sheet"]; + + int iMaxRow = Sheet.Dimension.Rows; + + DateTime RowDT = DateTime.Now; + List aPrevDT = new List(); + + bool bStart = false; + int iAskCount = 0; + int iAskDownCount = 0; + int iDealCountInSec = 0; + + int iTrailingCount = 0; + int iMaxPrice = int.MinValue; + int iStockCount = 0; + int iStartRow = 0; + int iPrevPrice = 0; + bool bPrevAsk = false; + int iMaxAskPrice = 0; + + int iPrevAskPrice = 0; + + for(int iRow = 2; iRow<=iMaxRow; iRow++) + { + int iTime = (int)(double)Sheet.Cells[iRow, 1].Value; + int iPrice = (int)(double)Sheet.Cells[iRow, 3].Value; + int iAskPrice = (int)(double)Sheet.Cells[iRow, 4].Value; + int iBidPrice = (int)(double)Sheet.Cells[iRow, 5].Value; + + DateTime.TryParse(strDate+" "+string.Format("{0}:{1}:{2}", iTime/10000, (iTime/100)%100, iTime%100), out RowDT); + + iStockCount = 1000000/iStartPrice; + + if(bStart == false) + { + if(RowDT >= StartDT && iPrice==iStartPrice) + { + bStart = true; + iStartRow = iRow; + iMaxAskPrice = iAskPrice; + iPrevAskPrice = iAskPrice; + } + } + else + { + //// 체결가 비교 + //if(iPrice > iPrevPrice) + //{ + // iAskCount = 0; + // bPrevAsk = false; + //} + //else if(iPrice < iPrevPrice) + //{ + // iAskCount++; + // bPrevAsk = true; + //} + //else if(bPrevAsk == true) + //{ + // iAskCount++; + //} + + //// 호가 비교 - 중간 유지 + //if(iPrice >= iAskPrice) + //{ + // iAskCount = 0; + // bPrevAsk = false; + //} + //else if(iPrice <= iBidPrice) + //{ + // iAskCount++; + // bPrevAsk = true; + //} + //else if(bPrevAsk == true) + //{ + // iAskCount++; + //} + + // 호가 비교 - 매수호가 기준 + if(iPrice <= iBidPrice) + iAskCount++; + else + iAskCount = 0; + + //// 호가 비교 - 매도호가 기준 + //if(iPrice < iAskPrice) + // iAskCount++; + //else + // iAskCount = 0; + + //// 매도호가 최고가 미만 연속 + //if(iAskPrice < iMaxAskPrice) + // iAskDownCount++; + //else + // iAskDownCount=0; + //iMaxAskPrice = Math.Max(iMaxAskPrice, iAskPrice); + + //// 매도호가 최고가 미만 누적 + //if(iAskPrice < iMaxAskPrice) + // iAskDownCount++; + //int iNextMaxAskPrice = Math.Max(iMaxAskPrice, iAskPrice); + //if(iNextMaxAskPrice > iMaxAskPrice) + // iAskDownCount = 0; + //iMaxAskPrice = iNextMaxAskPrice; + + //// 매도호가 하락 - 최고 갱신시 리셋 + //if(iAskPrice < iPrevAskPrice) + // iAskDownCount++; + //int iNextMaxAskPrice = Math.Max(iMaxAskPrice, iAskPrice); + //if(iNextMaxAskPrice > iMaxAskPrice) + // iAskDownCount = 0; + //iMaxAskPrice = iNextMaxAskPrice; + + //if(PrevRowDT.Second == RowDT.Second) + // iDealCountInSec++; + //else + // iDealCountInSec = 1; + + if(iAskCount >= Config.GetBidCount()) + { + m_tbLogView.AppendText(string.Format("[{0,-10}] 조건1 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%) (매수 : {6:n0}원, {7}, line:{8})\n", + strCodeName, + RowDT.ToString("yyyy-MM-dd HH:mm:ss"), + iRow, + iPrice, + iPrice-iStartPrice, + (iPrice-iStartPrice)*100/(float)iStartPrice, + iStartPrice, + StartDT.ToString("yyyy-MM-dd HH:mm:ss"), + iStartRow + )); + iTotalProfit += (iPrice-iStartPrice)*iStockCount; + iTotalBid += iStartPrice*iStockCount; + break; + } + + //if(aPrevDT.Count > 3 && aPrevDT.Last() - aPrevDT[aPrevDT.Count-3] > TimeSpan.FromSeconds(1) && iAskDownCount >= Config.GetBidCount()) + //if(iAskDownCount >= 5) + //{ + // m_tbLogView.AppendText(string.Format("[{0,-10}] 조건2 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%) (매수 : {6:n0}원, {7}, line:{8})\n", + // strCodeName, + // RowDT.ToString("yyyy-MM-dd HH:mm:ss"), + // iRow, + // iPrice, + // iPrice-iStartPrice, + // (iPrice-iStartPrice)*100/(float)iStartPrice, + // iStartPrice, + // StartDT.ToString("yyyy-MM-dd HH:mm:ss"), + // iStartRow + // )); + // iTotalProfit += (iPrice-iStartPrice)*iStockCount; + // iTotalBid += iStartPrice*iStockCount; + // break; + //} + + if(iPrice > iMaxPrice) + iTrailingCount = 0; + else if(iPrice <= iMaxPrice*(100-Config.GetTrailingRate())/100) + iTrailingCount++; + iMaxPrice = Math.Max(iPrice, iMaxPrice); + + if(iTrailingCount >= Config.GetTrailingCnt()) + { + m_tbLogView.AppendText(string.Format("[{0}] 트레일링 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%) (매수 : {6:n0}원, {7} line:{8})\n", + strCodeName, + RowDT.ToString("yyyy-MM-dd HH:mm:ss"), + iRow, + iPrice, + iPrice-iStartPrice, + (iPrice-iStartPrice)*100/(float)iStartPrice, + iStartPrice, + StartDT.ToString("yyyy-MM-dd HH:mm:ss"), + iStartRow + )); + iTotalProfit += (iPrice-iStartPrice)*iStockCount; + iTotalBid += iStartPrice*iStockCount; + break; + } + } + + iPrevPrice = iPrice; + iPrevAskPrice = iAskPrice; + aPrevDT.Add(RowDT); + if(aPrevDT.Count > 15) + aPrevDT.RemoveAt(0); + } + } + + m_tbLogView.AppendText(string.Format("[시뮬레이션 종료] 총수익 : {0:n0}원 : {1:n2}%\n\n", iTotalProfit, iTotalProfit*100/(float)iTotalBid)); + m_tbLogView.SelectionStart = m_tbLogView.TextLength; + m_tbLogView.ScrollToCaret(); + } } } +