Update tg message for synthapi
This commit is contained in:
@@ -334,12 +334,18 @@ public class TradingBot : Bot, ITradingBot
|
||||
if (Config.IsForWatchingOnly || (ExecutionCount < 1 && !Config.IsForBacktest))
|
||||
signal.Status = SignalStatus.Expired;
|
||||
|
||||
var signalText = $"{Config.ScenarioName} trigger a signal. Signal told you " +
|
||||
$"to {signal.Direction} {Config.Ticker} on {Config.Timeframe}. The confidence in this signal is {signal.Confidence}. Identifier : {signal.Identifier}";
|
||||
var indicatorNames = Indicators.Select(i => i.Type.ToString()).ToList();
|
||||
var signalText = $"🎯 **New Trading Signal**\n\n" +
|
||||
$"📊 **Signal Details:**\n" +
|
||||
$"📈 Action: `{signal.Direction}` {Config.Ticker}\n" +
|
||||
$"⏰ Timeframe: `{Config.Timeframe}`\n" +
|
||||
$"🎯 Confidence: `{signal.Confidence}`\n" +
|
||||
$"🔍 Indicators: `{string.Join(", ", indicatorNames)}`\n" +
|
||||
$"🆔 Signal ID: `{signal.Identifier}`";
|
||||
|
||||
|
||||
// Apply Synth-based signal filtering if enabled
|
||||
if (Config.UseSynthApi)
|
||||
if (Config.UseSynthApi || !Config.IsForBacktest)
|
||||
{
|
||||
var currentPrice = Config.IsForBacktest
|
||||
? OptimizedCandles.Last().Close
|
||||
@@ -352,16 +358,41 @@ public class TradingBot : Bot, ITradingBot
|
||||
signalValidationResult.Confidence == Confidence.Low ||
|
||||
signalValidationResult.IsBlocked)
|
||||
{
|
||||
signal.Status = SignalStatus.Expired;
|
||||
await LogInformation(
|
||||
$"🚫 **Synth Signal Filter** - Signal {signal.Identifier} blocked by Synth risk assessment. Context : {signalValidationResult.ValidationContext}");
|
||||
return;
|
||||
// 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}`";
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
signal.SetConfidence(signalValidationResult.Confidence);
|
||||
signalText +=
|
||||
$" and Synth risk assessment passed. Context : {signalValidationResult.ValidationContext}";
|
||||
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}`";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1316,19 +1347,22 @@ public class TradingBot : Bot, ITradingBot
|
||||
// Calculate closing fee based on the actual executed trade's price and quantity
|
||||
if (position.StopLoss?.Status == TradeStatus.Filled)
|
||||
{
|
||||
var stopLossPositionSizeUsd = (position.StopLoss.Price * position.StopLoss.Quantity) * position.StopLoss.Leverage;
|
||||
var stopLossPositionSizeUsd =
|
||||
(position.StopLoss.Price * position.StopLoss.Quantity) * position.StopLoss.Leverage;
|
||||
var uiFeeClose = stopLossPositionSizeUsd * uiFeeRate; // Fee paid on closing via StopLoss
|
||||
fees += uiFeeClose;
|
||||
}
|
||||
else if (position.TakeProfit1?.Status == TradeStatus.Filled)
|
||||
{
|
||||
var takeProfit1PositionSizeUsd = (position.TakeProfit1.Price * position.TakeProfit1.Quantity) * position.TakeProfit1.Leverage;
|
||||
var takeProfit1PositionSizeUsd = (position.TakeProfit1.Price * position.TakeProfit1.Quantity) *
|
||||
position.TakeProfit1.Leverage;
|
||||
var uiFeeClose = takeProfit1PositionSizeUsd * uiFeeRate; // Fee paid on closing via TakeProfit1
|
||||
fees += uiFeeClose;
|
||||
}
|
||||
else if (position.TakeProfit2?.Status == TradeStatus.Filled)
|
||||
{
|
||||
var takeProfit2PositionSizeUsd = (position.TakeProfit2.Price * position.TakeProfit2.Quantity) * position.TakeProfit2.Leverage;
|
||||
var takeProfit2PositionSizeUsd = (position.TakeProfit2.Price * position.TakeProfit2.Quantity) *
|
||||
position.TakeProfit2.Leverage;
|
||||
var uiFeeClose = takeProfit2PositionSizeUsd * uiFeeRate; // Fee paid on closing via TakeProfit2
|
||||
fees += uiFeeClose;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user