OctoBot-Trading 2.4.50__tar.gz → 2.4.52__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.50 → OctoBot-Trading-2.4.52}/CHANGELOG.md +14 -3
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.50/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.52}/PKG-INFO +2 -2
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/README.md +1 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/__init__.py +1 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/__init__.py +8 -2
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/exchange.py +2 -2
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/portfolio.py +4 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/trades.py +18 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/constants.py +12 -8
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/enums.py +1 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/candles_manager.py +2 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +4 -2
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +1 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_builder.py +4 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_factory.py +6 -41
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_manager.py +1 -2
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/traders/trader.py +1 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/types/rest_exchange.py +4 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/exchange_util.py +2 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order.py +10 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_factory.py +5 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +6 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trade.py +6 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/exchange_data.py +1 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/real_exchange_tester.py +42 -1
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_ascendex.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_binance.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_binance_futures.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bingx.py +38 -18
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitfinex.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitget.py +5 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bithumb.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitso.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bitstamp.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bybit.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_bybit_futures.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_coinbase.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_coinex.py +4 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_cryptocom.py +4 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_gateio.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_hitbtc.py +4 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_hollaex.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_htx.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_kraken.py +5 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_kucoin.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_kucoin_futures.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_mexc.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_ndax.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_okx.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_okx_futures.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_phemex.py +5 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_poloniex.py +4 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_upbit.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_wavesexchange.py +3 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/LICENSE +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/MANIFEST.in +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/requires.txt +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/OctoBot_Trading.egg-info/top_level.txt +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/channels.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/contracts.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/modes.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/orders.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/positions.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/profitability.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/storage.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/symbol_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/api/trader.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/errors.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_channel.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/adapters/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/config/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_channels.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_details.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchanges.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/symbol_details.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/websockets_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/channel/mode.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/mode_config.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/modes_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/modes_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/context_management.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/octobot_channel_consumer.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_group.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/position_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trades_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/transaction.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/channel/signal_producer.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/signal_creation.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/signals/util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/abstract_storage.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/candles_storage.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/orders_storage.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/portfolio_storage.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/storage_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/trades_storage.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/transactions_storage.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/storage/util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/supervisors/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/config_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/initializable.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/initialization_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/simulator_updater_utils.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/requirements.txt +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/setup.cfg +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/setup.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_channels.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_modes.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_orders.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_profitability.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_symbol_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_trader.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/api/test_trades.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/cli/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/contracts/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/contracts/test_future_contract.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/funding/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/funding/test_funding_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/kline/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/kline/test_kline_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ohlcv/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/order_book/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/prices/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/prices/test_prices_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/recent_trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ticker/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/implementations/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_abstract_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_builder.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_config_data.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchange_simulator.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/test_exchanges.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/traders/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/traders/test_trader.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/types/test_websocket_exchange.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/exchanges/util/test_exchange_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/basic_keywords/test_amount.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/dsl/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/test_abstract_mode_consumer.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/test_abstract_trading_mode.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/modes/test_modes_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/test_group_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_double_filled_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order_adapter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_order_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_orders_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/market/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/history/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_asset.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/test_value_converter.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/channel/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/states/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/test_position.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/test_position_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/test_positions_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/types/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/positions/types/test_linear_position.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_pnl.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/trades/test_trade_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/transactions/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/signals/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/signals/test_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/test_utils/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/test_utils/order_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/test_utils/random_numbers.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/util/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests/util/test_config_util.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/__init__.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
- {OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_okcoin.py +0 -0
@@ -4,11 +4,22 @@ 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.
|
7
|
+
## [2.4.52] - 2024-01-30
|
8
|
+
### Added
|
9
|
+
- [API] Trades utility
|
10
|
+
### Fixed
|
11
|
+
- [Exchanges] Unidentified auth error in market status loading
|
12
|
+
- [Exchanges] Fetch balance error spam on auth error
|
13
|
+
|
14
|
+
## [2.4.51] - 2024-01-18
|
15
|
+
### Added
|
16
|
+
- [CoinEx] Support CoinEx exchange
|
17
|
+
|
18
|
+
## [2.4.50] - 2024-01-18
|
8
19
|
### Updated
|
9
|
-
- [Websocket] Fix websocket reconnection after binance auto
|
20
|
+
- [Websocket] Fix websocket reconnection after binance auto disconnect
|
10
21
|
|
11
|
-
## [2.4.49] -
|
22
|
+
## [2.4.49] - 2024-01-08
|
12
23
|
### Updated
|
13
24
|
- [Exchanges] replace Huobi by HTX
|
14
25
|
- [CCXT] 4.2.10
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: OctoBot-Trading
|
3
|
-
Version: 2.4.
|
3
|
+
Version: 2.4.52
|
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.52](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.52
|
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.52](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.52](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)
|
@@ -51,6 +51,8 @@ from octobot_trading.api.symbol_data import (
|
|
51
51
|
from octobot_trading.api.trades import (
|
52
52
|
get_trade_history,
|
53
53
|
get_completed_pnl_history,
|
54
|
+
is_executed_trade,
|
55
|
+
is_trade_after_or_at,
|
54
56
|
get_total_paid_trading_fees,
|
55
57
|
get_trade_exchange_name,
|
56
58
|
parse_trade_type,
|
@@ -97,7 +99,7 @@ from octobot_trading.api.exchange import (
|
|
97
99
|
get_new_ccxt_client,
|
98
100
|
get_default_exchange_type,
|
99
101
|
is_sponsoring,
|
100
|
-
|
102
|
+
is_broker_enabled,
|
101
103
|
get_historical_ohlcv,
|
102
104
|
get_bot_id,
|
103
105
|
get_supported_exchange_types,
|
@@ -154,6 +156,7 @@ from octobot_trading.api.portfolio import (
|
|
154
156
|
set_simulated_portfolio_initial_config,
|
155
157
|
refresh_real_trader_portfolio,
|
156
158
|
format_portfolio,
|
159
|
+
parse_decimal_portfolio,
|
157
160
|
get_draw_down,
|
158
161
|
get_coefficient_of_determination,
|
159
162
|
get_usd_like_symbol_from_symbols,
|
@@ -229,6 +232,8 @@ __all__ = [
|
|
229
232
|
"get_config_symbols",
|
230
233
|
"get_trade_history",
|
231
234
|
"get_completed_pnl_history",
|
235
|
+
"is_executed_trade",
|
236
|
+
"is_trade_after_or_at",
|
232
237
|
"get_total_paid_trading_fees",
|
233
238
|
"get_trade_exchange_name",
|
234
239
|
"parse_trade_type",
|
@@ -271,7 +276,7 @@ __all__ = [
|
|
271
276
|
"get_new_ccxt_client",
|
272
277
|
"get_default_exchange_type",
|
273
278
|
"is_sponsoring",
|
274
|
-
"
|
279
|
+
"is_broker_enabled",
|
275
280
|
"get_historical_ohlcv",
|
276
281
|
"get_bot_id",
|
277
282
|
"get_supported_exchange_types",
|
@@ -330,6 +335,7 @@ __all__ = [
|
|
330
335
|
"get_origin_portfolio_value",
|
331
336
|
"get_profitability_stats",
|
332
337
|
"format_portfolio",
|
338
|
+
"parse_decimal_portfolio",
|
333
339
|
"get_current_portfolio_value",
|
334
340
|
"get_currency_ref_market_value",
|
335
341
|
"get_current_holdings_values",
|
@@ -281,8 +281,8 @@ def is_sponsoring(exchange_name: str) -> bool:
|
|
281
281
|
return trading_backend.is_sponsoring(exchange_name)
|
282
282
|
|
283
283
|
|
284
|
-
def
|
285
|
-
return exchange_manager.
|
284
|
+
def is_broker_enabled(exchange_manager) -> bool:
|
285
|
+
return exchange_manager.is_broker_enabled
|
286
286
|
|
287
287
|
|
288
288
|
def get_historical_ohlcv(
|
@@ -73,6 +73,10 @@ def format_portfolio(portfolio, as_decimal) -> dict:
|
|
73
73
|
return personal_data.portfolio_to_float(portfolio)
|
74
74
|
|
75
75
|
|
76
|
+
def parse_decimal_portfolio(portfolio, as_decimal) -> dict:
|
77
|
+
return personal_data.parse_decimal_portfolio(portfolio, as_decimal=as_decimal)
|
78
|
+
|
79
|
+
|
76
80
|
async def refresh_real_trader_portfolio(exchange_manager) -> bool:
|
77
81
|
return await exchange_channel.get_chan(octobot_trading.constants.BALANCE_CHANNEL, exchange_manager.id). \
|
78
82
|
get_internal_producer(). \
|
@@ -50,7 +50,24 @@ def _trade_filter(trade, quote=None, symbol=None, timestamp=None, include_cancel
|
|
50
50
|
return True
|
51
51
|
|
52
52
|
|
53
|
-
def
|
53
|
+
def is_executed_trade(trade: dict) -> bool:
|
54
|
+
try:
|
55
|
+
return trade[octobot_trading.enums.ExchangeConstantsOrderColumns.STATUS.value] not in (
|
56
|
+
octobot_trading.enums.OrderStatus.CANCELED.value,
|
57
|
+
octobot_trading.enums.OrderStatus.EXPIRED.value,
|
58
|
+
)
|
59
|
+
except KeyError:
|
60
|
+
return False
|
61
|
+
|
62
|
+
|
63
|
+
def is_trade_after_or_at(trade: dict, timestamp: float) -> bool:
|
64
|
+
try:
|
65
|
+
return trade[octobot_trading.enums.ExchangeConstantsOrderColumns.TIMESTAMP.value] >= timestamp
|
66
|
+
except KeyError:
|
67
|
+
return False
|
68
|
+
|
69
|
+
|
70
|
+
def _is_trade_after_or_at(trade: personal_data.Trade, timestamp: float) -> bool:
|
54
71
|
return trade.executed_time >= timestamp or trade.canceled_time >= timestamp
|
55
72
|
|
56
73
|
|
@@ -64,6 +64,7 @@ ENABLE_CCXT_RATE_LIMIT = os_util.parse_boolean_environment_var("ENABLE_CCXT_RATE
|
|
64
64
|
THROTTLED_WS_UPDATES = float(os.getenv("THROTTLED_WS_UPDATES", "0.1")) # avoid spamming CPU
|
65
65
|
ENABLE_LIVE_CANDLES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_LIVE_CANDLES_STORAGE", "False")
|
66
66
|
ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE", "False")
|
67
|
+
MAX_CANDLES_IN_RAM = int(os.getenv("MAX_CANDLES_IN_RAM", "3000")) # max candles per CandlesManager
|
67
68
|
STORAGE_ORIGIN_VALUE = "origin_value"
|
68
69
|
DISPLAY_TIME_FRAME = commons_enums.TimeFrames.ONE_HOUR
|
69
70
|
DEFAULT_SUBACCOUNT_ID = "default_subaccount_id"
|
@@ -94,23 +95,26 @@ FULL_CANDLE_HISTORY_EXCHANGES = [
|
|
94
95
|
DEFAULT_FUTURE_EXCHANGES = ["binanceusdm", "bybit"]
|
95
96
|
TESTED_EXCHANGES = [
|
96
97
|
"binance",
|
98
|
+
"kucoin",
|
97
99
|
"okx",
|
98
|
-
|
100
|
+
] + sorted([
|
101
|
+
"coinbase",
|
102
|
+
"cryptocom",
|
99
103
|
"htx",
|
100
104
|
"bitget",
|
105
|
+
"gateio",
|
101
106
|
"ascendex",
|
102
|
-
"kucoin",
|
103
|
-
"coinbase",
|
104
107
|
"bybit",
|
105
|
-
"cryptocom",
|
106
108
|
"phemex",
|
107
109
|
"hollaex",
|
108
110
|
"mexc",
|
109
|
-
|
110
|
-
|
111
|
-
|
111
|
+
"bingx",
|
112
|
+
"coinex",
|
113
|
+
])
|
114
|
+
DEFAULT_FUTURE_EXCHANGES = sorted(["bybit"])
|
115
|
+
SIMULATOR_TESTED_EXCHANGES = sorted(["bitfinex2", "bithumb", "bitstamp", "bittrex",
|
112
116
|
"hitbtc", "kraken", "poloniex", "bitso", "ndax", "upbit",
|
113
|
-
"wavesexchange"]
|
117
|
+
"wavesexchange"])
|
114
118
|
|
115
119
|
CONFIG_DEFAULT_FEES = 0.001
|
116
120
|
CONFIG_DEFAULT_SIMULATOR_FEES = 0
|
@@ -20,10 +20,11 @@ import octobot_commons.enums as enums
|
|
20
20
|
import octobot_commons.logging as logging
|
21
21
|
|
22
22
|
import octobot_trading.util as util
|
23
|
+
import octobot_trading.constants as constants
|
23
24
|
|
24
25
|
|
25
26
|
class CandlesManager(util.Initializable):
|
26
|
-
MAX_CANDLES_COUNT =
|
27
|
+
MAX_CANDLES_COUNT = constants.MAX_CANDLES_IN_RAM
|
27
28
|
|
28
29
|
def __init__(self, max_candles_count=None):
|
29
30
|
super().__init__()
|
@@ -125,6 +125,7 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
125
125
|
except KeyError:
|
126
126
|
load_markets = True
|
127
127
|
if load_markets:
|
128
|
+
self.logger.info(f"Loading {self.exchange_manager.exchange_name} exchange markets")
|
128
129
|
try:
|
129
130
|
await self.client.load_markets(reload=reload)
|
130
131
|
ccxt_client_util.set_markets_cache(self.client)
|
@@ -132,8 +133,9 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
|
|
132
133
|
raise octobot_trading.errors.FailedRequest(
|
133
134
|
f"Failed to load_symbol_markets: {err.__class__.__name__} on {err}"
|
134
135
|
) from err
|
135
|
-
except ccxt.
|
136
|
-
|
136
|
+
except ccxt.ExchangeError:
|
137
|
+
# includes AuthenticationError but also auth error not identified as such by ccxt
|
138
|
+
if not self.force_authentication and self.is_authenticated:
|
137
139
|
self.logger.debug(
|
138
140
|
f"Credentials check enabled when fetching exchange market status, trying with "
|
139
141
|
f"unauthenticated client."
|
@@ -276,6 +276,7 @@ class CCXTWebsocketConnector(abstract_websocket_exchange.AbstractWebsocketExchan
|
|
276
276
|
"""
|
277
277
|
try:
|
278
278
|
self.initialized_event = asyncio.Event()
|
279
|
+
self.logger.info(f"Loading {self.exchange_manager.exchange_name} websocket exchange markets")
|
279
280
|
await self.client.load_markets()
|
280
281
|
self._filter_exchange_pairs_and_timeframes()
|
281
282
|
self._subscribe_feeds()
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_builder.py
RENAMED
@@ -230,6 +230,10 @@ class ExchangeBuilder:
|
|
230
230
|
self.exchange_manager.ignore_config = ignore_config
|
231
231
|
return self
|
232
232
|
|
233
|
+
def is_broker_enabled(self, is_broker_enabled=False):
|
234
|
+
self.exchange_manager.is_broker_enabled = is_broker_enabled
|
235
|
+
return self
|
236
|
+
|
233
237
|
def is_without_auth(self):
|
234
238
|
self.exchange_manager.without_auth = True
|
235
239
|
return self
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_factory.py
RENAMED
@@ -59,7 +59,6 @@ async def create_real_exchange(exchange_manager) -> None:
|
|
59
59
|
if exchange_manager.exchange_only:
|
60
60
|
return
|
61
61
|
await _initialize_exchange_backend(exchange_manager)
|
62
|
-
_ensure_exchange_validity(exchange_manager)
|
63
62
|
except errors.AuthenticationError:
|
64
63
|
exchange_manager.logger.error("Authentication error, retrying without authentication...")
|
65
64
|
exchange_manager.without_auth = True
|
@@ -78,21 +77,6 @@ async def initialize_real_exchange(exchange_manager):
|
|
78
77
|
await exchanges.search_and_create_websocket(exchange_manager)
|
79
78
|
|
80
79
|
|
81
|
-
def _ensure_exchange_validity(exchange_manager):
|
82
|
-
if exchange_manager.is_future and \
|
83
|
-
not exchange_manager.is_trader_simulated and \
|
84
|
-
not exchange_manager.is_valid_account:
|
85
|
-
error_message = f"Impossible to check exchange sponsoring due to" \
|
86
|
-
f" {exchange_manager.init_error.__class__.__name__}." \
|
87
|
-
if isinstance(exchange_manager.init_error, trading_backend.TimeSyncError) \
|
88
|
-
else \
|
89
|
-
f"Impossible to start futures trading for {exchange_manager.exchange.name.capitalize()}: " \
|
90
|
-
f"incompatible account with no registered donation. Your OctoBot will work normally " \
|
91
|
-
f"for spot trading but will be *limited to backtesting for futures trading. " \
|
92
|
-
f"Please select spot trading on your exchange configuration."
|
93
|
-
raise errors.NotSupported(error_message)
|
94
|
-
|
95
|
-
|
96
80
|
def _create_exchange_backend(exchange_manager):
|
97
81
|
try:
|
98
82
|
exchange_manager.exchange_backend = trading_backend.exchange_factory.create_exchange_backend(
|
@@ -106,32 +90,13 @@ async def _initialize_exchange_backend(exchange_manager):
|
|
106
90
|
if exchange_manager.exchange_backend is not None and exchange_manager.exchange.authenticated() \
|
107
91
|
and not exchange_manager.is_trader_simulated:
|
108
92
|
exchange_manager.logger.debug(await exchange_manager.exchange_backend.initialize())
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
exchange_manager.
|
113
|
-
if exchange_manager.is_valid_account:
|
114
|
-
return True
|
115
|
-
exchange_manager.is_valid_account, message = await exchange_manager.exchange_backend.is_valid_account()
|
116
|
-
if not exchange_manager.is_valid_account:
|
117
|
-
exchange_manager.logger.error(
|
118
|
-
f"Incompatible {exchange_manager.exchange.name.capitalize()} account to use futures trading: "
|
119
|
-
f"{message}. OctoBot relies on exchanges profits sharing to remain 100% free, please create a "
|
120
|
-
f"new {exchange_manager.exchange.name.capitalize()} account or register a donation to support "
|
121
|
-
f"the project. {exchanges.get_partners_explanation_message()}")
|
122
|
-
except trading_backend.TimeSyncError as err:
|
123
|
-
exchanges.log_time_sync_error(exchange_manager.logger, exchange_manager.exchange.name,
|
124
|
-
err, "exchange_backend.is_valid_account")
|
125
|
-
exchange_manager.is_valid_account = False
|
126
|
-
exchange_manager.init_error = err
|
93
|
+
initial_is_broker_enabled = exchange_manager.is_broker_enabled
|
94
|
+
try:
|
95
|
+
exchange_manager.is_broker_enabled, _ = await exchange_manager.exchange_backend.is_valid_account()
|
96
|
+
exchange_manager.logger.debug(f"Broker rebate enabled: {exchange_manager.is_broker_enabled}")
|
127
97
|
except Exception as err:
|
128
|
-
exchange_manager.
|
129
|
-
exchange_manager.
|
130
|
-
exchange_manager.logger.exception(err, True, f"Error when loading exchange account: {err}")
|
131
|
-
finally:
|
132
|
-
if exchange_manager.is_valid_account:
|
133
|
-
exchange_manager.logger.info("On behalf of the OctoBot team, thank you for "
|
134
|
-
"actively supporting the project !")
|
98
|
+
exchange_manager.is_broker_enabled = initial_is_broker_enabled
|
99
|
+
exchange_manager.logger.debug(f"Error when checking account broker state: {err}")
|
135
100
|
|
136
101
|
|
137
102
|
async def _is_supporting_octobot() -> bool:
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/exchange_manager.py
RENAMED
@@ -70,8 +70,7 @@ class ExchangeManager(util.Initializable):
|
|
70
70
|
self.trader = None
|
71
71
|
self.exchange = None
|
72
72
|
self.exchange_backend = None
|
73
|
-
self.
|
74
|
-
self.init_error = None
|
73
|
+
self.is_broker_enabled = False
|
75
74
|
self.trading_modes = []
|
76
75
|
|
77
76
|
self.exchange_web_socket = None
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/traders/trader.py
RENAMED
@@ -257,7 +257,7 @@ class Trader(util.Initializable):
|
|
257
257
|
|
258
258
|
# get real order from exchange
|
259
259
|
updated_order = order_factory.create_order_instance_from_raw(
|
260
|
-
self, created_order, force_open_or_pending_creation=True
|
260
|
+
self, created_order, force_open_or_pending_creation=True, has_just_been_created=True
|
261
261
|
)
|
262
262
|
is_pending_creation = updated_order.status == enums.OrderStatus.PENDING_CREATION
|
263
263
|
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/types/rest_exchange.py
RENAMED
@@ -447,7 +447,10 @@ class RestExchange(abstract_exchange.AbstractExchange):
|
|
447
447
|
raise NotImplementedError(f"get_account_id is not implemented on {self.exchange_manager.exchange_name}")
|
448
448
|
|
449
449
|
async def get_balance(self, **kwargs: dict):
|
450
|
-
|
450
|
+
try:
|
451
|
+
return await self.connector.get_balance(**kwargs)
|
452
|
+
except ccxt.AuthenticationError as err:
|
453
|
+
raise errors.AuthenticationError(err) from err
|
451
454
|
|
452
455
|
async def get_symbol_prices(self, symbol: str, time_frame: commons_enums.TimeFrames, limit: int = None,
|
453
456
|
**kwargs: dict) -> typing.Optional[list]:
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/exchanges/util/exchange_util.py
RENAMED
@@ -207,6 +207,7 @@ def get_enabled_exchanges(config):
|
|
207
207
|
async def get_local_exchange_manager(
|
208
208
|
exchange_name: str, exchange_config: dict, tentacles_setup_config,
|
209
209
|
is_sandboxed: bool, ignore_config=False, builder=None, use_cached_markets=True,
|
210
|
+
is_broker_enabled: bool = False,
|
210
211
|
market_filter: typing.Union[None, typing.Callable[[dict], bool]] = None
|
211
212
|
):
|
212
213
|
exchange_type = exchange_config.get(common_constants.CONFIG_EXCHANGE_TYPE, get_default_exchange_type(exchange_name))
|
@@ -220,6 +221,7 @@ async def get_local_exchange_manager(
|
|
220
221
|
.is_using_exchange_type(exchange_type) \
|
221
222
|
.is_exchange_only() \
|
222
223
|
.is_rest_only() \
|
224
|
+
.is_broker_enabled(is_broker_enabled) \
|
223
225
|
.use_cached_markets(use_cached_markets) \
|
224
226
|
.use_market_filter(market_filter) \
|
225
227
|
.is_ignoring_config(ignore_config) \
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/orders/order.py
RENAMED
@@ -58,6 +58,7 @@ class Order(util.Initializable):
|
|
58
58
|
self.side = side
|
59
59
|
self.tag = None
|
60
60
|
self.associated_entry_ids = None
|
61
|
+
self.broker_applied = False
|
61
62
|
|
62
63
|
# original order attributes
|
63
64
|
self.creation_time = self.exchange_manager.exchange.get_exchange_current_time()
|
@@ -282,6 +283,10 @@ class Order(util.Initializable):
|
|
282
283
|
if self.is_created() and not self.is_closed():
|
283
284
|
await self.update_order_status()
|
284
285
|
|
286
|
+
def register_broker_applied_if_enabled(self):
|
287
|
+
if not self.simulated and self.trader and self.trader.exchange_manager:
|
288
|
+
self.broker_applied = self.trader.exchange_manager.is_broker_enabled
|
289
|
+
|
285
290
|
def _on_origin_price_change(self, previous_price, price_time):
|
286
291
|
"""
|
287
292
|
Called when origin price just changed.
|
@@ -674,6 +679,10 @@ class Order(util.Initializable):
|
|
674
679
|
# rebind order attributes that are not stored on exchange
|
675
680
|
order_dict = order_details.get(constants.STORAGE_ORIGIN_VALUE, {})
|
676
681
|
self.tag = order_dict.get(enums.ExchangeConstantsOrderColumns.TAG.value, self.tag)
|
682
|
+
self.broker_applied = order_dict.get(
|
683
|
+
enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value,
|
684
|
+
self.broker_applied
|
685
|
+
)
|
677
686
|
self.order_id = order_dict.get(enums.ExchangeConstantsOrderColumns.ID.value, self.order_id)
|
678
687
|
self.exchange_order_id = order_dict.get(enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value,
|
679
688
|
self.exchange_order_id)
|
@@ -768,6 +777,7 @@ class Order(util.Initializable):
|
|
768
777
|
enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value: self.reduce_only,
|
769
778
|
enums.ExchangeConstantsOrderColumns.TAG.value: self.tag,
|
770
779
|
enums.ExchangeConstantsOrderColumns.SELF_MANAGED.value: self.is_self_managed(),
|
780
|
+
enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: self.broker_applied,
|
771
781
|
}
|
772
782
|
|
773
783
|
def clear(self):
|
@@ -23,9 +23,13 @@ def create_order_from_raw(trader, raw_order):
|
|
23
23
|
return create_order_from_type(trader, order_type)
|
24
24
|
|
25
25
|
|
26
|
-
def create_order_instance_from_raw(
|
26
|
+
def create_order_instance_from_raw(
|
27
|
+
trader, raw_order, force_open_or_pending_creation=False, has_just_been_created=False
|
28
|
+
):
|
27
29
|
order = create_order_from_raw(trader, raw_order)
|
28
30
|
order.update_from_raw(raw_order)
|
31
|
+
if has_just_been_created:
|
32
|
+
order.register_broker_applied_if_enabled()
|
29
33
|
if force_open_or_pending_creation \
|
30
34
|
and order.status not in (enums.OrderStatus.OPEN, enums.OrderStatus.PENDING_CREATION):
|
31
35
|
order.status = enums.OrderStatus.OPEN
|
@@ -57,8 +57,13 @@ class BalanceUpdater(portfolios_channel.BalanceProducer):
|
|
57
57
|
f"{self.channel.exchange_manager.exchange_name} is not supporting updates"
|
58
58
|
)
|
59
59
|
await self.pause()
|
60
|
+
except errors.AuthenticationError as err:
|
61
|
+
self.logger.exception(
|
62
|
+
err, True, f"Authentication error when fetching balance: {err}. Retrying in the next update cycle"
|
63
|
+
)
|
64
|
+
await asyncio.sleep(self.BALANCE_REFRESH_TIME)
|
60
65
|
except Exception as e:
|
61
|
-
self.logger.
|
66
|
+
self.logger.exception(e, True, f"Failed to update balance : {e}")
|
62
67
|
|
63
68
|
async def fetch_and_push(self):
|
64
69
|
await self.push((await self.fetch_portfolio()))
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/octobot_trading/personal_data/trades/trade.py
RENAMED
@@ -61,6 +61,7 @@ class Trade:
|
|
61
61
|
self.tag = None
|
62
62
|
self.quantity_currency = None
|
63
63
|
self.associated_entry_ids = None
|
64
|
+
self.broker_applied = False
|
64
65
|
|
65
66
|
# raw exchange trade type, used to create trade dict
|
66
67
|
self.exchange_trade_type = None
|
@@ -94,6 +95,7 @@ class Trade:
|
|
94
95
|
self.reduce_only = order.reduce_only
|
95
96
|
self.tag = order.tag
|
96
97
|
self.associated_entry_ids = order.associated_entry_ids
|
98
|
+
self.broker_applied = order.broker_applied
|
97
99
|
|
98
100
|
def get_time(self):
|
99
101
|
return self.executed_time if self.has_been_executed() else self.canceled_time
|
@@ -125,6 +127,7 @@ class Trade:
|
|
125
127
|
enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value: self.reduce_only,
|
126
128
|
enums.ExchangeConstantsOrderColumns.TAG.value: self.tag,
|
127
129
|
enums.ExchangeConstantsOrderColumns.ENTRIES.value: self.associated_entry_ids,
|
130
|
+
enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: self.broker_applied,
|
128
131
|
enums.TradeExtraConstants.CREATION_TIME.value: self.creation_time,
|
129
132
|
}
|
130
133
|
|
@@ -165,6 +168,9 @@ class Trade:
|
|
165
168
|
trade.reduce_only = trade_dict.get(enums.ExchangeConstantsOrderColumns.REDUCE_ONLY.value)
|
166
169
|
trade.tag = trade_dict.get(enums.ExchangeConstantsOrderColumns.TAG.value)
|
167
170
|
trade.associated_entry_ids = trade_dict.get(enums.ExchangeConstantsOrderColumns.ENTRIES.value)
|
171
|
+
trade.broker_applied = trade_dict.get(
|
172
|
+
enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value, trade.broker_applied
|
173
|
+
)
|
168
174
|
trade.creation_time = trade_dict.get(enums.TradeExtraConstants.CREATION_TIME.value)
|
169
175
|
return trade
|
170
176
|
|
@@ -393,6 +393,7 @@ async def test_update_from_order_storage(trader_simulator):
|
|
393
393
|
assert order.exchange_order_id is origin_exchange_order_id
|
394
394
|
assert order.has_been_bundled is origin_has_been_bundled
|
395
395
|
assert order.associated_entry_ids is origin_associated_entry_ids
|
396
|
+
assert order.broker_applied is False
|
396
397
|
assert order.update_with_triggering_order_fees is origin_update_with_triggering_order_fees
|
397
398
|
|
398
399
|
# partial update
|
@@ -414,6 +415,7 @@ async def test_update_from_order_storage(trader_simulator):
|
|
414
415
|
enums.ExchangeConstantsOrderColumns.TAG.value: "t1",
|
415
416
|
enums.ExchangeConstantsOrderColumns.ID.value: "11a",
|
416
417
|
enums.ExchangeConstantsOrderColumns.EXCHANGE_ID.value: "eee1",
|
418
|
+
enums.ExchangeConstantsOrderColumns.BROKER_APPLIED.value: True,
|
417
419
|
},
|
418
420
|
enums.StoredOrdersAttr.TRADER_CREATION_KWARGS.value: {"plop2": 1},
|
419
421
|
enums.StoredOrdersAttr.EXCHANGE_CREATION_PARAMS.value: {"ex": 2, "gg": "yesyes"},
|
@@ -425,6 +427,7 @@ async def test_update_from_order_storage(trader_simulator):
|
|
425
427
|
assert order.trader_creation_kwargs == {"plop2": 1} != origin_trader_creation_kwargs
|
426
428
|
assert order.exchange_creation_params == {"ex": 2, "gg": "yesyes"} != origin_exchange_creation_params
|
427
429
|
assert order.order_id == "11a" != origin_order_id
|
430
|
+
assert order.broker_applied is True
|
428
431
|
assert order.exchange_order_id == "eee1" != origin_exchange_order_id
|
429
432
|
assert order.has_been_bundled is True is not origin_has_been_bundled
|
430
433
|
assert order.associated_entry_ids == ["ABC", "2"] != origin_associated_entry_ids
|
@@ -22,6 +22,7 @@ import octobot_commons.constants as constants
|
|
22
22
|
import octobot_commons.enums as commons_enums
|
23
23
|
import octobot_trading.enums as trading_enums
|
24
24
|
import octobot_trading.exchanges.connectors.ccxt.ccxt_client_util as ccxt_client_util
|
25
|
+
import octobot_trading.exchanges.util as exchanges_util
|
25
26
|
from octobot_trading.enums import ExchangeConstantsTickersColumns as Ectc, \
|
26
27
|
ExchangeConstantsMarketStatusColumns as Ecmsc
|
27
28
|
from tests_additional.real_exchanges import get_exchange_manager
|
@@ -41,6 +42,7 @@ class RealExchangeTester:
|
|
41
42
|
CANDLE_SINCE_SEC = CANDLE_SINCE / 1000
|
42
43
|
REQUIRES_AUTH = False # set True when even normally public apis require authentication
|
43
44
|
MARKET_STATUS_TYPE = trading_enums.ExchangeTypes.SPOT.value
|
45
|
+
HISTORICAL_CANDLES_TO_FETCH_COUNT = 650
|
44
46
|
|
45
47
|
# Public methods: to be implemented as tests
|
46
48
|
# Use await self._[method_name] to get the test request result
|
@@ -100,6 +102,25 @@ class RealExchangeTester:
|
|
100
102
|
# async def test_create_order(self):
|
101
103
|
# pass
|
102
104
|
|
105
|
+
async def test_get_historical_ohlcv(self):
|
106
|
+
# common implementation, should always work if candles history is supported
|
107
|
+
historical_ohlcv = await self.get_historical_ohlcv()
|
108
|
+
assert len(historical_ohlcv) > 500 # should be around 650
|
109
|
+
self.ensure_elements_order(historical_ohlcv, commons_enums.PriceIndexes.IND_PRICE_TIME.value)
|
110
|
+
self.ensure_unique_elements(historical_ohlcv, commons_enums.PriceIndexes.IND_PRICE_TIME.value)
|
111
|
+
start, end = self.get_historical_ohlcv_start_and_end_times()
|
112
|
+
max_candle_time = self.get_time_after_time_frames(start, len(historical_ohlcv))
|
113
|
+
assert max_candle_time <= end
|
114
|
+
assert max_candle_time <= self.get_time()
|
115
|
+
# on some exchanges, a lot of candles are missing, ensure more than 1 fetch succeeded
|
116
|
+
assert (
|
117
|
+
self.HISTORICAL_CANDLES_TO_FETCH_COUNT * 0.85
|
118
|
+
< len(historical_ohlcv)
|
119
|
+
<= self.HISTORICAL_CANDLES_TO_FETCH_COUNT
|
120
|
+
)
|
121
|
+
for candle in historical_ohlcv:
|
122
|
+
assert start <= candle[commons_enums.PriceIndexes.IND_PRICE_TIME.value] <= end
|
123
|
+
|
103
124
|
def get_config(self):
|
104
125
|
return {
|
105
126
|
constants.CONFIG_EXCHANGES: {
|
@@ -108,7 +129,7 @@ class RealExchangeTester:
|
|
108
129
|
}
|
109
130
|
}
|
110
131
|
}
|
111
|
-
|
132
|
+
|
112
133
|
@contextlib.asynccontextmanager
|
113
134
|
async def get_exchange_manager(self, market_filter=None):
|
114
135
|
async with get_exchange_manager(
|
@@ -140,6 +161,22 @@ class RealExchangeTester:
|
|
140
161
|
return await exchange_manager.exchange.get_symbol_prices(self.SYMBOL, self.TIME_FRAME,
|
141
162
|
limit=limit, **kwargs)
|
142
163
|
|
164
|
+
async def get_historical_ohlcv(self, **kwargs) -> list:
|
165
|
+
async with self.get_exchange_manager() as exchange_manager:
|
166
|
+
start, end = self.get_historical_ohlcv_start_and_end_times()
|
167
|
+
start_ms, end_ms = start * 1000, end * 1000
|
168
|
+
ohlcvs = []
|
169
|
+
async for ohlcv in exchanges_util.get_historical_ohlcv(
|
170
|
+
exchange_manager, self.SYMBOL, self.TIME_FRAME, start_ms, end_ms, request_retry_timeout=2, **kwargs
|
171
|
+
):
|
172
|
+
ohlcvs.extend(ohlcv)
|
173
|
+
return ohlcvs
|
174
|
+
|
175
|
+
def get_historical_ohlcv_start_and_end_times(self):
|
176
|
+
start = self.get_time() - (self.get_timeframe_seconds() * self.HISTORICAL_CANDLES_TO_FETCH_COUNT * 2)
|
177
|
+
end = self.get_time_after_time_frames(start, self.HISTORICAL_CANDLES_TO_FETCH_COUNT)
|
178
|
+
return start, end
|
179
|
+
|
143
180
|
async def get_kline_price(self, **kwargs):
|
144
181
|
async with self.get_exchange_manager() as exchange_manager:
|
145
182
|
return await exchange_manager.exchange.get_kline_price(self.SYMBOL, self.TIME_FRAME, **kwargs)
|
@@ -195,6 +232,10 @@ class RealExchangeTester:
|
|
195
232
|
def ensure_elements_order(elements, sort_key, reverse=False):
|
196
233
|
assert sorted(elements, key=lambda x: x[sort_key], reverse=reverse) == elements
|
197
234
|
|
235
|
+
@staticmethod
|
236
|
+
def ensure_unique_elements(elements, key):
|
237
|
+
assert len(elements) == len(set(element[key] for element in elements))
|
238
|
+
|
198
239
|
def check_market_status_limits(self, market_status,
|
199
240
|
normal_price_max=10000, normal_price_min=1e-06,
|
200
241
|
normal_cost_max=10000, normal_cost_min=1e-06,
|
{OctoBot-Trading-2.4.50 → OctoBot-Trading-2.4.52}/tests_additional/real_exchanges/test_ascendex.py
RENAMED
@@ -100,6 +100,9 @@ class TestAscendExRealExchangeTester(RealExchangeTester):
|
|
100
100
|
for candle in symbol_prices:
|
101
101
|
assert self.CANDLE_SINCE_SEC <= candle[PriceIndexes.IND_PRICE_TIME.value] <= max_candle_time
|
102
102
|
|
103
|
+
async def test_get_historical_ohlcv(self):
|
104
|
+
await super().test_get_historical_ohlcv()
|
105
|
+
|
103
106
|
async def test_get_kline_price(self):
|
104
107
|
kline_price = await self.get_kline_price()
|
105
108
|
assert len(kline_price) == 1
|