Add startuptime and update creationDate
This commit is contained in:
@@ -21,6 +21,7 @@ namespace Managing.Application.Abstractions
|
||||
Dictionary<DateTime, decimal> WalletBalances { get; set; }
|
||||
Dictionary<IndicatorType, IndicatorsResultBase> IndicatorsValues { get; set; }
|
||||
DateTime StartupTime { get; set; }
|
||||
DateTime CreateDate { get; }
|
||||
DateTime PreloadSince { get; set; }
|
||||
int PreloadedCandlesCount { get; set; }
|
||||
decimal Fee { get; set; }
|
||||
|
||||
@@ -114,7 +114,12 @@ public class TradingBot : Bot, ITradingBot
|
||||
CancelAllOrders().GetAwaiter().GetResult();
|
||||
|
||||
// Send startup message only for fresh starts (not reboots)
|
||||
var isReboot = Signals.Any() || Positions.Any();
|
||||
// Consider it a reboot if the bot was created more than 5 minutes ago
|
||||
var timeSinceCreation = DateTime.UtcNow - CreateDate;
|
||||
var isReboot = timeSinceCreation.TotalMinutes > 5;
|
||||
|
||||
StartupTime = DateTime.UtcNow;
|
||||
|
||||
if (!isReboot)
|
||||
{
|
||||
try
|
||||
@@ -361,38 +366,37 @@ public class TradingBot : Bot, ITradingBot
|
||||
// TODO : remove this when Synth is stable
|
||||
// signal.Status = SignalStatus.Expired;
|
||||
signalText += $"\n\n🚫 *Synth Signal Filter*\n" +
|
||||
$"Signal `{signal.Identifier}` blocked by Synth risk assessment\n\n" +
|
||||
$"📊 *Risk Analysis Details*\n" +
|
||||
$"SL Probability: `{signalValidationResult.StopLossProbability:P2}`\n" +
|
||||
$"TP Probability: `{signalValidationResult.TakeProfitProbability:P2}`\n" +
|
||||
$"TP/SL Ratio: `{signalValidationResult.TpSlRatio:F2}x`\n" +
|
||||
$"Win/Loss: `{signalValidationResult.WinLossRatio:F2}:1`\n" +
|
||||
$"Expected Value: `${signalValidationResult.ExpectedMonetaryValue:F2}`\n" +
|
||||
$"Expected Utility: `{signalValidationResult.ExpectedUtility:F4}`\n" +
|
||||
$"Kelly Criterion: `{signalValidationResult.KellyFraction:P2}`\n" +
|
||||
$"Kelly Capped: `{signalValidationResult.KellyCappedFraction:P2}`\n" +
|
||||
$"Risk Assessment: `{signalValidationResult.GetUtilityRiskAssessment()}`\n" +
|
||||
$"Time Horizon: `{signalValidationResult.TimeHorizonSeconds / 3600:F1}h`\n\n" +
|
||||
$"📋 *Context*\n`{signalValidationResult.ValidationContext}`";
|
||||
|
||||
$"Signal `{signal.Identifier}` blocked by Synth risk assessment\n\n" +
|
||||
$"📊 *Risk Analysis Details*\n" +
|
||||
$"SL Probability: `{signalValidationResult.StopLossProbability:P2}`\n" +
|
||||
$"TP Probability: `{signalValidationResult.TakeProfitProbability:P2}`\n" +
|
||||
$"TP/SL Ratio: `{signalValidationResult.TpSlRatio:F2}x`\n" +
|
||||
$"Win/Loss: `{signalValidationResult.WinLossRatio:F2}:1`\n" +
|
||||
$"Expected Value: `${signalValidationResult.ExpectedMonetaryValue:F2}`\n" +
|
||||
$"Expected Utility: `{signalValidationResult.ExpectedUtility:F4}`\n" +
|
||||
$"Kelly Criterion: `{signalValidationResult.KellyFraction:P2}`\n" +
|
||||
$"Kelly Capped: `{signalValidationResult.KellyCappedFraction:P2}`\n" +
|
||||
$"Risk Assessment: `{signalValidationResult.GetUtilityRiskAssessment()}`\n" +
|
||||
$"Time Horizon: `{signalValidationResult.TimeHorizonSeconds / 3600:F1}h`\n\n" +
|
||||
$"📋 *Context*\n`{signalValidationResult.ValidationContext}`";
|
||||
}
|
||||
else
|
||||
{
|
||||
signal.SetConfidence(signalValidationResult.Confidence);
|
||||
signalText += $"\n\n✅ *Synth Risk Assessment Passed*\n" +
|
||||
$"Confidence: `{signalValidationResult.Confidence}`\n\n" +
|
||||
$"📊 *Risk Analysis Details*\n" +
|
||||
$"SL Probability: `{signalValidationResult.StopLossProbability:P2}`\n" +
|
||||
$"TP Probability: `{signalValidationResult.TakeProfitProbability:P2}`\n" +
|
||||
$"TP/SL Ratio: `{signalValidationResult.TpSlRatio:F2}x`\n" +
|
||||
$"Win/Loss: `{signalValidationResult.WinLossRatio:F2}:1`\n" +
|
||||
$"Expected Value: `${signalValidationResult.ExpectedMonetaryValue:F2}`\n" +
|
||||
$"Expected Utility: `{signalValidationResult.ExpectedUtility:F4}`\n" +
|
||||
$"Kelly Criterion: `{signalValidationResult.KellyFraction:P2}`\n" +
|
||||
$"Kelly Capped: `{signalValidationResult.KellyCappedFraction:P2}`\n" +
|
||||
$"Risk Assessment: `{signalValidationResult.GetUtilityRiskAssessment()}`\n" +
|
||||
$"Time Horizon: `{signalValidationResult.TimeHorizonSeconds / 3600:F1}h`\n\n" +
|
||||
$"📋 *Context*\n`{signalValidationResult.ValidationContext}`";
|
||||
$"Confidence: `{signalValidationResult.Confidence}`\n\n" +
|
||||
$"📊 *Risk Analysis Details*\n" +
|
||||
$"SL Probability: `{signalValidationResult.StopLossProbability:P2}`\n" +
|
||||
$"TP Probability: `{signalValidationResult.TakeProfitProbability:P2}`\n" +
|
||||
$"TP/SL Ratio: `{signalValidationResult.TpSlRatio:F2}x`\n" +
|
||||
$"Win/Loss: `{signalValidationResult.WinLossRatio:F2}:1`\n" +
|
||||
$"Expected Value: `${signalValidationResult.ExpectedMonetaryValue:F2}`\n" +
|
||||
$"Expected Utility: `{signalValidationResult.ExpectedUtility:F4}`\n" +
|
||||
$"Kelly Criterion: `{signalValidationResult.KellyFraction:P2}`\n" +
|
||||
$"Kelly Capped: `{signalValidationResult.KellyCappedFraction:P2}`\n" +
|
||||
$"Risk Assessment: `{signalValidationResult.GetUtilityRiskAssessment()}`\n" +
|
||||
$"Time Horizon: `{signalValidationResult.TimeHorizonSeconds / 3600:F1}h`\n\n" +
|
||||
$"📋 *Context*\n`{signalValidationResult.ValidationContext}`";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1429,7 +1433,8 @@ public class TradingBot : Bot, ITradingBot
|
||||
Signals = Signals,
|
||||
Positions = Positions,
|
||||
WalletBalances = WalletBalances,
|
||||
StartupTime = StartupTime
|
||||
StartupTime = StartupTime,
|
||||
CreateDate = CreateDate
|
||||
};
|
||||
BotService.SaveOrUpdateBotBackup(User, Identifier, Status, JsonConvert.SerializeObject(data));
|
||||
}
|
||||
@@ -1449,6 +1454,7 @@ public class TradingBot : Bot, ITradingBot
|
||||
Positions = data.Positions ?? new List<Position>();
|
||||
WalletBalances = data.WalletBalances ?? new Dictionary<DateTime, decimal>();
|
||||
PreloadSince = data.StartupTime;
|
||||
CreateDate = data.CreateDate;
|
||||
Identifier = backup.Identifier;
|
||||
User = backup.User;
|
||||
Status = backup.LastStatus;
|
||||
@@ -1718,7 +1724,6 @@ public class TradingBot : Bot, ITradingBot
|
||||
if (allowNameChange && !string.IsNullOrEmpty(newConfig.Name))
|
||||
{
|
||||
Name = newConfig.Name;
|
||||
Identifier = newConfig.Name;
|
||||
}
|
||||
|
||||
// If account changed, reload it
|
||||
@@ -1893,4 +1898,9 @@ public class TradingBotBackup
|
||||
/// Runtime state: When the bot was started
|
||||
/// </summary>
|
||||
public DateTime StartupTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Runtime state: When the bot was created
|
||||
/// </summary>
|
||||
public DateTime CreateDate { get; set; }
|
||||
}
|
||||
@@ -244,12 +244,20 @@ namespace Managing.Application.ManageBot
|
||||
{
|
||||
if (botWrapper.BotInstance is IBot bot)
|
||||
{
|
||||
// Stop the bot first to ensure clean state
|
||||
bot.Stop();
|
||||
|
||||
// Small delay to ensure stop is complete
|
||||
await Task.Delay(100);
|
||||
|
||||
// Restart the bot (this will update StartupTime)
|
||||
bot.Restart();
|
||||
|
||||
var restartMessage = $"🔄 **Bot Restarted**\n\n" +
|
||||
$"🎯 **Agent:** {bot.User.AgentName}\n" +
|
||||
$"🤖 **Bot Name:** {bot.Name}\n" +
|
||||
$"⏰ **Restarted At:** {DateTime.UtcNow:MMM dd, yyyy • HH:mm:ss} UTC\n\n" +
|
||||
$"⏰ **Restarted At:** {DateTime.UtcNow:MMM dd, yyyy • HH:mm:ss} UTC\n" +
|
||||
$"🕐 **New Startup Time:** {bot.StartupTime:MMM dd, yyyy • HH:mm:ss} UTC\n\n" +
|
||||
$"🚀 **Bot has been successfully restarted and is now active.**";
|
||||
|
||||
await _messengerService.SendTradeMessage(restartMessage, false, bot.User);
|
||||
|
||||
@@ -207,7 +207,7 @@ public class MessengerService : IMessengerService
|
||||
var finalPnl = backtest.FinalPnl;
|
||||
var growthPercentage = backtest.GrowthPercentage;
|
||||
var maxDrawdown = backtest.Statistics?.MaxDrawdownPc ?? 0;
|
||||
var sharpeRatio = backtest.Statistics?.SharpeRatio ?? 0;
|
||||
var sharpeRatio = (backtest.Statistics?.SharpeRatio * 100) ?? 0;
|
||||
|
||||
return $"📈 Performance Metrics:\n" +
|
||||
$"⭐ Score: {score:F1}/100 | 🏆 Win Rate: {winRate:F1}%\n" +
|
||||
|
||||
Reference in New Issue
Block a user