OctoBot-Trading 2.4.78__tar.gz → 2.4.80__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.
Files changed (476) hide show
  1. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/CHANGELOG.md +8 -0
  2. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80/OctoBot_Trading.egg-info}/PKG-INFO +2 -2
  3. {OctoBot-Trading-2.4.78/OctoBot_Trading.egg-info → OctoBot-Trading-2.4.80}/PKG-INFO +2 -2
  4. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/README.md +1 -1
  5. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/__init__.py +1 -1
  6. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/constants.py +4 -0
  7. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/types/rest_exchange.py +6 -0
  8. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/account_balance.py +27 -7
  9. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/amount.py +3 -2
  10. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/order.py +5 -2
  11. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/types/spot_portfolio.py +9 -2
  12. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/traders/test_trader.py +6 -3
  13. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/basic_keywords/test_account_balance.py +39 -8
  14. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/basic_keywords/test_amount.py +23 -13
  15. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/test_portfolio.py +49 -23
  16. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/LICENSE +0 -0
  17. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/MANIFEST.in +0 -0
  18. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/OctoBot_Trading.egg-info/SOURCES.txt +0 -0
  19. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/OctoBot_Trading.egg-info/dependency_links.txt +0 -0
  20. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/OctoBot_Trading.egg-info/not-zip-safe +0 -0
  21. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/OctoBot_Trading.egg-info/requires.txt +0 -0
  22. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/OctoBot_Trading.egg-info/top_level.txt +0 -0
  23. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/__init__.py +0 -0
  24. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/channels.py +0 -0
  25. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/contracts.py +0 -0
  26. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/exchange.py +0 -0
  27. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/modes.py +0 -0
  28. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/orders.py +0 -0
  29. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/portfolio.py +0 -0
  30. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/positions.py +0 -0
  31. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/profitability.py +0 -0
  32. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/storage.py +0 -0
  33. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/symbol_data.py +0 -0
  34. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/trader.py +0 -0
  35. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/api/trades.py +0 -0
  36. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/enums.py +0 -0
  37. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/errors.py +0 -0
  38. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_channel.py +0 -0
  39. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/__init__.py +0 -0
  40. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/contracts/__init__.py +0 -0
  41. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/contracts/contract_factory.py +0 -0
  42. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/contracts/future_contract.py +0 -0
  43. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/contracts/margin_contract.py +0 -0
  44. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/exchange_symbol_data.py +0 -0
  45. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/exchange_symbols_data.py +0 -0
  46. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/funding/__init__.py +0 -0
  47. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/funding/channel/__init__.py +0 -0
  48. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/funding/channel/funding.py +0 -0
  49. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/funding/channel/funding_updater.py +0 -0
  50. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/funding/channel/funding_updater_simulator.py +0 -0
  51. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/funding/funding_manager.py +0 -0
  52. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/kline/__init__.py +0 -0
  53. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/kline/channel/__init__.py +0 -0
  54. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/kline/channel/kline.py +0 -0
  55. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/kline/channel/kline_updater.py +0 -0
  56. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/kline/channel/kline_updater_simulator.py +0 -0
  57. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/kline/kline_manager.py +0 -0
  58. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/__init__.py +0 -0
  59. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/candles_adapter.py +0 -0
  60. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/candles_manager.py +0 -0
  61. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/channel/__init__.py +0 -0
  62. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/channel/ohlcv.py +0 -0
  63. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater.py +0 -0
  64. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/channel/ohlcv_updater_simulator.py +0 -0
  65. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ohlcv/preloaded_candles_manager.py +0 -0
  66. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/order_book/__init__.py +0 -0
  67. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/order_book/channel/__init__.py +0 -0
  68. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/order_book/channel/order_book.py +0 -0
  69. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/order_book/channel/order_book_updater.py +0 -0
  70. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/order_book/channel/order_book_updater_simulator.py +0 -0
  71. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/order_book/order_book_manager.py +0 -0
  72. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/prices/__init__.py +0 -0
  73. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/prices/channel/__init__.py +0 -0
  74. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/prices/channel/price.py +0 -0
  75. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/prices/channel/prices_updater.py +0 -0
  76. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/prices/channel/prices_updater_simulator.py +0 -0
  77. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/prices/price_events_manager.py +0 -0
  78. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/prices/prices_manager.py +0 -0
  79. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/recent_trades/__init__.py +0 -0
  80. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/recent_trades/channel/__init__.py +0 -0
  81. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/recent_trades/channel/recent_trade.py +0 -0
  82. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.py +0 -0
  83. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater_simulator.py +0 -0
  84. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/recent_trades/recent_trades_manager.py +0 -0
  85. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ticker/__init__.py +0 -0
  86. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ticker/channel/__init__.py +0 -0
  87. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ticker/channel/ticker.py +0 -0
  88. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ticker/channel/ticker_updater.py +0 -0
  89. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ticker/channel/ticker_updater_simulator.py +0 -0
  90. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchange_data/ticker/ticker_manager.py +0 -0
  91. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/__init__.py +0 -0
  92. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/abstract_exchange.py +0 -0
  93. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/abstract_websocket_exchange.py +0 -0
  94. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/adapters/__init__.py +0 -0
  95. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/adapters/abstract_adapter.py +0 -0
  96. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/config/__init__.py +0 -0
  97. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/config/backtesting_exchange_config.py +0 -0
  98. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/config/exchange_config_data.py +0 -0
  99. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/__init__.py +0 -0
  100. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/__init__.py +0 -0
  101. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py +0 -0
  102. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py +0 -0
  103. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/ccxt_clients_cache.py +0 -0
  104. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +0 -0
  105. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py +0 -0
  106. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/constants.py +0 -0
  107. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/ccxt/enums.py +0 -0
  108. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/simulator/__init__.py +0 -0
  109. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/simulator/ccxt_client_simulation.py +0 -0
  110. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_adapter.py +0 -0
  111. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py +0 -0
  112. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/exchange_builder.py +0 -0
  113. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/exchange_channels.py +0 -0
  114. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/exchange_details.py +0 -0
  115. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/exchange_factory.py +0 -0
  116. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/exchange_manager.py +0 -0
  117. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/exchange_websocket_factory.py +0 -0
  118. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/exchanges.py +0 -0
  119. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/implementations/__init__.py +0 -0
  120. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/implementations/default_rest_exchange.py +0 -0
  121. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/implementations/default_websocket_exchange.py +0 -0
  122. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/implementations/exchange_simulator.py +0 -0
  123. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/traders/__init__.py +0 -0
  124. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/traders/trader.py +0 -0
  125. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/traders/trader_simulator.py +0 -0
  126. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/types/__init__.py +0 -0
  127. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/types/websocket_exchange.py +0 -0
  128. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/util/__init__.py +0 -0
  129. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/util/exchange_market_status_fixer.py +0 -0
  130. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/util/exchange_util.py +0 -0
  131. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/util/symbol_details.py +0 -0
  132. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/exchanges/util/websockets_util.py +0 -0
  133. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/__init__.py +0 -0
  134. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/abstract_trading_mode.py +0 -0
  135. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/channel/__init__.py +0 -0
  136. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/channel/abstract_mode_consumer.py +0 -0
  137. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/channel/abstract_mode_producer.py +0 -0
  138. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/channel/mode.py +0 -0
  139. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/mode_activity.py +0 -0
  140. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/mode_config.py +0 -0
  141. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/modes_factory.py +0 -0
  142. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/modes_util.py +0 -0
  143. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/__init__.py +0 -0
  144. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/__init__.py +0 -0
  145. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/configuration.py +0 -0
  146. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/position.py +0 -0
  147. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/price.py +0 -0
  148. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/run_persistence.py +0 -0
  149. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/trading_signals.py +0 -0
  150. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/basic_keywords/user_inputs.py +0 -0
  151. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/context_management.py +0 -0
  152. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/dsl/__init__.py +0 -0
  153. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/dsl/quantity.py +0 -0
  154. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/script_keywords/dsl/values.py +0 -0
  155. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/scripted_trading_mode/__init__.py +0 -0
  156. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/modes/scripted_trading_mode/abstract_scripted_trading_mode.py +0 -0
  157. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/octobot_channel_consumer.py +0 -0
  158. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/__init__.py +0 -0
  159. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/exchange_personal_data.py +0 -0
  160. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/__init__.py +0 -0
  161. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/channel/__init__.py +0 -0
  162. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/channel/orders.py +0 -0
  163. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/channel/orders_updater.py +0 -0
  164. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/channel/orders_updater_simulator.py +0 -0
  165. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/decimal_order_adapter.py +0 -0
  166. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/groups/__init__.py +0 -0
  167. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/groups/balanced_take_profit_and_stop_order_group.py +0 -0
  168. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/groups/group_util.py +0 -0
  169. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/groups/one_cancels_the_other_order_group.py +0 -0
  170. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/order_adapter.py +0 -0
  171. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/order_factory.py +0 -0
  172. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/order_group.py +0 -0
  173. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/order_state.py +0 -0
  174. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/order_util.py +0 -0
  175. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/orders_manager.py +0 -0
  176. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/orders_storage_operations.py +0 -0
  177. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/__init__.py +0 -0
  178. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/cancel_order_state.py +0 -0
  179. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/close_order_state.py +0 -0
  180. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/fill_order_state.py +0 -0
  181. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/open_order_state.py +0 -0
  182. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/order_state_factory.py +0 -0
  183. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py +0 -0
  184. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/states/pending_creation_order_state.py +0 -0
  185. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/__init__.py +0 -0
  186. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/__init__.py +0 -0
  187. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/buy_limit_order.py +0 -0
  188. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/limit_order.py +0 -0
  189. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/sell_limit_order.py +0 -0
  190. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/stop_loss_limit_order.py +0 -0
  191. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/stop_loss_order.py +0 -0
  192. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/take_profit_limit_order.py +0 -0
  193. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/limit/take_profit_order.py +0 -0
  194. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/market/__init__.py +0 -0
  195. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/market/buy_market_order.py +0 -0
  196. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/market/market_order.py +0 -0
  197. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/market/sell_market_order.py +0 -0
  198. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/trailing/__init__.py +0 -0
  199. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_limit_order.py +0 -0
  200. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/trailing/trailing_stop_order.py +0 -0
  201. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/unknown_order.py +0 -0
  202. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/orders/types/unsupported_order.py +0 -0
  203. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/__init__.py +0 -0
  204. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/asset.py +0 -0
  205. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/assets/__init__.py +0 -0
  206. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/assets/future_asset.py +0 -0
  207. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/assets/margin_asset.py +0 -0
  208. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/assets/spot_asset.py +0 -0
  209. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/channel/__init__.py +0 -0
  210. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/channel/balance.py +0 -0
  211. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/channel/balance_updater.py +0 -0
  212. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.py +0 -0
  213. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/history/__init__.py +0 -0
  214. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/history/historical_asset_value.py +0 -0
  215. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.py +0 -0
  216. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py +0 -0
  217. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/portfolio.py +0 -0
  218. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/portfolio_factory.py +0 -0
  219. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/portfolio_manager.py +0 -0
  220. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/portfolio_profitability.py +0 -0
  221. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/portfolio_util.py +0 -0
  222. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/portfolio_value_holder.py +0 -0
  223. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/sub_portfolio.py +0 -0
  224. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/types/__init__.py +0 -0
  225. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/types/future_portfolio.py +0 -0
  226. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/types/margin_portfolio.py +0 -0
  227. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/portfolios/value_converter.py +0 -0
  228. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/__init__.py +0 -0
  229. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/channel/__init__.py +0 -0
  230. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/channel/positions.py +0 -0
  231. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/channel/positions_updater.py +0 -0
  232. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/channel/positions_updater_simulator.py +0 -0
  233. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/position.py +0 -0
  234. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/position_factory.py +0 -0
  235. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/position_state.py +0 -0
  236. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/position_util.py +0 -0
  237. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/positions_manager.py +0 -0
  238. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/states/__init__.py +0 -0
  239. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/states/active_position_state.py +0 -0
  240. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/states/idle_position_state.py +0 -0
  241. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/states/liquidate_position_state.py +0 -0
  242. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/states/position_state_factory.py +0 -0
  243. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/types/__init__.py +0 -0
  244. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/types/inverse_position.py +0 -0
  245. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/positions/types/linear_position.py +0 -0
  246. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/state.py +0 -0
  247. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/__init__.py +0 -0
  248. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/channel/__init__.py +0 -0
  249. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/channel/trades.py +0 -0
  250. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/channel/trades_updater.py +0 -0
  251. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/trade.py +0 -0
  252. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/trade_factory.py +0 -0
  253. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/trade_pnl.py +0 -0
  254. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/trades_manager.py +0 -0
  255. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/trades/trades_util.py +0 -0
  256. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/__init__.py +0 -0
  257. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/transaction.py +0 -0
  258. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/transaction_factory.py +0 -0
  259. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/transactions_manager.py +0 -0
  260. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/types/__init__.py +0 -0
  261. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/types/blockchain_transaction.py +0 -0
  262. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/types/fee_transaction.py +0 -0
  263. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/types/realised_pnl_transaction.py +0 -0
  264. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/personal_data/transactions/types/transfer_transaction.py +0 -0
  265. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/__init__.py +0 -0
  266. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/channel/__init__.py +0 -0
  267. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/channel/remote_trading_signal.py +0 -0
  268. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/channel/remote_trading_signal_channel_factory.py +0 -0
  269. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/channel/signal_producer.py +0 -0
  270. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/signal_creation.py +0 -0
  271. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/trading_signal_bundle_builder.py +0 -0
  272. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/signals/util.py +0 -0
  273. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/__init__.py +0 -0
  274. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/abstract_storage.py +0 -0
  275. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/candles_storage.py +0 -0
  276. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/orders_storage.py +0 -0
  277. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/portfolio_storage.py +0 -0
  278. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/storage_manager.py +0 -0
  279. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/trades_storage.py +0 -0
  280. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/transactions_storage.py +0 -0
  281. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/storage/util.py +0 -0
  282. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/supervisors/__init__.py +0 -0
  283. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/supervisors/abstract_portfolio_supervisor.py +0 -0
  284. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/supervisors/abstract_supervisor.py +0 -0
  285. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/__init__.py +0 -0
  286. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/config_util.py +0 -0
  287. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/initializable.py +0 -0
  288. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/initialization_util.py +0 -0
  289. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/simulator_updater_utils.py +0 -0
  290. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/test_tools/__init__.py +0 -0
  291. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/test_tools/exchange_data.py +0 -0
  292. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/test_tools/exchanges_test_tools.py +0 -0
  293. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +0 -0
  294. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/octobot_trading/util/test_tools/websocket_test_tools.py +0 -0
  295. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/requirements.txt +0 -0
  296. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/setup.cfg +0 -0
  297. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/setup.py +0 -0
  298. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/__init__.py +0 -0
  299. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_channels.py +0 -0
  300. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_exchange.py +0 -0
  301. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_modes.py +0 -0
  302. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_orders.py +0 -0
  303. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_portfolio.py +0 -0
  304. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_profitability.py +0 -0
  305. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_symbol_data.py +0 -0
  306. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_trader.py +0 -0
  307. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/api/test_trades.py +0 -0
  308. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/cli/__init__.py +0 -0
  309. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/__init__.py +0 -0
  310. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/contracts/__init__.py +0 -0
  311. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/contracts/test_future_contract.py +0 -0
  312. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/contracts/test_margin_contract.py +0 -0
  313. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/funding/__init__.py +0 -0
  314. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/funding/test_funding_manager.py +0 -0
  315. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/kline/__init__.py +0 -0
  316. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/kline/test_kline_manager.py +0 -0
  317. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/ohlcv/__init__.py +0 -0
  318. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/ohlcv/test_candles_adapter.py +0 -0
  319. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/ohlcv/test_candles_manager.py +0 -0
  320. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/order_book/__init__.py +0 -0
  321. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/order_book/test_order_book_manager.py +0 -0
  322. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/prices/__init__.py +0 -0
  323. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/prices/test_price_events_manager.py +0 -0
  324. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/prices/test_prices_manager.py +0 -0
  325. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/recent_trades/__init__.py +0 -0
  326. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/recent_trades/test_recent_trades_manager.py +0 -0
  327. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/test_exchange_symbols_data.py +0 -0
  328. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/ticker/__init__.py +0 -0
  329. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchange_data/ticker/test_ticker_manager.py +0 -0
  330. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/__init__.py +0 -0
  331. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/connectors/__init__.py +0 -0
  332. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/connectors/ccxt/__init__.py +0 -0
  333. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/connectors/ccxt/mock_exchanges_data.py +0 -0
  334. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/connectors/ccxt/test_ccxt_connector.py +0 -0
  335. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/implementations/__init__.py +0 -0
  336. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/implementations/test_default_rest_exchange.py +0 -0
  337. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/implementations/test_default_websocket_exchange.py +0 -0
  338. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_abstract_exchange.py +0 -0
  339. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_abstract_websocket_exchange.py +0 -0
  340. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_exchange_builder.py +0 -0
  341. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_exchange_config_data.py +0 -0
  342. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_exchange_factory.py +0 -0
  343. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_exchange_manager.py +0 -0
  344. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_exchange_simulator.py +0 -0
  345. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/test_exchanges.py +0 -0
  346. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/traders/__init__.py +0 -0
  347. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/types/__init__.py +0 -0
  348. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/types/test_websocket_exchange.py +0 -0
  349. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/util/__init__.py +0 -0
  350. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/util/test_exchange_market_status_fixer.py +0 -0
  351. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/exchanges/util/test_exchange_util.py +0 -0
  352. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/__init__.py +0 -0
  353. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/__init__.py +0 -0
  354. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/basic_keywords/__init__.py +0 -0
  355. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/basic_keywords/test_position.py +0 -0
  356. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/basic_keywords/test_price.py +0 -0
  357. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/dsl/__init__.py +0 -0
  358. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/script_keywords/dsl/test_quantity.py +0 -0
  359. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/test_abstract_mode_consumer.py +0 -0
  360. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/test_abstract_trading_mode.py +0 -0
  361. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/modes/test_modes_util.py +0 -0
  362. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/__init__.py +0 -0
  363. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/__init__.py +0 -0
  364. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/groups/__init__.py +0 -0
  365. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/groups/test_balanced_take_profit_and_stop_order_group.py +0 -0
  366. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/groups/test_group_util.py +0 -0
  367. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/groups/test_one_cancels_the_other_order_group.py +0 -0
  368. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/__init__.py +0 -0
  369. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_cancel_order_state.py +0 -0
  370. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_close_order_state.py +0 -0
  371. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_fill_order_state.py +0 -0
  372. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_open_order_state.py +0 -0
  373. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_order_state.py +0 -0
  374. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_order_state_factory.py +0 -0
  375. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_pending_creation_chained_order_state.py +0 -0
  376. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/states/test_pending_creation_order_state.py +0 -0
  377. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_decimal_order_adapter.py +0 -0
  378. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_double_filled_order.py +0 -0
  379. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_order.py +0 -0
  380. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_order_adapter.py +0 -0
  381. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_order_factory.py +0 -0
  382. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_order_util.py +0 -0
  383. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_orders_manager.py +0 -0
  384. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/test_orders_storage_operations.py +0 -0
  385. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/__init__.py +0 -0
  386. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/__init__.py +0 -0
  387. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/test_buy_limit_order.py +0 -0
  388. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/test_limit_order.py +0 -0
  389. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/test_sell_limit_order.py +0 -0
  390. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/test_stop_loss_limit_order.py +0 -0
  391. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/test_stop_loss_order.py +0 -0
  392. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/test_take_profit_limit_order.py +0 -0
  393. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/limit/test_take_profit_order.py +0 -0
  394. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/market/__init__.py +0 -0
  395. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/market/test_buy_market_order.py +0 -0
  396. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/market/test_sell_market_order.py +0 -0
  397. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/test_unknown_order.py +0 -0
  398. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/trailing/__init__.py +0 -0
  399. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/trailing/test_trailing_stop_limit_order.py +0 -0
  400. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/orders/types/trailing/test_trailing_stop_order.py +0 -0
  401. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/__init__.py +0 -0
  402. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/assets/__init__.py +0 -0
  403. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/assets/test_future_asset.py +0 -0
  404. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/assets/test_margin_asset.py +0 -0
  405. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/assets/test_spot_asset.py +0 -0
  406. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/history/__init__.py +0 -0
  407. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/history/test_historical_asset_value_factory.py +0 -0
  408. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/history/test_historical_portfolio_value_manager.py +0 -0
  409. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/test_asset.py +0 -0
  410. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/test_portfolio_manager.py +0 -0
  411. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/test_portfolio_profitability.py +0 -0
  412. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/test_portfolio_value_holder.py +0 -0
  413. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/test_value_converter.py +0 -0
  414. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/types/__init__.py +0 -0
  415. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/types/test_future_portfolio.py +0 -0
  416. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/types/test_margin_portfolio.py +0 -0
  417. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/portfolios/types/test_spot_portfolio.py +0 -0
  418. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/__init__.py +0 -0
  419. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/channel/__init__.py +0 -0
  420. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/states/__init__.py +0 -0
  421. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/test_position.py +0 -0
  422. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/test_position_factory.py +0 -0
  423. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/test_positions_manager.py +0 -0
  424. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/types/__init__.py +0 -0
  425. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/types/test_inverse_position.py +0 -0
  426. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/positions/types/test_linear_position.py +0 -0
  427. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/trades/__init__.py +0 -0
  428. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/trades/test_trade_factory.py +0 -0
  429. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/trades/test_trade_manager.py +0 -0
  430. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/trades/test_trade_pnl.py +0 -0
  431. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/trades/test_trade_util.py +0 -0
  432. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/transactions/__init__.py +0 -0
  433. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/transactions/test_transaction_factory.py +0 -0
  434. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/personal_data/transactions/test_transactions_manager.py +0 -0
  435. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/signals/__init__.py +0 -0
  436. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/signals/test_trading_signal_bundle_builder.py +0 -0
  437. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/signals/test_util.py +0 -0
  438. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/test_utils/__init__.py +0 -0
  439. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/test_utils/order_util.py +0 -0
  440. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/test_utils/random_numbers.py +0 -0
  441. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/util/__init__.py +0 -0
  442. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests/util/test_config_util.py +0 -0
  443. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/__init__.py +0 -0
  444. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/__init__.py +0 -0
  445. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/real_exchange_tester.py +0 -0
  446. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/real_futures_exchange_tester.py +0 -0
  447. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_ascendex.py +0 -0
  448. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_binance.py +0 -0
  449. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_binance_futures.py +0 -0
  450. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bingx.py +0 -0
  451. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bitfinex.py +0 -0
  452. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bitget.py +0 -0
  453. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bithumb.py +0 -0
  454. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bitso.py +0 -0
  455. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bitstamp.py +0 -0
  456. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bybit.py +0 -0
  457. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_bybit_futures.py +0 -0
  458. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_coinbase.py +0 -0
  459. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_coinex.py +0 -0
  460. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_cryptocom.py +0 -0
  461. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_gateio.py +0 -0
  462. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_hitbtc.py +0 -0
  463. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_hollaex.py +0 -0
  464. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_htx.py +0 -0
  465. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_kraken.py +0 -0
  466. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_kucoin.py +0 -0
  467. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_kucoin_futures.py +0 -0
  468. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_mexc.py +0 -0
  469. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_ndax.py +0 -0
  470. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_okcoin.py +0 -0
  471. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_okx.py +0 -0
  472. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_okx_futures.py +0 -0
  473. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_phemex.py +0 -0
  474. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_poloniex.py +0 -0
  475. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_upbit.py +0 -0
  476. {OctoBot-Trading-2.4.78 → OctoBot-Trading-2.4.80}/tests_additional/real_exchanges/test_wavesexchange.py +0 -0
@@ -4,6 +4,14 @@ 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.80] - 2024-05-10
8
+ ### Fixed
9
+ - [Orders] missing trading permission error
10
+
11
+ ## [2.4.79] - 2024-04-24
12
+ ### Updated
13
+ - [Keywords] add ignored orders to amount keyword
14
+
7
15
  ## [2.4.78] - 2024-04-15
8
16
  ### Added
9
17
  - [Exchanges] key adapter
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.4.78
3
+ Version: 2.4.80
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.78](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.80](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
20
20
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](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
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
22
22
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](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.78
3
+ Version: 2.4.80
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.78](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
19
+ # OctoBot-Trading [2.4.80](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
20
20
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](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
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
22
22
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -1,4 +1,4 @@
1
- # OctoBot-Trading [2.4.78](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
1
+ # OctoBot-Trading [2.4.80](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
2
2
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/903b6b22bceb4661b608a86fea655f69)](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
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
4
4
  [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot-Trading/badge.svg?branch=master)](https://coveralls.io/github/Drakkar-Software/OctoBot-Trading?branch=master)
@@ -15,4 +15,4 @@
15
15
  # License along with this library.
16
16
 
17
17
  PROJECT_NAME = "OctoBot-Trading"
18
- VERSION = "2.4.78" # major.minor.revision
18
+ VERSION = "2.4.80" # major.minor.revision
@@ -131,9 +131,13 @@ EXCHANGE_PERMISSION_ERRORS: typing.List[typing.Iterable[str]] = [
131
131
  # OKX ex: okx {"msg":"API key doesn't exist","code":"50119"}
132
132
  ("api", "key"),
133
133
 
134
+ # Binance ex: DDoSProtection('binance {"code":-2015,"msg":"Invalid API-key, IP, or permissions for action."}')
135
+ ("key", "permissions for action"),
136
+
134
137
  # coinbase ex: coinbase {"error":"PERMISSION_DENIED",
135
138
  # "error_details":"Missing required scopes","message":"Missing required scopes"}
136
139
  ("permission_denied", "required scopes"),
140
+ ("missing required scopes"),
137
141
  ]
138
142
 
139
143
  # text content of errors due to exchange compliancy rules
@@ -206,6 +206,12 @@ class RestExchange(abstract_exchange.AbstractExchange):
206
206
  ) from err
207
207
  except ccxt.DDoSProtection as e:
208
208
  # raised upon rate limit issues, last response data might have details on what is happening
209
+ # ensure this is not a permission error (can happen on binance)
210
+ if exchanges_util.is_api_permission_error(e):
211
+ # invalid api key or missing trading rights
212
+ raise errors.AuthenticationError(
213
+ f"Error when handling order {e}. Please make sure that trading permissions are on for this API key."
214
+ ) from e
209
215
  if self.should_log_on_ddos_exception(e):
210
216
  self.connector.log_ddos_error(e)
211
217
  raise errors.FailedRequest(f"Failed to order operation: {e.__class__.__name__} {e}") from e
@@ -49,8 +49,10 @@ async def total_account_balance(context, side=trading_enums.PositionSide.BOTH.va
49
49
  f"the reference market. reference market: {reference_market}, symbol: {context.symbol}")
50
50
 
51
51
 
52
- async def available_account_balance(context, side=trading_enums.TradeOrderSide.BUY.value, use_total_holding=False,
53
- is_stop_order=False, reduce_only=True, target_price=None):
52
+ async def available_account_balance(
53
+ context, side=trading_enums.TradeOrderSide.BUY.value, use_total_holding=False,
54
+ is_stop_order=False, reduce_only=True, target_price=None, orders_to_be_ignored=None
55
+ ):
54
56
  portfolio_type = commons_constants.PORTFOLIO_TOTAL if use_total_holding else commons_constants.PORTFOLIO_AVAILABLE
55
57
  current_symbol_holding, _, market_quantity, price, _ = \
56
58
  await trading_personal_data.get_pre_order_data(context.exchange_manager,
@@ -67,6 +69,21 @@ async def available_account_balance(context, side=trading_enums.TradeOrderSide.B
67
69
  already_locked_amount = trading_constants.ZERO
68
70
  if use_total_holding and is_stop_order:
69
71
  already_locked_amount = _get_locked_amount_in_stop_orders(context, side)
72
+ if orders_to_be_ignored:
73
+ for order_to_be_ignored in orders_to_be_ignored:
74
+ if order_to_be_ignored.side == trading_enums.TradeOrderSide.BUY:
75
+ market_quantity += order_to_be_ignored.origin_quantity
76
+ else:
77
+ current_symbol_holding += order_to_be_ignored.origin_quantity
78
+ total_symbol_holding, _, total_market_quantity, _, _ = \
79
+ await trading_personal_data.get_pre_order_data(context.exchange_manager,
80
+ symbol=context.symbol,
81
+ timeout=trading_constants.ORDER_DATA_FETCHING_TIMEOUT,
82
+ portfolio_type=commons_constants.PORTFOLIO_TOTAL,
83
+ target_price=target_price)
84
+ # ensure not using more than total amounts
85
+ current_symbol_holding = min(current_symbol_holding, total_symbol_holding)
86
+ market_quantity = min(market_quantity, total_market_quantity)
70
87
  return (market_quantity if side == trading_enums.TradeOrderSide.BUY.value else current_symbol_holding) \
71
88
  - already_locked_amount
72
89
 
@@ -80,11 +97,14 @@ def _get_locked_amount_in_stop_orders(context, side):
80
97
  return locked_amount
81
98
 
82
99
 
83
- async def adapt_amount_to_holdings(context, amount, side, use_total_holding, reduce_only,
84
- is_stop_order, target_price=None):
85
- available_acc_bal = await available_account_balance(context, side, use_total_holding=use_total_holding,
86
- is_stop_order=is_stop_order, reduce_only=reduce_only,
87
- target_price=target_price)
100
+ async def adapt_amount_to_holdings(
101
+ context, amount, side, use_total_holding, reduce_only,
102
+ is_stop_order, target_price=None, orders_to_be_ignored=None
103
+ ):
104
+ available_acc_bal = await available_account_balance(
105
+ context, side, use_total_holding=use_total_holding, is_stop_order=is_stop_order,
106
+ reduce_only=reduce_only, target_price=target_price, orders_to_be_ignored=orders_to_be_ignored
107
+ )
88
108
  if available_acc_bal > amount:
89
109
  return amount
90
110
  else:
@@ -13,7 +13,6 @@
13
13
  #
14
14
  # You should have received a copy of the GNU Lesser General Public
15
15
  # License along with this library.
16
-
17
16
  import octobot_commons.symbols as commons_symbols
18
17
  import octobot_trading.modes.script_keywords.dsl as dsl
19
18
  import octobot_trading.modes.script_keywords.basic_keywords.account_balance as account_balance
@@ -32,6 +31,7 @@ async def get_amount_from_input_amount(
32
31
  use_total_holding=False,
33
32
  target_price=None,
34
33
  allow_holdings_adaptation=True,
34
+ orders_to_be_ignored=None,
35
35
  ):
36
36
  amount_type, amount_value = dsl.parse_quantity(input_amount)
37
37
 
@@ -81,7 +81,8 @@ async def get_amount_from_input_amount(
81
81
  else:
82
82
  raise trading_errors.InvalidArgumentError(f"Unsupported input: {input_amount} make sure to use a supported syntax for amount")
83
83
  adapted_amount = await account_balance.adapt_amount_to_holdings(
84
- context, amount_value, side, use_total_holding, reduce_only, is_stop_order, target_price=target_price
84
+ context, amount_value, side, use_total_holding, reduce_only, is_stop_order,
85
+ target_price=target_price, orders_to_be_ignored=orders_to_be_ignored
85
86
  )
86
87
  if adapted_amount < amount_value and not allow_holdings_adaptation:
87
88
  raise trading_errors.MissingFunds(
@@ -546,16 +546,19 @@ class Order(util.Initializable):
546
546
  is_from_exchange = False
547
547
  price = self.origin_price if use_origin_quantity_and_price else self.filled_price
548
548
  quantity = self.origin_quantity if use_origin_quantity_and_price else self.filled_quantity
549
+ # consider worse case taker fees when using use_origin_quantity_and_price as the order is not filled yet
550
+ taker_or_maker = enums.ExchangeConstantsOrderColumns.TAKER.value \
551
+ if use_origin_quantity_and_price else self.taker_or_maker
549
552
  if self.fees_currency_side is enums.FeesCurrencySide.UNDEFINED:
550
553
  computed_fee = self.exchange_manager.exchange.get_trade_fee(
551
- self.symbol, self.order_type, quantity, price, self.taker_or_maker
554
+ self.symbol, self.order_type, quantity, price, taker_or_maker
552
555
  )
553
556
  value = computed_fee[enums.FeePropertyColumns.COST.value]
554
557
  currency = computed_fee[enums.FeePropertyColumns.CURRENCY.value]
555
558
  is_from_exchange = computed_fee[enums.FeePropertyColumns.IS_FROM_EXCHANGE.value]
556
559
  else:
557
560
  symbol_fees = self.exchange_manager.exchange.get_fees(self.symbol)
558
- fees = decimal.Decimal(f"{symbol_fees[self.taker_or_maker]}")
561
+ fees = decimal.Decimal(f"{symbol_fees[taker_or_maker]}")
559
562
  if self.fees_currency_side is enums.FeesCurrencySide.CURRENCY:
560
563
  value = quantity / price * fees
561
564
  currency = self.currency
@@ -31,6 +31,9 @@ class SpotPortfolio(portfolio_class.Portfolio):
31
31
  """
32
32
  base_fees = order.get_total_fees(order.currency)
33
33
  quote_fees = order.get_total_fees(order.market)
34
+ forecasted_fees = order.get_computed_fee(use_origin_quantity_and_price=True)
35
+ forecasted_base_fees = order_util.get_fees_for_currency(forecasted_fees, order.currency)
36
+ forecasted_quote_fees = order_util.get_fees_for_currency(forecasted_fees, order.market)
34
37
 
35
38
  # update base
36
39
  if order.side == enums.TradeOrderSide.BUY:
@@ -38,12 +41,16 @@ class SpotPortfolio(portfolio_class.Portfolio):
38
41
  self._update_portfolio_data(order.currency, total_value=new_quantity, available_value=new_quantity)
39
42
  else:
40
43
  new_quantity = -order.filled_quantity - base_fees
41
- self._update_portfolio_data(order.currency, total_value=new_quantity)
44
+ # Align available amount using really paid fees. Does nothing if forecasted fees == real fees
45
+ available_update = forecasted_base_fees - base_fees
46
+ self._update_portfolio_data(order.currency, total_value=new_quantity, available_value=available_update)
42
47
 
43
48
  # update quote
44
49
  if order.side == enums.TradeOrderSide.BUY:
45
50
  new_quantity = -(order.filled_quantity * order.filled_price) - quote_fees
46
- self._update_portfolio_data(order.market, total_value=new_quantity)
51
+ # Align available amount using really paid fees. Does nothing if forecasted fees == real fees
52
+ available_update = forecasted_quote_fees - quote_fees
53
+ self._update_portfolio_data(order.market, total_value=new_quantity, available_value=available_update)
47
54
  else:
48
55
  new_quantity = (order.filled_quantity * order.filled_price) - quote_fees
49
56
  self._update_portfolio_data(order.market, total_value=new_quantity, available_value=new_quantity)
@@ -567,8 +567,9 @@ class TestTrader:
567
567
  with patch.object(ccxt.async_support.binanceus, "calculate_fee",
568
568
  Mock(return_value=get_fees_mock("SOL"))) as calculate_fee_mock:
569
569
  await limit_buy.on_fill(force_fill=True)
570
- # ensure call ccxt calculate_fee for order fees
571
- calculate_fee_mock.assert_called_once()
570
+ # called twice: once for filled order fee calculation, once for forecasted fees calculation used to restore
571
+ # available amounts if relevant
572
+ assert calculate_fee_mock.call_count == 2
572
573
 
573
574
  # added filled orders as filled trades
574
575
  assert len(trades_manager.trades) == 1
@@ -611,7 +612,9 @@ class TestTrader:
611
612
  with patch.object(ccxt.async_support.binanceus, "calculate_fee", Mock(return_value=get_fees_mock("SOL"))) \
612
613
  as calculate_fee_mock:
613
614
  await limit_buy.on_fill(force_fill=True)
614
- calculate_fee_mock.assert_called_once()
615
+ # called twice: once for filled order fee calculation, once for forecasted fees calculation used to restore
616
+ # available amounts if relevant
617
+ assert calculate_fee_mock.call_count == 2
615
618
 
616
619
  assert limit_buy not in orders_manager.get_open_orders()
617
620
 
@@ -47,8 +47,17 @@ async def test_total_account_balance(mock_context):
47
47
  async def test_available_account_balance(mock_context):
48
48
  current_symbol_holding = decimal.Decimal("100")
49
49
  market_quantity = decimal.Decimal("50")
50
- ret_val = (current_symbol_holding, "current_market_holding", market_quantity, "current_price", "symbol_market")
51
- with mock.patch.object(trading_personal_data, "get_pre_order_data", mock.AsyncMock(return_value=ret_val)) \
50
+
51
+ async def _get_pre_order_data(
52
+ exchange_manager, symbol: str, timeout: int = None,
53
+ portfolio_type=commons_constants.PORTFOLIO_AVAILABLE,
54
+ target_price=None
55
+ ):
56
+ if portfolio_type == commons_constants.PORTFOLIO_AVAILABLE:
57
+ return current_symbol_holding, "current_market_holding", market_quantity, "current_price", "symbol_market"
58
+ return current_symbol_holding*2, "current_market_holding", market_quantity*2, "current_price", "symbol_market"
59
+
60
+ with mock.patch.object(trading_personal_data, "get_pre_order_data", mock.AsyncMock(side_effect=_get_pre_order_data)) \
52
61
  as get_pre_order_data_mock, \
53
62
  mock.patch.object(account_balance, "_get_locked_amount_in_stop_orders",
54
63
  mock.Mock(return_value=trading_constants.ONE)) as _get_locked_amount_in_stop_orders_mock:
@@ -62,7 +71,7 @@ async def test_available_account_balance(mock_context):
62
71
  target_price=trading_constants.ZERO)
63
72
  get_pre_order_data_mock.reset_mock()
64
73
  _get_locked_amount_in_stop_orders_mock.assert_not_called()
65
- assert current_symbol_holding == await script_keywords.available_account_balance(
74
+ assert current_symbol_holding * 2 == await script_keywords.available_account_balance(
66
75
  mock_context, side=trading_enums.TradeOrderSide.SELL.value, use_total_holding=True)
67
76
  get_pre_order_data_mock.assert_called_once_with(mock_context.exchange_manager, symbol=mock_context.symbol,
68
77
  timeout=trading_constants.ORDER_DATA_FETCHING_TIMEOUT,
@@ -70,7 +79,7 @@ async def test_available_account_balance(mock_context):
70
79
  target_price=None)
71
80
  get_pre_order_data_mock.reset_mock()
72
81
  _get_locked_amount_in_stop_orders_mock.assert_not_called()
73
- assert current_symbol_holding - trading_constants.ONE == await script_keywords.available_account_balance(
82
+ assert current_symbol_holding * 2 - trading_constants.ONE == await script_keywords.available_account_balance(
74
83
  mock_context, side=trading_enums.TradeOrderSide.SELL.value, use_total_holding=True, is_stop_order=True)
75
84
  get_pre_order_data_mock.assert_called_once_with(mock_context.exchange_manager, symbol=mock_context.symbol,
76
85
  timeout=trading_constants.ORDER_DATA_FETCHING_TIMEOUT,
@@ -80,7 +89,7 @@ async def test_available_account_balance(mock_context):
80
89
  trading_enums.TradeOrderSide.SELL.value)
81
90
  get_pre_order_data_mock.reset_mock()
82
91
  _get_locked_amount_in_stop_orders_mock.reset_mock()
83
- assert market_quantity - trading_constants.ONE == await script_keywords.available_account_balance(
92
+ assert market_quantity * 2 - trading_constants.ONE == await script_keywords.available_account_balance(
84
93
  mock_context, side=trading_enums.TradeOrderSide.BUY.value, use_total_holding=True, is_stop_order=True)
85
94
  get_pre_order_data_mock.assert_called_once_with(mock_context.exchange_manager, symbol=mock_context.symbol,
86
95
  timeout=trading_constants.ORDER_DATA_FETCHING_TIMEOUT,
@@ -91,6 +100,25 @@ async def test_available_account_balance(mock_context):
91
100
  get_pre_order_data_mock.reset_mock()
92
101
  _get_locked_amount_in_stop_orders_mock.reset_mock()
93
102
 
103
+ buy_1 = trading_personal_data.BuyLimitOrder(mock_context.trader)
104
+ buy_1.origin_quantity = decimal.Decimal("10")
105
+ buy_1.origin_price = decimal.Decimal("100")
106
+ buy_2 = trading_personal_data.BuyLimitOrder(mock_context.trader)
107
+ buy_2.origin_quantity = decimal.Decimal("3")
108
+ buy_2.origin_price = decimal.Decimal("40")
109
+ sell_1 = trading_personal_data.SellLimitOrder(mock_context.trader)
110
+ sell_1.origin_quantity = decimal.Decimal("2.21")
111
+ sell_1.origin_price = decimal.Decimal("200")
112
+ assert market_quantity + buy_1.origin_quantity + buy_2.origin_quantity == \
113
+ await script_keywords.available_account_balance(
114
+ mock_context, side=trading_enums.TradeOrderSide.BUY.value, use_total_holding=False, is_stop_order=False,
115
+ orders_to_be_ignored=[buy_1, buy_2, sell_1]
116
+ )
117
+ assert get_pre_order_data_mock.call_count == 2
118
+ _get_locked_amount_in_stop_orders_mock.assert_not_called()
119
+ get_pre_order_data_mock.reset_mock()
120
+ _get_locked_amount_in_stop_orders_mock.reset_mock()
121
+
94
122
 
95
123
  async def test_adapt_amount_to_holdings(null_context):
96
124
  with mock.patch.object(account_balance, "available_account_balance",
@@ -106,18 +134,21 @@ async def test_adapt_amount_to_holdings(null_context):
106
134
  available_account_balance_mock.assert_called_once_with(null_context, trading_enums.TradeOrderSide.SELL,
107
135
  use_total_holding=False, is_stop_order="is_stop_order",
108
136
  reduce_only="reduce_only",
109
- target_price=trading_constants.ONE_HUNDRED)
137
+ target_price=trading_constants.ONE_HUNDRED,
138
+ orders_to_be_ignored=None)
110
139
  available_account_balance_mock.reset_mock()
111
140
  assert await script_keywords.adapt_amount_to_holdings(null_context,
112
141
  decimal.Decimal(1),
113
142
  trading_enums.TradeOrderSide.SELL,
114
143
  True,
115
144
  "reduce_only",
116
- "is_stop_order") == decimal.Decimal(1)
145
+ "is_stop_order",
146
+ orders_to_be_ignored=["plop"]) == decimal.Decimal(1)
117
147
  available_account_balance_mock.assert_called_once_with(null_context, trading_enums.TradeOrderSide.SELL,
118
148
  use_total_holding=True, is_stop_order="is_stop_order",
119
149
  reduce_only="reduce_only",
120
- target_price=None)
150
+ target_price=None,
151
+ orders_to_be_ignored=["plop"])
121
152
  assert await script_keywords.adapt_amount_to_holdings(null_context,
122
153
  decimal.Decimal(2),
123
154
  trading_enums.TradeOrderSide.SELL,
@@ -59,7 +59,8 @@ async def test_get_amount_from_input_amount(null_context):
59
59
  assert await script_keywords.get_amount_from_input_amount(null_context, "1", "buy") \
60
60
  == decimal.Decimal(1)
61
61
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal(2), "buy",
62
- False, True, False, target_price=None)
62
+ False, True, False, target_price=None,
63
+ orders_to_be_ignored=None)
63
64
  parse_quantity_mock.assert_called_once_with("1")
64
65
  parse_quantity_mock.reset_mock()
65
66
  adapt_amount_to_holdings_mock.reset_mock()
@@ -67,10 +68,11 @@ async def test_get_amount_from_input_amount(null_context):
67
68
  with pytest.raises(errors.MissingFunds):
68
69
  # raises as 1 != 2
69
70
  await script_keywords.get_amount_from_input_amount(
70
- null_context, "1", "buy", allow_holdings_adaptation=False
71
+ null_context, "1", "buy", allow_holdings_adaptation=False, orders_to_be_ignored=[]
71
72
  )
72
73
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal(2), "buy",
73
- False, True, False, target_price=None)
74
+ False, True, False, target_price=None,
75
+ orders_to_be_ignored=[])
74
76
  parse_quantity_mock.assert_called_once_with("1")
75
77
  adapt_amount_to_holdings_mock.reset_mock()
76
78
 
@@ -80,10 +82,12 @@ async def test_get_amount_from_input_amount(null_context):
80
82
  for allow_holdings_adaptation in (True, False):
81
83
  # doesn't raise as 1 == 1
82
84
  assert await script_keywords.get_amount_from_input_amount(
83
- null_context, "1", "buy", allow_holdings_adaptation=allow_holdings_adaptation
85
+ null_context, "1", "buy", allow_holdings_adaptation=allow_holdings_adaptation,
86
+ orders_to_be_ignored=["plip"]
84
87
  ) == decimal.Decimal(1)
85
88
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal(1), "buy",
86
- False, True, False, target_price=None)
89
+ False, True, False, target_price=None,
90
+ orders_to_be_ignored=["plip"])
87
91
  parse_quantity_mock.assert_called_once_with("1")
88
92
  parse_quantity_mock.reset_mock()
89
93
  adapt_amount_to_holdings_mock.reset_mock()
@@ -97,7 +101,8 @@ async def test_get_amount_from_input_amount(null_context):
97
101
  null_context, "1", "buy", allow_holdings_adaptation=allow_holdings_adaptation
98
102
  ) == decimal.Decimal(1)
99
103
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal("0.5"), "buy",
100
- False, True, False, target_price=None)
104
+ False, True, False, target_price=None,
105
+ orders_to_be_ignored=None)
101
106
  parse_quantity_mock.assert_called_once_with("1")
102
107
  parse_quantity_mock.reset_mock()
103
108
  adapt_amount_to_holdings_mock.reset_mock()
@@ -117,7 +122,7 @@ async def test_get_amount_from_input_amount(null_context):
117
122
  # without target_price
118
123
  adapt_amount_to_holdings_mock.assert_called_once_with(
119
124
  null_context, decimal.Decimal(2) / decimal.Decimal(100), "buy",
120
- False, True, False, target_price=None
125
+ False, True, False, target_price=None, orders_to_be_ignored=None
121
126
  )
122
127
  parse_quantity_mock.assert_called_once_with("1")
123
128
  adapt_amount_to_holdings_mock.reset_mock()
@@ -130,7 +135,7 @@ async def test_get_amount_from_input_amount(null_context):
130
135
  get_up_to_date_price_mock.assert_not_called()
131
136
  adapt_amount_to_holdings_mock.assert_called_once_with(
132
137
  null_context, decimal.Decimal(2) / decimal.Decimal(23), "buy",
133
- False, True, False, target_price=decimal.Decimal(23)
138
+ False, True, False, target_price=decimal.Decimal(23), orders_to_be_ignored=None
134
139
  )
135
140
  parse_quantity_mock.assert_called_once_with("1")
136
141
  adapt_amount_to_holdings_mock.reset_mock()
@@ -142,7 +147,8 @@ async def test_get_amount_from_input_amount(null_context):
142
147
  null_context, "1", "buy", target_price=decimal.Decimal("0.5"), allow_holdings_adaptation=False
143
148
  )
144
149
  adapt_amount_to_holdings_mock.assert_called_once_with(
145
- null_context, decimal.Decimal(4), "buy", False, True, False, target_price=decimal.Decimal("0.5")
150
+ null_context, decimal.Decimal(4), "buy", False, True, False, target_price=decimal.Decimal("0.5"),
151
+ orders_to_be_ignored=None
146
152
  )
147
153
  parse_quantity_mock.assert_called_once_with("1")
148
154
  adapt_amount_to_holdings_mock.reset_mock()
@@ -158,7 +164,8 @@ async def test_get_amount_from_input_amount(null_context):
158
164
  is_stop_order=True,
159
165
  target_price=constants.ZERO) == decimal.Decimal(1)
160
166
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal("1.5"), "buy",
161
- True, False, True, target_price=constants.ZERO)
167
+ True, False, True, target_price=constants.ZERO,
168
+ orders_to_be_ignored=None)
162
169
  parse_quantity_mock.assert_called_once_with("50")
163
170
  available_account_balance_mock.assert_called_once_with(null_context, "buy",
164
171
  use_total_holding=True, reduce_only=False)
@@ -173,7 +180,8 @@ async def test_get_amount_from_input_amount(null_context):
173
180
  as available_account_balance_mock:
174
181
  assert await script_keywords.get_amount_from_input_amount(null_context, "50", "buy") == decimal.Decimal(1)
175
182
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal("1.5"), "buy",
176
- False, True, False, target_price=None)
183
+ False, True, False, target_price=None,
184
+ orders_to_be_ignored=None)
177
185
  parse_quantity_mock.assert_called_once_with("50")
178
186
  available_account_balance_mock.assert_called_once_with(null_context, "buy",
179
187
  use_total_holding=False, reduce_only=True)
@@ -196,7 +204,8 @@ async def test_get_amount_from_input_amount(null_context):
196
204
 
197
205
  assert await script_keywords.get_amount_from_input_amount(null_context, "50", "buy") == decimal.Decimal(1)
198
206
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal("1.5"), "buy",
199
- False, True, False, target_price=None)
207
+ False, True, False, target_price=None,
208
+ orders_to_be_ignored=None)
200
209
  parse_quantity_mock.assert_called_once_with("50")
201
210
  get_holdings_value_mock.assert_called_once_with(("BTC", "USDT"), "BTC")
202
211
  adapt_amount_to_holdings_mock.reset_mock()
@@ -229,7 +238,8 @@ async def test_get_amount_from_input_amount(null_context):
229
238
 
230
239
  assert await script_keywords.get_amount_from_input_amount(null_context, "50", "buy") == decimal.Decimal(1)
231
240
  adapt_amount_to_holdings_mock.assert_called_once_with(null_context, decimal.Decimal("7.5"), "buy",
232
- False, True, False, target_price=None)
241
+ False, True, False, target_price=None,
242
+ orders_to_be_ignored=None)
233
243
  parse_quantity_mock.assert_called_once_with("50")
234
244
  get_holdings_value_mock.assert_called_once_with({'BTC', 'ETH', 'SOL', 'USDT'}, "BTC")
235
245
  adapt_amount_to_holdings_mock.reset_mock()
@@ -259,40 +259,62 @@ async def test_update_portfolio_with_filled_orders(backtesting_trader):
259
259
  current_price=decimal.Decimal(str(50)),
260
260
  quantity=decimal.Decimal(str(2)),
261
261
  price=decimal.Decimal(str(50)))
262
+ limit_buy_2 = BuyLimitOrder(trader)
263
+ limit_buy_2.update(order_type=TraderOrderType.BUY_LIMIT,
264
+ symbol="BTC/USDT",
265
+ current_price=decimal.Decimal(str(50)),
266
+ quantity=decimal.Decimal(str(2)),
267
+ price=decimal.Decimal(str(50)))
262
268
 
263
269
  # update portfolio with creations
264
270
  portfolio_manager.portfolio.update_portfolio_available(market_sell, True)
265
- portfolio_manager.portfolio.update_portfolio_available(limit_sell, True)
266
271
  portfolio_manager.portfolio.update_portfolio_available(stop_loss, True)
267
- portfolio_manager.portfolio.update_portfolio_available(limit_buy, True)
272
+ # simulate fees in USDT (ex: Kucoin, OKX)
273
+ with mock.patch.object(limit_buy.exchange_manager.exchange.connector, "_get_fees_currency", return_value="USDT") \
274
+ as _get_fees_currency_mock:
275
+ # taker fees are locked
276
+ portfolio_manager.portfolio.update_portfolio_available(limit_sell, True)
277
+ portfolio_manager.portfolio.update_portfolio_available(limit_buy, True)
278
+ portfolio_manager.portfolio.update_portfolio_available(limit_buy_2, True)
268
279
 
269
280
  assert portfolio_manager.portfolio.get_currency_portfolio("BTC").available == decimal.Decimal('2.8')
270
- assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('900')
281
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('799.9')
271
282
 
272
283
  # when cancelling limit sell, market sell and stop orders
273
284
  portfolio_manager.portfolio.update_portfolio_available(stop_loss, False)
274
- portfolio_manager.portfolio.update_portfolio_available(limit_sell, False)
285
+ # simulate fees in USDT (ex: Kucoin, OKX)
286
+ with mock.patch.object(limit_buy.exchange_manager.exchange.connector, "_get_fees_currency", return_value="USDT") \
287
+ as _get_fees_currency_mock:
288
+ portfolio_manager.portfolio.update_portfolio_available(limit_sell, False)
275
289
 
276
290
  assert portfolio_manager.portfolio.get_currency_portfolio("BTC").available == decimal.Decimal('7')
277
- assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('900')
291
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('799.9')
278
292
 
279
293
  # when filling limit buy
280
- await fill_limit_or_stop_order(limit_buy)
281
- assert portfolio_manager.portfolio.get_currency_portfolio("BTC").available == decimal.Decimal('8.999')
282
- assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('900')
283
- assert portfolio_manager.portfolio.get_currency_portfolio("BTC").total == decimal.Decimal('11.999')
284
- assert portfolio_manager.portfolio.get_currency_portfolio("USDT").total == decimal.Decimal('900')
294
+ # simulate fees in USDT (ex: Kucoin, OKX)
295
+ with mock.patch.object(limit_buy.exchange_manager.exchange.connector, "_get_fees_currency", return_value="USDT") \
296
+ as _get_fees_currency_mock:
297
+ await fill_limit_or_stop_order(limit_buy)
298
+ assert portfolio_manager.portfolio.get_currency_portfolio("BTC").available == decimal.Decimal('9')
299
+ # USDT available is now 899.95 as maker fees are applied
300
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('799.95')
301
+ assert portfolio_manager.portfolio.get_currency_portfolio("BTC").total == decimal.Decimal('12')
302
+ # USDT total is now 899.95 as maker fees are applied
303
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").total == decimal.Decimal('899.95')
285
304
 
286
305
  # when filling market sell
287
306
  await fill_market_order(market_sell)
288
- assert portfolio_manager.portfolio.get_currency_portfolio("BTC").available == decimal.Decimal(
289
- '8.999')
290
- assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal(
291
- '1109.79')
292
- assert portfolio_manager.portfolio.get_currency_portfolio("BTC").total == decimal.Decimal(
293
- '8.999')
294
- assert portfolio_manager.portfolio.get_currency_portfolio("USDT").total == decimal.Decimal(
295
- '1109.79')
307
+ assert portfolio_manager.portfolio.get_currency_portfolio("BTC").available == decimal.Decimal('9')
308
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('1009.74')
309
+ assert portfolio_manager.portfolio.get_currency_portfolio("BTC").total == decimal.Decimal('9')
310
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").total == decimal.Decimal('1109.74')
311
+
312
+ # when filling limit buy 2 (fees paid in BTC)
313
+ await fill_market_order(limit_buy_2)
314
+ assert portfolio_manager.portfolio.get_currency_portfolio("BTC").available == decimal.Decimal('10.999')
315
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('1009.74')
316
+ assert portfolio_manager.portfolio.get_currency_portfolio("BTC").total == decimal.Decimal('10.999')
317
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").total == decimal.Decimal('1009.74')
296
318
 
297
319
 
298
320
  async def test_update_portfolio_with_cancelled_orders(backtesting_trader):
@@ -349,15 +371,15 @@ async def test_update_portfolio_with_cancelled_orders(backtesting_trader):
349
371
  portfolio_manager.portfolio.update_portfolio_available(limit_buy, True)
350
372
  assert round(portfolio_manager.portfolio.get_currency_portfolio("BTC").available,
351
373
  1) == decimal.Decimal('5.8')
352
- # also locked 0.1 USDT for fees
353
- assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('799.9')
374
+ # also locked 0.2 USDT for fees (use taker fees to be sure to have enough funds if order is filled as taker)
375
+ assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal('799.8')
354
376
 
355
377
  portfolio_manager.portfolio.update_portfolio_available(market_sell, True)
356
378
 
357
379
  assert round(portfolio_manager.portfolio.get_currency_portfolio("BTC").available,
358
380
  1) == decimal.Decimal('1.7')
359
381
  assert portfolio_manager.portfolio.get_currency_portfolio("USDT").available == decimal.Decimal(
360
- '799.9')
382
+ '799.8')
361
383
  assert portfolio_manager.portfolio.get_currency_portfolio("BTC").total == decimal.Decimal(
362
384
  '10')
363
385
  assert portfolio_manager.portfolio.get_currency_portfolio("USDT").total == decimal.Decimal(
@@ -803,12 +825,16 @@ async def test_update_portfolio_with_multiple_filled_orders(backtesting_trader):
803
825
  with mock.patch.object(exchange_manager.exchange.connector, "_get_fees_currency", return_value="BTC") \
804
826
  as _get_fees_currency_mock:
805
827
  await fill_limit_or_stop_order(limit_sell)
806
- _get_fees_currency_mock.assert_called_once()
828
+ # called twice: once for filled order fee calculation, once for forecasted fees calculation used to restore
829
+ # available amounts if relevant
830
+ assert _get_fees_currency_mock.call_count == 2
807
831
  await fill_limit_or_stop_order(limit_sell_3)
808
832
  with mock.patch.object(exchange_manager.exchange.connector, "_get_fees_currency", return_value="USDT") \
809
833
  as _get_fees_currency_mock:
810
834
  await fill_limit_or_stop_order(limit_buy_2)
811
- _get_fees_currency_mock.assert_called_once()
835
+ # called twice: once for filled order fee calculation, once for forecasted fees calculation used to restore
836
+ # available amounts if relevant
837
+ assert _get_fees_currency_mock.call_count == 2
812
838
  await fill_limit_or_stop_order(limit_sell_5)
813
839
  await fill_limit_or_stop_order(stop_loss_4)
814
840
  await fill_limit_or_stop_order(limit_buy_4)