high 조건 추가

This commit is contained in:
kyh
2025-08-11 09:56:02 +09:00
parent d030c3004c
commit d9ad08d6ad
2 changed files with 100 additions and 81 deletions

View File

@@ -230,88 +230,88 @@ namespace BitgetAPI.IndicatorConditionSetup
// Description
var strInterval = Utils.Convertor.GetEnumDescription((Enum)interval);
if (!intervalList.Contains(strInterval)) continue;
/*
if (nowTime.Minute == 0 && nowTime.Hour == 24 && 전저고점Flag)
{
전저고점.Clear();
전저고점Flag = false;
}
//if (nowTime.Minute == 0 && nowTime.Hour == 24 && 전저고점Flag)
//{
// 전저고점.Clear();
// 전저고점Flag = false;
//}
if (!전저고점.ContainsKey(market + strInterval))
if (!FirstFlag.ContainsKey(market + strInterval + "Long"))
{
FirstFlag.Add(market + strInterval + "Long", false);
FirstFlag.Add(market + strInterval + "Short", false);
var dic = new Dictionary<string, double>
{
{ "전고가", 0 },
{ "전저가", 0 },
{ "전전고가", 0 },
{ "전전저가", 0 },
{ "전전전저가", 0 },
{ "전전전고가", 0 },
{ "전전전전저가", 0 },
{ "전전전전고가", 0 },
{ "tempHighVal", 0 },
{ "tempLowVal", 0 },
{ "tempHigh2Val", 0 },
{ "tempLow2Val", 0 },
{ "tempHigh3Val", 0 },
{ "tempLow3Val", 0 },
{ "tempHigh4Val", 0 },
{ "tempLow4Val", 0 },
{ "switchLowVal", 0 },
{ "switchHighVal", 0 }
};
//var dic = new Dictionary<string, double>
//{
// { "전고가", 0 },
// { "전저가", 0 },
// { "전전고가", 0 },
// { "전전저가", 0 },
// { "전전전저가", 0 },
// { "전전전고가", 0 },
// { "전전전전저가", 0 },
// { "전전전전고가", 0 },
// { "tempHighVal", 0 },
// { "tempLowVal", 0 },
// { "tempHigh2Val", 0 },
// { "tempLow2Val", 0 },
// { "tempHigh3Val", 0 },
// { "tempLow3Val", 0 },
// { "tempHigh4Val", 0 },
// { "tempLow4Val", 0 },
// { "switchLowVal", 0 },
// { "switchHighVal", 0 }
//};
전저고점.Add(market + strInterval, dic);
//전저고점.Add(market + strInterval, dic);
var candleDatas_Temp = findedMarket.candleDataList[interval];
var candleDatas_정렬_Temp = candleDatas_Temp.OrderBy(i => i.Argument).ToList();
var candleDatas_Temp_List = new List<CandleData>();
//var candleDatas_Temp = findedMarket.candleDataList[interval];
//var candleDatas_정렬_Temp = candleDatas_Temp.OrderBy(i => i.Argument).ToList();
//var candleDatas_Temp_List = new List<CandleData>();
totalImperseMACDData[market + strInterval] = new Dictionary<DateTime, ImpulseMacdData>();
//totalImperseMACDData[market + strInterval] = new Dictionary<DateTime, ImpulseMacdData>();
for (var i = 0; i < 199; i++)
candleDatas_Temp_List.Add(candleDatas_정렬_Temp[i]);
//for (var i = 0; i < 199; i++)
// candleDatas_Temp_List.Add(candleDatas_정렬_Temp[i]);
for (var i = 199; i < candleDatas_정렬_Temp.Count; i++)
{
//for (var i = 199; i < candleDatas_정렬_Temp.Count; i++)
//{
var candleData_Main = candleDatas_정렬_Temp[i];
// var candleData_Main = candleDatas_정렬_Temp[i];
if (candleData_Main == null) continue;
// if (candleData_Main == null) continue;
candleDatas_Temp_List.Add(candleData_Main);
// candleDatas_Temp_List.Add(candleData_Main);
ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main);
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main);
// ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main);
// movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_Temp_List, candleData_Main);
if (i > 210)
{
var 현재봉4_Temp = candleDatas_Temp_List[i].movingAverageDataList[4].Value;
var 전봉4_Temp = candleDatas_Temp_List[i - 1].movingAverageDataList[4].Value;
var 전전봉4_Temp = candleDatas_Temp_List[i - 2].movingAverageDataList[4].Value;
var 전전전봉4_Temp = candleDatas_Temp_List[i - 3].movingAverageDataList[4].Value;
// if (i > 210)
// {
// var 현재봉4_Temp = candleDatas_Temp_List[i].movingAverageDataList[4].Value;
// var 전봉4_Temp = candleDatas_Temp_List[i - 1].movingAverageDataList[4].Value;
// var 전전봉4_Temp = candleDatas_Temp_List[i - 2].movingAverageDataList[4].Value;
// var 전전전봉4_Temp = candleDatas_Temp_List[i - 3].movingAverageDataList[4].Value;
var returnVal = Calculate전고점(market, strInterval, interval, 전봉4_Temp, 전전봉4_Temp, 전전전봉4_Temp, candleDatas_Temp_List[candleDatas_Temp_List.Count - 1]);
}
}
// var returnVal = Calculate전고점(market, strInterval, interval, 전봉4_Temp, 전전봉4_Temp, 전전전봉4_Temp, candleDatas_Temp_List[candleDatas_Temp_List.Count - 1]);
// }
//}
}
else {
if(nowTime.Minute > 0 && nowTime.Hour == 24)
전저고점Flag = true;
}
//else {
// if(nowTime.Minute > 0 && nowTime.Hour == 24)
// 전저고점Flag = true;
//}
//if (!BuyShortStep.ContainsKey(market))
//{
// BuyShortStep[market] = 0;
// BuyLongStep[market] = 0;
//}
//if (!(전저고점.ContainsKey(market + "30m")))
// continue;
if (!BuyShortStep.ContainsKey(market))
{
BuyShortStep[market] = 0;
BuyLongStep[market] = 0;
}
if (!(전저고점.ContainsKey(market + "30m")))
continue;
*/
#region 30분봉 처리
var candleDatas_30 = findedMarket.candleDataList[MCandleTimeType.M30];
@@ -375,16 +375,16 @@ namespace BitgetAPI.IndicatorConditionSetup
//사는 시점
if (!UpBuyList.ContainsKey(market))
{
//if(!FirstFlag[market + strInterval + "Long"])
//{
// if(sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.LongSell, true))
// {
// FirstFlag[market + strInterval + "Long"] = true;
// }
//}
if (!FirstFlag[market + strInterval + "Long"])
{
if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.LongSell, true))
{
FirstFlag[market + strInterval + "Long"] = true;
}
}
if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.LongBuy, true)
//&& FirstFlag[market + strInterval + "Long"]
&& FirstFlag[market + strInterval + "Long"]
//&& 저고점["전저가"] > 저고점["전전저가"]
)
@@ -575,10 +575,19 @@ namespace BitgetAPI.IndicatorConditionSetup
{
//사는 시점
if (!DownBuyList.ContainsKey(market))
{
{
if (!FirstFlag[market + strInterval + "Short"])
{
if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.ShortSell, true))
{
FirstFlag[market + strInterval + "Short"] = true;
}
}
if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.ShortBuy, true))
if (sMABandConditionSetup.Calculate(candleDatas_30_TempList, SMABandType.ShortBuy, true)
&& FirstFlag[market + strInterval + "Short"])
{
//BuyShortStep[market] = 0;
// 없으면 생성

View File

@@ -89,20 +89,20 @@ namespace BitgetApi.IndicatorConditionSetup
// 밴드 계산
double sma4High = Highest(close, i, 12, 4);
double sma4Middle = CalculateSMA(close, i, 12);
double sma4Middle = Middle(close, i, 12, 4);
double sma4Low = Lowest(close, i, 12, 4);
double prevSma4High = Highest(close, i - 1, 12, 4);
double prevSma4Middle = CalculateSMA(close, i - 1, 12);
double prevSma4Middle = Middle(close, i - 1, 12, 4);
double prevSma4Low = Lowest(close, i - 1, 12, 4);
double prev2Sma4High = Highest(close, i - 2, 12, 4);
double prev2Sma4Low = Lowest(close, i - 2, 12, 4);
double prev2Sma4Middle = CalculateSMA(close, i - 2, 12);
double prev2Sma4Middle = Middle(close, i - 2, 12, 4);
double prev3Sma4High = Highest(close, i - 3, 12, 4);
double prev3Sma4Low = Lowest(close, i - 3, 12, 4);
double prev3Sma4Middle = CalculateSMA(close, i - 3, 12);
double prev3Sma4Middle = Middle(close, i - 3, 12, 4);
var ichmok = GetIchimokuCloud(candles, i - 25);
@@ -115,7 +115,7 @@ namespace BitgetApi.IndicatorConditionSetup
var cloudBottomAfter = Math.Min(ichmokCurrent.SenkouSpanA, ichmokCurrent.SenkouSpanB);
bool isSma4BelowCloud = low[i] < cloudBottomNow;
bool isSma4AboveCloud = high[i] > cloudTopNow;
bool isSma4AboveCloud = high[i] > cloudTopNow;
bool greenCandle = open[i] < close[i];
bool redCandle = open[i] > close[i];
@@ -124,16 +124,19 @@ namespace BitgetApi.IndicatorConditionSetup
for (var cnt = 0; cnt < 10; cnt++)
{
if (Lowest(close, i - cnt, 12, 4) == CalculateSMA(close, i - cnt, 12) && Lowest(close, i - cnt-1, 12, 4) <= CalculateSMA(close, i - cnt-1, 12))
{
if (Lowest(close, i - cnt, 12, 4) == CalculateSMA(close, i - cnt, 12) && Lowest(close, i - cnt - 1, 12, 4) <= CalculateSMA(close, i - cnt - 1, 12))
{
isLongRecentTouch = false;
break;
}
}
//high 데이터 비교(기본 12개)
var highestTempData = Highest(high, i, 12, 1);
// 진입/청산 조건
bool rawNewLong = isLongRecentTouch && greenCandle && IsSideways(high, low, i, true, rangeThresholdLongPercent) && prevSma4 <= sma4 && sma4High == sma4 && prevSma4High >= prevSma4 && (prev2Sma4Middle - prevSma4Middle) > (prevSma4Middle - sma4Middle) && sma4Middle > sma72 && sma4 > cloudTopNow;
bool rawNewLong = highestTempData == high[i] && isLongRecentTouch && greenCandle && IsSideways(high, low, i, true, rangeThresholdLongPercent) && prevSma4 <= sma4 && sma4High == sma4 && prevSma4High >= prevSma4 && (prev2Sma4Middle - prevSma4Middle) > (prevSma4Middle - sma4Middle) && sma4Middle > sma72 && sma4 > cloudTopNow;
bool rawLongSell = (sma4Middle < sma72 && prevSma4Middle > prevSma72) || (sma4 == sma4Low);
bool rawNewShort = (sma72 < cloudTopAfter && sma72 < cloudTopNow) && sma72 > sma4 && sma4High > cloudTopNow && sma4 == sma4Low && IsSideways(high, low, i, true, rangeThresholdShortPercent) && redCandle && sma4 < cloudTopNow;
@@ -203,6 +206,13 @@ namespace BitgetApi.IndicatorConditionSetup
}
private double Middle(List<double> source, int index, int period, int num)
{
return GetAvgList(source, index, period, num).Average();
}
private double Lowest(List<double> source, int index, int period, int num)
{
return GetAvgList(source, index, period, num).Min();