Update cooldown

This commit is contained in:
2025-06-09 17:01:23 +07:00
parent 7147072836
commit e0f60fcb59

View File

@@ -859,23 +859,67 @@ public class TradingBot : Bot, ITradingBot
return false;
}
var positionSignal = Signals.FirstOrDefault(s => s.Identifier == lastPosition.SignalIdentifier);
if (positionSignal == null)
// Get the actual closing date of the position instead of signal date
var positionClosingDate = GetPositionClosingDate(lastPosition);
if (positionClosingDate == null)
{
await LogWarning($"Cannot find signal for last position {lastPosition.Identifier}");
await LogWarning($"Cannot determine closing date for last position {lastPosition.Identifier}");
return false;
}
var canOpenPosition = positionSignal.Date < cooldownCandle.Date;
var canOpenPosition = positionClosingDate < cooldownCandle.Date;
if (!canOpenPosition)
{
await LogInformation(
$"⏳ **Cooldown Active**\nPosition blocked by cooldown period\n📅 Last Position: `{positionSignal.Date:MM/dd HH:mm}`\n🕒 Cooldown Until: `{cooldownCandle.Date:MM/dd HH:mm}`");
$"⏳ **Cooldown Active**\nPosition blocked by cooldown period\n📅 Last Position Closed: `{positionClosingDate:MM/dd HH:mm}`\n🕒 Cooldown Until: `{cooldownCandle.Date:MM/dd HH:mm}`");
}
return canOpenPosition;
}
/// <summary>
/// Gets the actual closing date of a position by checking which trade (Stop Loss or Take Profit) was executed.
/// </summary>
/// <param name="position">The finished position</param>
/// <returns>The date when the position was closed, or null if cannot be determined</returns>
private DateTime? GetPositionClosingDate(Position position)
{
if (!position.IsFinished())
{
return null;
}
// Check which trade actually closed the position
if (position.StopLoss?.Status == TradeStatus.Filled && position.StopLoss.Date != default)
{
return position.StopLoss.Date;
}
if (position.TakeProfit1?.Status == TradeStatus.Filled && position.TakeProfit1.Date != default)
{
return position.TakeProfit1.Date;
}
if (position.TakeProfit2?.Status == TradeStatus.Filled && position.TakeProfit2.Date != default)
{
return position.TakeProfit2.Date;
}
// Fallback: if we can't determine the exact closing trade, use the latest date available
var availableDates = new List<DateTime>();
if (position.StopLoss?.Date != default)
availableDates.Add(position.StopLoss.Date);
if (position.TakeProfit1?.Date != default)
availableDates.Add(position.TakeProfit1.Date);
if (position.TakeProfit2?.Date != default)
availableDates.Add(position.TakeProfit2.Date);
return availableDates.Any() ? availableDates.Max() : position.Open.Date;
}
public async Task CloseTrade(Signal signal, Position position, Trade tradeToClose, decimal lastPrice,
bool tradeClosingPosition = false)
{