에러 수정 및 로그 시스템 도입

This commit is contained in:
kyh
2022-10-27 13:14:42 +09:00
parent 535927cb3c
commit 2881a7f2a9
6 changed files with 144 additions and 44 deletions

View File

@@ -36,6 +36,8 @@ namespace Million_Buyer
bool SetIndicator = false;
bool ThreadFlag = false;
bool AliveCheckor = false;
private Thread thread = null;
private Thread orderThread = null;
private List<Account> accounts = null;
@@ -188,8 +190,8 @@ namespace Million_Buyer
private void bt_Stop_Click(object sender, EventArgs e)
{
ThreadFlag = false;
if (!RealTimeMode && thread != null) thread.Abort();
if (!RealTimeMode && orderThread != null) orderThread.Abort();
//if (!RealTimeMode && thread != null) thread.Abort();
//if (!RealTimeMode && orderThread != null) orderThread.Abort();
bt_Start.Enabled = true;
rd_buyer.Enabled = true;
@@ -284,9 +286,9 @@ namespace Million_Buyer
var buyRex = _saveResultData.BuyRegularExpression;
var sellRex = _saveResultData.SellRegularExpression;
var buyScript = new InteratorScripter();
var buyScript = new InteratorScripter("Buy Script");
buyScript.regularExpressionString = buyRex;
var sellScript = new InteratorScripter();
var sellScript = new InteratorScripter("Sell Script");
sellScript.regularExpressionString = sellRex;
var scriptDic = new Dictionary<string, bool>();
@@ -294,11 +296,7 @@ namespace Million_Buyer
//TODO 모든 조건 데이터 미리 계산 필요
//save 데이터
_saveResultData.StartDateTime = DateTime.Now;
//구매 데이터
var saveFlag = true;
_saveResultData.StartDateTime = DateTime.Now;
//구매 후 데이터 여러개 계속 겹치는 경우 제외하기 위한 List
var overlapBuyManagementList = new Dictionary<string, bool>();
@@ -327,6 +325,13 @@ namespace Million_Buyer
{
try
{
if (AliveCheckor)
{
AliveCheckor = false;
InsertLog("Alive");
}
#region 기본 데이터 Setting
if (firstFlag == 0)
{
@@ -352,15 +357,23 @@ namespace Million_Buyer
dic[codeFullname] = true;
}
CommonProperty.subIndicatorStateManagement[item.IndexString] = dic;
}
#region TODO 이미 구매되어 있는 종목에 대한 기본 데이터 Setting 필요
if (RealTimeMode)
{
}
else
{
// TODO 이미 구매되어 있는 종목에 대한 기본 데이터 Setting 필요
}
#endregion
firstFlag = 1;
InsertLog("Deafult Data Setting 완료..");
sw.Stop();
InsertLog("Default 계산 시간 : " + sw.Elapsed.ToString());
LogManager.WriteLog("Default 계산 시간 : " + sw.Elapsed.ToString());
}
else
{
@@ -373,14 +386,7 @@ namespace Million_Buyer
InsertLog("Ticker 계산 시간 : " + sw.Elapsed.ToString());
}
}
#endregion
//Ticker 초기화
if (DateTime.Now.Minute == 0 && saveFlag)
{
saveFlag = false;
}
else if (DateTime.Now.Minute > 1) saveFlag = true;
#endregion
foreach (var item in realTimeMsg.coinFullNameList)
{
@@ -468,6 +474,10 @@ namespace Million_Buyer
}
buyList.Add(buyData);
string str = "Buy : " + item + ",\r\n Buy Candle Data : " + JsonConvert.SerializeObject(recentlyData) + "\r\n";
LogManager.WriteLog(str, item);
overlapBuyManagementList[item] = false;
InsertLog(buyData.ConGoodsData.CoinFullName + " Market Data 구입 DateTime : " + time.ToString("yyyy-MM-dd HH:mm:ss"));
//grid 처리 구매항목, 구매 가격, 구매 개수, 구매시점
@@ -531,10 +541,9 @@ namespace Million_Buyer
result.WinCount = rate > 0 ? 1 : 0;
result.LoseCount = rate < 0 ? 1 : 0;
result.FirstWinFlag = rate > 0 ? true : false;
result.BuyCount = buyItem.CandleDataLists_Im[0].BuyCount;
result.SellCount = buyItem.CandleDataLists_Im[0].BuyCount;
result.SellCount = sellItem.BuyCount;
// buycount 에서 sell count를 제외한 양이 미체결 량
if (!RealTimeMode)
@@ -545,6 +554,10 @@ namespace Million_Buyer
}
resultDataList.Add(result);
string str = "Sell : " + item + ",\r\n Sell Candle Data : " + JsonConvert.SerializeObject(recentlyData) + "\r\n";
LogManager.WriteLog(str, item);
//처리한 buyList는 삭제
buyList.Remove(buyItem);
InsertLog(buyItem.ConGoodsData.CoinFullName + " Market Data 판매 DateTime : " + time.ToString("yyyy-MM-dd HH:mm:ss"));
@@ -743,6 +756,8 @@ namespace Million_Buyer
InsertLog("Order List Thread Alive.");
else
InsertLog("Order List Thread Death.");
AliveCheckor = true;
}
/// <summary>

View File

@@ -15,7 +15,7 @@ namespace Million.Manager
/// </summary>
public static class CalculateManager
{
public static InteratorScripter subScript = new InteratorScripter();
public static InteratorScripter subScript = new InteratorScripter("최초 돌파 Sub Script");
/// <summary>
///
/// </summary>
@@ -608,12 +608,27 @@ namespace Million.Manager
{
subFlag = false;
if (recentlyDataFlag)
subManagement[coinFullName] = true;
else
firstFlag = false;
if(!(subManagement[coinFullName] || !firstFlag))
{
var str = "";
if (recentlyDataFlag)
{
subManagement[coinFullName] = true;
str = "Buyer(Realtime) Mode\r\n";
}
else
{
firstFlag = false;
str = "Hunter Mode\r\n";
}
str += coinFullName + " 최초 돌파 Sub조건 초기화 됨\r\n";
LogManager.WriteLog(str, coinFullName);
}
}
//sub 조건이 만족할 경우
if (subFlag)
{
@@ -624,21 +639,17 @@ namespace Million.Manager
if (overlapData == 0) continue;
var valDic = ResultLogicManager.GetIndicateValue(dic, totalIndicators, parent);
var subVal = GetConditionValue(subScript.regularExpressionString, valDic, dic);
if (subVal == 0) continue;
if (upperMainIndicatorFlag)
{
var valDic = ResultLogicManager.GetIndicateValue(dic, totalIndicators, parent);
var subVal = GetConditionValue(subScript.regularExpressionString, valDic, dic);
if (subVal == 0) continue;
if (overlapData < subVal) continue;
}
//TODO Tick 차이 관련 조건 식 추가 예정
//최초로 매수, 매도 진행 시 사전 조건과의 Tick거리를 예외할 수 있어야 함
//OverlapValue는 사야할 데이터, beforeIndiValue는 사전 데이터
var beforeIndiValue = parent.IndicatorDic[subKey].value;
if (beforeIndiValue == 0) continue;
if (!GetTickDifferenceCount(overlapData, beforeIndiValue, 3)) continue;
if (!GetTickDifferenceCount(overlapData, subVal, 3)) continue;
//최초 시점이 아닐 경우
if ((subManagement != null && subManagement[coinFullName]) || !firstFlag)
@@ -647,7 +658,7 @@ namespace Million.Manager
var enumList = setUp.OverStatusEnumList;
if (setUp.SubIndicatorSetupType == SubIndicatorSetupType.최초돌파) enumList = setUp.OverStatusEnumListFirstOver;
if (enumList.Any(t => t == parent.IndicatorDic[key].overStatus))
{
GetTranspierceData(parent, childrenCandleDataList, setUp, overlapData, key, true);
@@ -681,7 +692,7 @@ namespace Million.Manager
{
if (calBigData <= calSamllData)
break;
calSamllData += 0.000001;
calSamllData += 0.0001;
calSamllData = OrderbookManager.GetAskPrice(calSamllData);
count++;
}

View File

@@ -1,4 +1,5 @@
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -13,6 +14,7 @@ namespace Million.Manager
/// C# 코드기준으로 스크립팅 해줌
/// </summary>
public string regularExpressionString;
public string Name;
/// <summary>
/// 캐쉬 Dictionary
@@ -22,9 +24,10 @@ namespace Million.Manager
/// <summary>
/// 생성자
/// </summary>
public InteratorScripter()
public InteratorScripter(string Name)
{
rememberDic = new Dictionary<Dictionary<string, bool>, bool>();
this.Name = Name;
}
/// <summary>
@@ -34,6 +37,8 @@ namespace Million.Manager
/// <returns></returns>
public bool DicExcuteScript(Dictionary<string, bool> RegularExpression)
{
var cloneRex = RegularExpression.ToDictionary(x => x.Key, x => x.Value);
try
{
//중복 검사
@@ -42,13 +47,13 @@ namespace Million.Manager
foreach(var key in rememberDic.Keys)
{
bool checker = true;
if(key.Count == RegularExpression.Count)
if(key.Count == cloneRex.Count)
{
foreach(var keyStr in key.Keys)
{
if(RegularExpression.ContainsKey(keyStr))
if(cloneRex.ContainsKey(keyStr))
{
if (key[keyStr] != RegularExpression[keyStr])
if (key[keyStr] != cloneRex[keyStr])
checker = false;
}
else
@@ -74,7 +79,16 @@ namespace Million.Manager
}
else
{
return rememberDic[RegularExpression] = ScriptExcute(ChangeScript(regularExpressionString, RegularExpression));
var returnData = ScriptExcute(ChangeScript(regularExpressionString, cloneRex));
rememberDic[cloneRex] = returnData;
var str = "Name : " + Name +",\r\nregularExpressionString : " + regularExpressionString + ",\r\n RegularExpression : "
+ JsonConvert.SerializeObject(cloneRex) + ",\r\n Result : " + returnData.ToString()
+ ",\r\n RememberDic : " + JsonConvert.SerializeObject(rememberDic) + "\r\n";
LogManager.WriteLog(str);
return returnData;
}
}
catch (Exception e)

View File

@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Million.Manager
{
/// <summary>
/// Log Manager
/// </summary>
public static class LogManager
{
/// <summary>
/// Lock 관련 Field
/// </summary>
private static readonly object padlock = new object();
/// <summary>
/// Insert Log
/// </summary>
/// <param name="message"></param>
/// <param name="coinFullName"></param>
/// <returns></returns>
public static bool WriteLog(string message, string coinFullName = "")
{
if (coinFullName == "") coinFullName = "common";
var returnData = true;
var defaultMesage = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "=>" + message +"\r\n";
var dirPath = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf("\\"));
dirPath = dirPath + "\\Log";
var filePath = dirPath + "\\" + DateTime.Now.ToString("yyyyMMdd") + "_" + coinFullName + ".txt";
lock (padlock)
{
try
{
if (!System.IO.Directory.Exists(dirPath))
{
System.IO.Directory.CreateDirectory(dirPath);
}
if (!System.IO.File.Exists(filePath))
{
System.IO.File.Create(filePath);
}
System.IO.File.AppendAllText(filePath, defaultMesage);
}
catch (Exception e)
{
returnData = false;
}
}
return returnData;
}
}
}

View File

@@ -68,9 +68,9 @@ namespace Million.Manager
string buyRegularExpression, string sellRegularExpression, MarketData market, List<IndicatorCoditionSetup> totalIndicator, bool insertTermCandleData = false)
{
//buy, sell script 선언
var buyScript = new InteratorScripter();
var buyScript = new InteratorScripter("Buy Script");
buyScript.regularExpressionString = buyRegularExpression;
var sellScript = new InteratorScripter();
var sellScript = new InteratorScripter("Sell Script");
sellScript.regularExpressionString = sellRegularExpression;

View File

@@ -194,6 +194,7 @@
<Compile Include="Manager\DataManager.cs" />
<Compile Include="Manager\IndicatorSetupManager.cs" />
<Compile Include="Manager\InteratorScripter.cs" />
<Compile Include="Manager\LogManager.cs" />
<Compile Include="Manager\OrderbookManager.cs" />
<Compile Include="Manager\ExportManager.cs" />
<Compile Include="Manager\RealtimeDataSettingManager.cs" />