OctoBot-Trading 2.4.75__tar.gz → 2.4.77__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/CHANGELOG.md +10 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.75/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.77}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/README.md +1 -1
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/constants.py +3 -1
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/errors.py +6 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/abstract_exchange.py +7 -1
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +9 -1
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +3 -3
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +1 -1
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/types/rest_exchange.py +11 -6
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/modes_util.py +21 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_config_data.py +13 -5
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/test_modes_util.py +58 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/real_exchange_tester.py +9 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_ascendex.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_binance.py +2 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_binance_futures.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bingx.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitfinex.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitget.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bithumb.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitso.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitstamp.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bybit.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bybit_futures.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_coinbase.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_coinex.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_cryptocom.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_gateio.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_hitbtc.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_hollaex.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_htx.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_kraken.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_kucoin.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_kucoin_futures.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_mexc.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_ndax.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_okcoin.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_okx.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_okx_futures.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_phemex.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_poloniex.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_upbit.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_wavesexchange.py +1 -4
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/LICENSE +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/traders/trader.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/exchange_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/order_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/setup.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [2.4.77] - 2024-04-13
|
8
|
+
### Added
|
9
|
+
- [Exchanges] Handle inactive markets
|
10
|
+
|
11
|
+
## [2.4.76] - 2024-04-12
|
12
|
+
### Added
|
13
|
+
- [Exchanges] Handle order type open status for symbol
|
14
|
+
### Updated
|
15
|
+
- [Exchanges] Handle portfolio optimization using limit orders
|
16
|
+
|
7
17
|
## [2.4.75] - 2024-04-11
|
8
18
|
### Fixed
|
9
19
|
- [Exchanges] Properly handle order not found errors
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.77
|
4
4
|
Summary: OctoBot project trading package
|
5
5
|
Home-page: https://github.com/Drakkar-Software/OctoBot-Trading
|
6
6
|
Author: Drakkar-Software
|
@@ -16,7 +16,7 @@ Classifier: Operating System :: POSIX
|
|
16
16
|
Requires-Python: >=3.8
|
17
17
|
License-File: LICENSE
|
18
18
|
|
19
|
-
# OctoBot-Trading [2.4.
|
19
|
+
# OctoBot-Trading [2.4.77](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
|
20
20
|
[](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
|
21
21
|
[](https://pypi.python.org/pypi/OctoBot-Trading/)
|
22
22
|
[](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.77
|
4
4
|
Summary: OctoBot project trading package
|
5
5
|
Home-page: https://github.com/Drakkar-Software/OctoBot-Trading
|
6
6
|
Author: Drakkar-Software
|
@@ -16,7 +16,7 @@ Classifier: Operating System :: POSIX
|
|
16
16
|
Requires-Python: >=3.8
|
17
17
|
License-File: LICENSE
|
18
18
|
|
19
|
-
# OctoBot-Trading [2.4.
|
19
|
+
# OctoBot-Trading [2.4.77](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
|
20
20
|
[](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
|
21
21
|
[](https://pypi.python.org/pypi/OctoBot-Trading/)
|
22
22
|
[](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# OctoBot-Trading [2.4.
|
1
|
+
# OctoBot-Trading [2.4.77](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
|
2
2
|
[](https://app.codacy.com/gh/Drakkar-Software/OctoBot-Trading?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot-Trading&utm_campaign=Badge_Grade_Dashboard)
|
3
3
|
[](https://pypi.python.org/pypi/OctoBot-Trading/)
|
4
4
|
[](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
|
@@ -42,6 +42,8 @@ ALLOW_SIMULATED_ORDERS_INSTANT_FILL = os_util.parse_boolean_environment_var(
|
|
42
42
|
ORDER_DATA_FETCHING_TIMEOUT = 5 * commons_constants.MINUTE_TO_SECONDS
|
43
43
|
CHAINED_ORDER_PRICE_FETCHING_TIMEOUT = 1 # should be instant or ignored
|
44
44
|
CHAINED_ORDERS_OUTDATED_PRICE_ALLOWANCE = decimal.Decimal("0.005") # allows 0.5% outdated price error
|
45
|
+
# create instantly filled limit orders 0.5% beyond market
|
46
|
+
INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA = decimal.Decimal("0.005")
|
45
47
|
CREATED_ORDER_FORCED_UPDATE_PERIOD = 5
|
46
48
|
|
47
49
|
# Tentacles
|
@@ -131,7 +133,7 @@ EXCHANGE_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = [
|
|
131
133
|
|
132
134
|
# coinbase ex: coinbase {"error":"PERMISSION_DENIED",
|
133
135
|
# "error_details":"Missing required scopes","message":"Missing required scopes"}
|
134
|
-
("permission_denied", )
|
136
|
+
("permission_denied", "required scopes"),
|
135
137
|
]
|
136
138
|
|
137
139
|
# text content of errors due to exchange compliancy rules
|
@@ -93,6 +93,12 @@ class FailedRequest(Exception):
|
|
93
93
|
"""
|
94
94
|
|
95
95
|
|
96
|
+
class UnavailableOrderTypeForMarketError(Exception):
|
97
|
+
"""
|
98
|
+
Raised when an exchange refuses to create a given type of order that should normally be supported
|
99
|
+
"""
|
100
|
+
|
101
|
+
|
96
102
|
class AuthenticationError(Exception):
|
97
103
|
"""
|
98
104
|
Raised when an exchange failed to authenticate
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/abstract_exchange.py
RENAMED
@@ -383,7 +383,7 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
383
383
|
"""
|
384
384
|
raise NotImplementedError("get_bundled_order_parameters is not implemented")
|
385
385
|
|
386
|
-
def is_supported_order_type(self, order_type):
|
386
|
+
def is_supported_order_type(self, order_type: enums.TraderOrderType) -> bool:
|
387
387
|
"""
|
388
388
|
Check if the order type is supported by the current exchange instance
|
389
389
|
Should be used to know if we should simulate this order or create it on the exchange
|
@@ -392,6 +392,12 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
392
392
|
"""
|
393
393
|
return order_type not in self.get_supported_elements(enums.ExchangeSupportedElements.UNSUPPORTED_ORDERS)
|
394
394
|
|
395
|
+
def is_market_open_for_order_type(self, symbol: str, order_type: enums.TraderOrderType) -> bool:
|
396
|
+
"""
|
397
|
+
Override if necessary
|
398
|
+
"""
|
399
|
+
return True
|
400
|
+
|
395
401
|
def get_trade_fee(self, symbol: str, order_type: enums.TraderOrderType, quantity, price, taker_or_maker):
|
396
402
|
"""
|
397
403
|
Calculates fees resulting to a trade
|
@@ -134,8 +134,16 @@ def get_ccxt_client_login_options(exchange_manager):
|
|
134
134
|
return {'defaultType': 'spot'}
|
135
135
|
|
136
136
|
|
137
|
-
def get_symbols(client):
|
137
|
+
def get_symbols(client, active_only):
|
138
138
|
try:
|
139
|
+
if active_only:
|
140
|
+
return set(
|
141
|
+
symbol
|
142
|
+
for symbol in client.symbols
|
143
|
+
if client.markets.get(symbol, {}).get(
|
144
|
+
enums.ExchangeConstantsMarketStatusColumns.ACTIVE.value, True
|
145
|
+
)
|
146
|
+
)
|
139
147
|
return set(client.symbols)
|
140
148
|
except (AttributeError, TypeError):
|
141
149
|
# ccxt exchange load_markets failed
|
@@ -97,7 +97,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
97
97
|
)
|
98
98
|
|
99
99
|
# initialize symbols and timeframes
|
100
|
-
self.symbols = self.get_client_symbols()
|
100
|
+
self.symbols = self.get_client_symbols(active_only=True)
|
101
101
|
self.time_frames = self.get_client_time_frames()
|
102
102
|
|
103
103
|
except (ccxt.ExchangeNotAvailable, ccxt.RequestTimeout) as e:
|
@@ -157,8 +157,8 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
157
157
|
else:
|
158
158
|
raise
|
159
159
|
|
160
|
-
def get_client_symbols(self):
|
161
|
-
return ccxt_client_util.get_symbols(self.client)
|
160
|
+
def get_client_symbols(self, active_only=True):
|
161
|
+
return ccxt_client_util.get_symbols(self.client, active_only)
|
162
162
|
|
163
163
|
def get_client_time_frames(self):
|
164
164
|
return ccxt_client_util.get_time_frames(self.client)
|
@@ -766,7 +766,7 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
|
|
766
766
|
return self.EXCHANGE_FEEDS.get(Feeds.CANDLE, Feeds.UNSUPPORTED.value) != Feeds.UNSUPPORTED.value
|
767
767
|
|
768
768
|
def _is_supported_pair(self, pair):
|
769
|
-
return pair in ccxt_client_util.get_symbols(self.client)
|
769
|
+
return pair in ccxt_client_util.get_symbols(self.client, True)
|
770
770
|
|
771
771
|
def _is_pair_independent_feed(self, feed):
|
772
772
|
return feed in self.PAIR_INDEPENDENT_CHANNELS
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -196,30 +196,35 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
196
196
|
self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
|
197
197
|
if self.__class__.PRINT_DEBUG_LOGS:
|
198
198
|
self.logger.warning(str(e))
|
199
|
-
raise errors.MissingFunds(e)
|
200
|
-
except ccxt.NotSupported:
|
201
|
-
raise errors.NotSupported
|
199
|
+
raise errors.MissingFunds(e) from e
|
200
|
+
except ccxt.NotSupported as err:
|
201
|
+
raise errors.NotSupported from err
|
202
202
|
except ccxt.AuthenticationError as err:
|
203
203
|
# invalid api key or missing trading rights
|
204
204
|
raise errors.AuthenticationError(
|
205
205
|
f"Error when handling order {err}. Please make sure that trading permissions are on for this API key."
|
206
|
-
)
|
206
|
+
) from err
|
207
207
|
except ccxt.DDoSProtection as e:
|
208
208
|
# raised upon rate limit issues, last response data might have details on what is happening
|
209
209
|
if self.should_log_on_ddos_exception(e):
|
210
210
|
self.connector.log_ddos_error(e)
|
211
211
|
raise errors.FailedRequest(f"Failed to order operation: {e.__class__.__name__} {e}") from e
|
212
212
|
except Exception as e:
|
213
|
+
if not self.is_market_open_for_order_type(symbol, order_type):
|
214
|
+
raise errors.UnavailableOrderTypeForMarketError(
|
215
|
+
f"Error when handling order {e}. "
|
216
|
+
f"Exchange currently refuses to create orders of type {order_type} on {symbol}."
|
217
|
+
) from e
|
213
218
|
if exchanges_util.is_api_permission_error(e):
|
214
219
|
# invalid api key or missing trading rights
|
215
220
|
raise errors.AuthenticationError(
|
216
221
|
f"Error when handling order {e}. Please make sure that trading permissions are on for this API key."
|
217
|
-
)
|
222
|
+
) from e
|
218
223
|
if exchanges_util.is_exchange_rules_compliancy_error(e):
|
219
224
|
raise errors.ExchangeCompliancyError(
|
220
225
|
f"Error when handling order {e}. Exchange is refusing this order request on this account because "
|
221
226
|
f"of its compliancy requirements."
|
222
|
-
)
|
227
|
+
) from e
|
223
228
|
self.log_order_creation_error(e, order_type, symbol, quantity, price, stop_price)
|
224
229
|
print(traceback.format_exc(), file=sys.stderr)
|
225
230
|
self.logger.exception(e, False, f"Unexpected error during order operation: {e}")
|
@@ -120,6 +120,18 @@ async def convert_asset_to_target_asset(
|
|
120
120
|
)
|
121
121
|
return created_orders
|
122
122
|
|
123
|
+
if trading_personal_data.get_trade_order_type(order_type) is not trading_enums.TradeOrderType.MARKET:
|
124
|
+
# can't use market orders: use limit orders with price a bit under the current price to instant fill it.
|
125
|
+
price_delta = price * constants.INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA
|
126
|
+
if order_type is trading_enums.TraderOrderType.SELL_LIMIT:
|
127
|
+
price -= price_delta
|
128
|
+
elif order_type is trading_enums.TraderOrderType.BUY_LIMIT:
|
129
|
+
price += price_delta
|
130
|
+
else:
|
131
|
+
trading_mode.logger.error(
|
132
|
+
f"Unhandled order type in convertor limit order price adapter: {order_type}"
|
133
|
+
)
|
134
|
+
|
123
135
|
# get order quantity
|
124
136
|
quantity = _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount)
|
125
137
|
symbol_market = trading_mode.exchange_manager.exchange.get_market_status(symbol, with_fixer=False)
|
@@ -147,6 +159,15 @@ def _get_associated_symbol_and_order_type(trading_mode, asset: str, target_asset
|
|
147
159
|
symbol, reversed_symbol = exchange_util.get_associated_symbol(trading_mode.exchange_manager, asset, target_asset)
|
148
160
|
order_type = trading_enums.TraderOrderType.BUY_MARKET if reversed_symbol else \
|
149
161
|
trading_enums.TraderOrderType.SELL_MARKET
|
162
|
+
if not trading_mode.exchange_manager.exchange.is_market_open_for_order_type(symbol, order_type):
|
163
|
+
# can't use market orders: use limit orders instead
|
164
|
+
order_type = trading_enums.TraderOrderType.BUY_LIMIT if order_type is trading_enums.TraderOrderType.BUY_MARKET \
|
165
|
+
else trading_enums.TraderOrderType.SELL_LIMIT
|
166
|
+
if not trading_mode.exchange_manager.exchange.is_market_open_for_order_type(symbol, order_type):
|
167
|
+
# can't convert asset: still try with limit orders but it will probably fail
|
168
|
+
trading_mode.logger.error(
|
169
|
+
f"Both market and {order_type} order are currently unsupported. Trying limit orders anyway."
|
170
|
+
)
|
150
171
|
return symbol, order_type
|
151
172
|
|
152
173
|
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests/exchanges/test_exchange_config_data.py
RENAMED
@@ -80,7 +80,6 @@ class TestExchangeConfig:
|
|
80
80
|
}
|
81
81
|
_, exchange_manager = await self.init_default(config=config)
|
82
82
|
|
83
|
-
assert "UNI/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
84
83
|
assert "AVAX/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
85
84
|
assert "ADA/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
86
85
|
assert "MATIC/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
@@ -90,6 +89,9 @@ class TestExchangeConfig:
|
|
90
89
|
assert "AVAX/BNB" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
91
90
|
assert "ETH/BTC" in exchange_manager.exchange_config.traded_symbol_pairs
|
92
91
|
|
92
|
+
# inactive markets
|
93
|
+
assert "UNI/BTC" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
94
|
+
|
93
95
|
# disabled
|
94
96
|
assert "Ethereum" not in exchange_manager.exchange_config.traded_cryptocurrencies
|
95
97
|
assert "ADA/ETH" not in exchange_manager.exchange_config.traded_symbol_pairs
|
@@ -113,10 +115,12 @@ class TestExchangeConfig:
|
|
113
115
|
}
|
114
116
|
_, exchange_manager = await self.init_default(config=config)
|
115
117
|
|
116
|
-
assert "TRX/BTC" in exchange_manager.exchange_config.traded_symbol_pairs
|
117
118
|
assert "ADA/BTC" in exchange_manager.exchange_config.traded_symbol_pairs
|
118
119
|
assert "Bitcoin" in exchange_manager.exchange_config.traded_cryptocurrencies
|
119
120
|
|
121
|
+
# inactive markets
|
122
|
+
assert "TRX/BTC" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
123
|
+
|
120
124
|
# invalid ETH wildcard config
|
121
125
|
assert "Ethereum" not in exchange_manager.exchange_config.traded_cryptocurrencies
|
122
126
|
|
@@ -141,7 +145,6 @@ class TestExchangeConfig:
|
|
141
145
|
|
142
146
|
_, exchange_manager = await self.init_default(config=config)
|
143
147
|
|
144
|
-
assert "UNI/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
145
148
|
assert "AVAX/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
146
149
|
assert "ADA/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
147
150
|
assert "MATIC/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
@@ -152,6 +155,9 @@ class TestExchangeConfig:
|
|
152
155
|
assert "AVAX/BNB" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
153
156
|
assert "BTC/USDT" in exchange_manager.exchange_config.traded_symbol_pairs
|
154
157
|
|
158
|
+
# inactive markets
|
159
|
+
assert "UNI/BTC" not in exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"]
|
160
|
+
|
155
161
|
# disabled
|
156
162
|
assert "Ethereum" not in exchange_manager.exchange_config.traded_cryptocurrencies
|
157
163
|
assert "ADA/ETH" not in exchange_manager.exchange_config.traded_symbol_pairs
|
@@ -189,11 +195,13 @@ class TestExchangeConfig:
|
|
189
195
|
_, exchange_manager = await self.init_default(config=config)
|
190
196
|
|
191
197
|
assert exchange_manager.exchange_config.traded_cryptocurrencies["Binance Coin"] == ["BNB/USDT"]
|
192
|
-
assert exchange_manager.exchange_config.traded_cryptocurrencies["Binance USD"] == ["BNB/BUSD"]
|
193
198
|
assert exchange_manager.exchange_config.traded_cryptocurrencies["Bitcoin"] == ["BNB/BTC"]
|
194
199
|
assert exchange_manager.exchange_config.traded_cryptocurrencies["Tether"] == ["BNB/USDT"]
|
195
200
|
|
196
|
-
|
201
|
+
# inactive markets
|
202
|
+
assert exchange_manager.exchange_config.traded_cryptocurrencies["Binance USD"] == []
|
203
|
+
|
204
|
+
sorted_pairs_without_redundancy = sorted(["BNB/USDT", "BNB/BTC"])
|
197
205
|
assert sorted(exchange_manager.exchange_config.traded_symbol_pairs) == sorted_pairs_without_redundancy
|
198
206
|
|
199
207
|
cancel_ccxt_throttle_task()
|
@@ -243,6 +243,64 @@ async def test_convert_asset_to_target_asset(backtesting_trader):
|
|
243
243
|
trading_mode.create_order.assert_called_once()
|
244
244
|
trading_mode.create_order.reset_mock()
|
245
245
|
|
246
|
+
# using limit orders
|
247
|
+
def _is_market_open_for_order_type(symbol: str, order_type: trading_enums.TraderOrderType):
|
248
|
+
return (
|
249
|
+
True if order_type in (trading_enums.TraderOrderType.SELL_LIMIT, trading_enums.TraderOrderType.BUY_LIMIT)
|
250
|
+
else False
|
251
|
+
)
|
252
|
+
|
253
|
+
with mock.patch.object(
|
254
|
+
exchange_manager.exchange, "is_market_open_for_order_type",
|
255
|
+
mock.Mock(side_effect=_is_market_open_for_order_type)
|
256
|
+
) as is_market_open_for_order_type_mock:
|
257
|
+
# cast 1: buying
|
258
|
+
orders = await modes_util.convert_asset_to_target_asset(
|
259
|
+
trading_mode, "USDT", "ETH", tickers, asset_amount=decimal.Decimal(450)
|
260
|
+
)
|
261
|
+
assert len(orders) == 1
|
262
|
+
order = orders[0]
|
263
|
+
assert order.order_type == trading_enums.TraderOrderType.BUY_LIMIT
|
264
|
+
assert order.symbol == "ETH/USDT"
|
265
|
+
# a bit lower than 0.3 because of the price change
|
266
|
+
assert order.origin_quantity == decimal.Decimal("0.29850746")
|
267
|
+
adapted_price = decimal.Decimal(1500) * (
|
268
|
+
constants.ONE + constants.INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA
|
269
|
+
)
|
270
|
+
assert order.origin_price == adapted_price
|
271
|
+
assert order.created_last_price == adapted_price
|
272
|
+
assert is_market_open_for_order_type_mock.call_count == 2
|
273
|
+
assert is_market_open_for_order_type_mock.mock_calls[0].args == \
|
274
|
+
("ETH/USDT", trading_enums.TraderOrderType.BUY_MARKET)
|
275
|
+
assert is_market_open_for_order_type_mock.mock_calls[1].args == \
|
276
|
+
("ETH/USDT", trading_enums.TraderOrderType.BUY_LIMIT)
|
277
|
+
is_market_open_for_order_type_mock.reset_mock()
|
278
|
+
trading_mode.create_order.assert_called_once()
|
279
|
+
trading_mode.create_order.reset_mock()
|
280
|
+
|
281
|
+
# cast 2: selling
|
282
|
+
orders = await modes_util.convert_asset_to_target_asset(
|
283
|
+
trading_mode, "ETH", "USDT", tickers, asset_amount=decimal.Decimal(2)
|
284
|
+
)
|
285
|
+
assert len(orders) == 1
|
286
|
+
order = orders[0]
|
287
|
+
assert order.order_type == trading_enums.TraderOrderType.SELL_LIMIT
|
288
|
+
assert order.symbol == "ETH/USDT"
|
289
|
+
assert order.origin_quantity == decimal.Decimal("2")
|
290
|
+
adapted_price = decimal.Decimal(1500) * (
|
291
|
+
constants.ONE - constants.INSTANT_FILLED_LIMIT_ORDER_PRICE_DELTA
|
292
|
+
)
|
293
|
+
assert order.origin_price == adapted_price
|
294
|
+
assert order.created_last_price == adapted_price
|
295
|
+
assert is_market_open_for_order_type_mock.call_count == 2
|
296
|
+
assert is_market_open_for_order_type_mock.mock_calls[0].args == \
|
297
|
+
("ETH/USDT", trading_enums.TraderOrderType.SELL_MARKET)
|
298
|
+
assert is_market_open_for_order_type_mock.mock_calls[1].args == \
|
299
|
+
("ETH/USDT", trading_enums.TraderOrderType.SELL_LIMIT)
|
300
|
+
is_market_open_for_order_type_mock.reset_mock()
|
301
|
+
trading_mode.create_order.assert_called_once()
|
302
|
+
trading_mode.create_order.reset_mock()
|
303
|
+
|
246
304
|
|
247
305
|
def _get_trading_mode(exchange_manager):
|
248
306
|
return mock.Mock(
|
@@ -35,6 +35,7 @@ class RealExchangeTester:
|
|
35
35
|
SYMBOL = None
|
36
36
|
SYMBOL_2 = None
|
37
37
|
SYMBOL_3 = None
|
38
|
+
INACTIVE_MARKETS = []
|
38
39
|
# default is 1h, change if necessary
|
39
40
|
TIME_FRAME = commons_enums.TimeFrames.ONE_HOUR
|
40
41
|
ALLOWED_TIMEFRAMES_WITHOUT_CANDLE = 0
|
@@ -102,6 +103,14 @@ class RealExchangeTester:
|
|
102
103
|
# async def test_create_order(self):
|
103
104
|
# pass
|
104
105
|
|
106
|
+
def ensure_required_market_status_values(self, market_status):
|
107
|
+
assert market_status
|
108
|
+
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
109
|
+
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
110
|
+
assert market_status[Ecmsc.ACTIVE.value] \
|
111
|
+
is False if market_status[Ecmsc.SYMBOL.value] in self.INACTIVE_MARKETS else True
|
112
|
+
assert market_status[Ecmsc.PRECISION.value]
|
113
|
+
|
105
114
|
async def test_get_historical_ohlcv(self):
|
106
115
|
# common implementation, should always work if candles history is supported
|
107
116
|
historical_ohlcv = await self.get_historical_ohlcv()
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_ascendex.py
RENAMED
@@ -52,10 +52,7 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
|
|
52
52
|
|
53
53
|
async def test_get_market_status(self):
|
54
54
|
for market_status in await self.get_market_statuses():
|
55
|
-
|
56
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
57
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
58
|
-
assert market_status[Ecmsc.PRECISION.value]
|
55
|
+
self.ensure_required_market_status_values(market_status)
|
59
56
|
# on AscendEx, precision is a decimal instead of a number of digits
|
60
57
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
61
58
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in AscendEx tentacle
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_binance.py
RENAMED
@@ -32,6 +32,7 @@ class TestBinanceRealExchangeTester(RealExchangeTester):
|
|
32
32
|
SYMBOL = "BTC/USDT"
|
33
33
|
SYMBOL_2 = "ETH/BTC"
|
34
34
|
SYMBOL_3 = "XRP/BTC"
|
35
|
+
INACTIVE_MARKETS = [SYMBOL_3]
|
35
36
|
|
36
37
|
async def test_time_frames(self):
|
37
38
|
time_frames = await self.time_frames()
|
@@ -55,10 +56,7 @@ class TestBinanceRealExchangeTester(RealExchangeTester):
|
|
55
56
|
|
56
57
|
async def test_get_market_status(self):
|
57
58
|
for market_status in await self.get_market_statuses():
|
58
|
-
|
59
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
60
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
61
|
-
assert market_status[Ecmsc.PRECISION.value]
|
59
|
+
self.ensure_required_market_status_values(market_status)
|
62
60
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
|
63
61
|
market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
|
64
62
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
|
@@ -59,10 +59,7 @@ class TestBinanceFuturesRealExchangeTester(RealFuturesExchangeTester):
|
|
59
59
|
|
60
60
|
async def test_get_market_status(self):
|
61
61
|
for market_status in await self.get_market_statuses():
|
62
|
-
|
63
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
64
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
65
|
-
assert market_status[Ecmsc.PRECISION.value]
|
62
|
+
self.ensure_required_market_status_values(market_status)
|
66
63
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
|
67
64
|
market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
|
68
65
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bingx.py
RENAMED
@@ -56,10 +56,7 @@ class TestBingxRealExchangeTester(RealExchangeTester):
|
|
56
56
|
|
57
57
|
async def test_get_market_status(self):
|
58
58
|
for market_status in await self.get_market_statuses():
|
59
|
-
|
60
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
61
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
62
|
-
assert market_status[Ecmsc.PRECISION.value]
|
59
|
+
self.ensure_required_market_status_values(market_status)
|
63
60
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
|
64
61
|
market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
|
65
62
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitfinex.py
RENAMED
@@ -55,10 +55,7 @@ class TestBitfinexRealExchangeTester(RealExchangeTester):
|
|
55
55
|
|
56
56
|
async def test_get_market_status(self):
|
57
57
|
for market_status in await self.get_market_statuses():
|
58
|
-
|
59
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
60
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
61
|
-
assert market_status[Ecmsc.PRECISION.value]
|
58
|
+
self.ensure_required_market_status_values(market_status)
|
62
59
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
|
63
60
|
market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
|
64
61
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitget.py
RENAMED
@@ -57,10 +57,7 @@ class TestBitgetRealExchangeTester(RealExchangeTester):
|
|
57
57
|
|
58
58
|
async def test_get_market_status(self):
|
59
59
|
for market_status in await self.get_market_statuses():
|
60
|
-
|
61
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
62
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
63
|
-
assert market_status[Ecmsc.PRECISION.value]
|
60
|
+
self.ensure_required_market_status_values(market_status)
|
64
61
|
# on Bitget, precision is a decimal instead of a number of digits
|
65
62
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
66
63
|
Ecmsc.PRECISION_AMOUNT.value] < 1 # to be fixed in Bitget tentacle
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bithumb.py
RENAMED
@@ -50,10 +50,7 @@ class TestBithumbRealExchangeTester(RealExchangeTester):
|
|
50
50
|
|
51
51
|
async def test_get_market_status(self):
|
52
52
|
for market_status in await self.get_market_statuses():
|
53
|
-
|
54
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
55
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
56
|
-
assert market_status[Ecmsc.PRECISION.value]
|
53
|
+
self.ensure_required_market_status_values(market_status)
|
57
54
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]) == \
|
58
55
|
market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value]
|
59
56
|
assert int(market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value]) == \
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitso.py
RENAMED
@@ -49,10 +49,7 @@ class TestBitsoRealExchangeTester(RealExchangeTester):
|
|
49
49
|
|
50
50
|
async def test_get_market_status(self):
|
51
51
|
for market_status in await self.get_market_statuses():
|
52
|
-
|
53
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
54
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
55
|
-
assert market_status[Ecmsc.PRECISION.value]
|
52
|
+
self.ensure_required_market_status_values(market_status)
|
56
53
|
# on this exchange, precision is a decimal instead of a number of digits
|
57
54
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
58
55
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in this exchange tentacle
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bitstamp.py
RENAMED
@@ -53,10 +53,7 @@ class TestBitstampRealExchangeTester(RealExchangeTester):
|
|
53
53
|
|
54
54
|
async def test_get_market_status(self):
|
55
55
|
for market_status in await self.get_market_statuses():
|
56
|
-
|
57
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
58
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
59
|
-
assert market_status[Ecmsc.PRECISION.value]
|
56
|
+
self.ensure_required_market_status_values(market_status)
|
60
57
|
# on this exchange, precision is a decimal instead of a number of digits
|
61
58
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
62
59
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in this exchange tentacle
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_bybit.py
RENAMED
@@ -53,10 +53,7 @@ class TestBybitRealExchangeTester(RealExchangeTester):
|
|
53
53
|
|
54
54
|
async def test_get_market_status(self):
|
55
55
|
for market_status in await self.get_market_statuses():
|
56
|
-
|
57
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
58
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
59
|
-
assert market_status[Ecmsc.PRECISION.value]
|
56
|
+
self.ensure_required_market_status_values(market_status)
|
60
57
|
# on Bybit, precision is a decimal instead of a number of digits
|
61
58
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
62
59
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in Bybit tentacle
|
@@ -59,10 +59,7 @@ class TestBybitRealExchangeTester(RealFuturesExchangeTester):
|
|
59
59
|
|
60
60
|
async def test_get_market_status(self):
|
61
61
|
for market_status in await self.get_market_statuses():
|
62
|
-
|
63
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
64
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
65
|
-
assert market_status[Ecmsc.PRECISION.value]
|
62
|
+
self.ensure_required_market_status_values(market_status)
|
66
63
|
# on Bybit, precision is a decimal instead of a number of digits
|
67
64
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
68
65
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in Bybit tentacle
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_coinbase.py
RENAMED
@@ -50,10 +50,7 @@ class TestCoinbaseRealExchangeTester(RealExchangeTester):
|
|
50
50
|
|
51
51
|
async def test_get_market_status(self):
|
52
52
|
for market_status in await self.get_market_statuses():
|
53
|
-
|
54
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
55
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
56
|
-
assert market_status[Ecmsc.PRECISION.value]
|
53
|
+
self.ensure_required_market_status_values(market_status)
|
57
54
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
58
55
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in coinbase tentacle
|
59
56
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_coinex.py
RENAMED
@@ -53,10 +53,7 @@ class TestCoinexRealExchangeTester(RealExchangeTester):
|
|
53
53
|
|
54
54
|
async def test_get_market_status(self):
|
55
55
|
for market_status in await self.get_market_statuses():
|
56
|
-
|
57
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
58
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
59
|
-
assert market_status[Ecmsc.PRECISION.value]
|
56
|
+
self.ensure_required_market_status_values(market_status)
|
60
57
|
# on this exchange, precision is a decimal instead of a number of digits
|
61
58
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
62
59
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in this exchange tentacle
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_cryptocom.py
RENAMED
@@ -51,10 +51,7 @@ class TestCryptoComRealExchangeTester(RealExchangeTester):
|
|
51
51
|
|
52
52
|
async def test_get_market_status(self):
|
53
53
|
for market_status in await self.get_market_statuses():
|
54
|
-
|
55
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
56
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
57
|
-
assert market_status[Ecmsc.PRECISION.value]
|
54
|
+
self.ensure_required_market_status_values(market_status)
|
58
55
|
# on CryptoCom, precision is a decimal instead of a number of digits
|
59
56
|
assert 0 < market_status[Ecmsc.PRECISION.value][
|
60
57
|
Ecmsc.PRECISION_AMOUNT.value] <= 1 # to be fixed in CryptoCom tentacle
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_gateio.py
RENAMED
@@ -49,10 +49,7 @@ class TestGateIORealExchangeTester(RealExchangeTester):
|
|
49
49
|
|
50
50
|
async def test_get_market_status(self):
|
51
51
|
for market_status in await self.get_market_statuses():
|
52
|
-
|
53
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
54
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
55
|
-
assert market_status[Ecmsc.PRECISION.value]
|
52
|
+
self.ensure_required_market_status_values(market_status)
|
56
53
|
assert 1e-08 <= market_status[Ecmsc.PRECISION.value][
|
57
54
|
Ecmsc.PRECISION_AMOUNT.value] < 1 # to be fixed in tentacle
|
58
55
|
assert 1e-08 <= market_status[Ecmsc.PRECISION.value][
|
{OctoBot-Trading-2.4.75 → OctoBot-Trading-2.4.77}/tests_additional/real_exchanges/test_hitbtc.py
RENAMED
@@ -50,10 +50,7 @@ class TestHitBtcRealExchangeTester(RealExchangeTester):
|
|
50
50
|
|
51
51
|
async def test_get_market_status(self):
|
52
52
|
for market_status in await self.get_market_statuses():
|
53
|
-
|
54
|
-
assert market_status[Ecmsc.TYPE.value] == self.MARKET_STATUS_TYPE
|
55
|
-
assert market_status[Ecmsc.SYMBOL.value] in (self.SYMBOL, self.SYMBOL_2, self.SYMBOL_3)
|
56
|
-
assert market_status[Ecmsc.PRECISION.value]
|
53
|
+
self.ensure_required_market_status_values(market_status)
|
57
54
|
assert 1e-08 <= market_status[Ecmsc.PRECISION.value][
|
58
55
|
Ecmsc.PRECISION_AMOUNT.value] < 1 # to be fixed in hitbtc tentacle
|
59
56
|
assert 1e-09 <= market_status[Ecmsc.PRECISION.value][
|