EthereumExecutionModel#
tradeexecutor.ethereum.execution.EthereumExecutionModel Python class in Trading Strategy framework.
- class EthereumExecutionModel[source]#
Bases:
ExecutionModel
Run order execution on a single Uniswap v2 style exchanges.
- abstract __init__(tx_builder, min_balance_threshold=Decimal('0.5'), confirmation_block_count=6, confirmation_timeout=datetime.timedelta(seconds=300), max_slippage=0.01, stop_on_execution_failure=True, swap_gas_fee_limit=2000000, mainnet_fork=False)[source]#
- Parameters:
tx_builder (TransactionBuilder) – Hot wallet instance used for this execution
min_balance_threshold – Abort execution if our hot wallet gas fee balance drops below this
confirmation_block_count – How many blocks to wait for the receipt confirmations to mitigate unstable chain tip issues
confirmation_timeout – How long we wait transactions to clear
stop_on_execution_failure – Raise an exception if any of the trades fail top execute
max_slippage (float) –
TODO: No longer used. Set in TradeExecution object.
Max slippage tolerance per trade. 0.01 is 1%.
mainnet_fork – Is this Anvil in automining mainnet fork mode
Methods
__init__
(tx_builder[, ...])- param tx_builder:
analyse_trade_by_receipt
(web3, uniswap, tx, ...)Links to either uniswap v2 or v3 implementation in eth_defi
broadcast_and_resolve
(state, trades[, ...])Do the live trade execution.
execute_trades
(ts, state, trades, ...[, ...])Execute the trades determined by the algo on a designed Uniswap v2 instance.
Get needed details to establish a routing state.
Set up the wallet
is_live_trading
()Do we support stop-loss/take profit functionality with this execution model?
is_v3
()Returns true if instance is related to Uniswap V3, else false.
Links to either uniswap v2 or v3 implementation in eth_defi
pre_execute_assertions
(ts, routing_model, ...)Check that we can connect to the web3 node
repair_unconfirmed_trades
(state)Repair unconfirmed trades.
resolve_trades
(ts, state, tx_map, receipts)Resolve trade outcome.
update_confirmation_status
(ts, tx_map, receipts)First update the state of all transactions, as we now have receipt for them.
Attributes
Which chain the live execution is connected to.
web3
- abstract __init__(tx_builder, min_balance_threshold=Decimal('0.5'), confirmation_block_count=6, confirmation_timeout=datetime.timedelta(seconds=300), max_slippage=0.01, stop_on_execution_failure=True, swap_gas_fee_limit=2000000, mainnet_fork=False)[source]#
- Parameters:
tx_builder (TransactionBuilder) – Hot wallet instance used for this execution
min_balance_threshold – Abort execution if our hot wallet gas fee balance drops below this
confirmation_block_count – How many blocks to wait for the receipt confirmations to mitigate unstable chain tip issues
confirmation_timeout – How long we wait transactions to clear
stop_on_execution_failure – Raise an exception if any of the trades fail top execute
max_slippage (float) –
TODO: No longer used. Set in TradeExecution object.
Max slippage tolerance per trade. 0.01 is 1%.
mainnet_fork – Is this Anvil in automining mainnet fork mode
- abstract analyse_trade_by_receipt(web3, uniswap, tx, tx_hash, tx_receipt, input_args)[source]#
Links to either uniswap v2 or v3 implementation in eth_defi
- Parameters:
web3 (Web3) –
uniswap (UniswapV2Deployment) –
tx (dict) –
tx_hash (str) –
tx_receipt (dict) –
input_args (tuple | None) –
- Return type:
eth_defi.trade.TradeSuccess | eth_defi.trade.TradeFail
- abstract mock_partial_deployment_for_analysis()[source]#
Links to either uniswap v2 or v3 implementation in eth_defi
- abstract is_v3()[source]#
Returns true if instance is related to Uniswap V3, else false. Kind of a hack to be able to share resolve trades function amongst v2 and v3.
- repair_unconfirmed_trades(state)[source]#
Repair unconfirmed trades.
Repair trades that failed to properly broadcast or confirm due to blockchain node issues.
- Parameters:
state (State) –
- Return type:
- is_stop_loss_supported()[source]#
Do we support stop-loss/take profit functionality with this execution model?
For backtesting we need to have data stream for candles used to calculate stop loss
For production execution, we need to have special oracle data streams for checking real-time stop loss
- Return type:
- broadcast_and_resolve(state, trades, confirmation_timeout=datetime.timedelta(seconds=60), confirmation_block_count=0, stop_on_execution_failure=False)[source]#
Do the live trade execution.
Push trades to a live blockchain
Wait transactions to be mined
Based on the transaction result, update the state of the trade if it was success or not
- Parameters:
confirmation_block_count (int) – How many blocks to wait until marking transaction as confirmed
stop_on_execution_failure – If any of the transactions fail, then raise an exception. Set for unit test.
state (State) –
trades (List[TradeExecution]) –
confirmation_timeout (timedelta) –
- Confirmation_timeout:
Max time to wait for a confirmation.
We can use zero or negative values to simulate unconfirmed trades. See test_broadcast_failed_and_repair_state.
- execute_trades(ts, state, trades, routing_model, routing_state, check_balances=False)[source]#
Execute the trades determined by the algo on a designed Uniswap v2 instance.
- Returns:
Tuple List of succeeded trades, List of failed trades
- Parameters:
ts (datetime) –
state (State) –
trades (List[TradeExecution]) –
routing_model (tradeexecutor.ethereum.uniswap_v2.uniswap_v2_routing.UniswapV2SimpleRoutingModel | tradeexecutor.ethereum.uniswap_v3.uniswap_v3_routing.UniswapV3SimpleRoutingModel) –
routing_state (tradeexecutor.ethereum.uniswap_v2.uniswap_v2_routing.UniswapV2RoutingState | tradeexecutor.ethereum.uniswap_v3.uniswap_v3_routing.UniswapV3RoutingState) –
- update_confirmation_status(ts, tx_map, receipts)[source]#
First update the state of all transactions, as we now have receipt for them. Update the transaction confirmation status
- Parameters:
ts (datetime) –
tx_map (Dict[HexBytes, Tuple[TradeExecution, BlockchainTransaction]]) –
- Return type:
- resolve_trades(ts, state, tx_map, receipts, stop_on_execution_failure=True)[source]#
Resolve trade outcome.
Read on-chain Uniswap swap data from the transaction receipt and record how it went.
Mutates the trade objects in-place.
- Parameters:
tx_map (Dict[HexBytes, Tuple[TradeExecution, BlockchainTransaction]]) – tx hash -> (trade, transaction) mapping
receipts (Dict[HexBytes, dict]) – tx hash -> receipt object mapping
stop_on_execution_failure – Raise an exception if any of the trades failed
ts (datetime) –
state (State) –