301 lines
8.8 KiB
C#
301 lines
8.8 KiB
C#
using CPSYSDIBLib;
|
|
using OfficeOpenXml;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace AutoSellerNS
|
|
{
|
|
class SimulationHelper
|
|
{
|
|
CybosHelper m_CybosHelper = null;
|
|
RichTextBox m_tbLogView = null;
|
|
|
|
public SimulationHelper(CybosHelper CybosHelper, RichTextBox tbLog)
|
|
{
|
|
m_CybosHelper = CybosHelper;
|
|
m_tbLogView = tbLog;
|
|
}
|
|
|
|
public void LoadTxt()
|
|
{
|
|
List<string> aItems = new List<string>();
|
|
StockChart CPStockChart = new StockChart();
|
|
|
|
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);
|
|
uint uiStartDate;
|
|
uint.TryParse(StartDT.ToString("yyyyMMdd"), out uiStartDate);
|
|
|
|
string strOutFileName = Util.GetSimulationPath() + "/" + strCodeName + "-" + StartDT.ToString("yyyy-MM-dd") + ".txt";
|
|
if(File.Exists(strOutFileName) == true)
|
|
continue;
|
|
|
|
CPStockChart.SetInputValue(0, "A"+strCode);
|
|
CPStockChart.SetInputValue(1, '1');
|
|
CPStockChart.SetInputValue(2, uiStartDate);
|
|
CPStockChart.SetInputValue(3, uiStartDate);
|
|
CPStockChart.SetInputValue(4, 100000);
|
|
CPStockChart.SetInputValue(5, new int[] { 0, 1, 5, 8, 9, 10, 11 });
|
|
CPStockChart.SetInputValue(6, 'T');
|
|
CPStockChart.BlockRequest2(0);
|
|
|
|
int iFieldCnt = CPStockChart.GetHeaderValue(1);
|
|
string[] astrFieldName = CPStockChart.GetHeaderValue(2);
|
|
|
|
string strOutLine = "";
|
|
for(int j = 0; j<iFieldCnt; j++)
|
|
{
|
|
strOutLine += astrFieldName[j];
|
|
strOutLine += '\t';
|
|
}
|
|
File.AppendAllText(strOutFileName, strOutLine+Environment.NewLine, new UTF8Encoding(true));
|
|
strOutLine = "";
|
|
|
|
bool bContinue = true;
|
|
while(bContinue == true)
|
|
{
|
|
int iCnt = CPStockChart.GetHeaderValue(3);
|
|
for(int i = 0; i<iCnt; i++)
|
|
{
|
|
for(int j = 0; j<iFieldCnt; j++)
|
|
{
|
|
strOutLine += CPStockChart.GetDataValue(j, i);
|
|
strOutLine += '\t';
|
|
}
|
|
|
|
strOutLine += Environment.NewLine;
|
|
|
|
if(i % 1000 == 999)
|
|
{
|
|
File.AppendAllText(strOutFileName, strOutLine, new UTF8Encoding(true));
|
|
strOutLine = "";
|
|
}
|
|
}
|
|
|
|
bContinue = (CPStockChart.Continue==1);
|
|
if(bContinue == true)
|
|
CPStockChart.BlockRequest2(0);
|
|
|
|
m_tbLogView.AppendText(string.Format("RequestRQ({0})", m_CybosHelper.GetLimitRemainCountRQ()));
|
|
}
|
|
|
|
if(strOutLine.Length > 0)
|
|
{
|
|
File.AppendAllText(strOutFileName, strOutLine, new UTF8Encoding(true));
|
|
strOutLine = "";
|
|
}
|
|
|
|
m_tbLogView.AppendText(string.Format("[Load] " + strOutFileName + " End"));
|
|
}
|
|
|
|
m_tbLogView.AppendText(string.Format("[Load] All End"));
|
|
}
|
|
|
|
public void LoadExcel()
|
|
{
|
|
List<string> aItems = new List<string>();
|
|
StockChart CPStockChart = new StockChart();
|
|
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;
|
|
}
|
|
|
|
CPStockChart.SetInputValue(0, "A"+strCode);
|
|
CPStockChart.SetInputValue(1, '1');
|
|
CPStockChart.SetInputValue(2, StartDT.ToString("yyyyMMdd"));
|
|
CPStockChart.SetInputValue(3, StartDT.ToString("yyyyMMdd"));
|
|
CPStockChart.SetInputValue(5, new int[] { 0, 1, 5, 8, 9, 10, 11 });
|
|
CPStockChart.SetInputValue(6, 'T');
|
|
CPStockChart.BlockRequest2(0);
|
|
|
|
int iFieldCnt = CPStockChart.GetHeaderValue(1);
|
|
string[] astrFieldName = CPStockChart.GetHeaderValue(2);
|
|
List<object> aRow = new List<object>();
|
|
List<object[]> aRows = new List<object[]>();
|
|
|
|
Excel = new ExcelHandler(strOutFileName, astrFieldName);
|
|
|
|
bool bContinue = true;
|
|
while(bContinue == true)
|
|
{
|
|
int iCnt = CPStockChart.GetHeaderValue(3);
|
|
for(int i = 0; i<iCnt; i++)
|
|
{
|
|
for(int j = 0; j<iFieldCnt; j++)
|
|
aRow.Add(CPStockChart.GetDataValue(j, i));
|
|
aRows.Add(aRow.ToArray());
|
|
aRow.Clear();
|
|
}
|
|
|
|
bContinue = (CPStockChart.Continue==1);
|
|
if(bContinue == true)
|
|
CPStockChart.BlockRequest2(0);
|
|
|
|
m_tbLogView.AppendText(string.Format("RequestRQ({0})\n", m_CybosHelper.GetLimitRemainCountRQ()));
|
|
}
|
|
|
|
aRows.Reverse();
|
|
Excel.AddRows(aRows.ToArray());
|
|
|
|
m_tbLogView.AppendText(string.Format("[Load] " + strOutFileName + " End\n"));
|
|
}
|
|
|
|
m_tbLogView.AppendText(string.Format("[Load] All End\n\n"));
|
|
m_tbLogView.SelectionStart = m_tbLogView.TextLength;
|
|
m_tbLogView.ScrollToCaret();
|
|
}
|
|
|
|
public void StartSimuation()
|
|
{
|
|
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, out iStartPrice);
|
|
|
|
string strFileName = Util.GetSimulationPath() + "/" + strCodeName + "-" + StartDT.ToString("yyyy-MM-dd") + ".xlsx";
|
|
|
|
|
|
FileInfo newFile = new FileInfo(strFileName);
|
|
newFile.IsReadOnly = true;
|
|
ExcelPackage package = new ExcelPackage(newFile);
|
|
ExcelWorksheet Sheet = package.Workbook.Worksheets["sheet"];
|
|
|
|
int iMaxRow = Sheet.Dimension.Rows;
|
|
|
|
DateTime RowDT;
|
|
bool bStart = false;
|
|
int iTotalAskCount = 0;
|
|
int iTotalBidCount = 0;
|
|
int iPrevAskCount = 0;
|
|
int iPrevBidCount = 0;
|
|
bool bBid = false;
|
|
int iAskCount = 0;
|
|
int iTrailingCount = 0;
|
|
int iMaxPrice = int.MinValue;
|
|
int iStockCount = 0;
|
|
for(int iRow = 2; iRow<=iMaxRow; iRow++)
|
|
{
|
|
int iTime = (int)(double)Sheet.Cells[iRow, 2].Value;
|
|
int iPrice = (int)(double)Sheet.Cells[iRow, 3].Value;
|
|
iTotalAskCount = (int)(double)Sheet.Cells[iRow, 6].Value;
|
|
iTotalBidCount = (int)(double)Sheet.Cells[iRow, 7].Value;
|
|
|
|
bBid = (iTotalAskCount == iPrevAskCount);
|
|
DateTime.TryParse(strDate+" "+string.Format("{0}:{1}:{2}", iTime/100, iTime%100, 59), out RowDT);
|
|
|
|
iStockCount = 1000000/iStartPrice;
|
|
|
|
if(bStart == false)
|
|
{
|
|
if(RowDT >= StartDT && iPrice==iStartPrice)
|
|
bStart = true;
|
|
}
|
|
else
|
|
{
|
|
if(bBid == false)
|
|
iAskCount++;
|
|
else
|
|
iAskCount = 0;
|
|
|
|
if(iAskCount >= Config.GetBidCount())
|
|
{
|
|
m_tbLogView.AppendText(string.Format("[{0}] 시뮬레이션 매도 {1} line:{2} {3:n0}원 ({4} : {5:n2}%)\n",
|
|
strCodeName,
|
|
RowDT.ToString("yyyy-MM-dd HH:mm:00"),
|
|
iRow,
|
|
iPrice,
|
|
iPrice-iStartPrice,
|
|
(iPrice-iStartPrice)*100/(float)iStartPrice
|
|
));
|
|
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}%)\n",
|
|
strCodeName,
|
|
RowDT.ToString("yyyy-MM-dd HH:mm:00"),
|
|
iRow,
|
|
iPrice,
|
|
iPrice-iStartPrice,
|
|
(iPrice-iStartPrice)*100/(float)iStartPrice
|
|
));
|
|
iTotalProfit += (iPrice-iStartPrice)*iStockCount;
|
|
iTotalBid += iStartPrice*iStockCount;
|
|
break;
|
|
}
|
|
}
|
|
|
|
iPrevAskCount = iTotalAskCount;
|
|
iPrevBidCount = iTotalBidCount;
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|