This commit is contained in:
kyh
2025-01-31 12:05:21 +09:00
parent c7d6235224
commit 9d31413579

View File

@@ -76,7 +76,7 @@ namespace BitgetAPI.IndicatorConditionSetup
// 스레드 시작/종료 플래그
public bool Is_th_SignalInfo;
public Dictionary<string, Dictionary<string, double>> 전저고점 = new Dictionary<string, Dictionary<string, double>>();
public List<object> checkedMarkets;
public List<object> intervalList;
@@ -127,7 +127,7 @@ namespace BitgetAPI.IndicatorConditionSetup
public Dictionary<string, bool> BuyShortStep = new Dictionary<string, bool>();
public Dictionary<string, bool> BuyLongStep = new Dictionary<string, bool>();
public int 전가Flag = 1;
@@ -158,7 +158,7 @@ namespace BitgetAPI.IndicatorConditionSetup
//var sellData = FutureOrder("XRPUSDT", FutureMarginMode.isolated, 10, 0, FutureSide.SellShort, OrderType.market, 10, orderDic["orderId"]);
var firstFlag = true;
// 추후 공통화 및 소스정리 필요
while (true)
{
@@ -272,25 +272,28 @@ namespace BitgetAPI.IndicatorConditionSetup
candleDatas_Temp_List.Add(candleData_Main);
ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main);
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main);
if(i > 210)
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main);
if (i > 210)
{
var 현재봉3_Temp = candleDatas_Temp_List[i].movingAverageDataList[3].Value;
var 전봉3_Temp = candleDatas_Temp_List[i-1].movingAverageDataList[3].Value;
var 전전봉3_Temp = candleDatas_Temp_List[i-2].movingAverageDataList[3].Value;
var 전전전봉3_Temp = candleDatas_Temp_List[i-3].movingAverageDataList[3].Value;
var 전봉3_Temp = candleDatas_Temp_List[i - 1].movingAverageDataList[3].Value;
var 전전봉3_Temp = candleDatas_Temp_List[i - 2].movingAverageDataList[3].Value;
var 전전전봉3_Temp = candleDatas_Temp_List[i - 3].movingAverageDataList[3].Value;
var returnVal = Calculate전고점(market, strInterval, interval, 전봉3_Temp, 전전봉3_Temp, 전전전봉3_Temp, candleDatas_Temp_List[candleDatas_Temp_List.Count - 1]);
}
}
}
}
if (!BuyShortStep.ContainsKey(market + strInterval)) {
if (!BuyShortStep.ContainsKey(market + strInterval))
{
BuyShortStep[market + strInterval] = false;
BuyLongStep[market + strInterval] = false;
}
#region Main 처리
if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m")))
continue;
#region 1분봉 처리
// 시간별로 정렬하기 (임시 리스트)
var candleDatas = findedMarket.candleDataList[MCandleTimeType.M1];
var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList();
@@ -509,7 +512,6 @@ namespace BitgetAPI.IndicatorConditionSetup
var 전전봉80 = candleData_전전봉.movingAverageDataList[80].Value;
//var 전전봉480 = candleData_전전봉.movingAverageDataList[480].Value;
var 전봉3 = candleData_전봉.movingAverageDataList[3].Value;
var 전봉4 = candleData_전봉.movingAverageDataList[4].Value;
var 전봉8 = candleData_전봉.movingAverageDataList[8].Value;
@@ -579,13 +581,12 @@ namespace BitgetAPI.IndicatorConditionSetup
var 전전봉3_5 = candleData_5_전전봉.movingAverageDataList[3].Value;
var 전전전봉3_5 = candleData_5_전전전봉.movingAverageDataList[3].Value;
var 현재봉3_30 = candleData_5.movingAverageDataList[3].Value;
var 현재봉3_30 = candleData_30.movingAverageDataList[3].Value;
var 전봉3_30 = candleData_30_전봉.movingAverageDataList[3].Value;
var 전전봉3_30 = candleData_30_전전봉.movingAverageDataList[3].Value;
var 전전전봉3_30 = candleData_30_전전전봉.movingAverageDataList[3].Value;
if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m")))
continue;
var 저고점_1 = 전저고점[market + "1m"];
var 저고점_5 = 전저고점[market + "5m"];
@@ -609,28 +610,29 @@ namespace BitgetAPI.IndicatorConditionSetup
var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
//전 저점 계산
try
{
{
//사는 시점
if (!UpBuyList.ContainsKey(market + interval))
if (!UpBuyList.ContainsKey(market))
{
if ((int)interval != 1)
{
continue;
}
var buyFlag = false;
// 30분봉
var flag_30 = (저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && 현재봉3_30 > 저고점_30["전저가"])
|| (저고점_30["전전저가"] > 저고점_30["전저가"] && candleData_30.High > 저고점_30["전고가"]);
var flag_30 = (저고점_30["전전전저가"] > 저고점_30["전전저가"]
&& (저고점_30["전전저가"] < 전봉3 && 저고점_30["전전저가"] < 전전봉3 && 저고점_30["전전저가"] < 현재봉3 && 전전봉3 > 전봉3 && 전봉3 < 현재봉3)
&& 현재봉3_30 > 저고점_30["전고가"])
|| (저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && 현재봉3_30 > 저고점_30["전고가"])
|| (저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] > 저고점_30["전저가"] && 현재봉3_30 > 저고점_30["전고가"]);
var flag_5 = (저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && candleData_5.High > 저고점_5["전고가"])
|| (저고점_5["전전저가"] > 저고점_5["전저가"] && candleData_5.High > 저고점_5["전고가"]);
var flag_5 = (저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && 현재봉3_5 > 저고점_5["전고가"])
|| (저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] > 저고점_5["전저가"] && 현재봉3_5 > 저고점_5["전고가"]);
var flag_1 = 현재봉3 > 현재봉24 && 현재봉3 > 현재봉48 && 현재봉3 > 현재봉72 && 현재봉3 > 현재봉120;
if (flag_30 && flag_5 && flag_1) {
if (flag_30 && flag_5 && flag_1)
{
buyFlag = true;
}
@@ -657,13 +659,13 @@ namespace BitgetAPI.IndicatorConditionSetup
{
{ "MarketName", market },
{ "BuyDate", nowTime },
{ "Price", price },
{ "Price", price },
{ "MCandleTimeType", (int)interval },
{ "CandleTime", candleData.Argument },
{ "CandleTime", candleData.Argument },
{ "Candle", candleData }
};
UpBuyList.Add(market + interval, buyDic);
UpBuyList.Add(market, buyDic);
var dic = new Dictionary<int, bool>
{
@@ -673,7 +675,7 @@ namespace BitgetAPI.IndicatorConditionSetup
[4] = false,
[5] = false
};
SellLongStep.Add(market + interval, dic);
SellLongStep.Add(market, dic);
if (LongCount < 5)
{
double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
@@ -698,16 +700,13 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
}
//파는 시점
else
{
if ((int)interval != 30)
{
continue;
}
var buyItem = UpBuyList[market + interval];
var flag = (bool)buyItem["Flag"];
var buyItem = UpBuyList[market];
if (interval < MCandleTimeType.H1)
{
var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
@@ -723,7 +722,7 @@ namespace BitgetAPI.IndicatorConditionSetup
}
var sellFlag = false;
if (저고점_30["전저가"] > 현재봉3)
if (저고점_30["전저가"] > 전봉3 || 저고점_30["전고가"] < 저고점_30["전전고가"])
sellFlag = true;
@@ -731,7 +730,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{
double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
var resultRate = ((price - buyPrice) / buyPrice) * 100;
BuyLongStep[market + interval] = false;
BuyLongStep[market] = false;
var result = new Dictionary<string, object>()
{
{ "MarketName", market },
@@ -747,8 +746,8 @@ namespace BitgetAPI.IndicatorConditionSetup
};
UpResultList.Add(result);
UpBuyList.Remove(market + interval);
SellLongStep.Remove(market + interval);
UpBuyList.Remove(market);
SellLongStep.Remove(market);
var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market);
@@ -792,6 +791,7 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
}
}
@@ -813,75 +813,77 @@ namespace BitgetAPI.IndicatorConditionSetup
try
{
//사는 시점
if (!DownBuyList.ContainsKey(market + interval))
if (!DownBuyList.ContainsKey(market))
{
if ((int)interval != 1)
{
continue;
}
var buyFlag = false;
var buyFlag = false;
//var flag_30 = (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"])
// || (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"]);
var flag_30 = (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전고가"])
|| (저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30.Low < 저고점_30["전저가"]);
var flag_30 = (저고점_30["전전전고가"] < 저고점_30["전전고가"]
&& (저고점_30["전전고가"] > 전봉3 && 저고점_30["전전고가"] > 전전봉3 && 저고점_30["전전고가"] > 현재봉3 && 전전봉3 < 전봉3 && 전봉3 > 현재봉3)
&& 현재봉3_30 < 저고점_30["전저가"])
|| (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"])
|| (저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && 현재봉3_30 < 저고점_30["전저가"]);
var flag_5 = (저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && candleData_5.Low < 저고점_5["전저가"])
|| (저고점_5["전전고가"] < 저고점_5["전고가"] && candleData_5.Low < 저고점_5["전저가"]);
var flag_5 = (저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && 현재봉3_5 < 저고점_5["전저가"])
|| (저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] < 저고점_5["전고가"] && 현재봉3_5 < 저고점_5["전저가"]);
var flag_1 = 현재봉3 < 현재봉24 && 현재봉3 < 현재봉48 && 현재봉3 < 현재봉72 && 현재봉3 < 현재봉120;
var flag_1 = 현재봉3 < 현재봉24 && 현재봉3 < 현재봉48 && 현재봉3 < 현재봉72 && 현재봉3 < 현재봉120;
if (flag_30 && flag_5 && flag_1)
{
buyFlag = true;
}
if (buyFlag)
{
// 없으면 생성
if (signalData == null)
if (flag_30 && flag_5 && flag_1)
{
SignalInfoData signalInfoData = new SignalInfoData();
signalInfoData.SignalStart = nowTime;
signalInfoData.MarketName = market;
signalInfoData.Description = description;
signalInfoData.Rate = rate;
signalInfoData.Price = price;
signalInfoData.IndicatorPrice = indicatorPrice;
signalInfoData.IndicatorRate = indicatorRate;
signalInfoData.MCandleTimeType = interval;
signals_SD.Add(signalInfoData);
buyFlag = true;
}
var buyDic = new Dictionary<string, object>
if (buyFlag)
{
// 없으면 생성
if (signalData == null)
{
SignalInfoData signalInfoData = new SignalInfoData();
signalInfoData.SignalStart = nowTime;
signalInfoData.MarketName = market;
signalInfoData.Description = description;
signalInfoData.Rate = rate;
signalInfoData.Price = price;
signalInfoData.IndicatorPrice = indicatorPrice;
signalInfoData.IndicatorRate = indicatorRate;
signalInfoData.MCandleTimeType = interval;
signals_SD.Add(signalInfoData);
}
var buyDic = new Dictionary<string, object>
{
{ "MarketName", market },
{ "BuyDate", nowTime },
{ "Price", price },
{ "MCandleTimeType", (int)interval },
{ "CandleTime", candleData.Argument },
{ "MCandleTimeType", (int)interval },
{ "CandleTime", candleData.Argument },
{ "Candle", candleData }
};
DownBuyList.Add(market + interval, buyDic);
var dic = new Dictionary<int, bool>
{
[1] = true,
[2] = false,
[3] = false,
[4] = false,
[5] = false
};
SellShortStep.Add(market + interval, dic);
if (ShortCount < 5)
{
double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage);
if (orderData != null)
DownBuyList.Add(market, buyDic);
var dic = new Dictionary<int, bool>
{
var orderDic = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(orderData["data"]));
[1] = true,
[2] = false,
[3] = false,
[4] = false,
[5] = false
};
SellShortStep.Add(market, dic);
var orderDataDic = new Dictionary<string, object>
if (ShortCount < 5)
{
double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage);
if (orderData != null)
{
var orderDic = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(orderData["data"]));
var orderDataDic = new Dictionary<string, object>
{
{ "MarketName", market },
{ "BuyDate", nowTime },
@@ -891,24 +893,19 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "Size", size },
{ "orderId", orderDic["orderId"] }
};
BuyShortList.Add(orderDataDic);
ShortCount++;
BuyShortList.Add(orderDataDic);
ShortCount++;
}
}
}
}
}
//파는 시점
else
{
if ((int)interval != 30)
{
continue;
}
var sellFlag = false;
var buyItem = DownBuyList[market + interval];
var flag = (bool)buyItem["Flag"];
{
var buyItem = DownBuyList[market];
if (interval < MCandleTimeType.H1)
{
var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
@@ -922,13 +919,15 @@ namespace BitgetAPI.IndicatorConditionSetup
if (nowTime < buyTime)
continue;
}
var sellFlag = false;
if (저고점_30["전고가"] < 현재봉3)
if (저고점_30["전고가"] < 전봉3 || 저고점_30["전저가"] > 저고점_30["전전저가"])
sellFlag = true;
if (sellFlag)
{
BuyShortStep[market + interval] = false;
BuyShortStep[market] = false;
double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
var resultRate = ((price - buyPrice) / buyPrice) * 100;
@@ -947,8 +946,8 @@ namespace BitgetAPI.IndicatorConditionSetup
};
DownResultList.Add(result);
DownBuyList.Remove(market + interval);
SellShortStep.Remove(market + interval);
DownBuyList.Remove(market);
SellShortStep.Remove(market);
var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market);
if (orderDic != null)
@@ -993,6 +992,7 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
}
}
catch (Exception e)
{
@@ -1017,11 +1017,11 @@ namespace BitgetAPI.IndicatorConditionSetup
//전저가
if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 &&
저고점["tempLowVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute &&
(candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempHighVal"] > 2 * (int)type)
저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() &&
((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] >= 120 * (int)type)
{
저고점["tempLow2Val"] = 저고점["tempLowVal"];
저고점["tempLowVal"] = candleData.Argument.Hour * 60 + candleData.Argument.Minute;
저고점["tempLowVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds();
저고점["switchLowVal"] = 저고점["전전전전저가"];
저고점["전전전전저가"] = 저고점["전전저가"];
저고점["전전전저가"] = 저고점["전전저가"];
@@ -1030,8 +1030,8 @@ namespace BitgetAPI.IndicatorConditionSetup
}
else if (전봉3 > 전전봉3 && 전전봉3 < 전전전봉3 &&
저고점["tempLowVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute &&
(candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempHighVal"] <= 2 * (int)type)
저고점["tempLowVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() &&
((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempHighVal"] < 120 * (int)type)
{
//이전으로 초기화 작업(High)
저고점["전고가"] = 저고점["전전고가"];
@@ -1046,11 +1046,11 @@ namespace BitgetAPI.IndicatorConditionSetup
//전고가
if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 &&
저고점["tempHighVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute &&
(candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempLowVal"] > 2 * (int)type)
저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() &&
((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] >= 120 * (int)type)
{
저고점["tempHigh2Val"] = 저고점["tempHighVal"];
저고점["tempHighVal"] = candleData.Argument.Hour * 60 + candleData.Argument.Minute;
저고점["tempHighVal"] = ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds();
저고점["switchHighVal"] = 저고점["전전전전고가"];
저고점["전전전전고가"] = 저고점["전전전고가"];
저고점["전전전고가"] = 저고점["전전고가"];
@@ -1058,8 +1058,8 @@ namespace BitgetAPI.IndicatorConditionSetup
저고점["전고가"] = 전전봉3;
}
else if (전전봉3 > 전봉3 && 전전봉3 > 전전전봉3 &&
저고점["tempHighVal"] != candleData.Argument.Hour * 60 + candleData.Argument.Minute &&
(candleData.Argument.Hour * 60 + candleData.Argument.Minute) - 저고점["tempLowVal"] < 2 * (int)type)
저고점["tempHighVal"] != ((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() &&
((DateTimeOffset)candleData.Argument).ToUnixTimeSeconds() - 저고점["tempLowVal"] < 120 * (int)type)
{
//이전으로 초기화 작업(Low)
저고점["전저가"] = 저고점["전전저가"];
@@ -1070,7 +1070,7 @@ namespace BitgetAPI.IndicatorConditionSetup
if (저고점["전고가"] < 전전봉3)
저고점["전고가"] = 전전봉3;
}
}
if (저고점["전전전저가"] == 0 || 저고점["전전전고가"] == 0)
return false;