StrategyRunner#
API documentation for tradeexecutor.strategy.runner.StrategyRunner Python class in Trading Strategy framework.
- class StrategyRunner[source]#
- Bases: - ABC- A base class for a strategy executor. - Each different strategy type needs its own runner. Currently we have - TODO: Make user_supplied_routing_model non-optional after eliminating legacy code. - __init__(timed_task_context_manager, execution_model, approval_model, valuation_model_factory, sync_model, pricing_model_factory, execution_context, routing_model=None, routing_model_factory=None, run_state=None, accounting_checks=False, unit_testing=False, trade_settle_wait=None, parameters=None, create_indicators=None, visualisation=True, max_price_impact=None)[source]#
- Parameters:
- engine_version – - Strategy execution version. - Changes function arguments based on this. See StrategyModuleInformation.trading_strategy_engine_version. 
- timed_task_context_manager (AbstractContextManager) – 
- execution_model (ExecutionModel) – 
- approval_model (ApprovalModel) – 
- valuation_model_factory (ValuationModelFactory) – 
- pricing_model_factory (PricingModelFactory) – 
- execution_context (ExecutionContext) – 
- routing_model (Optional[RoutingModel]) – 
- routing_model_factory (Callable[[], RoutingModel]) – 
- parameters (StrategyParameters) – 
- create_indicators (tradeexecutor.strategy.pandas_trader.indicator.CreateIndicatorsProtocolV1 | tradeexecutor.strategy.pandas_trader.indicator.CreateIndicatorsProtocolV2) – 
- max_price_impact (float | None) – 
 
 
 - Methods - __init__(timed_task_context_manager, ...[, ...])- param engine_version:
 - check_accounts(universe, state[, ...])- Perform extra accounting checks on live trading startup. - check_balances_post_execution(universe, ...)- Check that on-chain balances matches our internal accounting after executing trades. - check_position_triggers(clock, state, ...[, ...])- Check stop loss/take profit for positions. - Collect post execution data for all trades. - Do we log the strategy steps to logger? - on_clock(clock, universe, pricing_model, ...)- Perform the core strategy decision cycle. - pretick_check(ts, universe)- Check the universe for good data before a strategy tick is executed. - refresh_visualisations(state, universe)- Update the visualisations in the run state. - repair_state(state)- Repair unclean state issues. - report_after_execution(cycle, clock, ...)- report_after_sync_and_revaluation(clock, ...)- report_before_execution(clock, universe, ...)- Strategy admin helpers to understand a live running strategy. - revalue_state(ts, state, valuation_model)- Revalue portfolio based on the latest prices. - setup_routing(universe)- Setups routing state for this cycle. - sync_portfolio(...[, end_block, ...])- Adjust portfolio balances based on the external events. - tick(strategy_cycle_timestamp, universe, ...)- Execute the core functions of a strategy. - __init__(timed_task_context_manager, execution_model, approval_model, valuation_model_factory, sync_model, pricing_model_factory, execution_context, routing_model=None, routing_model_factory=None, run_state=None, accounting_checks=False, unit_testing=False, trade_settle_wait=None, parameters=None, create_indicators=None, visualisation=True, max_price_impact=None)[source]#
- Parameters:
- engine_version – - Strategy execution version. - Changes function arguments based on this. See StrategyModuleInformation.trading_strategy_engine_version. 
- timed_task_context_manager (AbstractContextManager) – 
- execution_model (ExecutionModel) – 
- approval_model (ApprovalModel) – 
- valuation_model_factory (ValuationModelFactory) – 
- pricing_model_factory (PricingModelFactory) – 
- execution_context (ExecutionContext) – 
- routing_model (Optional[RoutingModel]) – 
- routing_model_factory (Callable[[], RoutingModel]) – 
- parameters (StrategyParameters) – 
- create_indicators (tradeexecutor.strategy.pandas_trader.indicator.CreateIndicatorsProtocolV1 | tradeexecutor.strategy.pandas_trader.indicator.CreateIndicatorsProtocolV2) – 
- max_price_impact (float | None) – 
 
 
 - abstract pretick_check(ts, universe)[source]#
- Check the universe for good data before a strategy tick is executed. - If there are data errors, then log and abort with helpful error messages. - Only relevant for live trading; if backtesting data fails it can be diagnosed in the backtesting itself. - Parameters:
- client – Trading Strategy client to check server versions etc. 
- universe (StrategyExecutionUniverse) – THe currently constructed universe 
- ts (datetime) – Real-time clock signal or past clock timestamp in the case of unit testing 
 
- Raises:
- PreflightCheckFailed – In the case we cannot go live 
 
 - is_progress_report_needed()[source]#
- Do we log the strategy steps to logger? - Disabled for backtesting to speed up 
- Can be enabled by hacking this function if backtesting needs debugging 
 - Return type:
 
 - sync_portfolio(strategy_cycle_or_trigger_check_ts, universe, state, debug_details, end_block=None, long_short_metrics_latest=None, post_valuation=True)[source]#
- Adjust portfolio balances based on the external events. - External events include - Deposits 
- Withdrawals 
- Interest accrued 
- Token rebases 
 - Parameters:
- strategy_cycle_or_trigger_check_ts (datetime) – Timestamp for the event trigger 
- universe (StrategyExecutionUniverse) – Loaded universe 
- state (State) – Currnet strategy state 
- end_block (int | None) – - Sync until this block. - If not given sync to the lateshish. 
- debug_details (dict) – Dictionary of debug data that will be passed down to the callers 
- long_short_metrics_latest (tradeexecutor.statistics.statistics_table.StatisticsTable | None) – Latest long/short statistics table, if available 
 
 
 - revalue_state(ts, state, valuation_model)[source]#
- Revalue portfolio based on the latest prices. - Parameters:
- ts (datetime) – 
- state (State) – 
- valuation_model (ValuationModel) – 
 
 
 - collect_post_execution_data(execution_context, pricing_model, trades)[source]#
- Collect post execution data for all trades. - Collect prices after the execution 
- Mostly matters for failed execution only, but we collect for everything 
 - Parameters:
- execution_context (ExecutionContext) – 
- pricing_model (PricingModel) – 
- trades (List[TradeExecution]) – 
 
 
 - on_clock(clock, universe, pricing_model, state, debug_details, indicators=None, routing_state=None, routing_model=None)[source]#
- Perform the core strategy decision cycle. - Parameters:
- clock (datetime) – The current cycle timestamp 
- universe (StrategyExecutionUniverse) – Our trading pairs and such. Refreshed before the cycle. 
- pricing_model (PricingModel) – When constructing trades, uses pricing model to estimate the cost of a trade. 
- state (State) – The current trade execution and portfolio status 
- debug_details (dict) – 
- indicators (tradeexecutor.strategy.pandas_trader.strategy_input.StrategyInputIndicators | None) – 
- routing_state (RoutingState) – 
- routing_model (RoutingModel) – 
 
- Returns:
- List of new trades to execute 
- Return type:
 
 - report_strategy_thinking(strategy_cycle_timestamp, cycle, universe, state, trades, debug_details)[source]#
- Strategy admin helpers to understand a live running strategy. - Post latest variables 
- Draw the single pair strategy visualisation. 
 - Parameters:
- strategy_cycle_timestamp (datetime) – real time lock 
- cycle (int) – Cycle number 
- universe (TradingStrategyUniverse) – Currnet trading universe 
- trades (List[TradeExecution]) – Trades executed on this cycle 
- state (State) – Current execution state 
- debug_details (dict) – Dict of random debug stuff 
 
 
 - setup_routing(universe)[source]#
- Setups routing state for this cycle. - Parameters:
- universe (StrategyExecutionUniverse) – The currently tradeable universe 
- Returns:
- Tuple(routing state, pricing model, valuation model) 
- Return type:
 
 - check_balances_post_execution(universe, state, cycle)[source]#
- Check that on-chain balances matches our internal accounting after executing trades. - Crash the execution if the on-chain balance is not what we expect 
- Call after we have stored the execution state in the database 
 - Parameters:
- universe (StrategyExecutionUniverse) – 
- state (State) – 
- cycle (int) – 
 
 
 - tick(strategy_cycle_timestamp, universe, state, debug_details, cycle_duration=None, cycle=None, store=None, long_short_metrics_latest=None, indicators=None)[source]#
- Execute the core functions of a strategy. - TODO: This function is vulnerable to balance changes in the middle of execution. It’s not possible to fix this until we have atomic rebalances. - Parameters:
- strategy_cycle_timestamp (datetime) – Current timestamp of the execution cycle. 
- universe (StrategyExecutionUniverse) – Loaded trading data 
- state (State) – The current state of the strategy (open position, past trades, visualisation) 
- debug_details (dict) – Internal bunch of data used in unit testing 
- cycle_duration (Optional[CycleDuration]) – The currenct cycle duration (time between ticks). This may be specific in a strategy module, but also overridden for testing. This is used only for logging purposes. 
- execution_context – Live or backtesting 
- indicators (tradeexecutor.strategy.pandas_trader.strategy_input.StrategyInputIndicators | None) – Precalculated backtest or live calculated indicator values. 
- store (Optional[StateStore]) – 
- long_short_metrics_latest (tradeexecutor.statistics.statistics_table.StatisticsTable | None) – 
 
- Returns:
- Debug details dictionary where different subsystems can write their diagnostics information what is happening during the dict. Mostly useful for integration testing. 
- Return type:
 
 - check_position_triggers(clock, state, universe, stop_loss_pricing_model, routing_state, long_short_metrics_latest=None)[source]#
- Check stop loss/take profit for positions. - Unlike trade balancing in tick() - Stop loss/take profit can occur only to any existing positions. No new positions are opened. 
- Trading Universe cannot change for these triggers, but remains stable between main ticks. 
- check_position_triggers() is much more lightweight and can be called much more frequently, even once per minute 
 - Returns:
- List of generated stop loss trades 
- Parameters:
- clock (datetime) – 
- state (State) – 
- universe (StrategyExecutionUniverse) – 
- stop_loss_pricing_model (PricingModel) – 
- routing_state (RoutingState) – 
- long_short_metrics_latest (tradeexecutor.statistics.statistics_table.StatisticsTable | None) – 
 
- Return type:
 
 - repair_state(state)[source]#
- Repair unclean state issues. - Currently supports - Fixing unfinished trades 
 - Returns:
- List of fixed trades 
- Parameters:
- state (State) – 
- Return type:
 
 - refresh_visualisations(state, universe)[source]#
- Update the visualisations in the run state. - This will update RunState.visualisations for the current strategy. - In-process memory charts are served by webhook 
- In-process memory charts are posted to Discord, etc. 
- This is called on the startup, so that we have immediately good visualisation to show over the webhook when the web server boots up 
- This is called after each strategy thinking cycle is complete. 
 - The function is overridden by the child class for actual strategy runner specific implementation. - Parameters:
- state (State) – 
- universe (TradingStrategyUniverse) – 
 
 
 - check_accounts(universe, state, report_only=False, end_block=None, cycle=None)[source]#
- Perform extra accounting checks on live trading startup. - Must be enabled in the settings. Enabled by default for live trading. - Parameters:
- report_only – Don’t crash if we get problems in accounts 
- end_block (int | None) – - Check specifically at this block. - If not given use the lateshish block. 
- universe (TradingStrategyUniverse) – 
- state (State) – 
- cycle (int | None) – 
 
- Raises:
- UnexpectedAccountingCorrectionIssue – Aborting execution.