Buyer 관련 Main 로직 함수 분기 1차
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user