Files
managing-apps/orleans-plan.md
Oda 3de8b5e00e Orlean (#32)
* Start building with orlean

* Add missing file

* Serialize grain state

* Remove grain and proxies

* update and add plan

* Update a bit

* Fix backtest grain

* Fix backtest grain

* Clean a bit
2025-07-30 16:03:30 +07:00

10 KiB

Todo List Phase 1: Keep TradingBotBase Unchanged (Composition Approach) COMPLETE [] File: src/Managing.Application/Bots/TradingBotBase.cs [] Keep class as concrete (not abstract) [] No Orleans-specific methods needed [] Preserve all existing functionality [] Ensure it remains reusable for direct instantiation and Orleans composition

Phase 2: Create Orleans Wrapper Grains (Composition) [] File: src/Managing.Application/Bots/Grains/LiveTradingBotGrain.cs [] Inherit from Grain and implement ITradingBotGrain [] Use composition: private TradingBotBase _tradingBot [] Implement Orleans lifecycle methods (OnActivateAsync, OnDeactivateAsync) [] Delegate trading operations to _tradingBot instance [] Handle Orleans timer management for bot execution [] Implement state persistence between grain state and TradingBotBase [] Add configuration validation for live trading [] Implement all ITradingBotGrain methods as wrappers

[] File: src/Managing.Application/Bots/Grains/BacktestTradingBotGrain.cs [] Inherit from Grain and implement IBacktestTradingBotGrain [] Use composition: private TradingBotBase _tradingBot [] Implement Orleans lifecycle methods for backtest execution [] Delegate trading operations to _tradingBot instance [] Handle backtest-specific candle processing (no timer) [] Implement state persistence for backtest scenarios [] Add configuration validation for backtesting [] Implement all ITradingBotGrain methods as wrappers [] Add backtest-specific methods: RunBacktestAsync, GetBacktestProgressAsync (following GetBacktestingResult pattern) [] Stateless design - no state persistence, fresh TradingBotBase instance per backtest [] Simplified interface - Start/Stop are no-ops, other methods throw exceptions for backtest mode [] StatelessWorker attribute - grain doesn't inherit from Grain but implements interface [] Config passed as parameter - no state dependency, config passed to RunBacktestAsync method [] NEW: Orleans Serialization Support [] Return LightBacktest instead of Backtest for safe Orleans serialization [] Add ConvertToLightBacktest method to map Backtest to LightBacktest [] Handle type conversions (decimal? to double? for SharpeRatio, etc.) [] Ensure all properties are Orleans-serializable

[] File: src/Managing.Domain/Backtests/LightBacktest.cs [] NEW: Add Orleans Serialization Attributes [] Add [GenerateSerializer] attribute for Orleans serialization [] Add [Id(n)] attributes to all properties for proper serialization [] Add using Orleans; statement [] Ensure all property types are Orleans-serializable [] Match property types with LightBacktestResponse for consistency

[] File: src/Managing.Application.Abstractions/Grains/IBacktestTradingBotGrain.cs [] NEW: Update Interface for LightBacktest [] Change RunBacktestAsync return type from Backtest to LightBacktest [] Update method documentation to reflect LightBacktest usage [] Ensure interface is Orleans-compatible

[] File: src/Managing.Application/Backtesting/Backtester.cs [] Inject IGrainFactory dependency [] Update RunBacktestWithCandles to use Orleans grain instead of direct bot creation [] Remove GetBacktestingResult method (logic moved to grain) [] Remove helper methods (AggregateValues, GetIndicatorsValues) - moved to grain [] Simplified backtesting flow - Backtester orchestrates, grain executes [] Fixed Orleans serialization issue - CreateCleanConfigForOrleans method removes FixedSizeQueue objects [] Created LightIndicator and LightScenario classes for Orleans serialization [] Updated TradingBotConfig to use LightScenario instead of Scenario [] Simplified serialization - no more FixedSizeQueue or User properties in Orleans data [] Updated all application code to use LightScenario conversions [] Main application builds successfully with Orleans integration [] NEW: Update for LightBacktest Integration [] Update interface to return LightBacktest instead of Backtest [] Update RunTradingBotBacktest methods to return LightBacktest [] Remove conversion methods (no longer needed) [] Simplify Orleans grain calls to return LightBacktest directly [] Update all dependent services to work with LightBacktest

[] File: src/Managing.Application.Abstractions/Services/IBacktester.cs [] NEW: Update Interface for LightBacktest [] Change main backtest methods to return LightBacktest [] Keep full Backtest methods for database retrieval [] Update method documentation for LightBacktest usage [] Ensure backward compatibility where needed

[] File: src/Managing.Api/Controllers/BacktestController.cs [] NEW: Update Controller for LightBacktest [] Update Run method to return LightBacktest instead of Backtest [] Update method documentation to explain LightBacktest usage [] Remove unused notification method (handled in Orleans grain) [] Update variable declarations and return statements [] Ensure API responses are consistent with LightBacktest structure

[] File: src/Managing.Application.Workers/StatisticService.cs [] NEW: Update for LightBacktest Compatibility [] Update GetSignals method to handle LightBacktest (no signals data) [] Add warning log when signals data is not available [] Return empty list for signals (full data available via database lookup)

[] File: src/Managing.Application/GeneticService.cs [] NEW: Update for LightBacktest Compatibility [] Update TradingBotFitness.Evaluate to work with LightBacktest [] Update CalculateFitness method to accept LightBacktest [] Ensure genetic algorithm works with lightweight backtest data

[ ] File: src/Managing.Application/Bots/Grains/TradingBotGrainProxy.cs [ ] Fix remaining test compilation errors (6 scenario conversion errors in BotsTests.cs) [ ] Create proxy class that implements ITradingBot interface [ ] Wrap Orleans grain calls for seamless integration [ ] Maintain compatibility with existing ITradingBot consumers [ ] Handle async/await conversion between Orleans and synchronous calls

Phase 3: Update BotService for Conditional Instantiation [ ] File: src/Managing.Application/ManageBot/BotService.cs [ ] Remove _botTasks dictionary (replaced by Orleans grain management) [ ] Remove BotTaskWrapper class (no longer needed) [ ] Inject IGrainFactory for Orleans grain creation [ ] Update CreateTradingBot() with conditional logic: [ ] If IsForBacktest: return new TradingBotBase() (direct instantiation) [ ] If live trading: return new TradingBotGrainProxy(grain) (Orleans wrapper) [ ] Update CreateBacktestTradingBot() with same conditional logic [ ] Update all bot management methods to work with both direct and grain instances [ ] Use Guid for grain identification

Phase 4: Update Orleans Interface and State [ ] File: src/Managing.Application.Abstractions/Grains/ITradingBotGrain.cs [ ] Update to use IGrainWithGuidKey [ ] Add InitializeAsync(TradingBotConfig config) method [ ] Add RestartAsync() method [ ] Add DeleteAsync() method [ ] Add GetBotDataAsync() method [ ] Ensure all methods are async and Orleans-compatible

[ ] File: src/Managing.Application/Bots/TradingBotGrainState.cs [ ] Ensure all properties are Orleans-serializable [ ] Add methods for state synchronization with TradingBotBase [ ] Implement backup/restore functionality [ ] Add validation for state consistency

Phase 5: Update Dependencies and Configuration [ ] File: src/Managing.Bootstrap/ApiBootstrap.cs [ ] Register Orleans grains (LiveTradingBotGrain, BacktestTradingBotGrain) [ ] Keep existing bot service registrations for backward compatibility [ ] Add grain factory registration [ ] Configure Orleans clustering and persistence

Phase 6: Testing and Validation [ ] Test direct TradingBotBase instantiation (backtesting) [ ] Test LiveTradingBotGrain functionality (live trading) [ ] Test BacktestTradingBotGrain functionality (Orleans backtesting) [ ] Test BotService conditional instantiation [ ] Test Orleans reminder functionality [ ] Test grain lifecycle management [ ] Test state persistence and recovery [ ] Test TradingBotGrainProxy compatibility [] NEW: Test LightBacktest Serialization [] Verify Orleans serialization works correctly [] Test LightBacktest to Backtest conversion (if needed) [] Verify API responses with LightBacktest data [] Test genetic algorithm with LightBacktest

Benefits of Composition Approach TradingBotBase remains concrete and reusable No Orleans-specific code in core trading logic Backward compatibility maintained Clean separation of concerns Easier testing and maintenance Follows SOLID principles Flexible architecture for future changes NEW: Orleans Serialization Benefits LightBacktest provides efficient serialization Reduced memory footprint for Orleans communication Safe type serialization with GenerateSerializer attributes Consistent data structure across Orleans grains and API responses

Implementation Order Phase 1: Keep TradingBotBase unchanged (preserve existing functionality) COMPLETE Phase 2: Create Orleans wrapper grains (composition approach) COMPLETE Phase 3: Update BotService for conditional instantiation Phase 4: Update Orleans interface and state management Phase 5: Update dependencies and configuration Phase 6: Testing and validation

Current Status Orleans infrastructure setup TradingBotBase contains all core logic (keep as-is) LiveTradingBot.cs exists (will be replaced by grain) Phase 1 Complete - TradingBotBase ready for composition approach Phase 2 Complete - Orleans wrapper grains created and working NEW: LightBacktest Orleans Serialization Complete BacktestTradingBotGrain returns LightBacktest for safe serialization All interfaces and services updated to use LightBacktest API controllers updated for LightBacktest responses Application builds successfully with Orleans integration Ready to start Phase 3 (update BotService for conditional instantiation)