OctoBot-Trading 2.4.97__tar.gz → 2.4.99__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.97 → OctoBot-Trading-2.4.99}/CHANGELOG.md +9 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/OctoBot_Trading.egg-info/requires.txt +1 -1
- {OctoBot-Trading-2.4.97/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.99}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/README.md +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/portfolio.py +2 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/constants.py +2 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/abstract_exchange.py +7 -2
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/abstract_websocket_exchange.py +2 -2
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/config/exchange_config_data.py +6 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +24 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +6 -4
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_builder.py +12 -2
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_factory.py +23 -12
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_manager.py +5 -4
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/implementations/exchange_simulator.py +9 -4
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/types/rest_exchange.py +14 -5
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/util/exchange_util.py +28 -15
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/abstract_trading_mode.py +7 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/value_converter.py +2 -6
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/channel/trades_updater.py +22 -18
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/trades_manager.py +18 -6
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/requirements.txt +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/__init__.py +15 -9
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/implementations/test_default_rest_exchange.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_abstract_exchange.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_exchange_config_data.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_exchange_manager.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_exchanges.py +9 -9
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/traders/test_trader.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/util/test_exchange_util.py +12 -12
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/test_abstract_mode_consumer.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_order_factory.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/trades/test_trade_factory.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/__init__.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/real_exchange_tester.py +4 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bingx.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bitget.py +2 -2
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bitmart.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_cryptocom.py +7 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_okx.py +1 -1
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/LICENSE +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/api/trades.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/enums.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/errors.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/traders/trader.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/mode_activity.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/order_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/order_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/trade.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/test_tools/exchange_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/setup.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_ascendex.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_binance.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bithumb.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bitso.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bybit.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_coinbase.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_coinex.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_gateio.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_hollaex.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_htx.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_kraken.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_kucoin.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_mexc.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_ndax.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_okcoin.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_phemex.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_poloniex.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_upbit.py +0 -0
- {OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,15 @@ 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.99] - 2024-08-19
|
8
|
+
### Updated
|
9
|
+
- [CCXT] updated to ccxt 4.3.85
|
10
|
+
|
11
|
+
## [2.4.98] - 2024-08-16
|
12
|
+
### Added
|
13
|
+
- [Exchanges] exchange_config_by_exchange in init
|
14
|
+
- [Trades] option to ignore cancelled orders
|
15
|
+
|
7
16
|
## [2.4.97] - 2024-08-14
|
8
17
|
### Added
|
9
18
|
- [Exchanges] cancel_all_orders
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.99
|
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.99](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.99
|
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.99](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.99](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)
|
@@ -15,6 +15,7 @@
|
|
15
15
|
# License along with this library.
|
16
16
|
import decimal
|
17
17
|
|
18
|
+
import octobot_commons.symbols as commons_symbols
|
18
19
|
import octobot_trading.exchange_channel as exchange_channel
|
19
20
|
import octobot_trading.constants
|
20
21
|
import octobot_trading.personal_data as personal_data
|
@@ -105,4 +106,4 @@ def can_convert_symbol_to_usd_like(symbol: str) -> bool:
|
|
105
106
|
|
106
107
|
|
107
108
|
def is_usd_like_coin(coin) -> bool:
|
108
|
-
return
|
109
|
+
return commons_symbols.is_usd_like_coin(coin)
|
@@ -121,11 +121,12 @@ TESTED_EXCHANGES = [
|
|
121
121
|
"mexc",
|
122
122
|
"bingx",
|
123
123
|
"coinex",
|
124
|
+
"bitmart",
|
124
125
|
])
|
125
126
|
DEFAULT_FUTURE_EXCHANGES = sorted(["bybit"])
|
126
127
|
SIMULATOR_TESTED_EXCHANGES = sorted(["bitfinex2", "bithumb", "bitstamp", "bittrex",
|
127
128
|
"hitbtc", "kraken", "poloniex", "bitso", "ndax", "upbit",
|
128
|
-
"wavesexchange",
|
129
|
+
"wavesexchange",])
|
129
130
|
|
130
131
|
# text content of errors due to exchange compliancy rules
|
131
132
|
# Warning: should never be a false positive
|
{OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/abstract_exchange.py
RENAMED
@@ -72,7 +72,7 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
72
72
|
}
|
73
73
|
ACCOUNTS = {}
|
74
74
|
|
75
|
-
def __init__(self, config, exchange_manager):
|
75
|
+
def __init__(self, config, exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
|
76
76
|
super().__init__()
|
77
77
|
self.config = config
|
78
78
|
self.exchange_manager = exchange_manager
|
@@ -97,6 +97,8 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
97
97
|
|
98
98
|
self._creating_exchange_order_descriptions = set()
|
99
99
|
|
100
|
+
if exchange_config_by_exchange and self.get_name() in exchange_config_by_exchange:
|
101
|
+
self.tentacle_config = exchange_config_by_exchange[self.get_name()]
|
100
102
|
if self.exchange_manager.tentacles_setup_config is not None:
|
101
103
|
self.load_user_inputs_from_class(self.exchange_manager.tentacles_setup_config, self.tentacle_config)
|
102
104
|
|
@@ -748,4 +750,7 @@ class AbstractExchange(tentacles_management.AbstractTentacle):
|
|
748
750
|
def _get_order_description(
|
749
751
|
self, side: enums.TradeOrderSide, symbol: str, quantity: decimal.Decimal, price: decimal.Decimal
|
750
752
|
) -> str:
|
751
|
-
return
|
753
|
+
return (
|
754
|
+
f"{side.value if side else None}-{symbol}-"
|
755
|
+
f"{float(quantity) if quantity else None}-{float(price) if price else None}"
|
756
|
+
)
|
@@ -94,7 +94,7 @@ class AbstractWebsocketExchange:
|
|
94
94
|
def get_exchange_credentials(self):
|
95
95
|
"""
|
96
96
|
Exchange credentials
|
97
|
-
:return: key, secret, password
|
97
|
+
:return: key, secret, password, uid
|
98
98
|
"""
|
99
99
|
return self.exchange_manager.get_exchange_credentials(self.exchange_manager.exchange_name)
|
100
100
|
|
@@ -219,7 +219,7 @@ class AbstractWebsocketExchange:
|
|
219
219
|
raise NotImplementedError(f"get_feeds_count is not implemented")
|
220
220
|
|
221
221
|
def _should_authenticate(self):
|
222
|
-
api_key, api_secret, _ = self.get_exchange_credentials()
|
222
|
+
api_key, api_secret, _, _ = self.get_exchange_credentials()
|
223
223
|
return not self.exchange_manager.without_auth \
|
224
224
|
and not self.exchange_manager.is_trader_simulated \
|
225
225
|
and api_key and api_secret
|
@@ -68,6 +68,9 @@ class ExchangeConfig(util.Initializable):
|
|
68
68
|
# periodic updaters that should always be started for this configuration
|
69
69
|
self.forced_updater_channels = set()
|
70
70
|
|
71
|
+
# When False, cancelled orders won't be saved in trades history
|
72
|
+
self.is_saving_cancelled_orders_as_trade = True
|
73
|
+
|
71
74
|
self.backtesting_exchange_config = None
|
72
75
|
|
73
76
|
async def initialize_impl(self):
|
@@ -150,6 +153,9 @@ class ExchangeConfig(util.Initializable):
|
|
150
153
|
def add_forced_updater_channels(self, channel: set[str]):
|
151
154
|
self.forced_updater_channels.update(channel)
|
152
155
|
|
156
|
+
def set_is_saving_cancelled_orders_as_trade(self, value: bool):
|
157
|
+
self.is_saving_cancelled_orders_as_trade = value
|
158
|
+
|
153
159
|
async def add_watched_symbols(self, symbols):
|
154
160
|
new_valid_symbols = [
|
155
161
|
symbol
|
@@ -43,6 +43,30 @@ class CCXTAdapter(adapters.AbstractAdapter):
|
|
43
43
|
# CCXT standard order parsing logic
|
44
44
|
return fixed
|
45
45
|
|
46
|
+
def adapt_amount_from_filled_or_cost(self, fixed):
|
47
|
+
try:
|
48
|
+
if (
|
49
|
+
fixed[enums.ExchangeConstantsOrderColumns.TYPE.value] == enums.TradeOrderType.MARKET.value and
|
50
|
+
fixed[enums.ExchangeConstantsOrderColumns.SIDE.value] == enums.TradeOrderSide.BUY.value and
|
51
|
+
fixed[enums.ExchangeConstantsOrderColumns.FILLED.value]
|
52
|
+
):
|
53
|
+
# convert amount to use the base unit: use FILLED for accuracy (when not None/0)
|
54
|
+
fixed[enums.ExchangeConstantsOrderColumns.AMOUNT.value] = (
|
55
|
+
fixed[enums.ExchangeConstantsOrderColumns.FILLED.value]
|
56
|
+
)
|
57
|
+
if (
|
58
|
+
(not fixed[enums.ExchangeConstantsOrderColumns.AMOUNT.value]) and
|
59
|
+
fixed[enums.ExchangeConstantsOrderColumns.COST.value] and
|
60
|
+
fixed[enums.ExchangeConstantsOrderColumns.PRICE.value]
|
61
|
+
):
|
62
|
+
# convert amount to use the base unit
|
63
|
+
fixed[enums.ExchangeConstantsOrderColumns.AMOUNT.value] = (
|
64
|
+
fixed[enums.ExchangeConstantsOrderColumns.COST.value] /
|
65
|
+
fixed[enums.ExchangeConstantsOrderColumns.PRICE.value]
|
66
|
+
)
|
67
|
+
except KeyError:
|
68
|
+
pass
|
69
|
+
|
46
70
|
def adapt_quantities_with_contract_size(self, order_or_trade, symbol):
|
47
71
|
if self.connector.exchange_manager.is_future:
|
48
72
|
symbol = symbol or order_or_trade.get(ecoc.SYMBOL.value)
|
@@ -45,15 +45,15 @@ def create_client(
|
|
45
45
|
f"exchange with ccxt in version {ccxt.__version__}")
|
46
46
|
if exchange_manager.ignore_config or exchange_manager.check_config(exchange_manager.exchange_name):
|
47
47
|
try:
|
48
|
-
key, secret, password = exchange_manager.get_exchange_credentials(exchange_manager.exchange_name)
|
48
|
+
key, secret, password, uid = exchange_manager.get_exchange_credentials(exchange_manager.exchange_name)
|
49
49
|
if keys_adapter:
|
50
|
-
key, secret, password = keys_adapter(key, secret, password)
|
50
|
+
key, secret, password, uid = keys_adapter(key, secret, password, uid)
|
51
51
|
if not (key and secret) and not exchange_manager.is_simulated and not exchange_manager.ignore_config:
|
52
52
|
logger.warning(f"No exchange API key set for {exchange_manager.exchange_name}. "
|
53
53
|
f"Enter your account details to enable real trading on this exchange.")
|
54
54
|
if should_authenticate and not exchange_manager.is_backtesting:
|
55
55
|
client = exchange_class(_get_client_config(options, headers, additional_config,
|
56
|
-
key, secret, password))
|
56
|
+
key, secret, password, uid))
|
57
57
|
is_authenticated = True
|
58
58
|
if exchange_manager.check_credentials:
|
59
59
|
client.checkRequiredCredentials()
|
@@ -244,7 +244,7 @@ def _use_http_proxy_if_necessary(client):
|
|
244
244
|
client.aiohttp_trust_env = constants.ENABLE_EXCHANGE_HTTP_PROXY_FROM_ENV
|
245
245
|
|
246
246
|
|
247
|
-
def _get_client_config(options, headers, additional_config, api_key=None, secret=None, password=None):
|
247
|
+
def _get_client_config(options, headers, additional_config, api_key=None, secret=None, password=None, uid=None):
|
248
248
|
config = {
|
249
249
|
'verbose': constants.ENABLE_CCXT_VERBOSE,
|
250
250
|
'enableRateLimit': constants.ENABLE_CCXT_RATE_LIMIT,
|
@@ -258,5 +258,7 @@ def _get_client_config(options, headers, additional_config, api_key=None, secret
|
|
258
258
|
config['secret'] = secret
|
259
259
|
if password is not None:
|
260
260
|
config['password'] = password
|
261
|
+
if uid is not None:
|
262
|
+
config['uid'] = uid
|
261
263
|
config.update(additional_config or {})
|
262
264
|
return config
|
@@ -50,7 +50,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
50
50
|
def __init__(
|
51
51
|
self, config, exchange_manager, adapter_class=None, additional_config=None, rest_name=None, force_auth=False
|
52
52
|
):
|
53
|
-
super().__init__(config, exchange_manager)
|
53
|
+
super().__init__(config, exchange_manager, None)
|
54
54
|
self.client = None
|
55
55
|
self.exchange_type = None
|
56
56
|
self.adapter = self.get_adapter_class(adapter_class)(self)
|
@@ -35,7 +35,7 @@ import octobot_trading.exchanges.util as util
|
|
35
35
|
|
36
36
|
class ExchangeSimulatorConnector(abstract_exchange.AbstractExchange):
|
37
37
|
def __init__(self, config, exchange_manager, backtesting, adapter_class=None):
|
38
|
-
super().__init__(config, exchange_manager)
|
38
|
+
super().__init__(config, exchange_manager, None)
|
39
39
|
self.backtesting = backtesting
|
40
40
|
self.allowed_time_lag = constants.DEFAULT_BACKTESTING_TIME_LAG
|
41
41
|
self.adapter = self.get_adapter_class(adapter_class)(self)
|
{OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_builder.py
RENAMED
@@ -37,6 +37,7 @@ class ExchangeBuilder:
|
|
37
37
|
self._is_using_trading_modes: bool = True
|
38
38
|
self._matrix_id: str = None
|
39
39
|
self.trading_config_by_trading_mode: dict = None
|
40
|
+
self.exchange_config_by_exchange: dict = None
|
40
41
|
self.auto_start_trading_modes: bool = True
|
41
42
|
|
42
43
|
async def build(self):
|
@@ -61,10 +62,12 @@ class ExchangeBuilder:
|
|
61
62
|
if self._is_using_trading_modes:
|
62
63
|
trading_mode_class = modes.get_activated_trading_mode(self.exchange_manager.tentacles_setup_config)
|
63
64
|
# handle exchange related requirements if the activated trading mode has any
|
64
|
-
self._register_trading_modes_requirements(
|
65
|
+
self._register_trading_modes_requirements(
|
66
|
+
trading_mode_class, self.exchange_manager.tentacles_setup_config
|
67
|
+
)
|
65
68
|
|
66
69
|
self._ensure_exchange_compatibility()
|
67
|
-
await self.exchange_manager.initialize()
|
70
|
+
await self.exchange_manager.initialize(exchange_config_by_exchange=self.exchange_config_by_exchange)
|
68
71
|
# add exchange to be able to use it
|
69
72
|
exchanges.Exchanges.instance().add_exchange(self.exchange_manager, self._matrix_id)
|
70
73
|
|
@@ -110,6 +113,9 @@ class ExchangeBuilder:
|
|
110
113
|
self.exchange_manager.exchange_config.add_forced_updater_channels(
|
111
114
|
trading_mode_class.get_forced_updater_channels()
|
112
115
|
)
|
116
|
+
self.exchange_manager.exchange_config.set_is_saving_cancelled_orders_as_trade(
|
117
|
+
not trading_mode_class.is_ignoring_cancelled_orders_trades()
|
118
|
+
)
|
113
119
|
|
114
120
|
async def _build_trading_modes_if_required(self, trading_mode_class):
|
115
121
|
if self._is_using_trading_modes:
|
@@ -270,6 +276,10 @@ class ExchangeBuilder:
|
|
270
276
|
self.trading_config_by_trading_mode = trading_config_by_trading_mode
|
271
277
|
return self
|
272
278
|
|
279
|
+
def use_exchange_config_by_exchange(self, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
|
280
|
+
self.exchange_config_by_exchange = exchange_config_by_exchange
|
281
|
+
return self
|
282
|
+
|
273
283
|
def set_auto_start_trading_modes(self, auto_start_trading_modes):
|
274
284
|
self.auto_start_trading_modes = auto_start_trading_modes
|
275
285
|
return self
|
{OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_factory.py
RENAMED
@@ -14,6 +14,7 @@
|
|
14
14
|
# You should have received a copy of the GNU Lesser General Public
|
15
15
|
# License along with this library.
|
16
16
|
import asyncio
|
17
|
+
import typing
|
17
18
|
|
18
19
|
import trading_backend
|
19
20
|
|
@@ -22,7 +23,7 @@ import octobot_trading.errors as errors
|
|
22
23
|
import octobot_trading.exchanges as exchanges
|
23
24
|
|
24
25
|
|
25
|
-
async def create_exchanges(exchange_manager):
|
26
|
+
async def create_exchanges(exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
|
26
27
|
if exchange_manager.is_sandboxed and not exchange_manager.exchange_only:
|
27
28
|
exchange_manager.logger.info(f"Using sandbox exchange for {exchange_manager.exchange_name}")
|
28
29
|
|
@@ -32,7 +33,7 @@ async def create_exchanges(exchange_manager):
|
|
32
33
|
exchange_manager.load_constants()
|
33
34
|
else:
|
34
35
|
# real : create a rest or websocket exchange instance
|
35
|
-
await create_real_exchange(exchange_manager)
|
36
|
+
await create_real_exchange(exchange_manager, exchange_config_by_exchange)
|
36
37
|
exchange_manager.load_constants()
|
37
38
|
await initialize_real_exchange(exchange_manager)
|
38
39
|
|
@@ -47,12 +48,13 @@ async def create_exchanges(exchange_manager):
|
|
47
48
|
exchange_manager.is_ready = True
|
48
49
|
|
49
50
|
|
50
|
-
async def create_real_exchange(exchange_manager) -> None:
|
51
|
+
async def create_real_exchange(exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]) -> None:
|
51
52
|
"""
|
52
53
|
Create and initialize real REST exchange
|
53
54
|
:param exchange_manager: the related exchange manager
|
55
|
+
:param exchange_config_by_exchange: optional exchange configurations
|
54
56
|
"""
|
55
|
-
await _create_rest_exchange(exchange_manager)
|
57
|
+
await _create_rest_exchange(exchange_manager, exchange_config_by_exchange)
|
56
58
|
try:
|
57
59
|
await exchange_manager.exchange.initialize()
|
58
60
|
_create_exchange_backend(exchange_manager)
|
@@ -62,7 +64,7 @@ async def create_real_exchange(exchange_manager) -> None:
|
|
62
64
|
except errors.AuthenticationError:
|
63
65
|
exchange_manager.logger.error("Authentication error, retrying without authentication...")
|
64
66
|
exchange_manager.without_auth = True
|
65
|
-
await create_real_exchange(exchange_manager)
|
67
|
+
await create_real_exchange(exchange_manager, exchange_config_by_exchange)
|
66
68
|
return
|
67
69
|
|
68
70
|
|
@@ -112,12 +114,14 @@ async def _is_supporting_octobot() -> bool:
|
|
112
114
|
return False
|
113
115
|
|
114
116
|
|
115
|
-
async def _create_rest_exchange(
|
117
|
+
async def _create_rest_exchange(
|
118
|
+
exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]
|
119
|
+
) -> None:
|
116
120
|
"""
|
117
121
|
create REST based on ccxt exchange
|
118
122
|
:param exchange_manager: the related exchange manager
|
119
123
|
"""
|
120
|
-
await _search_and_create_rest_exchange(exchange_manager)
|
124
|
+
await _search_and_create_rest_exchange(exchange_manager, exchange_config_by_exchange)
|
121
125
|
|
122
126
|
if not exchange_manager.exchange:
|
123
127
|
raise Exception(f"Can't create an exchange instance that match the exchange configuration ({exchange_manager})")
|
@@ -139,16 +143,23 @@ async def init_simulated_exchange(exchange_manager):
|
|
139
143
|
await exchange_manager.exchange.create_backtesting_exchange_producers()
|
140
144
|
|
141
145
|
|
142
|
-
async def _search_and_create_rest_exchange(
|
146
|
+
async def _search_and_create_rest_exchange(
|
147
|
+
exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]]
|
148
|
+
) -> None:
|
143
149
|
"""
|
144
150
|
Create a rest exchange if a RestExchange matching class is found
|
145
151
|
:param exchange_manager: the related exchange manager
|
146
152
|
"""
|
147
|
-
rest_exchange_class = exchanges.get_rest_exchange_class(
|
148
|
-
|
153
|
+
rest_exchange_class = exchanges.get_rest_exchange_class(
|
154
|
+
exchange_manager.exchange_name, exchange_manager.tentacles_setup_config, exchange_config_by_exchange
|
155
|
+
)
|
149
156
|
if rest_exchange_class:
|
150
|
-
|
151
|
-
|
157
|
+
if rest_exchange_class.HAS_FETCHED_DETAILS:
|
158
|
+
await rest_exchange_class.fetch_exchange_config(exchange_config_by_exchange, exchange_manager)
|
159
|
+
exchange_manager.exchange = rest_exchange_class(
|
160
|
+
config=exchange_manager.config, exchange_manager=exchange_manager,
|
161
|
+
exchange_config_by_exchange=exchange_config_by_exchange
|
162
|
+
)
|
152
163
|
|
153
164
|
|
154
165
|
def _initialize_simulator_time_frames(exchange_manager):
|
{OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/exchange_manager.py
RENAMED
@@ -85,8 +85,8 @@ class ExchangeManager(util.Initializable):
|
|
85
85
|
|
86
86
|
self.debug_info = {}
|
87
87
|
|
88
|
-
async def initialize_impl(self):
|
89
|
-
await exchanges.create_exchanges(self)
|
88
|
+
async def initialize_impl(self, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
|
89
|
+
await exchanges.create_exchanges(self, exchange_config_by_exchange)
|
90
90
|
if self.is_storage_enabled():
|
91
91
|
await self.storage_manager.initialize()
|
92
92
|
|
@@ -306,7 +306,7 @@ class ExchangeManager(util.Initializable):
|
|
306
306
|
|
307
307
|
def get_exchange_credentials(self, exchange_name):
|
308
308
|
if self.ignore_config or not self.should_decrypt_token() or self.without_auth:
|
309
|
-
return "", "", ""
|
309
|
+
return "", "", "", ""
|
310
310
|
config_exchange = self.config[common_constants.CONFIG_EXCHANGES][exchange_name]
|
311
311
|
return (
|
312
312
|
configuration.decrypt_element_if_possible(
|
@@ -317,7 +317,8 @@ class ExchangeManager(util.Initializable):
|
|
317
317
|
).strip(" "), # remove leading and trailing whitespaces if any
|
318
318
|
configuration.decrypt_element_if_possible(
|
319
319
|
common_constants.CONFIG_EXCHANGE_PASSWORD, config_exchange, None
|
320
|
-
)
|
320
|
+
),
|
321
|
+
config_exchange.get(common_constants.CONFIG_EXCHANGE_UID, "")
|
321
322
|
)
|
322
323
|
|
323
324
|
def get_exchange_sub_account_id(self, exchange_name):
|
@@ -13,6 +13,8 @@
|
|
13
13
|
#
|
14
14
|
# You should have received a copy of the GNU Lesser General Public
|
15
15
|
# License along with this library.
|
16
|
+
import typing
|
17
|
+
|
16
18
|
import octobot_trading.constants as constants
|
17
19
|
import octobot_trading.exchanges.util as exchange_util
|
18
20
|
import octobot_trading.exchanges.connectors.simulator.exchange_simulator_connector as exchange_simulator_connector
|
@@ -22,12 +24,15 @@ import octobot_trading.exchanges.types.rest_exchange as rest_exchange
|
|
22
24
|
class ExchangeSimulator(rest_exchange.RestExchange):
|
23
25
|
DEFAULT_CONNECTOR_CLASS = exchange_simulator_connector.ExchangeSimulatorConnector
|
24
26
|
|
25
|
-
def __init__(
|
27
|
+
def __init__(
|
28
|
+
self, config, exchange_manager, backtesting,
|
29
|
+
exchange_config_by_exchange: typing.Optional[dict[str, dict]] = None
|
30
|
+
):
|
26
31
|
self.backtesting = backtesting
|
27
32
|
self.exchange_importers = []
|
28
33
|
self.exchange_tentacle_class = None
|
29
34
|
self.exchange_tentacle = None
|
30
|
-
super().__init__(config, exchange_manager)
|
35
|
+
super().__init__(config, exchange_manager, exchange_config_by_exchange)
|
31
36
|
|
32
37
|
def _create_connector(self, config, exchange_manager, connector_class):
|
33
38
|
return (connector_class or self.DEFAULT_CONNECTOR_CLASS)(
|
@@ -41,7 +46,7 @@ class ExchangeSimulator(rest_exchange.RestExchange):
|
|
41
46
|
await super().initialize_impl()
|
42
47
|
self.exchange_importers = self.connector.exchange_importers
|
43
48
|
self.exchange_tentacle_class = exchange_util.get_rest_exchange_class(
|
44
|
-
self.exchange_manager.exchange_name, self.exchange_manager.tentacles_setup_config
|
49
|
+
self.exchange_manager.exchange_name, self.exchange_manager.tentacles_setup_config, None
|
45
50
|
)
|
46
51
|
if self.connector.should_adapt_market_statuses():
|
47
52
|
await self._init_exchange_tentacle()
|
@@ -54,7 +59,7 @@ class ExchangeSimulator(rest_exchange.RestExchange):
|
|
54
59
|
# initialize a locale exchange_tentacle to be able to access adapters for market statuses
|
55
60
|
if self.exchange_tentacle_class:
|
56
61
|
self.exchange_tentacle = self.exchange_tentacle_class(
|
57
|
-
self.exchange_manager.config, self.exchange_manager
|
62
|
+
self.exchange_manager.config, self.exchange_manager, None
|
58
63
|
)
|
59
64
|
finally:
|
60
65
|
self.exchange_manager.ignore_config = origin_ignore_config
|
{OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -108,10 +108,13 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
108
108
|
|
109
109
|
DEFAULT_CONNECTOR_CLASS = ccxt_connector.CCXTConnector
|
110
110
|
|
111
|
-
def __init__(
|
112
|
-
|
111
|
+
def __init__(
|
112
|
+
self, config, exchange_manager, exchange_config_by_exchange: typing.Optional[dict[str, dict]],
|
113
|
+
connector_class=None
|
114
|
+
):
|
115
|
+
super().__init__(config, exchange_manager, exchange_config_by_exchange)
|
113
116
|
if self.HAS_FETCHED_DETAILS:
|
114
|
-
self.
|
117
|
+
self._apply_fetched_details(config, exchange_manager)
|
115
118
|
self.connector = self._create_connector(config, exchange_manager, connector_class)
|
116
119
|
self.pair_contracts = {}
|
117
120
|
|
@@ -938,8 +941,14 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
938
941
|
"""
|
939
942
|
Auto fetched and filled exchanges
|
940
943
|
"""
|
941
|
-
def
|
942
|
-
raise NotImplementedError("
|
944
|
+
def _apply_fetched_details(self, config, exchange_manager):
|
945
|
+
raise NotImplementedError("_apply_fetched_details is not implemented")
|
946
|
+
|
947
|
+
@classmethod
|
948
|
+
async def fetch_exchange_config(
|
949
|
+
cls, exchange_config_by_exchange: typing.Optional[dict[str, dict]], exchange_manager
|
950
|
+
):
|
951
|
+
raise NotImplementedError("fetch_exchange_config")
|
943
952
|
|
944
953
|
@staticmethod
|
945
954
|
def supported_autofill_exchanges(tentacle_config):
|
{OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/exchanges/util/exchange_util.py
RENAMED
@@ -37,13 +37,20 @@ import octobot_trading.exchanges.exchange_details as exchange_details
|
|
37
37
|
import octobot_trading.exchanges.exchange_builder as exchange_builder
|
38
38
|
|
39
39
|
|
40
|
-
def get_rest_exchange_class(
|
41
|
-
|
40
|
+
def get_rest_exchange_class(
|
41
|
+
exchange_name: str, tentacles_setup_config, exchange_config_by_exchange: typing.Optional[dict[str, dict]]
|
42
|
+
):
|
43
|
+
return search_exchange_class_from_exchange_name(
|
44
|
+
exchanges_types.RestExchange, exchange_name, tentacles_setup_config, exchange_config_by_exchange
|
45
|
+
)
|
42
46
|
|
43
47
|
|
44
|
-
def search_exchange_class_from_exchange_name(
|
45
|
-
|
46
|
-
|
48
|
+
def search_exchange_class_from_exchange_name(
|
49
|
+
exchange_class, exchange_name, tentacles_setup_config, exchange_config_by_exchange, enable_default=False
|
50
|
+
):
|
51
|
+
exchange_class = get_exchange_class_from_name(
|
52
|
+
exchange_class, exchange_name, tentacles_setup_config, exchange_config_by_exchange, enable_default
|
53
|
+
)
|
47
54
|
if exchange_class is not None:
|
48
55
|
return exchange_class
|
49
56
|
if enable_default:
|
@@ -59,8 +66,10 @@ def search_exchange_class_from_exchange_name(exchange_class, exchange_name,
|
|
59
66
|
return exchanges_implementations.DefaultRestExchange
|
60
67
|
|
61
68
|
|
62
|
-
def get_exchange_class_from_name(
|
63
|
-
|
69
|
+
def get_exchange_class_from_name(
|
70
|
+
exchange_parent_class, exchange_name, tentacles_setup_config, exchange_config_by_exchange,
|
71
|
+
enable_default_implementation, strict_name_matching=False
|
72
|
+
):
|
64
73
|
for exchange_candidate in tentacles_management.get_all_classes_from_parent(exchange_parent_class):
|
65
74
|
try:
|
66
75
|
if _is_exchange_candidate_matching(
|
@@ -75,19 +84,21 @@ def get_exchange_class_from_name(exchange_parent_class, exchange_name, tentacles
|
|
75
84
|
# As we are searching for an exchange_type specific subclass
|
76
85
|
# We should ignore classes that raises NotImplementedError
|
77
86
|
pass
|
78
|
-
auto_filled_exchanges = _get_auto_filled_exchanges(tentacles_setup_config)
|
87
|
+
auto_filled_exchanges = _get_auto_filled_exchanges(tentacles_setup_config, exchange_config_by_exchange)
|
79
88
|
if exchange_name in auto_filled_exchanges:
|
80
89
|
return auto_filled_exchanges[exchange_name][0]
|
81
90
|
return None
|
82
91
|
|
83
92
|
|
84
|
-
def _get_auto_filled_exchanges(tentacles_setup_config):
|
93
|
+
def _get_auto_filled_exchanges(tentacles_setup_config, exchange_config_by_exchange: typing.Optional[dict[str, dict]]):
|
85
94
|
auto_filled_exchanges = {}
|
86
95
|
for exchange_candidate in _get_auto_filled_exchanges_tentacles():
|
87
96
|
if tentacles_setup_config is None:
|
88
97
|
# tentacles_setup_config is required for auto-filled exchanges
|
89
98
|
continue
|
90
|
-
config =
|
99
|
+
config = exchange_config_by_exchange[exchange_candidate.get_name()] if (
|
100
|
+
exchange_config_by_exchange and exchange_candidate.get_name() in exchange_config_by_exchange
|
101
|
+
) else api.get_tentacle_config(
|
91
102
|
tentacles_setup_config, exchange_candidate
|
92
103
|
)
|
93
104
|
for exchange_name in exchange_candidate.supported_autofill_exchanges(config):
|
@@ -96,7 +107,7 @@ def _get_auto_filled_exchanges(tentacles_setup_config):
|
|
96
107
|
|
97
108
|
|
98
109
|
def get_auto_filled_exchange_names(tentacles_setup_config):
|
99
|
-
return list(_get_auto_filled_exchanges(tentacles_setup_config))
|
110
|
+
return list(_get_auto_filled_exchanges(tentacles_setup_config, None))
|
100
111
|
|
101
112
|
|
102
113
|
def _get_auto_filled_exchanges_tentacles():
|
@@ -111,7 +122,7 @@ async def get_exchange_details(
|
|
111
122
|
exchange_name, is_autofilled, tentacles_setup_config, aiohttp_session
|
112
123
|
) -> exchange_details.ExchangeDetails:
|
113
124
|
if is_autofilled:
|
114
|
-
auto_filled_exchanges = _get_auto_filled_exchanges(tentacles_setup_config)
|
125
|
+
auto_filled_exchanges = _get_auto_filled_exchanges(tentacles_setup_config, None)
|
115
126
|
if exchange_name in auto_filled_exchanges:
|
116
127
|
return await auto_filled_exchanges[exchange_name][0].get_autofilled_exchange_details(
|
117
128
|
aiohttp_session, auto_filled_exchanges[exchange_name][1], exchange_name
|
@@ -208,7 +219,7 @@ def get_enabled_exchanges(config):
|
|
208
219
|
async def get_local_exchange_manager(
|
209
220
|
exchange_name: str, exchange_config: dict, tentacles_setup_config,
|
210
221
|
is_sandboxed: bool, ignore_config=False, builder=None, use_cached_markets=True,
|
211
|
-
is_broker_enabled: bool = False,
|
222
|
+
is_broker_enabled: bool = False, exchange_config_by_exchange: typing.Optional[dict[str, dict]] = None,
|
212
223
|
market_filter: typing.Union[None, typing.Callable[[dict], bool]] = None
|
213
224
|
):
|
214
225
|
exchange_type = exchange_config.get(common_constants.CONFIG_EXCHANGE_TYPE, get_default_exchange_type(exchange_name))
|
@@ -220,6 +231,7 @@ async def get_local_exchange_manager(
|
|
220
231
|
.is_checking_credentials(False) \
|
221
232
|
.is_sandboxed(is_sandboxed) \
|
222
233
|
.is_using_exchange_type(exchange_type) \
|
234
|
+
.use_exchange_config_by_exchange(exchange_config_by_exchange) \
|
223
235
|
.is_exchange_only() \
|
224
236
|
.is_rest_only() \
|
225
237
|
.is_broker_enabled(is_broker_enabled) \
|
@@ -344,9 +356,10 @@ def get_default_exchange_type(exchange_name):
|
|
344
356
|
return common_constants.DEFAULT_EXCHANGE_TYPE
|
345
357
|
|
346
358
|
|
347
|
-
def get_supported_exchange_types(exchange_name, tentacles_setup_config):
|
359
|
+
def get_supported_exchange_types(exchange_name, tentacles_setup_config, exchange_config_by_exchange=None):
|
348
360
|
exchange_class = get_exchange_class_from_name(
|
349
|
-
exchanges_types.RestExchange, exchange_name, tentacles_setup_config,
|
361
|
+
exchanges_types.RestExchange, exchange_name, tentacles_setup_config,
|
362
|
+
exchange_config_by_exchange, False, strict_name_matching=True
|
350
363
|
)
|
351
364
|
if exchange_class is None:
|
352
365
|
# default
|
{OctoBot-Trading-2.4.97 → OctoBot-Trading-2.4.99}/octobot_trading/modes/abstract_trading_mode.py
RENAMED
@@ -179,6 +179,13 @@ class AbstractTradingMode(abstract_tentacle.AbstractTentacle):
|
|
179
179
|
"""
|
180
180
|
return True
|
181
181
|
|
182
|
+
@classmethod
|
183
|
+
def is_ignoring_cancelled_orders_trades(cls) -> bool:
|
184
|
+
"""
|
185
|
+
:return: True if trades created by cancelled orders should be ignored and not stored in trades manager
|
186
|
+
"""
|
187
|
+
return False
|
188
|
+
|
182
189
|
@classmethod
|
183
190
|
def get_parent_trading_mode_classes(cls, higher_parent_class_limit=None) -> list:
|
184
191
|
return [
|