Remove timeframe from strategy (#13)

This commit is contained in:
Oda
2025-02-26 17:24:59 +07:00
committed by GitHub
parent 298b666a0b
commit 4302bb8435
39 changed files with 299 additions and 288 deletions

View File

@@ -7,23 +7,24 @@ namespace Managing.Application.Abstractions
public interface IScenarioService
{
IEnumerable<Scenario> GetScenarios();
Scenario CreateScenario(string name, List<string> strategies);
Scenario CreateScenario(string name, List<string> strategies, int? loopbackPeriod = 1);
IEnumerable<Strategy> GetStrategies();
bool DeleteStrategy(string name);
bool DeleteScenario(string name);
Scenario GetScenario(string name);
Strategy CreateStrategy(StrategyType type,
Timeframe timeframe,
string name,
int? period = null,
int? fastPeriods = null,
int? slowPeriods = null,
int? signalPeriods = null,
double? multiplier = null,
int? stochPeriods = null,
int? smoothPeriods = null,
int? cyclePeriods = null);
string name,
int? period = null,
int? fastPeriods = null,
int? slowPeriods = null,
int? signalPeriods = null,
double? multiplier = null,
int? stochPeriods = null,
int? smoothPeriods = null,
int? cyclePeriods = null);
bool DeleteStrategies();
bool DeleteScenarios();
}
}
}

View File

@@ -17,7 +17,7 @@ namespace Managing.Application.Abstractions
Timeframe Timeframe { get; set; }
HashSet<IStrategy> Strategies { get; set; }
Ticker Ticker { get; }
string Scenario { get; }
string ScenarioName { get; }
string AccountName { get; }
bool IsForWatchingOnly { get; set; }
MoneyManagement MoneyManagement { get; set; }
@@ -31,5 +31,6 @@ namespace Managing.Application.Abstractions
decimal GetProfitAndLoss();
decimal GetTotalFees();
void LoadStrategies(IEnumerable<IStrategy> strategies);
void LoadScenario(string scenarioName);
}
}

View File

@@ -58,7 +58,7 @@ namespace Managing.Application.Backtesting
{
var scalpingBot = _botFactory.CreateBacktestScalpingBot(account.Name, moneyManagement, ticker, "scenario",
timeframe, isForWatchingOnly);
scalpingBot.LoadStrategies(ScenarioHelpers.GetStrategiesFromScenario(scenario));
scalpingBot.LoadScenario(scenario.Name);
var candles = initialCandles ?? GetCandles(account, ticker, timeframe, days);
var result = GetBacktestingResult(ticker, scenario, timeframe, scalpingBot, candles, balance, account,
moneyManagement);
@@ -88,8 +88,7 @@ namespace Managing.Application.Backtesting
{
var flippingBot = _botFactory.CreateBacktestFlippingBot(account.Name, moneyManagement, ticker, "scenario",
timeframe, false);
var strategy = ScenarioHelpers.GetStrategiesFromScenario(scenario);
flippingBot.LoadStrategies(ScenarioHelpers.GetStrategiesFromScenario(scenario));
flippingBot.LoadScenario(scenario.Name);
var candles = initialCandles ?? GetCandles(account, ticker, timeframe, days);
var result = GetBacktestingResult(ticker, scenario, timeframe, flippingBot, candles, balance, account,
moneyManagement);
@@ -107,7 +106,7 @@ namespace Managing.Application.Backtesting
var ticker = MiscExtensions.ParseEnum<Ticker>(candles.FirstOrDefault().Ticker);
var bot = _botFactory.CreateBacktestScalpingBot(account.Name, moneyManagement, ticker, "scenario",
timeframe, false);
bot.LoadStrategies(ScenarioHelpers.GetStrategiesFromScenario(scenario));
bot.LoadScenario(scenario.Name);
var result = GetBacktestingResult(ticker, scenario, timeframe, bot, candles, balance, account,
moneyManagement);
return result;
@@ -119,6 +118,7 @@ namespace Managing.Application.Backtesting
var ticker = MiscExtensions.ParseEnum<Ticker>(candles.FirstOrDefault().Ticker);
var bot = _botFactory.CreateBacktestFlippingBot(account.Name, moneyManagement, ticker, "scenario",
timeframe, false);
bot.LoadScenario(scenario.Name);
var result = GetBacktestingResult(ticker, scenario, timeframe, bot, candles, balance, account,
moneyManagement);
return result;

View File

@@ -1,8 +1,8 @@
using Managing.Application.Abstractions;
using Microsoft.Extensions.Logging;
using static Managing.Common.Enums;
using Managing.Application.Abstractions.Services;
using Managing.Domain.MoneyManagements;
using Microsoft.Extensions.Logging;
using static Managing.Common.Enums;
namespace Managing.Application.Bots
{
@@ -11,7 +11,7 @@ namespace Managing.Application.Bots
public FlippingBot(string accountName,
MoneyManagement moneyManagement,
string name,
string scenario,
string scenarioName,
IExchangeService exchangeService,
Ticker ticker,
ITradingService tradingService,
@@ -26,7 +26,7 @@ namespace Managing.Application.Bots
moneyManagement,
name,
ticker,
scenario,
scenarioName,
exchangeService,
logger,
tradingService,

View File

@@ -1,8 +1,8 @@
using Managing.Application.Abstractions;
using Microsoft.Extensions.Logging;
using static Managing.Common.Enums;
using Managing.Application.Abstractions.Services;
using Managing.Domain.MoneyManagements;
using Microsoft.Extensions.Logging;
using static Managing.Common.Enums;
namespace Managing.Application.Bots
{
@@ -11,7 +11,7 @@ namespace Managing.Application.Bots
public ScalpingBot(string accountName,
MoneyManagement moneyManagement,
string name,
string scenario,
string scenarioName,
IExchangeService exchangeService,
Ticker ticker,
ITradingService tradingService,
@@ -23,19 +23,19 @@ namespace Managing.Application.Bots
bool isForBacktest = false,
bool isForWatchingOnly = false)
: base(accountName,
moneyManagement,
name,
ticker,
scenario,
exchangeService,
logger,
tradingService,
timeframe,
accountService,
messengerService,
botService,
isForBacktest,
isForWatchingOnly)
moneyManagement,
name,
ticker,
scenarioName,
exchangeService,
logger,
tradingService,
timeframe,
accountService,
messengerService,
botService,
isForBacktest,
isForWatchingOnly)
{
BotType = BotType.ScalpingBot;
}
@@ -47,4 +47,4 @@ namespace Managing.Application.Bots
Logger.LogInformation($"Starting {Name} bot - Status : {Status}");
}
}
}
}

View File

@@ -33,7 +33,7 @@ public class TradingBot : Bot, ITradingBot
public HashSet<Signal> Signals { get; set; }
public List<Position> Positions { get; set; }
public Ticker Ticker { get; set; }
public string Scenario { get; set; }
public string ScenarioName { get; set; }
public string AccountName { get; set; }
public MoneyManagement MoneyManagement { get; set; }
public Timeframe Timeframe { get; set; }
@@ -44,6 +44,7 @@ public class TradingBot : Bot, ITradingBot
public int PreloadedCandlesCount { get; set; }
public BotType BotType { get; set; }
public decimal Fee { get; set; }
public Scenario Scenario { get; set; }
public Dictionary<DateTime, decimal> WalletBalances { get; set; }
public TradingBot(
@@ -51,7 +52,7 @@ public class TradingBot : Bot, ITradingBot
MoneyManagement moneyManagement,
string name,
Ticker ticker,
string scenario,
string scenarioName,
IExchangeService exchangeService,
ILogger<TradingBot> logger,
ITradingService tradingService,
@@ -75,7 +76,7 @@ public class TradingBot : Bot, ITradingBot
AccountName = accountName;
MoneyManagement = moneyManagement;
Ticker = ticker;
Scenario = scenario;
ScenarioName = scenarioName;
Timeframe = timeframe;
IsForBacktest = isForBacktest;
Logger = logger;
@@ -101,7 +102,7 @@ public class TradingBot : Bot, ITradingBot
if (!IsForBacktest)
{
LoadScenario();
LoadScenario(ScenarioName);
await PreloadCandles();
await CancelAllOrders();
@@ -135,9 +136,9 @@ public class TradingBot : Bot, ITradingBot
}
}
public void LoadScenario()
public void LoadScenario(string scenarioName)
{
var scenario = TradingService.GetScenarioByName(Scenario);
var scenario = TradingService.GetScenarioByName(scenarioName);
if (scenario == null)
{
Logger.LogWarning("No scenario found for this scenario name");
@@ -145,6 +146,7 @@ public class TradingBot : Bot, ITradingBot
}
else
{
Scenario = scenario;
LoadStrategies(ScenarioHelpers.GetStrategiesFromScenario(scenario));
}
}
@@ -159,22 +161,25 @@ public class TradingBot : Bot, ITradingBot
public async Task Run()
{
Logger.LogInformation($"____________________{Name}____________________");
Logger.LogInformation(
$"Time : {DateTime.Now} - Server time {DateTime.Now.ToUniversalTime()} - Bot : {Name} - Type {BotType} - Ticker : {Ticker}");
if (!IsForBacktest)
{
Logger.LogInformation($"____________________{Name}____________________");
Logger.LogInformation(
$"Time : {DateTime.Now} - Server time {DateTime.Now.ToUniversalTime()} - Bot : {Name} - Type {BotType} - Ticker : {Ticker}");
}
var previousLastCandle = OptimizedCandles.LastOrDefault();
if (!IsForBacktest)
await UpdateCandles();
var currentLastCandle = OptimizedCandles.LastOrDefault();
if (currentLastCandle != previousLastCandle || IsForBacktest)
await UpdateSignals(OptimizedCandles);
else
Logger.LogInformation($"No need to update signals for {Ticker}");
if (!IsForWatchingOnly)
await ManagePositions();
@@ -213,7 +218,7 @@ public class TradingBot : Bot, ITradingBot
private async Task UpdateSignals(FixedSizeQueue<Candle> candles)
{
var signal = TradingBox.GetSignal(candles.ToHashSet(), Strategies, Signals);
var signal = TradingBox.GetSignal(candles.ToHashSet(), Strategies, Signals, Scenario.LoopbackPeriod);
if (signal == null) return;
@@ -231,7 +236,7 @@ public class TradingBot : Bot, ITradingBot
if (IsForWatchingOnly || (ExecutionCount < 1 && !IsForBacktest))
signal.Status = SignalStatus.Expired;
var signalText = $"{Scenario} trigger a signal. Signal told you " +
var signalText = $"{ScenarioName} trigger a signal. Signal told you " +
$"to {signal.Direction} {Ticker} on {Timeframe}. The confidence in this signal is {signal.Confidence}. Identifier : {signal.Identifier}";
Logger.LogInformation(signalText);
@@ -726,7 +731,7 @@ public class TradingBot : Bot, ITradingBot
Positions = Positions,
Timeframe = Timeframe,
Ticker = Ticker,
Scenario = Scenario,
ScenarioName = ScenarioName,
AccountName = AccountName,
IsForWatchingOnly = IsForWatchingOnly,
WalletBalances = WalletBalances,
@@ -744,7 +749,7 @@ public class TradingBot : Bot, ITradingBot
MoneyManagement = data.MoneyManagement;
Timeframe = data.Timeframe;
Ticker = data.Ticker;
Scenario = data.Scenario;
ScenarioName = data.ScenarioName;
AccountName = data.AccountName;
IsForWatchingOnly = data.IsForWatchingOnly;
}
@@ -758,7 +763,7 @@ public class TradingBotBackup
public List<Position> Positions { get; set; }
public Timeframe Timeframe { get; set; }
public Ticker Ticker { get; set; }
public string Scenario { get; set; }
public string ScenarioName { get; set; }
public string AccountName { get; set; }
public bool IsForWatchingOnly { get; set; }
public Dictionary<DateTime, decimal> WalletBalances { get; set; }

View File

@@ -128,7 +128,7 @@ namespace Managing.Application.ManageBot
scalpingBotData.MoneyManagement,
backupBot.Name,
scalpingBotData.Ticker,
scalpingBotData.Scenario,
scalpingBotData.ScenarioName,
scalpingBotData.Timeframe,
scalpingBotData.IsForWatchingOnly);
botTask = Task.Run(() => ((ITradingBot)bot).Start());
@@ -140,7 +140,7 @@ namespace Managing.Application.ManageBot
flippingBotData.MoneyManagement,
backupBot.Name,
flippingBotData.Ticker,
flippingBotData.Scenario,
flippingBotData.ScenarioName,
flippingBotData.Timeframe,
flippingBotData.IsForWatchingOnly);
botTask = Task.Run(() => ((ITradingBot)bot).Start());

View File

@@ -19,9 +19,9 @@ namespace Managing.Application.Scenarios
_tradingService = tradingService;
}
public Scenario CreateScenario(string name, List<string> strategies)
public Scenario CreateScenario(string name, List<string> strategies, int? loopbackPeriod = 1)
{
var scenario = new Scenario(name);
var scenario = new Scenario(name, loopbackPeriod);
foreach (var strategy in strategies)
{
@@ -43,20 +43,18 @@ namespace Managing.Application.Scenarios
public Strategy CreateStrategy(
StrategyType type,
Timeframe timeframe,
string name,
string name,
int? period = null,
int? fastPeriods = null,
int? slowPeriods = null,
int? signalPeriods = null,
double? multiplier = null,
int? stochPeriods = null,
int? smoothPeriods = null,
int? smoothPeriods = null,
int? cyclePeriods = null)
{
var strategy = ScenarioHelpers.BuildStrategy(
type,
timeframe,
name,
period,
fastPeriods,
@@ -141,4 +139,4 @@ namespace Managing.Application.Scenarios
return true;
}
}
}
}

View File

@@ -62,7 +62,7 @@ public class SettingsService : ISettingsService
SetupMoneyManagementsSeed(Timeframe.FifteenMinutes);
SetupMoneyManagementsSeed(Timeframe.OneHour);
SetupMoneyManagementsSeed(Timeframe.OneDay);
SetupScenariosSeed(Timeframe.FifteenMinutes);
SetupScenariosSeed();
}
catch (Exception ex)
{
@@ -82,30 +82,29 @@ public class SettingsService : ISettingsService
Leverage = 1,
StopLoss = 0.021m,
TakeProfit = 0.042m,
Name = $"{timeframe} Money Management"
Name = $"{timeframe}-MediumRisk",
};
await _moneyManagementService.CreateOrUpdateMoneyManagement(moneyManagement);
}
private void SetupScenariosSeed(Timeframe timeframe)
private void SetupScenariosSeed()
{
SetupMacd(timeframe);
SetupRsiDiv(timeframe);
SetupRsiDivConfirm(timeframe);
SetupSuperTrend(timeframe);
SetupChandelierExit(timeframe);
SetupStochRsiTrend(timeframe);
SetupStochSTCTrend(timeframe);
SetupEmaTrend(timeframe);
SetupEmaCross(timeframe);
SetupMacd();
SetupRsiDiv();
SetupRsiDivConfirm();
SetupSuperTrend();
SetupChandelierExit();
SetupStochRsiTrend();
SetupStochSTCTrend();
SetupEmaTrend();
SetupEmaCross();
}
private void SetupStochSTCTrend(Timeframe timeframe)
private void SetupStochSTCTrend()
{
var name = "STCTrend";
var strategy = _scenarioService.CreateStrategy(StrategyType.Stc,
timeframe,
name,
fastPeriods: 23,
slowPeriods: 50,
@@ -113,11 +112,10 @@ public class SettingsService : ISettingsService
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupMacd(Timeframe timeframe)
private void SetupMacd()
{
var name = "MacdCross";
var strategy = _scenarioService.CreateStrategy(StrategyType.MacdCross,
timeframe,
name,
fastPeriods: 12,
slowPeriods: 26,
@@ -125,53 +123,48 @@ public class SettingsService : ISettingsService
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupRsiDiv(Timeframe timeframe)
private void SetupRsiDiv()
{
var name = "RsiDiv6";
var strategy = _scenarioService.CreateStrategy(StrategyType.RsiDivergence,
timeframe,
name,
period: 6);
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupRsiDivConfirm(Timeframe timeframe)
private void SetupRsiDivConfirm()
{
var name = "RsiDivConfirm6";
var strategy = _scenarioService.CreateStrategy(StrategyType.RsiDivergenceConfirm,
timeframe,
name,
period: 6);
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupSuperTrend(Timeframe timeframe)
private void SetupSuperTrend()
{
var name = "SuperTrend";
var strategy = _scenarioService.CreateStrategy(StrategyType.SuperTrend,
timeframe,
name,
period: 10,
multiplier: 3);
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupChandelierExit(Timeframe timeframe)
private void SetupChandelierExit()
{
var name = "ChandelierExit";
var strategy = _scenarioService.CreateStrategy(StrategyType.ChandelierExit,
timeframe,
name,
period: 22,
multiplier: 3);
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupStochRsiTrend(Timeframe timeframe)
private void SetupStochRsiTrend()
{
var name = "StochRsiTrend";
var strategy = _scenarioService.CreateStrategy(StrategyType.StochRsiTrend,
timeframe,
name,
period: 14,
stochPeriods: 14,
@@ -180,21 +173,19 @@ public class SettingsService : ISettingsService
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupEmaTrend(Timeframe timeframe)
private void SetupEmaTrend()
{
var name = "Ema200Trend";
var strategy = _scenarioService.CreateStrategy(StrategyType.EmaTrend,
timeframe,
name,
period: 200);
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });
}
private void SetupEmaCross(Timeframe timeframe)
private void SetupEmaCross()
{
var name = "Ema200Cross";
var strategy = _scenarioService.CreateStrategy(StrategyType.EmaCross,
timeframe,
name,
period: 200);
_scenarioService.CreateScenario(name, new List<string> { strategy.Name });

View File

@@ -30,7 +30,7 @@ public class RsiDiv : FlowBase
MapParameters();
var candles = JsonConvert.DeserializeObject<HashSet<Candle>>(input);
var strategy = new RSIDivergenceStrategy(Name, RsiDivParameters.Timeframe, RsiDivParameters.Period);
var strategy = new RSIDivergenceStrategy(Name, RsiDivParameters.Period);
strategy.UpdateCandles(candles);
strategy.Run();