Update ichimoku

This commit is contained in:
2025-11-24 20:02:14 +07:00
parent 4268626897
commit 4b33b01707

View File

@@ -74,8 +74,11 @@ public class IchimokuKumoTrend : IndicatorBase
if (preCalculatedValues?.Ichimoku != null && preCalculatedValues.Ichimoku.Any()) if (preCalculatedValues?.Ichimoku != null && preCalculatedValues.Ichimoku.Any())
{ {
// Filter pre-calculated Ichimoku values to match the candles we're processing // Filter pre-calculated Ichimoku values to match the candles we're processing
// and ensure we have valid cloud data (non-null, non-zero values)
ichimokuResults = preCalculatedValues.Ichimoku ichimokuResults = preCalculatedValues.Ichimoku
.Where(i => i.SenkouSpanA.HasValue && i.SenkouSpanB.HasValue && candles.Any(c => c.Date == i.Date)) .Where(i => i.SenkouSpanA.HasValue && i.SenkouSpanB.HasValue &&
i.SenkouSpanA.Value != 0 && i.SenkouSpanB.Value != 0 &&
candles.Any(c => c.Date == i.Date))
.ToList(); .ToList();
} }
@@ -128,8 +131,14 @@ public class IchimokuKumoTrend : IndicatorBase
var candleIchimokuResults = new List<CandleIchimoku>(); var candleIchimokuResults = new List<CandleIchimoku>();
// Map IchimokuResult to CandleIchimoku // Map IchimokuResult to CandleIchimoku
// Only include results where we have valid cloud data
foreach (var ichimoku in ichimokuList) foreach (var ichimoku in ichimokuList)
{ {
// Skip if cloud data is not available (null or 0 values indicate insufficient data)
if (!ichimoku.SenkouSpanA.HasValue || !ichimoku.SenkouSpanB.HasValue ||
ichimoku.SenkouSpanA.Value == 0 || ichimoku.SenkouSpanB.Value == 0)
continue;
// Find the corresponding candle // Find the corresponding candle
var candle = candles.FirstOrDefault(c => c.Date == ichimoku.Date); var candle = candles.FirstOrDefault(c => c.Date == ichimoku.Date);
if (candle == null) continue; if (candle == null) continue;
@@ -143,8 +152,8 @@ public class IchimokuKumoTrend : IndicatorBase
Exchange = candle.Exchange, Exchange = candle.Exchange,
TenkanSen = ichimoku.TenkanSen ?? 0, TenkanSen = ichimoku.TenkanSen ?? 0,
KijunSen = ichimoku.KijunSen ?? 0, KijunSen = ichimoku.KijunSen ?? 0,
SenkouSpanA = ichimoku.SenkouSpanA ?? 0, SenkouSpanA = ichimoku.SenkouSpanA.Value,
SenkouSpanB = ichimoku.SenkouSpanB ?? 0 SenkouSpanB = ichimoku.SenkouSpanB.Value
}); });
} }
@@ -161,6 +170,10 @@ public class IchimokuKumoTrend : IndicatorBase
var previousCandle = mappedData[0]; var previousCandle = mappedData[0];
foreach (var currentCandle in mappedData.Skip(1)) foreach (var currentCandle in mappedData.Skip(1))
{ {
// Skip if cloud data is not available (values are 0 due to insufficient data)
if (currentCandle.SenkouSpanA == 0 || currentCandle.SenkouSpanB == 0)
continue;
// For trend assessment, check if price is above or below the cloud // For trend assessment, check if price is above or below the cloud
// The cloud is formed by Senkou Span A and Senkou Span B // The cloud is formed by Senkou Span A and Senkou Span B
var cloudTop = Math.Max(currentCandle.SenkouSpanA, currentCandle.SenkouSpanB); var cloudTop = Math.Max(currentCandle.SenkouSpanA, currentCandle.SenkouSpanB);
@@ -193,6 +206,10 @@ public class IchimokuKumoTrend : IndicatorBase
if (candle == null || !currentResult.SenkouSpanA.HasValue || !currentResult.SenkouSpanB.HasValue) if (candle == null || !currentResult.SenkouSpanA.HasValue || !currentResult.SenkouSpanB.HasValue)
continue; continue;
// Skip if cloud data is not available (values are 0 due to insufficient data)
if (currentResult.SenkouSpanA.Value == 0 || currentResult.SenkouSpanB.Value == 0)
continue;
// For trend assessment, check if price is above or below the cloud // For trend assessment, check if price is above or below the cloud
// The cloud is formed by Senkou Span A and Senkou Span B // The cloud is formed by Senkou Span A and Senkou Span B
var cloudTop = Math.Max(currentResult.SenkouSpanA.Value, currentResult.SenkouSpanB.Value); var cloudTop = Math.Max(currentResult.SenkouSpanA.Value, currentResult.SenkouSpanB.Value);