Buyer 관련 Main 로직 함수 분기 1차

This commit is contained in:
kyh
2022-11-24 11:35:24 +09:00
parent 5026e2c732
commit d9076e4046
4 changed files with 180 additions and 112 deletions

View File

@@ -27,8 +27,13 @@ namespace Million_Buyer
{
public partial class MainForm : Form
{
bool RealTimeMode = true;
/*
* mode = 0 실시간 검증 모드
* mode = 1 Buyer 모드
* mode = 2 DB Ticker 데이터 검증 모드
*/
int programMode = 0;
private SavedResultData _saveResultData;
//결과 데이터
private List<SearchResult> resultDataList;
@@ -90,7 +95,7 @@ namespace Million_Buyer
private void rd_Realtime_CheckedChanged(object sender, EventArgs e)
{
mode = "RealTime";
RealTimeMode = true;
programMode = 0;
SetReadOnly(true);
}
@@ -102,7 +107,7 @@ namespace Million_Buyer
private void rd_buyer_CheckedChanged(object sender, EventArgs e)
{
mode = "Buyer";
RealTimeMode = false;
programMode = 1;
SetReadOnly(false);
}
@@ -156,7 +161,7 @@ namespace Million_Buyer
CommonProperty.UpperMainIndicatorFlag = cb_UpperMainIndi.Checked;
CommonProperty.DownBeforeValueFlag = cb_DownBeforeValueFlag.Checked;
if (!RealTimeMode)
if (programMode == 1)
{
if (cycleCount == 0 || cycleBuyMoney == 0)
{
@@ -173,7 +178,7 @@ namespace Million_Buyer
thread.Start();
//실시간 검증에는 동작하지 않음
if (!RealTimeMode)
if (programMode == 1)
{
orderThread = new Thread(OrderThreadFunction);
orderThread.Start();
@@ -327,7 +332,7 @@ namespace Million_Buyer
//구매 후 데이터 여러개 계속 겹치는 경우 제외하기 위한 List
var overlapBuyManagementList = new Dictionary<string, bool>();
int firstFlag = 0;
bool firstFlag = true;
RealtimeDataSettingManager realTimeMsg = null;
@@ -339,7 +344,7 @@ namespace Million_Buyer
lb_StartDate.Text = standardTime.ToString("yyyy-MM-dd HH:mm:ss");
}));
if (RealTimeMode)
if (programMode == 0)
InsertLog("실시간 검증 구동 중..");
else
InsertLog("Buyer 구동 중..");
@@ -347,6 +352,7 @@ namespace Million_Buyer
var cnt = 0;
sw.Start();
#endregion
while (ThreadFlag)
{
try
@@ -360,60 +366,24 @@ namespace Million_Buyer
#region 기본 데이터 Setting
if (firstFlag == 0)
if (firstFlag)
{
realTimeMsg = new RealtimeDataSettingManager(null, this.payment);
dataList = realTimeMsg.GetRealTimeCandleData(candleTypeList, 200);
foreach (var item in realTimeMsg.coinFullNameList)
this.BeginInvoke(new Action(delegate ()
{
if (cb_IncludeClearIndicator.Checked)
overlapBuyManagementList[item] = false;
else
overlapBuyManagementList[item] = true;
}
InitManager.BuyerInit(cb_IncludeClearIndicator.Checked, overlapBuyManagementList, totalIndicatorList);
}));
foreach (var item in totalIndicatorList)
{
var dic = new Dictionary<string, bool>();
foreach (var codeFullname in realTimeMsg.coinFullNameList)
{
if (cb_IncludeClearIndicator.Checked)
dic[codeFullname] = false;
else
dic[codeFullname] = true;
}
CommonProperty.subIndicatorStateManagement[item.IndexString] = dic;
}
#region TODO 이미 구매되어 있는 종목에 대한 기본 데이터 Setting 필요
if (!RealTimeMode)
if (programMode == 1)
{
foreach(var item in this.accounts)
{
if(item.Currency != "KRW")
{
var buyItem = new CandleDataList();
buyItem.Uuid = "";
var temp = dataList[MCandleTimeType.M1].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item.UnitCurrency + "-" + item.Currency);
if (temp == null) continue;
buyItem.ConGoodsData = temp.ConGoodsData;
var candle = new CandleData();
candle.BuyTime = new DateTime(2000, 1, 1);
candle.BuyValue = item.AvgBuyPrice;
candle.BuyCount = item.Balance;
buyItem.CandleDataLists_Im.Add(candle);
buyList.Add(buyItem);
}
}
buyList = InitManager.GetBuyListofAccounts(this.accounts, dataList);
this.BeginInvoke(new Action(delegate ()
{
try
{
foreach (var item in buyList)
{
var recentlyData = item.CandleDataLists_Im[0];
@@ -432,11 +402,11 @@ namespace Million_Buyer
InsertLog("이전에 사놓은 개수 입력 관련 에러" + e.Message);
}
}));
}
#endregion
firstFlag = 1;
firstFlag = false;
InsertLog("Deafult Data Setting 완료..");
sw.Stop();
InsertLog("Default 계산 시간 : " + sw.Elapsed.ToString());
@@ -444,35 +414,21 @@ namespace Million_Buyer
}
else
{
if (firstFlag == 1)
{
sw.Restart();
dataList = realTimeMsg.ProcessRecentlyCandleDatas(dataList, candleTypeList);
sw.Stop();
if (sw.Elapsed.TotalSeconds > 1)
InsertLog("Ticker 계산 시간 : " + sw.Elapsed.ToString());
}
sw.Restart();
dataList = realTimeMsg.ProcessRecentlyCandleDatas(dataList, candleTypeList);
sw.Stop();
if (sw.Elapsed.TotalSeconds > 1)
InsertLog("Ticker 계산 시간 : " + sw.Elapsed.ToString());
}
#endregion
foreach (var item in realTimeMsg.coinFullNameList)
{
#region Indicator 계산 -> Code full name 으로 for문 돌면서 계산 처리
var dic = new Dictionary<MCandleTimeType, List<CandleData>>();
var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicatorList);
sw.Restart();
foreach (var key in dataList.Keys)
{
var candleDataList = dataList[key].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item);
dic[key] = candleDataList.CandleDataLists_Im;
var indicatorSetUpList = distinctIndicator.Where(t => t.MCandleTimeType == key).ToList();
foreach (var setup in indicatorSetUpList)
{
setup.excute(dic[key], true);
}
}
var dic = DataManager.GetExecuteData(dataList, totalIndicatorList, item);
sw.Stop();
if (sw.Elapsed.TotalSeconds > 1)
InsertLog("Execute 계산 시간 : " + sw.Elapsed.ToString());
@@ -488,25 +444,12 @@ namespace Million_Buyer
#endregion
#region 사고 파는 로직
//최신 데이터 가져오기
var recentlyDataList = dic[MCandleTimeType.M1].Where(t=>t.RecentlyDataFlag).ToList();
if (recentlyDataList.Count == 0)
continue;
var maxTime = recentlyDataList.Select(t => t.DateTime).Max();
var recentlyData = recentlyDataList.FirstOrDefault(t => t.DateTime == maxTime);
//최신 데이터 가져오기
var recentlyData = DataManager.GetRecentlyData(dic, MCandleTimeType.M1, true);
if (recentlyData == null)
continue;
// Parent Recently Data는 indicator에 따라 달라질수 있으므로 전부다 처리한 후 초기화
foreach (var data in dic)
{
var recentlyList = data.Value.Where(t => t.RecentlyDataFlag).ToList();
foreach (var recentlyItem in recentlyList)
recentlyItem.RecentlyDataFlag = false;
}
/*
* 로직 설명
* 1. Buy List에 있는지 확인
@@ -526,7 +469,7 @@ namespace Million_Buyer
if (overlapBuyManagementList[item])
{
InsertLog("Insert Buy Logic");
if (!RealTimeMode)
if (programMode == 1)
{
LogManager.WriteLog("Buy CoinFullName : " + item + "\r\nCandleData : " + JsonConvert.SerializeObject(recentlyData), "BuySell");
InsertLog("Buy Coin Name : " + item + ", DateTime : " + recentlyData.DateTime.ToString("yyyy-MM-dd HH:mm:ss"));
@@ -546,7 +489,7 @@ namespace Million_Buyer
buyData.ConGoodsData = dataList[MCandleTimeType.M1].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item).ConGoodsData;
// 임시 -> 실시간은 1개만 삿다고 처리
if (RealTimeMode)
if (programMode != 1)
{
recentlyData.BuyCount = 1;
}
@@ -635,7 +578,7 @@ namespace Million_Buyer
result.SellCount = sellItem.BuyCount;
// buycount 에서 sell count를 제외한 양이 미체결 량
if (!RealTimeMode)
if (programMode == 1)
{
LogManager.WriteLog("Sell Point 진입 : " + item, item);
InsertLog("Sell Point 진입 : " + item);
@@ -714,17 +657,6 @@ namespace Million_Buyer
}
}
#region Thread 종료 후 후 처리 할 로직
if (RealTimeMode)
{
}
else
{
}
#endregion
SaveData();
InsertLog("Thread Out");
}

View File

@@ -58,6 +58,32 @@ namespace Million.Manager
return dic;
}
/// <summary>
/// Recently Data관련 Data Setting 및 데이터 들고오기
/// </summary>
/// <param name="dataList"></param>
/// <param name="totalIndicatorList"></param>
/// <param name="coinFullName"></param>
/// <returns></returns>
public static Dictionary<MCandleTimeType, List<CandleData>> GetExecuteData(Dictionary<MCandleTimeType, List<CandleDataList>> dataList, List<IndicatorCoditionSetup> totalIndicatorList, string coinFullName)
{
var dic = new Dictionary<MCandleTimeType, List<CandleData>>();
var distinctIndicator = IndicatorSetupManager.Distinct(totalIndicatorList);
foreach (var key in dataList.Keys)
{
var candleDataList = dataList[key].FirstOrDefault(t => t.ConGoodsData.CoinFullName == coinFullName);
dic[key] = candleDataList.CandleDataLists_Im;
var indicatorSetUpList = distinctIndicator.Where(t => t.MCandleTimeType == key).ToList();
foreach (var setup in indicatorSetUpList)
{
setup.excute(dic[key], true);
}
}
return dic;
}
/// <summary>
/// Sub Indicator List String 반환 Function
/// </summary>
@@ -80,5 +106,43 @@ namespace Million.Manager
subIndStringiList = subIndStringiList.Distinct().ToList();
return subIndStringiList;
}
/// <summary>
/// Get Recently Data
/// </summary>
/// <param name="dic"></param>
/// <param name="timeType"></param>
/// <param name="realTimeFlag"></param>
/// <returns></returns>
public static CandleData GetRecentlyData(Dictionary<MCandleTimeType, List<CandleData>> dic, MCandleTimeType timeType = MCandleTimeType.M1, bool realTimeFlag = false)
{
CandleData returnData = null;
var list = dic[timeType];
var orderList = list.OrderByDescending(t => t.DateTime).ToList();
if (orderList.Count > 0)
{
if (realTimeFlag)
{
var recentlyList = orderList.Where(t => t.RecentlyDataFlag).ToList();
if (recentlyList.Count > 0)
returnData = recentlyList[0];
}
else
{
returnData = orderList[0];
}
}
// Parent Recently Data는 indicator에 따라 달라질수 있으므로 전부다 처리한 후 초기화
foreach (var data in dic)
{
var recentlyList = data.Value.Where(t => t.RecentlyDataFlag).ToList();
foreach (var recentlyItem in recentlyList)
recentlyItem.RecentlyDataFlag = false;
}
return returnData;
}
}
}

View File

@@ -1,9 +1,13 @@
using Million.DbManagement;
using Million.Data;
using Million.Data.Upbit;
using Million.DbManagement;
using Million.IndicatorConditionSetup;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Million.CommonProperty;
namespace Million.Manager
{
@@ -12,9 +16,10 @@ namespace Million.Manager
/// </summary>
public static class InitManager
{
#region Common
public static void InitFunc(string marketName, CommonProperty.PaymentType payment)
{
DbServiceFunctions.GetMarketTable_FromDB(marketName, payment.ToString());
DbServiceFunctions.GetMarketTable_FromDB(marketName, Enum.GetName(typeof(PaymentType), payment));
// Result Data DB에 생성
Million.DbManagement.DBConnection.QueryUpdateExcuter
@@ -63,5 +68,75 @@ namespace Million.Manager
{
return Enum.GetNames(enumType: typeof(Million.CommonProperty.PaymentType));
}
#endregion
#region Buyer
/// <summary>
/// Buyer 관련 Init
/// </summary>
/// <param name="checkData"></param>
/// <param name="overlapBuyManagementList"></param>
/// <param name="totalIndicatorList"></param>
public static void BuyerInit(bool checkData, Dictionary<string, bool> overlapBuyManagementList, List<IndicatorCoditionSetup> totalIndicatorList)
{
var coinFullNameList = CommonProperty.selectedMarketOfPlaceList.Select(t => t.CoinFullName).ToList();
foreach (var item in coinFullNameList)
{
if (checkData)
overlapBuyManagementList[item] = false;
else
overlapBuyManagementList[item] = true;
}
foreach (var item in totalIndicatorList)
{
var dic = new Dictionary<string, bool>();
foreach (var codeFullname in coinFullNameList)
{
if (checkData)
dic[codeFullname] = false;
else
dic[codeFullname] = true;
}
CommonProperty.subIndicatorStateManagement[item.IndexString] = dic;
}
}
/// <summary>
/// Buyer에서 사용자가 기존에 가지고 있는 DataList 처리
/// </summary>
/// <param name="accounts"></param>
/// <param name="dataList"></param>
/// <returns></returns>
public static List<CandleDataList> GetBuyListofAccounts(List<Account> accounts, Dictionary<MCandleTimeType, List<CandleDataList>> dataList)
{
var buyList = new List<CandleDataList>();
foreach (var item in accounts)
{
if (item.Currency != "KRW")
{
var buyItem = new CandleDataList();
buyItem.Uuid = "";
var temp = dataList[MCandleTimeType.M1].FirstOrDefault(t => t.ConGoodsData.CoinFullName == item.UnitCurrency + "-" + item.Currency);
if (temp == null) continue;
buyItem.ConGoodsData = temp.ConGoodsData;
var candle = new CandleData();
candle.BuyTime = new DateTime(2000, 1, 1);
candle.BuyValue = item.AvgBuyPrice;
candle.BuyCount = item.Balance;
buyItem.CandleDataLists_Im.Add(candle);
buyList.Add(buyItem);
}
}
return buyList;
}
#endregion
}
}

View File

@@ -21,9 +21,7 @@ namespace Million.Manager
/// </summary>
public List<Ticker> tickerList = new List<Ticker>();
private object obj = new object();
public List<string> coinFullNameList = null;
public List<MarketData> marketList = null;
public List<string> coinFullNameList = null;
public PaymentType buyType = PaymentType.KRW;
public DateTime basicDateTime { get; set; }
public System.Threading.Timer timer = null;
@@ -34,14 +32,13 @@ namespace Million.Manager
/// </summary>
public RealtimeDataSettingManager(List<string> coinFullNameList, PaymentType buyType, string tableName = "Upbit")
{
this.buyType = buyType;
marketList = DbServiceFunctions.GetMarketDatas(tableName, Enum.GetName(typeof(PaymentType), buyType));
this.buyType = buyType;
//null일경우 전체가 가져옴
if (coinFullNameList == null)
{
//Upbit로 임시
this.coinFullNameList = marketList.Select(t => t.CoinFullName).ToList();
this.coinFullNameList = CommonProperty.selectedMarketOfPlaceList.Select(t => t.CoinFullName).ToList();
}
else
{
@@ -86,7 +83,7 @@ namespace Million.Manager
foreach (var item in coinFullNameList)
{
var val = new CandleDataList();
val.ConGoodsData = marketList.FirstOrDefault(t => t.CoinFullName == item);
val.ConGoodsData = CommonProperty.selectedMarketOfPlaceList.FirstOrDefault(t => t.CoinFullName == item);
val.CandleDataLists_Im = CommonProperty.UpbitApi.GetCandleStics(item, timeType, basicDateTime, count).OrderBy(t => t.DateTime).ToList();
returnData.Add(val);
Thread.Sleep(400);