결과값 적용

This commit is contained in:
DESKTOP-1A3P75F\lee
2022-04-15 15:14:08 +09:00
parent c7a1645465
commit d0d92e0404
11 changed files with 310 additions and 32 deletions

View File

@@ -54,9 +54,9 @@ namespace Million_Prototype
var dateTime = DateTime.Now;
//4시간 가져오기
foreach(var krw in dataList)
foreach (var krw in dataList)
{
krw.CandleDataLists_Im= UpbitApi.GetCandleStics(krw.ConGoodsData.CodeFullName, MCandleTimeType.H4, dateTime);
krw.CandleDataLists_Im = UpbitApi.GetCandleStics(krw.ConGoodsData.CodeFullName, MCandleTimeType.H4, dateTime);
}
/*
@@ -87,7 +87,7 @@ namespace Million_Prototype
foreach (var krw in krwList)
{
//candledataList.Add(uApi.GetCandleStics(krw.CodeFullName, Million.CommonProperty.MCandleTimeType.D1, DateTime.Now, 50));
}
@@ -100,7 +100,7 @@ namespace Million_Prototype
public void setCandleDataList(List<CandleDataList> dataList, List<MarketData> marketDataList)
{
foreach(var marketData in marketDataList)
foreach (var marketData in marketDataList)
{
dataList.Add(new CandleDataList()
{
@@ -117,13 +117,13 @@ namespace Million_Prototype
var tableList = CommonProperty.selectedMarketOfPlaceList;
var selectTable = tableList.FirstOrDefault(t => t.CodeFullName == "KRW-BTC");
if(selectTable != null)
if (selectTable != null)
{
var startDate = new DateTime(2000, 1, 1);
var candleData = DbServiceFunctions.GetCandleData(selectTable, startDate, 100000, MCandleTimeType.M1);
Bollinger_Bands.AddMovingAndBollingerBands(candleData.CandleDataLists_Im, 40, 2);
Bollinger_Bands.AddMovingAndBollingerBands(candleData.CandleDataLists_Im, 40, 1,false);
Bollinger_Bands.AddMovingAndBollingerBands(candleData.CandleDataLists_Im, 40, 1, false);
Ichimoku_cloud.excute(candleData.CandleDataLists_Im);
var resultdata = candleData.CandleDataLists_Im.FindAll(x => x.IndicatorDic["Bol401"].overStatus == OverStatus.Over);
@@ -137,7 +137,7 @@ namespace Million_Prototype
List<CandleDataList> list = null;
DataSettingManager realTimeMsg = null;
int firstFlag = 0;
for(; ; )
for (; ; )
{
if (firstFlag == 0)
{
@@ -149,14 +149,15 @@ namespace Million_Prototype
}
else
{
if (firstFlag == 1) {
if (firstFlag == 1)
{
firstFlag = 2;
realTimeMsg.EndRealTimeTicker();
realTimeMsg.EndRealTimeTicker();
list = realTimeMsg.ProcessRecentlyCandleDatas(list, realTimeMsg.tickerList, MCandleTimeType.M1);
realTimeMsg.StartGetRealTimeTicker(null);
}
else if(firstFlag == 2)
else if (firstFlag == 2)
{
list = realTimeMsg.ProcessRecentlyCandleDatas(list, realTimeMsg.tickerList, MCandleTimeType.M1);
// 1분 간격
@@ -175,17 +176,20 @@ namespace Million_Prototype
{
DbServiceFunctions.GetMarketTable_FromDB("Upbit");
var tableList = CommonProperty.selectedMarketOfPlaceList;
var resultList = new List<SearchResult>();
var errorResultList = new List<SearchResult>();
foreach (var marketData in tableList)
{
{
var buyCandleList = new List<CandleDataList>();
var sellList = new List<CandleData>();
if (marketData != null)
{
//사는 로직
var candleDataH1 = new CandleDataList();
var candleDataM1 = new CandleDataList();
var splitData = ValidationCheckManager.GetValidationCandleDatas(marketData, ref candleDataM1, new DateTime(2000,1,1), DateTime.Now);
var splitData = ValidationCheckManager.GetValidationCandleDatas(marketData, ref candleDataH1, ref candleDataM1, new DateTime(2020, 3, 1), DateTime.Now);
var buyData = new CandleDataList();
buyData.ConGoodsData = marketData;
@@ -193,20 +197,132 @@ namespace Million_Prototype
foreach (var split in splitData)
{
var overData = split.FindAll(x => (int)x.IndicatorDic["Bol401"].overStatus > -2 && x.IndicatorDic["Bol401"].overStatus != OverStatus.None
var overData = split.FindAll(x => (int)x.IndicatorDic["Bol401"].overStatus >= -2 && x.IndicatorDic["Bol401"].overStatus != OverStatus.None
&& ((IchimokData)x.IndicatorDic["Ich"]).value < x.StartValue && ((IchimokData)x.IndicatorDic["Ich"]).value2 < x.StartValue);
buyData = BuyLogicManager.GetBuyLogicByBol401Upper(overData, candleDataM1);
buyCandleList.Add(buyData);
}
buyCandleList.Add(buyData);
//파는 로직
foreach (var item in splitData)
{
var sell1 = SellLogicManager.GetSellLogicOverUnderIch(item);
var sell2 = SellLogicManager.GetSellLogicOVerUnderBol(item, 40, 1);
var sell3 = SellLogicManager.GetSellLogicOVerUnderBol(item, 40, 2);
sell1.AddRange(sell2);
sell1.AddRange(sell3);
var dateTimeList = sell1.Select(t => t.DateTime).Distinct().ToList();
foreach (var date in dateTimeList)
{
sellList.Add(sell1.FirstOrDefault(t => t.DateTime == date));
}
}
//Result 계산
foreach (var item in buyCandleList)
{
var result = new SearchResult();
result.BuyList.ConGoodsData = marketData;
if (item.CandleDataLists_Im.Count > 0)
{
var sellData = sellList.FirstOrDefault(t => t.DateTime > item.CandleDataLists_Im[0].DateTime);
foreach (var buy in item.CandleDataLists_Im)
{
if (buy.DateTime < sellData.DateTime)
{
result.BuyList.CandleDataLists_Im.Add(buy);
}
else
{
var sDate = result.BuyList.CandleDataLists_Im[0].DateTime;
var eDate = sellData.DateTime;
//Result Data Setting
result.TermCandleDataList = candleDataM1.CandleDataLists_Im.Where(x => x.DateTime >= sDate && x.DateTime <= eDate).ToList();
result.CodeFullName = result.BuyList.ConGoodsData.CodeFullName;
result.StartDate = sDate;
result.EndDate = eDate;
var sellLogicKeys = result.SellData.SellLogicFlag.Keys;
double sellValue = 0;
#region 파는 값 계산(파는 로직 중 제일 높은 값)
var key = Enum.GetName(typeof(CommonProperty.SellLogicKeyList), CommonProperty.SellLogicKeyList.IchMok);
if (result.SellData.SellLogicFlag.ContainsKey(key))
{
if(sellValue < ((IchimokData) result.SellData.IndicatorDic["Ich"]).GetOverValue())
{
sellValue = ((IchimokData)result.SellData.IndicatorDic["Ich"]).GetOverValue();
}
}
key = Enum.GetName(typeof(CommonProperty.SellLogicKeyList), CommonProperty.SellLogicKeyList.Bol) + "401";
if (result.SellData.SellLogicFlag.ContainsKey(key))
{
if (sellValue < result.SellData.IndicatorDic[key].overlapValue)
{
sellValue = result.SellData.IndicatorDic[key].overlapValue;
}
}
key = Enum.GetName(typeof(CommonProperty.SellLogicKeyList), CommonProperty.SellLogicKeyList.Bol) + "402";
if (result.SellData.SellLogicFlag.ContainsKey(key))
{
if (sellValue < result.SellData.IndicatorDic[key].overlapValue)
{
sellValue = result.SellData.IndicatorDic[key].overlapValue;
}
}
result.SellValue = sellValue;
#endregion
#region Rating 계산
double totalVal = 0;
foreach (var x in result.BuyList.CandleDataLists_Im)
{
var dateTime = x.DateTime.AddMinutes(x.DateTime.Minute);
var hCandle = candleDataH1.CandleDataLists_Im.FirstOrDefault(t => t.DateTime == dateTime);
var buyValue = hCandle.IndicatorDic[Enum.GetName(typeof(CommonProperty.SellLogicKeyList), CommonProperty.SellLogicKeyList.Bol) + "401"].overlapValue;
var rate = ((sellValue - buyValue) / buyValue) * 100;
result.BuyEarningRate.Add(rate);
result.BuyValueList.Add(buyValue);
totalVal += rate;
}
result.TotalEarningRate = totalVal / result.BuyValueList.Count;
#endregion
var errorList = ValidationCheckManager.ValidateCandleDataList(result.TermCandleDataList, "", MCandleTimeType.M1);
if (errorList.Count == 0)
{
result.SellData = sellData;
resultList.Add(result);
}
else
{
result.SellData = sellData;
errorResultList.Add(result);
}
result = new SearchResult();
result.BuyList.CandleDataLists_Im.Add(buy);
sellData = sellList.FirstOrDefault(t => t.DateTime > buy.DateTime);
}
}
}
}
sellList.ToString();
}
var sellCandleList = new List<CandleDataList>();
}
resultList.ToString();
}
}
}

View File

@@ -174,5 +174,13 @@ namespace Million
#endregion
#region Sell Logic Key List
public enum SellLogicKeyList
{
IchMok = 1,
Bol = 2
}
#endregion
}
}

View File

@@ -33,6 +33,7 @@ namespace Million.Data
public Dictionary<string, IndicatorData> IndicatorDic = new Dictionary<string, IndicatorData>();
public Dictionary<string, bool> SellLogicFlag = new Dictionary<string, bool>();
public CandleType CandleType { get; set; } = CandleType.None;

View File

@@ -5,8 +5,8 @@ namespace Million.Data
public class CandleDataList
{
// 코인 종목
public MarketData ConGoodsData { get; set; }
public MarketData ConGoodsData { get; set; } = new MarketData();
// 캔들 데이터 (1분)
public List<CandleData> CandleDataLists_Im { get; set; }
public List<CandleData> CandleDataLists_Im { get; set; } = new List<CandleData>();
}
}

View File

@@ -23,17 +23,36 @@ namespace Million.Data
/// </summary>
public OverStatus overStatus2 = OverStatus.None;
/// <summary>
/// 선행1,2중에 위의 값을 리턴함
/// </summary>
/// <returns></returns>
public Indicator_over GetOverIndicator()
{
if (value == 0 && value2 == 0)
return Indicator_over.None;
return value > value2 ? indicator_over : indicator_over2;
}
public OverStatus GetOverStatus()
{
if (value == 0 && value2 == 0)
return OverStatus.None;
return value > value2 ? overStatus : overStatus2;
}
/// <summary>
/// 두 선행스팬 값중에 위의 값을 리턴함
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static double GetOverValue(IchimokData data)
public double GetOverValue()
{
if (data.value == 0 || data.value2 == 0)
if (value == 0 || value2 == 0)
return 0;
return data.value > data.value2 ? data.value : data.value2;
return value > value2 ? value : value2;
}
}

View File

@@ -193,6 +193,6 @@ namespace Million.Data
Over = 1
}
}

View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Million.Data
{
/// <summary>
/// 검색기 결과 클래스
/// </summary>
public class SearchResult
{
public CandleDataList BuyList { get; set; } = new CandleDataList();
public CandleData SellData { get; set; } = new CandleData();
public List<CandleData> TermCandleDataList { get; set; } = new List<CandleData>();
public string CodeFullName { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public List<double> BuyEarningRate { get; set; } = new List<double>();
public List<double> BuyValueList { get; set; } = new List<double>();
public double SellValue;
public double TotalEarningRate;
}
}

View File

@@ -16,6 +16,7 @@ namespace Million.Manager
public static CandleDataList GetBuyLogicByBol401Upper(List<CandleData> overData, CandleDataList candleDataM1)
{
var returnData = new CandleDataList();
foreach (var item in overData)
{

View File

@@ -1,4 +1,5 @@
using System;
using Million.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -11,5 +12,43 @@ namespace Million.Manager
/// </summary>
public static class SellLogicManager
{
/// <summary>
/// 일목 하향돌파(선형1,2중 큰값) 판매 조건 계산
/// </summary>
/// <param name="overData"></param>
/// <param name="candleDataM1"></param>
/// <returns></returns>
public static List<CandleData> GetSellLogicOverUnderIch(List<CandleData> candleDataM)
{
var list = candleDataM.Where(t => t.IndicatorDic.ContainsKey("Ich") &&
t.IndicatorDic["Ich"] != null &&
((IchimokData)t.IndicatorDic["Ich"]).GetOverStatus() <= OverStatus.UnderOver).ToList();
foreach(var item in list)
{
item.SellLogicFlag[Enum.GetName(typeof(CommonProperty.SellLogicKeyList), CommonProperty.SellLogicKeyList.IchMok)] = true;
}
return list;
}
/// <summary>
/// Bol 하향돌파
/// </summary>
/// <param name="overData"></param>
/// <param name="candleDataM1"></param>
/// <returns></returns>
public static List<CandleData> GetSellLogicOVerUnderBol(List<CandleData> candleDataM, int period, int factor)
{
var keyName = "Bol" + period.ToString() + factor.ToString();
var list = candleDataM.Where(t => t.IndicatorDic.ContainsKey(keyName) &&
t.IndicatorDic[keyName] != null &&
t.IndicatorDic[keyName].overStatus <= OverStatus.UnderOver).ToList();
foreach (var item in list)
{
item.SellLogicFlag[keyName] = true;
}
return list;
}
}
}

View File

@@ -78,6 +78,58 @@ namespace Million.Manager
return returnData;
}
public static List<ErrorCandleData> ValidateCandleDataList(List<CandleData> candleDatas,string codeFullName, MCandleTimeType type = MCandleTimeType.M1)
{
var returnData = new List<ErrorCandleData>();
if (candleDatas == null) return returnData;
var datas = candleDatas;
if (datas == null || datas.Count < 2) return returnData;
for (var i = 1; i < datas.Count; i++)
{
var currentData = datas[i];
var beforeData = datas[i - 1];
if (type == MCandleTimeType.M1)
{
var beforeDataM = beforeData.DateTime.Minute;
var currentDataM = currentData.DateTime.Minute;
if (currentDataM == 0) currentDataM = 60;
if (currentDataM - beforeDataM == 1) continue;
var errorCandleData = new ErrorCandleData();
errorCandleData.CodeFullName = codeFullName;
errorCandleData.ErrorEndData = currentData;
errorCandleData.ErrorEndDate = beforeData.DateTime;
errorCandleData.ErrorStartData = beforeData;
errorCandleData.ErrorStartDate = currentData.DateTime;
returnData.Add(errorCandleData);
}
else if (type == MCandleTimeType.H1)
{
var beforeDataH = beforeData.DateTime.Hour;
var currentDataH = currentData.DateTime.Hour;
if (currentDataH == 0) currentDataH = 24;
if (currentDataH - beforeDataH == 1) continue;
var errorCandleData = new ErrorCandleData();
errorCandleData.CodeFullName = codeFullName;
errorCandleData.ErrorEndData = currentData;
errorCandleData.ErrorEndDate = beforeData.DateTime;
errorCandleData.ErrorStartData = beforeData;
errorCandleData.ErrorStartDate = currentData.DateTime;
returnData.Add(errorCandleData);
}
}
return returnData;
}
/// <summary>
/// 가치 있는 데이터만 잘라서 넣는 데이터
/// </summary>
@@ -148,7 +200,7 @@ namespace Million.Manager
/// Candle Data 기준 사용가능한 Candle Data Return 해주는 함수
/// </summary>
/// <returns></returns>
public static List<List<CandleData>> GetValidationCandleDatas(MarketData marketData,ref CandleDataList candleDataM1, DateTime startDate, DateTime endDate)
public static List<List<CandleData>> GetValidationCandleDatas(MarketData marketData, ref CandleDataList candleDataH1, ref CandleDataList candleDataM1, DateTime startDate, DateTime endDate)
{
if(startDate == null)
startDate = new DateTime(2000, 1, 1);
@@ -156,13 +208,18 @@ namespace Million.Manager
if (endDate == null)
endDate = DateTime.Now;
var candleData = DbServiceFunctions.GetCandleData(marketData, startDate, DateTime.Now, MCandleTimeType.H1);
//1시간
candleDataH1 = DbServiceFunctions.GetCandleData(marketData, startDate, DateTime.Now, MCandleTimeType.H1);
Bollinger_Bands.AddMovingAndBollingerBands(candleDataH1.CandleDataLists_Im, 40, 1);
Ichimoku_cloud.excute(candleDataH1.CandleDataLists_Im);
//1분봉
candleDataM1 = DbServiceFunctions.GetCandleData(marketData, startDate, DateTime.Now, MCandleTimeType.M1);
Bollinger_Bands.AddMovingAndBollingerBands(candleDataM1.CandleDataLists_Im, 40, 1);
Bollinger_Bands.AddMovingAndBollingerBands(candleDataM1.CandleDataLists_Im, 40, 2, false);
Ichimoku_cloud.excute(candleDataM1.CandleDataLists_Im);
return ValidationCheckManager.SplitValidationCandleDataList(candleData.CandleDataLists_Im, MCandleTimeType.H1);
return SplitValidationCandleDataList(candleDataH1.CandleDataLists_Im, MCandleTimeType.H1);
}
/// <summary>

View File

@@ -108,6 +108,7 @@
<Compile Include="Data\IndicatorData.cs" />
<Compile Include="Data\MarketData.cs" />
<Compile Include="Data\MovingAverageData.cs" />
<Compile Include="Data\SearchResult.cs" />
<Compile Include="Data\Upbit\Account.cs" />
<Compile Include="Data\Upbit\Conclusion.cs" />
<Compile Include="Data\Upbit\OrderableInformation\OrderableInformation_Account.cs" />