Add synthApi (#27)
* Add synthApi * Put confidence for Synth proba * Update the code * Update readme * Fix bootstraping * fix github build * Update the endpoints for scenario * Add scenario and update backtest modal * Update bot modal * Update interfaces for synth * add synth to backtest * Add Kelly criterion and better signal * Update signal confidence * update doc * save leaderboard and prediction * Update nswag to generate ApiClient in the correct path * Unify the trading modal * Save miner and prediction * Update messaging and block new signal until position not close when flipping off * Rename strategies to indicators * Update doc * Update chart + add signal name * Fix signal direction * Update docker webui * remove crypto npm * Clean
This commit is contained in:
169
src/Managing.Application/Synth/SynthConfigurationHelper.cs
Normal file
169
src/Managing.Application/Synth/SynthConfigurationHelper.cs
Normal file
@@ -0,0 +1,169 @@
|
||||
using Managing.Domain.Synth.Models;
|
||||
|
||||
namespace Managing.Application.Synth;
|
||||
|
||||
/// <summary>
|
||||
/// Helper class for creating and configuring Synth API integration
|
||||
/// </summary>
|
||||
public static class SynthConfigurationHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates a default Synth configuration for live trading
|
||||
/// </summary>
|
||||
/// <returns>A configured SynthConfiguration instance</returns>
|
||||
public static SynthConfiguration CreateLiveTradingConfig()
|
||||
{
|
||||
return new SynthConfiguration
|
||||
{
|
||||
IsEnabled = true,
|
||||
TopMinersCount = 10,
|
||||
TimeIncrement = 300, // 5 minutes
|
||||
DefaultTimeLength = 86400, // 24 hours
|
||||
MaxLiquidationProbability = 0.10m, // 10% max risk
|
||||
PredictionCacheDurationMinutes = 5,
|
||||
UseForPositionSizing = true,
|
||||
UseForSignalFiltering = true,
|
||||
UseForDynamicStopLoss = true
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a conservative Synth configuration with lower risk tolerances
|
||||
/// </summary>
|
||||
/// <returns>A conservative SynthConfiguration instance</returns>
|
||||
public static SynthConfiguration CreateConservativeConfig()
|
||||
{
|
||||
return new SynthConfiguration
|
||||
{
|
||||
IsEnabled = true,
|
||||
TopMinersCount = 10,
|
||||
TimeIncrement = 300, // 5 minutes
|
||||
DefaultTimeLength = 86400, // 24 hours
|
||||
MaxLiquidationProbability = 0.05m, // 5% max risk (more conservative)
|
||||
PredictionCacheDurationMinutes = 3, // More frequent updates
|
||||
UseForPositionSizing = true,
|
||||
UseForSignalFiltering = true,
|
||||
UseForDynamicStopLoss = true
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates an aggressive Synth configuration with higher risk tolerances
|
||||
/// </summary>
|
||||
/// <returns>An aggressive SynthConfiguration instance</returns>
|
||||
public static SynthConfiguration CreateAggressiveConfig()
|
||||
{
|
||||
return new SynthConfiguration
|
||||
{
|
||||
IsEnabled = true,
|
||||
TopMinersCount = 15, // More miners for broader consensus
|
||||
TimeIncrement = 300, // 5 minutes
|
||||
DefaultTimeLength = 86400, // 24 hours
|
||||
MaxLiquidationProbability = 0.15m, // 15% max risk (more aggressive)
|
||||
PredictionCacheDurationMinutes = 7, // Less frequent updates to reduce API calls
|
||||
UseForPositionSizing = true,
|
||||
UseForSignalFiltering = false, // Don't filter signals in aggressive mode
|
||||
UseForDynamicStopLoss = true
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a disabled Synth configuration (bot will operate without Synth predictions)
|
||||
/// </summary>
|
||||
/// <returns>A disabled SynthConfiguration instance</returns>
|
||||
public static SynthConfiguration CreateDisabledConfig()
|
||||
{
|
||||
return new SynthConfiguration
|
||||
{
|
||||
IsEnabled = false,
|
||||
TopMinersCount = 10,
|
||||
TimeIncrement = 300,
|
||||
DefaultTimeLength = 86400,
|
||||
MaxLiquidationProbability = 0.10m,
|
||||
PredictionCacheDurationMinutes = 5,
|
||||
UseForPositionSizing = false,
|
||||
UseForSignalFiltering = false,
|
||||
UseForDynamicStopLoss = false
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a Synth configuration optimized for backtesting (disabled)
|
||||
/// </summary>
|
||||
/// <returns>A backtesting-optimized SynthConfiguration instance</returns>
|
||||
public static SynthConfiguration CreateBacktestConfig()
|
||||
{
|
||||
// Synth predictions are not available for historical data, so always disabled for backtests
|
||||
return CreateDisabledConfig();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validates and provides suggestions for improving a Synth configuration
|
||||
/// </summary>
|
||||
/// <param name="config">The configuration to validate</param>
|
||||
/// <returns>List of validation messages and suggestions</returns>
|
||||
public static List<string> ValidateConfiguration(SynthConfiguration config)
|
||||
{
|
||||
var messages = new List<string>();
|
||||
|
||||
if (config == null)
|
||||
{
|
||||
messages.Add("❌ Configuration is null");
|
||||
return messages;
|
||||
}
|
||||
|
||||
if (!config.IsEnabled)
|
||||
{
|
||||
messages.Add("ℹ️ Synth API is disabled - bot will operate without predictions");
|
||||
return messages;
|
||||
}
|
||||
|
||||
if (config.TopMinersCount <= 0)
|
||||
{
|
||||
messages.Add("❌ TopMinersCount must be greater than 0");
|
||||
}
|
||||
else if (config.TopMinersCount > 20)
|
||||
{
|
||||
messages.Add("⚠️ TopMinersCount > 20 may result in slower performance and higher API usage");
|
||||
}
|
||||
|
||||
if (config.TimeIncrement <= 0)
|
||||
{
|
||||
messages.Add("❌ TimeIncrement must be greater than 0");
|
||||
}
|
||||
|
||||
if (config.DefaultTimeLength <= 0)
|
||||
{
|
||||
messages.Add("❌ DefaultTimeLength must be greater than 0");
|
||||
}
|
||||
|
||||
if (config.MaxLiquidationProbability < 0 || config.MaxLiquidationProbability > 1)
|
||||
{
|
||||
messages.Add("❌ MaxLiquidationProbability must be between 0 and 1");
|
||||
}
|
||||
else if (config.MaxLiquidationProbability < 0.02m)
|
||||
{
|
||||
messages.Add("⚠️ MaxLiquidationProbability < 2% is very conservative and may block many trades");
|
||||
}
|
||||
else if (config.MaxLiquidationProbability > 0.20m)
|
||||
{
|
||||
messages.Add("⚠️ MaxLiquidationProbability > 20% is very aggressive and may increase risk");
|
||||
}
|
||||
|
||||
if (config.PredictionCacheDurationMinutes <= 0)
|
||||
{
|
||||
messages.Add("❌ PredictionCacheDurationMinutes must be greater than 0");
|
||||
}
|
||||
else if (config.PredictionCacheDurationMinutes < 1)
|
||||
{
|
||||
messages.Add("⚠️ Cache duration < 1 minute may result in excessive API calls");
|
||||
}
|
||||
|
||||
if (messages.Count == 0)
|
||||
{
|
||||
messages.Add("✅ Configuration appears valid");
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user