OctoBot-Trading 2.3.34__cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl → 2.3.35__cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

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 (36) hide show
  1. {OctoBot_Trading-2.3.34.dist-info → OctoBot_Trading-2.3.35.dist-info}/METADATA +2 -2
  2. {OctoBot_Trading-2.3.34.dist-info → OctoBot_Trading-2.3.35.dist-info}/RECORD +36 -36
  3. octobot_trading/__init__.py +1 -1
  4. octobot_trading/constants.py +1 -0
  5. octobot_trading/enums.py +12 -0
  6. octobot_trading/exchanges/connectors/ccxt/ccxt_connector.cpython-38-aarch64-linux-gnu.so +0 -0
  7. octobot_trading/exchanges/connectors/ccxt/ccxt_connector.pxd +6 -3
  8. octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py +8 -0
  9. octobot_trading/exchanges/exchange_builder.cpython-38-aarch64-linux-gnu.so +0 -0
  10. octobot_trading/exchanges/exchange_factory.cpython-38-aarch64-linux-gnu.so +0 -0
  11. octobot_trading/exchanges/exchange_websocket_factory.cpython-38-aarch64-linux-gnu.so +0 -0
  12. octobot_trading/exchanges/traders/trader.cpython-38-aarch64-linux-gnu.so +0 -0
  13. octobot_trading/exchanges/traders/trader.py +4 -0
  14. octobot_trading/modes/channel/abstract_mode_consumer.cpython-38-aarch64-linux-gnu.so +0 -0
  15. octobot_trading/modes/channel/abstract_mode_producer.cpython-38-aarch64-linux-gnu.so +0 -0
  16. octobot_trading/personal_data/exchange_personal_data.cpython-38-aarch64-linux-gnu.so +0 -0
  17. octobot_trading/personal_data/exchange_personal_data.py +8 -7
  18. octobot_trading/personal_data/orders/channel/orders.cpython-38-aarch64-linux-gnu.so +0 -0
  19. octobot_trading/personal_data/orders/channel/orders.py +21 -15
  20. octobot_trading/personal_data/orders/orders_manager.cpython-38-aarch64-linux-gnu.so +0 -0
  21. octobot_trading/personal_data/orders/states/cancel_order_state.cpython-38-aarch64-linux-gnu.so +0 -0
  22. octobot_trading/personal_data/orders/states/cancel_order_state.py +3 -2
  23. octobot_trading/personal_data/orders/states/fill_order_state.cpython-38-aarch64-linux-gnu.so +0 -0
  24. octobot_trading/personal_data/orders/states/fill_order_state.py +2 -1
  25. octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.cpython-38-aarch64-linux-gnu.so +0 -0
  26. octobot_trading/personal_data/portfolios/portfolio_factory.cpython-38-aarch64-linux-gnu.so +0 -0
  27. octobot_trading/personal_data/portfolios/portfolio_manager.cpython-38-aarch64-linux-gnu.so +0 -0
  28. octobot_trading/personal_data/portfolios/portfolio_profitability.cpython-38-aarch64-linux-gnu.so +0 -0
  29. octobot_trading/personal_data/portfolios/portfolio_value_holder.cpython-38-aarch64-linux-gnu.so +0 -0
  30. octobot_trading/personal_data/portfolios/value_converter.cpython-38-aarch64-linux-gnu.so +0 -0
  31. octobot_trading/storage/orders_storage.py +54 -1
  32. octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py +1 -1
  33. tests/api/test_channels.py +1 -1
  34. {OctoBot_Trading-2.3.34.dist-info → OctoBot_Trading-2.3.35.dist-info}/LICENSE +0 -0
  35. {OctoBot_Trading-2.3.34.dist-info → OctoBot_Trading-2.3.35.dist-info}/WHEEL +0 -0
  36. {OctoBot_Trading-2.3.34.dist-info → OctoBot_Trading-2.3.35.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: OctoBot-Trading
3
- Version: 2.3.34
3
+ Version: 2.3.35
4
4
  Summary: OctoBot project trading package
5
5
  Home-page: https://github.com/Drakkar-Software/OctoBot-Trading
6
6
  Author: Drakkar-Software
@@ -28,7 +28,7 @@ Requires-Dist: cryptography
28
28
  Requires-Dist: sortedcontainers (==2.4.0)
29
29
  Requires-Dist: tinydb (==4.5.2)
30
30
 
31
- # OctoBot-Trading [2.3.34](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
31
+ # OctoBot-Trading [2.3.35](https://github.com/Drakkar-Software/OctoBot-Trading/blob/master/CHANGELOG.md)
32
32
  [![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)
33
33
  [![PyPI](https://img.shields.io/pypi/v/OctoBot-Trading.svg)](https://pypi.python.org/pypi/OctoBot-Trading/)
34
34
  [![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,8 +1,13 @@
1
+ OctoBot_Trading-2.3.35.dist-info/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
2
+ OctoBot_Trading-2.3.35.dist-info/WHEEL,sha256=oCBNUxcpJIObB7qxTwklMZvZV19pJGv6x0IkRXaUM7w,150
3
+ OctoBot_Trading-2.3.35.dist-info/top_level.txt,sha256=EWslZXCzarlfXX-Z5_2qiJ28t-1TykzGYqpXESZP0H0,39
4
+ OctoBot_Trading-2.3.35.dist-info/RECORD,,
5
+ OctoBot_Trading-2.3.35.dist-info/METADATA,sha256=H2zckNpzB0u9MO8T4HeLgTI4XT81diFNFjhTrNDMPZY,2285
1
6
  octobot_trading/errors.py,sha256=nDpLJ5OSKyVehbCaevg9M6pL6Xztz2UC-IVmOm7DyPY,5292
2
- octobot_trading/constants.py,sha256=zvWqjCUkRPeZ171tJuJ3qm3Tg7Q8hfBquTDR-u2WNyE,7645
7
+ octobot_trading/constants.py,sha256=SwCh4qT9RLeZQOrvZPiAzPWYSH_LcSgElX6Hm9DjzeQ,7779
3
8
  octobot_trading/octobot_channel_consumer.cpython-38-aarch64-linux-gnu.so,sha256=w2xjVoqdlbOHE8KeBJYk5VrodHKi4YroJTBEz_La0PM,959032
4
- octobot_trading/enums.py,sha256=UYW_TabwOgMPHq4rP8AIBQFNvlMlZ8--Zw8iw5agn7M,14581
5
- octobot_trading/__init__.py,sha256=Hde8AiykcSNuVCwqJdXf70aHlsDQyOYtx_5eajG5Dm8,793
9
+ octobot_trading/enums.py,sha256=Hx2icRPKw-mOKzsZokfY19-318udJNCA8Fe3IWCh5Jo,14826
10
+ octobot_trading/__init__.py,sha256=GD-ex0qJwY5UGj5-IPgPYITwdmCioNdHV_cDHkFTDsY,793
6
11
  octobot_trading/octobot_channel_consumer.py,sha256=XE7nay4TqK1YQ24ly_nK3gcgKEK-Btr_Al34oGIOr90,5364
7
12
  octobot_trading/octobot_channel_consumer.pxd,sha256=fTc7VH30Hrfftfov27PDO3gnGDaT_XgpYfXkhI3b3zM,834
8
13
  octobot_trading/exchange_channel.cpython-38-aarch64-linux-gnu.so,sha256=N0a19jKTUX8O80yylTh8ZCCblbFwp9IpG3EK1wbMQ5g,2138736
@@ -21,14 +26,14 @@ octobot_trading/modes/mode_config.py,sha256=3E-fLK5NYqGa3naRrbOVUpIg53fcYg3mUhun
21
26
  octobot_trading/modes/modes_factory.pxd,sha256=1MTpnlTncPZx3WmCLE7LblSefxye50oLytptXQ17SnI,1249
22
27
  octobot_trading/modes/channel/mode.pxd,sha256=Bd08rJ-nuOUDOZHUk_fzkyMsoIspcx-zrMLiXUdfz0w,1222
23
28
  octobot_trading/modes/channel/abstract_mode_producer.py,sha256=iqUo8FCDsHwktdx1F9SJQdk2w2IzN2HzS3BnvQ8H3PQ,21943
24
- octobot_trading/modes/channel/abstract_mode_producer.cpython-38-aarch64-linux-gnu.so,sha256=Gi5hLqsdouRfKuI6Ug2ogkEtZOHQTqXKhR7EqUNFgno,3105280
29
+ octobot_trading/modes/channel/abstract_mode_producer.cpython-38-aarch64-linux-gnu.so,sha256=5JLS7MDApAIGun_r0ujdHS9K3QZulplO1Lxe92TnSaQ,3105368
25
30
  octobot_trading/modes/channel/mode.py,sha256=4ez1hqq2xXiXiO_viVtX0xAzjZE6T0mlfWZ3_ogONtY,5567
26
31
  octobot_trading/modes/channel/__init__.py,sha256=E6fT8Pvg_VcZlVjnsSL07pMzrHkFhkmWYJLXypgSCk4,1414
27
32
  octobot_trading/modes/channel/abstract_mode_consumer.pxd,sha256=kG2s4zwm5LaIBvjf0R_FGKoRYz0B_psDXYx9wqnZ620,1105
28
33
  octobot_trading/modes/channel/abstract_mode_consumer.py,sha256=TGl3yz-ScFwl2ag3V1U9MupR7Gu-8G0OVtzwhgxQZjI,10133
29
34
  octobot_trading/modes/channel/abstract_mode_producer.pxd,sha256=PQb1MH3Biif6pBAPE5O1onuGzBxZAnjCnIqvHcqaI6M,1494
30
35
  octobot_trading/modes/channel/__init__.pxd,sha256=m4kKmGWJugvlOPEBIqTf8tLr_ThT8VoA77syujxgFs8,1380
31
- octobot_trading/modes/channel/abstract_mode_consumer.cpython-38-aarch64-linux-gnu.so,sha256=1iwP_Hti1N6l8PUC8rRmwOqm9R1ZV_xQrtd0kqBvqCg,1821232
36
+ octobot_trading/modes/channel/abstract_mode_consumer.cpython-38-aarch64-linux-gnu.so,sha256=ibeNledE6z_ktZsOsLdOBgZYBdkoXc_J0N22AQxomDU,1821328
32
37
  octobot_trading/modes/channel/mode.cpython-38-aarch64-linux-gnu.so,sha256=g0uICalNdfLhH1YBG1S9bsAE0RdUzkCvBW9AqMDhQAc,1149208
33
38
  octobot_trading/modes/script_keywords/__init__.py,sha256=E_KgXz1HK7f56TK9mCIzVJdxHHa_R7zmYFelocNwgx4,2395
34
39
  octobot_trading/modes/script_keywords/context_management.py,sha256=xVovC6waycw72SeuBD4y5erLWsZg_RgkArc1LE5rgx8,25906
@@ -58,13 +63,13 @@ octobot_trading/util/__init__.py,sha256=evLMJmcecR8p5fhKMbJda_kmkyogcQa0mb44Json
58
63
  octobot_trading/util/simulator_updater_utils.py,sha256=O_cealYwFROh6uDVi1DKx35OLykAwKNp0bdtfbeiYIw,1983
59
64
  octobot_trading/util/config_util.cpython-38-aarch64-linux-gnu.so,sha256=6_u-MptgEqamE5HIrs2AiYq8HUPGONypex6AI5qJYZc,847400
60
65
  octobot_trading/util/__init__.pxd,sha256=amvu39DTFlQ-Xv5lCKgDq4tsvzP_ui5TOTm5ehgpDek,1561
61
- octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py,sha256=bPQql0qcPABuCogTGtRI8N8vqmmj1xI7IZVTF8J_E34,6668
66
+ octobot_trading/util/test_tools/spot_rest_exchange_test_tools.py,sha256=qJ5b4cy9GKf6eJ1OMbteS1rEta_2qDPci32n4lXJopI,6672
62
67
  octobot_trading/util/test_tools/__init__.py,sha256=SZ1jl_Iee73IYok4awKPJ5YOA5LXBWRfvov17hmqqF8,715
63
68
  octobot_trading/util/test_tools/exchanges_test_tools.py,sha256=tOztZrOk6OkWiyJR6dzuFpyAhZ5-iWCrZbqws3W4dzk,2421
64
69
  octobot_trading/util/test_tools/websocket_test_tools.py,sha256=aaOz4dRm6CrWl7h6UOF4HlLmwJA5h03wPoWJugS9HFw,3809
65
- octobot_trading/exchanges/exchange_builder.cpython-38-aarch64-linux-gnu.so,sha256=66i02NxClf_soKKS8l37MiqprT3YDH4jbP6KBDCRNsc,1564712
70
+ octobot_trading/exchanges/exchange_builder.cpython-38-aarch64-linux-gnu.so,sha256=iS0bcSclWeghh9cJK6hH04uw6akAB-SjwukxLMj8wLI,1564800
66
71
  octobot_trading/exchanges/abstract_exchange.py,sha256=jxbx1rfeWYVC5N_yhxZsVDeRg7NYnqIHRuLs6X9Bm4w,25123
67
- octobot_trading/exchanges/exchange_websocket_factory.cpython-38-aarch64-linux-gnu.so,sha256=bAOS4X4_JvXfrBA-1JOgHW39J63_s-gYYHrfTg3cMq4,827248
72
+ octobot_trading/exchanges/exchange_websocket_factory.cpython-38-aarch64-linux-gnu.so,sha256=fAPwvYDmKv3edtYex2XZsUp42Ov7e0Q45L5BNB4eIGQ,827360
68
73
  octobot_trading/exchanges/exchange_factory.py,sha256=dLZtl2Bg6t8p8StGusX-Eq6iTYWmLJNV0srTd3ErCS4,8701
69
74
  octobot_trading/exchanges/abstract_exchange.pxd,sha256=OVMqU5KsZnyBu-KVIMFAXpikxNfZzl3CeKE5Lt5W1XQ,3752
70
75
  octobot_trading/exchanges/abstract_websocket_exchange.cpython-38-aarch64-linux-gnu.so,sha256=6tppKXMRJjBahvO-MlsLdTSWr-Gp1AUyv_7PugfaMWU,1568296
@@ -85,7 +90,7 @@ octobot_trading/exchanges/exchanges.pxd,sha256=FseAaQPfA3OntMfRq_Tw4OcRldh43JrvE
85
90
  octobot_trading/exchanges/exchange_channels.py,sha256=7EamxILSyq18zeo3-ZnYXKudWEKXqQ4VwZ9V01T2tsY,7805
86
91
  octobot_trading/exchanges/exchange_builder.pxd,sha256=_qCYBUNK8QFjiVwOhrbYOlyQcFPbTo48v24VLHh0s7U,2399
87
92
  octobot_trading/exchanges/exchange_channels.pxd,sha256=WyjKsHpjEejNNs5fjsKfyD7rN5p9SqvJeLO72YcxMvo,1114
88
- octobot_trading/exchanges/exchange_factory.cpython-38-aarch64-linux-gnu.so,sha256=lswxYhiNrYgbU4rLRnd37llZh2BOGPGGQh2hvIRX1mE,1065408
93
+ octobot_trading/exchanges/exchange_factory.cpython-38-aarch64-linux-gnu.so,sha256=V-zlZ0HKVadTIDMNBaiPROI0ZNRc9BZIFKUvYLHwuuY,1065472
89
94
  octobot_trading/exchanges/__init__.pxd,sha256=5C0_Tx8TX5qS--c8YrAmtoreKf3DmqBs18hVlFmXHsk,3877
90
95
  octobot_trading/exchanges/basic_exchange_wrapper.pxd,sha256=BCROGJhradjlEddupiO8lOOUC1bht5Fmq86jtAwbEic,981
91
96
  octobot_trading/exchanges/basic_exchange_wrapper.cpython-38-aarch64-linux-gnu.so,sha256=spwXdKTQW8_-kYwP3FZA1zRoHc_Wwq3L4864PdLGMys,878360
@@ -94,11 +99,11 @@ octobot_trading/exchanges/exchange_manager.py,sha256=CQXANkTqcUlGPyVW3HQOjg8J6Oh
94
99
  octobot_trading/exchanges/connectors/__init__.py,sha256=bEM3pYx1JZT3e3C_zy5E8cWWKsmfBr6YSFRw6TOPTb8,1229
95
100
  octobot_trading/exchanges/connectors/__init__.pxd,sha256=S-BuBm1bmQVA87yiXCd89Vt_REf-LxVwTmKpupsVZ7s,1134
96
101
  octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.py,sha256=ADbegEFdLlE6IZTQhgHjboulZgM_VbL-rxeIVJB8tOo,7153
97
- octobot_trading/exchanges/connectors/ccxt/ccxt_connector.cpython-38-aarch64-linux-gnu.so,sha256=YBmng1yb5_CrsxyefKqeWz3idzHhYwky3j-MxXcC9mk,6226440
102
+ octobot_trading/exchanges/connectors/ccxt/ccxt_connector.cpython-38-aarch64-linux-gnu.so,sha256=LDkqxSZ5hwJrROViup7XXft34ipgfEnmJTeTnk81LwQ,6358152
98
103
  octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.cpython-38-aarch64-linux-gnu.so,sha256=ssgE7sWcVjRQWVvdV1TORgCepO-Afz43_psge8-ik4o,4036368
99
104
  octobot_trading/exchanges/connectors/ccxt/ccxt_adapter.py,sha256=fsYNatyEC1-HwvBgJcQ2rWmsDVdMFRCPDcjqSot6Bjs,17945
100
105
  octobot_trading/exchanges/connectors/ccxt/constants.py,sha256=kvd4I9JgzjxFfdInGxSHmeMKYv1x8ReDmQyNuytHrX0,761
101
- octobot_trading/exchanges/connectors/ccxt/ccxt_connector.pxd,sha256=uhRjcfR54jgxSVV-h-QcuxpgfKQbry7SAiX3yg-pgrU,1790
106
+ octobot_trading/exchanges/connectors/ccxt/ccxt_connector.pxd,sha256=4daa-KsNpKYzOtjUCrZsi7ISOyHcx8uDArRD6LVk1S4,1980
102
107
  octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.py,sha256=fRPalldg1DNDguUJFdL1NqmfMc172b1u2nwj7GcVadw,43051
103
108
  octobot_trading/exchanges/connectors/ccxt/enums.py,sha256=fOpmMmvfxHDlqA-wqBQE3M6ujbB4kDlXDr5-TrYMh_0,3390
104
109
  octobot_trading/exchanges/connectors/ccxt/__init__.py,sha256=vBelwZG9S0b-wCX-5IBg_N1DN5T7Znfjslqi-Tf6IrY,1309
@@ -106,7 +111,7 @@ octobot_trading/exchanges/connectors/ccxt/ccxt_websocket_connector.pxd,sha256=h7
106
111
  octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.cpython-38-aarch64-linux-gnu.so,sha256=QvHzIY5sv45jbyTpV5Daw8A5Fc8MVi7ZCaaV1y_4SCY,1015624
107
112
  octobot_trading/exchanges/connectors/ccxt/__init__.pxd,sha256=h-_KWW0mhJikmMRy-t3GezWM8X4LJK6vH_jjlSLf-_0,1138
108
113
  octobot_trading/exchanges/connectors/ccxt/ccxt_client_util.pxd,sha256=-J-ujT_N1vV4ujKWNJn8ObqZps7jtZN0HZyY8eLOzWw,1912
109
- octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py,sha256=mb1teTMReqK4YWicZSTPTQ8DpzlIU7vesA9EPvtTwSY,35932
114
+ octobot_trading/exchanges/connectors/ccxt/ccxt_connector.py,sha256=PWsOQPKCkWPSR3UY0X21BFFu5GKdWUoRhqMEKL_4TmM,36174
110
115
  octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.cpython-38-aarch64-linux-gnu.so,sha256=r-KO3X4kcUSS14b-SM5Jm2VN9ZgHjOh13IjXiyBPk9c,1987768
111
116
  octobot_trading/exchanges/connectors/simulator/__init__.py,sha256=-86JVBUObRQ4CbelhQKGS7mi39I1pPATNfHDInv8RaE,1216
112
117
  octobot_trading/exchanges/connectors/simulator/exchange_simulator_connector.py,sha256=vNCBh6OyaNMQFpE9RcbE8Uji9ZwtQS9uCLMMJc8V7jY,11814
@@ -147,9 +152,9 @@ octobot_trading/exchanges/adapters/abstract_adapter.py,sha256=_AtpVz6lg2_moS9D1m
147
152
  octobot_trading/exchanges/adapters/__init__.py,sha256=aeqBi9gM8THRt7m2gbFqBSwfz6_bQUSLzKkl_bgzVMU,909
148
153
  octobot_trading/exchanges/traders/trader_simulator.pxd,sha256=ZEbvN8_XZl8S6NbraEZG5PByOaNISgpt3vVpiVsVBnE,849
149
154
  octobot_trading/exchanges/traders/trader_simulator.py,sha256=7tt7GX_RH-Ebr9CXamChbo47xWgegndFc9zi-5CgC0M,1684
150
- octobot_trading/exchanges/traders/trader.py,sha256=I--Q0BAe5vS1Enm5iUNez88pk6XDHo3Wsmh0Ij0giUo,42297
155
+ octobot_trading/exchanges/traders/trader.py,sha256=jMi8SSYyzUZmkTHLaqPr9hjcVcTkaRTv6EowDMFlIiY,42539
151
156
  octobot_trading/exchanges/traders/trader_simulator.cpython-38-aarch64-linux-gnu.so,sha256=U7bYo6-VeRdGIXgtPbu9lZwW44pl9ou4OZvQLcJSL5c,494296
152
- octobot_trading/exchanges/traders/trader.cpython-38-aarch64-linux-gnu.so,sha256=Ni1q7qKc_ywj_6NyyNuV55FONbL4i6_XQv7c8IXHdg0,4038704
157
+ octobot_trading/exchanges/traders/trader.cpython-38-aarch64-linux-gnu.so,sha256=DM0GtHbefkOb3Z8mzOEaimHQrDANGMZ7zkCcEIMtSbM,4050544
153
158
  octobot_trading/exchanges/traders/__init__.py,sha256=oQg6oA6Q0fyQeiJBwHCUuwPZsipSaOfSJpKRROVV_0I,1042
154
159
  octobot_trading/exchanges/traders/__init__.pxd,sha256=tGxOQj8t3SysC98JkTUns3p6igAjPzWFvfnY-F2WrtA,1047
155
160
  octobot_trading/exchanges/traders/trader.pxd,sha256=tZslPCFE1ATwClephjBtHHDshgR0eUJteS0pnK_9OZM,1427
@@ -313,7 +318,7 @@ octobot_trading/exchange_data/recent_trades/channel/recent_trade.cpython-38-aarc
313
318
  octobot_trading/exchange_data/recent_trades/channel/__init__.pxd,sha256=wKRQOFs-m32kAjFs22w5sgUd6joaQzAfRp_VPNSrAOU,1599
314
319
  octobot_trading/exchange_data/recent_trades/channel/recent_trade_updater.pxd,sha256=CcJedsfvuhJxJ4LdYAEoMsbniX56OEphre03op-BRmU,941
315
320
  octobot_trading/storage/candles_storage.py,sha256=lz01ISSrwa3sAnTSXArjuDZRkf8AHMl0gqUW0hTVG2o,4385
316
- octobot_trading/storage/orders_storage.py,sha256=-sNQMBXocSQpKuvXfGp_SuN9enz018VOu0PG1tONHnk,7291
321
+ octobot_trading/storage/orders_storage.py,sha256=TVpLDCQ0e0O4MQXGGZ69wZkTcqSrQYVHgdOvcxHwZg0,9604
317
322
  octobot_trading/storage/portfolio_storage.py,sha256=S9HkeKGZDhW8GlPqEyc603pImlGkefCCZWlXX6fonW8,5071
318
323
  octobot_trading/storage/trades_storage.py,sha256=ux7DrNr1jz_WRNy2O7ybzv_2Jlo3QVLrkD5qADqzIdw,8274
319
324
  octobot_trading/storage/__init__.py,sha256=Ukdo2_VX9FpVm2Zs23vB6pXhbJ2uONAOcr9eAzfs6Ss,2159
@@ -325,8 +330,8 @@ octobot_trading/personal_data/state.py,sha256=kUPh60h_rD0XlZaRRgEbPGMVIqAmDGfKAk
325
330
  octobot_trading/personal_data/exchange_personal_data.pxd,sha256=GNO8Yb4tBMh_SAEjDNZ2PcKs3L6MdNOII4lBq3N7Jqw,1904
326
331
  octobot_trading/personal_data/__init__.py,sha256=OA4Bree2GYL5z4O5p9CVjKNWu2H0483m2t2OZQBe0bo,11980
327
332
  octobot_trading/personal_data/state.pxd,sha256=UhylOYwxnbgWz98a3JBbod0kpXvidXhRKc5vrdP38lU,1548
328
- octobot_trading/personal_data/exchange_personal_data.cpython-38-aarch64-linux-gnu.so,sha256=wMTvyyL_I8oAH-NcM5-_x2IEf9NlswwA9jVpPlY15DM,2972288
329
- octobot_trading/personal_data/exchange_personal_data.py,sha256=tnPLTTqAtVZFcCGa_VItAuzODyLonh6dbDWCzbgDx7I,18899
333
+ octobot_trading/personal_data/exchange_personal_data.cpython-38-aarch64-linux-gnu.so,sha256=hWT5CPai56bOyQvmzUSAEPgTbS7wQ-Z-zaundnW-9Ps,2981312
334
+ octobot_trading/personal_data/exchange_personal_data.py,sha256=rLAlditGZbqGptz3-z83nXv9LM2IC_DtscG-EaBO6UA,19003
330
335
  octobot_trading/personal_data/__init__.pxd,sha256=pWCQsf28NYvdu1un3-Pr1yPZ-INMWXPy7jm-NVNGbD0,5451
331
336
  octobot_trading/personal_data/state.cpython-38-aarch64-linux-gnu.so,sha256=caJD3qT4E8McJu-RgVGJNDiwtcyzE34X6EhWEUJYxj0,1686416
332
337
  octobot_trading/personal_data/trades/trades_manager.cpython-38-aarch64-linux-gnu.so,sha256=igfxqeDibzmKvc1dF38_QZznmsC8Vseu_B3JBem1LZQ,1353104
@@ -356,7 +361,7 @@ octobot_trading/personal_data/orders/order_util.py,sha256=LLa5dIYeVaqKHMFi2sF_UA
356
361
  octobot_trading/personal_data/orders/order_adapter.py,sha256=kjmcmQnkI0I5SDou1pNX73hWkBEVKgW0v4yGjSdJShk,10764
357
362
  octobot_trading/personal_data/orders/order_adapter.pxd,sha256=b-JMLMZ9COO0dWa_tG1IGGYQM2wGXiXNx5vUUlffNmY,1559
358
363
  octobot_trading/personal_data/orders/order_factory.pxd,sha256=UNIi-CsVIwshXWn9kr84JEoL1CRKe6GE90zPsbr4GKA,2569
359
- octobot_trading/personal_data/orders/orders_manager.cpython-38-aarch64-linux-gnu.so,sha256=QKwXHeRguM9XAOe0QAdJ1dJWeGtROhhnldx6zGl6M-w,1975264
364
+ octobot_trading/personal_data/orders/orders_manager.cpython-38-aarch64-linux-gnu.so,sha256=ab2CDfalVbeJyuMiTLDXc793GSz8mIp5U8XP_afmK8k,1975352
360
365
  octobot_trading/personal_data/orders/order_group.cpython-38-aarch64-linux-gnu.so,sha256=CuZ742lcMaz0WpuprH_x82jOFK4WW3-LYGO3kB8uR9Q,739544
361
366
  octobot_trading/personal_data/orders/__init__.py,sha256=L0b39bLFcrUs_yDuLGgH6M7pMRC70p5aWcT0irmOh_g,7174
362
367
  octobot_trading/personal_data/orders/orders_manager.py,sha256=t9SgN-vSog0UlXxIfHYAflqAGecOPNr-_FCK8GvRif0,10764
@@ -386,14 +391,14 @@ octobot_trading/personal_data/orders/states/open_order_state.cpython-38-aarch64-
386
391
  octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.pxd,sha256=BHdS0fpBXZ9jomt5TYXQ74tm3UZsAc3_fqSmP5t0xtQ,967
387
392
  octobot_trading/personal_data/orders/states/order_state_factory.cpython-38-aarch64-linux-gnu.so,sha256=qNE9edErvHWXYKRW9PWnKC5eNCwlTpco9sHmbWkuT_o,456256
388
393
  octobot_trading/personal_data/orders/states/__init__.py,sha256=rGjbh1aqxa1L3GJmg6xvtI2O-wxaQ04g3-tDFzefxJ8,2133
389
- octobot_trading/personal_data/orders/states/cancel_order_state.py,sha256=Jh0Z9w_thqqvSQAJ4HUmgg6Tq7Tthks5mwxYtCzpA2Y,5414
394
+ octobot_trading/personal_data/orders/states/cancel_order_state.py,sha256=H65gbux2Q26e2r75lIgEVbpnM_9WdOPCzoee-_6InGY,5371
390
395
  octobot_trading/personal_data/orders/states/close_order_state.py,sha256=lav5WjmUv0b8cHVvzyOZYUp5ZkXIuLbvHTYgf3ESw8w,2600
391
- octobot_trading/personal_data/orders/states/fill_order_state.cpython-38-aarch64-linux-gnu.so,sha256=q_nFxhttk_QnK4axuxom6P-fJEA3ygAf_TsoWOdSJnQ,1098280
392
- octobot_trading/personal_data/orders/states/cancel_order_state.cpython-38-aarch64-linux-gnu.so,sha256=7DZ4BgeSi9_b79InNNL7RHYL35_VBB0eVBHn4m7gbeU,1069104
396
+ octobot_trading/personal_data/orders/states/fill_order_state.cpython-38-aarch64-linux-gnu.so,sha256=4LjRUViI58B1rEjmfrqjA4sY7KDrBboaDX68vXIMdgs,1102384
397
+ octobot_trading/personal_data/orders/states/cancel_order_state.cpython-38-aarch64-linux-gnu.so,sha256=Yo4gLe5mSFt0A-LGUa57Eqo6KVZpxdFJl_o4uILDOU8,1069952
393
398
  octobot_trading/personal_data/orders/states/pending_creation_chained_order_state.py,sha256=xXVK6LQ0__QV56d5_1KEvBZ70YgVJR330XzT00xr5-A,1166
394
399
  octobot_trading/personal_data/orders/states/pending_creation_order_state.cpython-38-aarch64-linux-gnu.so,sha256=7GegmBZgT03fpN-NA08ZNjsxeHD_3-VnpUaqMy0oKAE,695056
395
400
  octobot_trading/personal_data/orders/states/open_order_state.py,sha256=lZJuo_TpUgeVmnMOtrT9-B-xbCGBWL4kA30QywhSsx4,4835
396
- octobot_trading/personal_data/orders/states/fill_order_state.py,sha256=630wjflwtu6CQEY8QY0Uj015yjv3YYEQnYT8bMN7o7Y,5373
401
+ octobot_trading/personal_data/orders/states/fill_order_state.py,sha256=JTTQ1uxoH18sQQQKtV6FIN4_ecOdt_w_zC0VEnksDKA,5419
397
402
  octobot_trading/personal_data/orders/states/pending_creation_order_state.py,sha256=9JFMK-zA6txpqOw5TakcOOOzQGgvNDb5pldd3aGaX9w,1674
398
403
  octobot_trading/personal_data/orders/states/__init__.pxd,sha256=cPRfXU_i9gX7_k5hX0baBDM_HzfluRrJXLU55zpr98o,2030
399
404
  octobot_trading/personal_data/orders/states/pending_creation_order_state.pxd,sha256=jCug7dbE3wTItfbQ3gu5Hjnfv80z7MgoeFhElEBiuQA,887
@@ -401,9 +406,9 @@ octobot_trading/personal_data/orders/states/open_order_state.pxd,sha256=JKPBEm1i
401
406
  octobot_trading/personal_data/orders/states/cancel_order_state.pxd,sha256=Ay5fr1gzQyrkPELSP0kkctHbp9jYJHyqFDSCh4wDGa0,947
402
407
  octobot_trading/personal_data/orders/states/order_state_factory.py,sha256=U3eYUJ9AJRg2JspI5XXipY2k3-zcXSl4qkB2pFSeCTI,1775
403
408
  octobot_trading/personal_data/orders/channel/orders_updater.cpython-38-aarch64-linux-gnu.so,sha256=lQvalGyPcUKR6JIfTmoTkg7MYyZOWQZ_WSLZJyntz0Y,1393272
404
- octobot_trading/personal_data/orders/channel/orders.py,sha256=uUbBLLGullBsicIaXbpa99RpOOYBiJuATJU4aGlAV9k,13717
409
+ octobot_trading/personal_data/orders/channel/orders.py,sha256=7IYspXpv1_veixV2VdBzm5xZ9mp2XThKXL3gpPqtGu4,13853
405
410
  octobot_trading/personal_data/orders/channel/orders_updater.pxd,sha256=AW8WD6VtCekuYblfWt-oEmUeF_VR6PNsRDemxYqgMqM,1103
406
- octobot_trading/personal_data/orders/channel/orders.cpython-38-aarch64-linux-gnu.so,sha256=mlwxsw3TkRH4s-C-wwkpGJuu8ZMrsbja9H096-6mfZ8,1796624
411
+ octobot_trading/personal_data/orders/channel/orders.cpython-38-aarch64-linux-gnu.so,sha256=KY2Rw9QtiIX9vjtLycrFydRF_NCnSO6rjg13e0f8x74,1813136
407
412
  octobot_trading/personal_data/orders/channel/orders.pxd,sha256=QApCnVm5X8MfUzSwNV2d6WMuuOtUFTY3QYV9dGrru9Q,956
408
413
  octobot_trading/personal_data/orders/channel/__init__.py,sha256=BGcr4UWfJYVZQEqjjpvi92OSC4o-qJzRf42ayUJKIBY,1361
409
414
  octobot_trading/personal_data/orders/channel/orders_updater_simulator.pxd,sha256=nxTYeFPIvhkkOBeLRFa1rHrqM9ASW8BQC3VcQWshkug,904
@@ -547,15 +552,15 @@ octobot_trading/personal_data/positions/types/linear_position.cpython-38-aarch64
547
552
  octobot_trading/personal_data/positions/types/inverse_position.pxd,sha256=agBGmN7p5-g6I47XGCboLxTB7C5iCo5id8OvjMcu9aE,881
548
553
  octobot_trading/personal_data/portfolios/portfolio_profitability.pxd,sha256=d9NZ6ac_s0syRvx_rvOo5yziG-D_xytpCdn32zU38qA,1970
549
554
  octobot_trading/personal_data/portfolios/portfolio_value_holder.py,sha256=f8hAwyvt7ira3rEgTNIZ77_fFzts2wPj84_MWrabU7w,16679
550
- octobot_trading/personal_data/portfolios/portfolio_manager.cpython-38-aarch64-linux-gnu.so,sha256=TGW9bZZAgc0xuYECafb-5fDV2ZHk4ga3vqE5lqmAJZA,2116800
555
+ octobot_trading/personal_data/portfolios/portfolio_manager.cpython-38-aarch64-linux-gnu.so,sha256=siWmpPnW3JSyuGRYadEufgYsf2wr36HFN8lVvtJ5n28,2116888
551
556
  octobot_trading/personal_data/portfolios/sub_portfolio.py,sha256=YNdK8DccBPXaoaxMjSTwbU32_tdie-vExnSSbyfy-OU,3270
552
557
  octobot_trading/personal_data/portfolios/portfolio_util.py,sha256=cEphcqwuRz5-eBQl-0K1H46tP_61EfdwBoBA3RFP1OY,9056
553
558
  octobot_trading/personal_data/portfolios/sub_portfolio.pxd,sha256=suCzqU4K3j2wrf_1RLLLLIPiBwZiXp4_eRgen56fpj0,1339
554
559
  octobot_trading/personal_data/portfolios/__init__.py,sha256=Vu33e0iUSahxYyUh3ggOtPymE3i-GX7jqOR5Tl0P404,4168
555
560
  octobot_trading/personal_data/portfolios/portfolio.py,sha256=XS_I7hLN9BgCpzz8EgHJZy7q9vbQCYzCb8ipOQL_S_I,14495
556
561
  octobot_trading/personal_data/portfolios/portfolio_value_holder.pxd,sha256=vFnh13oLE2nJpq2c47PjGXkEfHjIC_5JULpwoOQ7Xqs,3572
557
- octobot_trading/personal_data/portfolios/portfolio_factory.cpython-38-aarch64-linux-gnu.so,sha256=J06I7blH3mMcjxabqFOmu-yMF1Un2y3pIj2etcgDurk,322704
558
- octobot_trading/personal_data/portfolios/portfolio_value_holder.cpython-38-aarch64-linux-gnu.so,sha256=B2nBHCkSyu2-rguSBK-i9vPn4cluTx8WLVG2tX0Zq5g,1293792
562
+ octobot_trading/personal_data/portfolios/portfolio_factory.cpython-38-aarch64-linux-gnu.so,sha256=uTSA_E3LATeCxuYtdVIaiZcZ7C2vDdGFwH1MgZ_yXOM,322792
563
+ octobot_trading/personal_data/portfolios/portfolio_value_holder.cpython-38-aarch64-linux-gnu.so,sha256=smG3VufsGXu_q1Rvt-qkCv55Om3TCTbfKipf-q-pKHg,1293864
559
564
  octobot_trading/personal_data/portfolios/value_converter.pxd,sha256=3lAiOSbz1NEFsLYXHRbVNM6r3sQHSTlugdHEX0_nyzg,2817
560
565
  octobot_trading/personal_data/portfolios/portfolio_manager.py,sha256=zo0Z_27_U-9XRGJzukxL0rZIu1dZzsBEe6StyHSh_-8,14643
561
566
  octobot_trading/personal_data/portfolios/asset.cpython-38-aarch64-linux-gnu.so,sha256=KZKTAuYlbW3nUen_tsBhwvRQ8qn9SGSyWAMZYu_J1Y4,904048
@@ -563,12 +568,12 @@ octobot_trading/personal_data/portfolios/portfolio_util.cpython-38-aarch64-linux
563
568
  octobot_trading/personal_data/portfolios/portfolio_util.pxd,sha256=_D86zqSs3xoIrgeOsBEAlUJij75gdLeR-oZpa41_5fI,940
564
569
  octobot_trading/personal_data/portfolios/asset.pxd,sha256=6zwtz13xrTvz9TW4NKnLlHWvFR2jzV6o-T9zC6-ZF0A,1305
565
570
  octobot_trading/personal_data/portfolios/portfolio_manager.pxd,sha256=fgPAVuaR87vDa01zk1GdJrO6f58SVs47jKH3zJIybZA,2606
566
- octobot_trading/personal_data/portfolios/portfolio_profitability.cpython-38-aarch64-linux-gnu.so,sha256=EoHYainL03IA2571ftkF8LOVqqVCg3Wz0rcxXYF-BdE,1051544
571
+ octobot_trading/personal_data/portfolios/portfolio_profitability.cpython-38-aarch64-linux-gnu.so,sha256=uDJAfX79oS2XzKecSEcfkD3h3P1COXLipQ6xyWPuG28,1051632
567
572
  octobot_trading/personal_data/portfolios/value_converter.py,sha256=mrmno_voKBluIpqOVucAgSbbXM9QVeOkKXMQsgSDWEY,17489
568
573
  octobot_trading/personal_data/portfolios/portfolio.pxd,sha256=ScWgO1SeIsQo2ILr33LfTIJOfta31aNpdBVehZjRhLw,3174
569
574
  octobot_trading/personal_data/portfolios/portfolio_factory.py,sha256=H2kSV_LjQFYevF0-biSg-W7YJ5yDmIdy3LkKQQPt1-c,1368
570
575
  octobot_trading/personal_data/portfolios/__init__.pxd,sha256=hw3qH1yZRT0TqzNr-dB8A6KB5LlaEkCAZMBz3XAcAyc,3758
571
- octobot_trading/personal_data/portfolios/value_converter.cpython-38-aarch64-linux-gnu.so,sha256=KR5OaZrmeayD0VosINdOIvbjnYbkLk0UDV894WcAPxQ,1908016
576
+ octobot_trading/personal_data/portfolios/value_converter.cpython-38-aarch64-linux-gnu.so,sha256=hEuYlZpSxJK_jPT15juXNnNx-0tTZSnSC0T8rTotgrs,1908112
572
577
  octobot_trading/personal_data/portfolios/portfolio.cpython-38-aarch64-linux-gnu.so,sha256=AavSKYUCQAtGh4XtaiDwufyLlrMg1_hWkDDM9wJrZGg,1465768
573
578
  octobot_trading/personal_data/portfolios/asset.py,sha256=v8mj4OShmjcsBSkoNUTLWiZZVrFLP0BHCgDw_MEgmCE,4783
574
579
  octobot_trading/personal_data/portfolios/sub_portfolio.cpython-38-aarch64-linux-gnu.so,sha256=TVLuOwC6Iu3GhyzO9bvpfqeyjhHloz6mq2JISxpuHUk,696456
@@ -584,7 +589,7 @@ octobot_trading/personal_data/portfolios/history/historical_asset_value.py,sha25
584
589
  octobot_trading/personal_data/portfolios/history/__init__.pxd,sha256=B-nwpWvSdL2L8fwTpsZsTY6j-iPPoIR2I_cHsAuG5VE,1541
585
590
  octobot_trading/personal_data/portfolios/history/historical_asset_value_factory.pxd,sha256=rbKXL5FsqCP24t83Pj3pguwoqGBqkTuupkr1bqYqJJo,855
586
591
  octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.py,sha256=6JnBXTeJisnlC04w97jscYnGLH_OwtymFAS9HcbjESc,17719
587
- octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.cpython-38-aarch64-linux-gnu.so,sha256=HD8gd89jGXD7hdDSTEbdPvEu29zrMxK556cjEiY3slQ,2179016
592
+ octobot_trading/personal_data/portfolios/history/historical_portfolio_value_manager.cpython-38-aarch64-linux-gnu.so,sha256=fA-pTUT1bF1up1jZ5VcFFyVKBbbzvtkuL7_etfKQrYE,2179104
588
593
  octobot_trading/personal_data/portfolios/channel/balance_updater_simulator.cpython-38-aarch64-linux-gnu.so,sha256=uf3J5PB24AKKcYTUc-AleNMrQW5gOkxS-Jj7GjGhKn0,509032
589
594
  octobot_trading/personal_data/portfolios/channel/balance_updater.cpython-38-aarch64-linux-gnu.so,sha256=8pa73wXLJuJHs09A1CScNAZEg7pF7_LhXer6vWBZARA,1360736
590
595
  octobot_trading/personal_data/portfolios/channel/balance.cpython-38-aarch64-linux-gnu.so,sha256=zy8mZ_mbOc5nV44cMht7l4BZnK9Tq2SoSZbnZpJ9u6E,1515568
@@ -662,7 +667,7 @@ tests/exchanges/traders/test_trader.py,sha256=srrcQQv1uQOzH3Ctifys4H_AtgTRDsYrNe
662
667
  tests/exchanges/types/__init__.py,sha256=YsUz9-zgsheTifsGc7O1Xt2PSwcnc6Od0IBU7_LAu3o,716
663
668
  tests/exchanges/types/test_websocket_exchange.py,sha256=rcl9dNBLcv4hHsAm9X_b1etkTKOqyetIPqeCMXOP9Qo,1496
664
669
  tests/api/test_exchange.py,sha256=omqI04fWyDP4M7ZjflA7zqLYXEb6lLA685TuYNTO_4w,2148
665
- tests/api/test_channels.py,sha256=F_1m5n1zLjaZnuy90VVbJCIx2JRvBxrkUYapBksraw8,1849
670
+ tests/api/test_channels.py,sha256=uSphqXYYx_gckOeWmN-LhHy1uvJOCsYxzv8txWN7RkM,1854
666
671
  tests/api/__init__.py,sha256=YsUz9-zgsheTifsGc7O1Xt2PSwcnc6Od0IBU7_LAu3o,716
667
672
  tests/api/test_symbol_data.py,sha256=X9ZrbkFYPKMggoZE70x5-N-O262UZJzpiryj8EUygWo,814
668
673
  tests/api/test_modes.py,sha256=X9ZrbkFYPKMggoZE70x5-N-O262UZJzpiryj8EUygWo,814
@@ -803,8 +808,3 @@ tests_additional/real_exchanges/test_phemex.py,sha256=RfweUAjb9xTWlKQ88xiw8VN9vM
803
808
  tests_additional/real_exchanges/test_bitget.py,sha256=S4oS8tzbEv3zLwzuuLFyUhMS95RNcbJzRabY_a3D3tM,7938
804
809
  tests_additional/real_exchanges/test_coinex.py,sha256=-aHIh-kYfuacBwopN06RSXQ5ZHCzW7QuJRewpV4tA2I,7180
805
810
  tests_additional/real_exchanges/test_kucoin.py,sha256=8iedpNDq7WdMaSlD0VYown6WyLb8ouP1GkJGKNlfoB0,7593
806
- OctoBot_Trading-2.3.34.dist-info/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
807
- OctoBot_Trading-2.3.34.dist-info/WHEEL,sha256=oCBNUxcpJIObB7qxTwklMZvZV19pJGv6x0IkRXaUM7w,150
808
- OctoBot_Trading-2.3.34.dist-info/top_level.txt,sha256=EWslZXCzarlfXX-Z5_2qiJ28t-1TykzGYqpXESZP0H0,39
809
- OctoBot_Trading-2.3.34.dist-info/RECORD,,
810
- OctoBot_Trading-2.3.34.dist-info/METADATA,sha256=o312uAmPpztKEwXhCHr8GzT9U99ati6NeQ7hYp70pqU,2285
@@ -15,4 +15,4 @@
15
15
  # License along with this library.
16
16
 
17
17
  PROJECT_NAME = "OctoBot-Trading"
18
- VERSION = "2.3.34" # major.minor.revision
18
+ VERSION = "2.3.35" # major.minor.revision
@@ -60,6 +60,7 @@ ENABLE_CCXT_VERBOSE = os_util.parse_boolean_environment_var("ENABLE_CCXT_VERBOSE
60
60
  ENABLE_CCXT_RATE_LIMIT = os_util.parse_boolean_environment_var("ENABLE_CCXT_RATE_LIMIT", "True")
61
61
  THROTTLED_WS_UPDATES = float(os.getenv("THROTTLED_WS_UPDATES", "0.1")) # avoid spamming CPU
62
62
  ENABLE_LIVE_CANDLES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_LIVE_CANDLES_STORAGE", "False")
63
+ ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE = os_util.parse_boolean_environment_var("ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE", "False")
63
64
 
64
65
  # Decimal default values (decimals are immutable, can be stored as constant)
65
66
  ZERO = decimal.Decimal(0)
octobot_trading/enums.py CHANGED
@@ -545,3 +545,15 @@ class StoredOrdersAttr(enum.Enum):
545
545
  SHARED_SIGNAL_ORDER_ID = "ssoi"
546
546
  HAS_BEEN_BUNDLED = "hbb"
547
547
  ENTRIES = "en"
548
+ UPDATE_TIME = "ut"
549
+ UPDATE_TYPE = "uty"
550
+ ORDER_ID = "oid"
551
+ ORDER_STATUS = "s"
552
+ ORDER_DETAILS = "d"
553
+
554
+
555
+ class OrderUpdateType(enum.Enum):
556
+ NEW = "new"
557
+ CLOSED = "closed"
558
+ EDIT = "edit"
559
+ STATE_CHANGE = "state_transition"
@@ -25,17 +25,17 @@ cdef class CCXTConnector(abstract_exchange.AbstractExchange):
25
25
  cdef public bint is_authenticated
26
26
  cdef public str rest_name
27
27
 
28
+ cdef public dict saved_data
29
+
28
30
  cdef object additional_config
29
31
  cdef dict options
30
32
  cdef dict headers
31
33
 
32
34
 
33
- # private
34
- cdef object _create_client(self)
35
-
36
35
  # @staticmethod waiting for a future version of cython
37
36
  # cdef bint _ensure_order_details_completeness(object order, list order_required_fields=*)
38
37
 
38
+ cpdef object _create_client(self) # public to call and override in non cython subclasses
39
39
  cpdef object get_adapter_class(self, object adapter_class)
40
40
  cpdef void add_headers(self, dict headers_dict)
41
41
  cpdef void add_options(self, dict options_dict)
@@ -45,3 +45,6 @@ cdef class CCXTConnector(abstract_exchange.AbstractExchange):
45
45
  cpdef object unauthenticated_exchange_fallback(self, object err)
46
46
 
47
47
  cdef bint _should_authenticate(self)
48
+
49
+ cpdef object get_saved_data(self, object key)
50
+ cpdef object set_saved_data(self, object key, object value)
@@ -56,6 +56,9 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
56
56
  self.is_authenticated = False
57
57
  self.rest_name = rest_name or self.exchange_manager.exchange_class_string
58
58
 
59
+ # used to save exchange local elements in subclasses
60
+ self.saved_data = {}
61
+
59
62
  self.additional_config = additional_config
60
63
  self.headers = {}
61
64
  self.options = {}
@@ -678,6 +681,11 @@ class CCXTConnector(abstract_exchange.AbstractExchange):
678
681
  self.client.safe_value(self.client.markets, pair, {}), property_name, def_value
679
682
  )
680
683
 
684
+ def get_saved_data(self, key):
685
+ return self.saved_data[key]
686
+
687
+ def set_saved_data(self, key, value):
688
+ self.saved_data[key] = value
681
689
 
682
690
  """
683
691
  Parsers todo: remove all parsers
@@ -215,6 +215,10 @@ class Trader(util.Initializable):
215
215
  self.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.update_portfolio_available(
216
216
  order, is_new_order=True
217
217
  )
218
+ # push order edit into orders channel as edit update
219
+ await self.exchange_manager.exchange_personal_data.handle_order_update_notification(
220
+ order, enums.OrderUpdateType.EDIT
221
+ )
218
222
  self.logger.info(f"Edited order: {order}")
219
223
  return changed
220
224
  finally:
@@ -208,7 +208,8 @@ class ExchangePersonalData(util.Initializable):
208
208
  asyncio.create_task(order.state.on_refresh_successful())
209
209
 
210
210
  if should_notify:
211
- await self.handle_order_update_notification(order, is_new_order)
211
+ update_type = enums.OrderUpdateType.NEW if is_new_order else enums.OrderUpdateType.STATE_CHANGE
212
+ await self.handle_order_update_notification(order, update_type)
212
213
  return order.state is not None
213
214
 
214
215
  def _is_out_of_sync_order(self, order_id) -> bool:
@@ -225,11 +226,11 @@ class ExchangePersonalData(util.Initializable):
225
226
  self.logger.exception(e, True, f"Failed to update order instance : {e}")
226
227
  return False
227
228
 
228
- async def handle_order_update_notification(self, order, is_new_order):
229
+ async def handle_order_update_notification(self, order, update_type: enums.OrderUpdateType):
229
230
  """
230
231
  Notify Orders channel for Order update
231
232
  :param order: the updated order
232
- :param is_new_order: True if the order was created during update
233
+ :param update_type: the type of update as enums.OrderUpdateType
233
234
  """
234
235
  try:
235
236
  orders_chan = exchange_channel.get_chan(constants.ORDERS_CHANNEL, self.exchange_manager.id)
@@ -237,11 +238,11 @@ class ExchangePersonalData(util.Initializable):
237
238
  # avoid other computations if no consumer
238
239
  return
239
240
  await orders_chan.get_internal_producer().send(
240
- cryptocurrency=self.exchange_manager.exchange.get_pair_cryptocurrency(order.symbol),
241
- symbol=order.symbol,
242
- order=order.to_dict(),
241
+ self.exchange_manager.exchange.get_pair_cryptocurrency(order.symbol),
242
+ order.symbol,
243
+ order.to_dict(),
243
244
  is_from_bot=order.is_from_this_octobot,
244
- is_new=is_new_order,
245
+ update_type=update_type,
245
246
  is_closed=order.is_closed()
246
247
  )
247
248
  except ValueError as e:
@@ -19,6 +19,7 @@ import octobot_trading.exchange_channel as exchanges_channel
19
19
  import octobot_trading.exchanges as exchanges
20
20
  import octobot_trading.constants as constants
21
21
  import octobot_trading.errors as errors
22
+ import octobot_trading.enums as enums
22
23
  import octobot_trading.personal_data.orders.orders_storage_operations as orders_storage_operations
23
24
 
24
25
 
@@ -105,12 +106,14 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
105
106
  )
106
107
  except Exception as err:
107
108
  self.logger.exception(err, True, f"Error when completing order with stored data: {err}")
108
- await self.send(cryptocurrency=self.channel.exchange_manager.exchange.
109
- get_pair_cryptocurrency(symbol),
110
- symbol=symbol, order=order,
111
- is_from_bot=is_from_bot,
112
- is_new=is_new_order,
113
- is_closed=False)
109
+ await self.send(
110
+ self.channel.exchange_manager.exchange.get_pair_cryptocurrency(symbol),
111
+ symbol,
112
+ order,
113
+ is_from_bot=is_from_bot,
114
+ update_type=enums.OrderUpdateType.NEW if is_new_order else enums.OrderUpdateType.STATE_CHANGE,
115
+ is_closed=False
116
+ )
114
117
 
115
118
  async def _complete_open_order_init(self, orders, is_from_bot):
116
119
  """
@@ -119,12 +122,14 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
119
122
  for order in orders:
120
123
  self.logger.debug(f"Completing order init for order: {order}")
121
124
  await self.channel.exchange_manager.exchange_personal_data.on_order_refresh_success(order, False, False)
122
- await self.send(cryptocurrency=self.channel.exchange_manager.exchange.
123
- get_pair_cryptocurrency(order.symbol),
124
- symbol=order.symbol, order=order.to_dict(),
125
- is_from_bot=is_from_bot,
126
- is_new=True,
127
- is_closed=False)
125
+ await self.send(
126
+ self.channel.exchange_manager.exchange.get_pair_cryptocurrency(order.symbol),
127
+ order.symbol,
128
+ order.to_dict(),
129
+ is_from_bot=is_from_bot,
130
+ update_type=enums.OrderUpdateType.NEW,
131
+ is_closed=False
132
+ )
128
133
 
129
134
  async def _handle_close_order_update(self, order_id, order):
130
135
  """
@@ -230,8 +235,9 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
230
235
  self.logger.error(f"Order with id {missing_order_id} could not be synchronized")
231
236
  await asyncio.gather(*synchronize_tasks)
232
237
 
233
- async def send(self, cryptocurrency, symbol, order, is_from_bot=True, is_new=False, is_closed=False):
234
- if is_closed:
238
+ async def send(self, cryptocurrency, symbol, order, is_from_bot=True,
239
+ update_type=enums.OrderUpdateType.STATE_CHANGE, is_closed=False):
240
+ if is_closed or update_type is enums.OrderUpdateType.CLOSED:
235
241
  # do not push closed orders
236
242
  return
237
243
  for consumer in self.channel.get_filtered_consumers(symbol=symbol):
@@ -241,7 +247,7 @@ class OrdersProducer(exchanges_channel.ExchangeChannelProducer):
241
247
  "cryptocurrency": cryptocurrency,
242
248
  "symbol": symbol,
243
249
  "order": order,
244
- "is_new": is_new,
250
+ "update_type": update_type.value,
245
251
  "is_from_bot": is_from_bot
246
252
  })
247
253
 
@@ -103,8 +103,9 @@ class CancelOrderState(order_state.OrderState):
103
103
  False)
104
104
 
105
105
  # notify order cancelled
106
- await self.order.exchange_manager.exchange_personal_data.handle_order_update_notification(self.order,
107
- False)
106
+ await self.order.exchange_manager.exchange_personal_data.handle_order_update_notification(
107
+ self.order, enums.OrderUpdateType.STATE_CHANGE
108
+ )
108
109
 
109
110
  # set close state
110
111
  await self.order.on_close(force_close=True) # TODO force ?
@@ -110,7 +110,8 @@ class FillOrderState(order_state.OrderState):
110
110
 
111
111
  # notify order filled
112
112
  await self.order.exchange_manager.exchange_personal_data.handle_order_update_notification(
113
- self.order, False)
113
+ self.order, enums.OrderUpdateType.STATE_CHANGE
114
+ )
114
115
 
115
116
  # call order on_filled callback
116
117
  await self.order.on_filled()
@@ -15,6 +15,7 @@
15
15
  # License along with this library
16
16
  import copy
17
17
  import decimal
18
+ import time
18
19
 
19
20
  import octobot_commons.channels_name as channels_name
20
21
  import octobot_commons.enums as commons_enums
@@ -22,6 +23,7 @@ import octobot_commons.databases as commons_databases
22
23
  import octobot_commons.logging as commons_logging
23
24
 
24
25
  import octobot_trading.enums as enums
26
+ import octobot_trading.constants as constants
25
27
  import octobot_trading.storage.abstract_storage as abstract_storage
26
28
  import octobot_trading.storage.util as storage_util
27
29
 
@@ -29,7 +31,9 @@ import octobot_trading.storage.util as storage_util
29
31
  class OrdersStorage(abstract_storage.AbstractStorage):
30
32
  LIVE_CHANNEL = channels_name.OctoBotTradingChannelsName.ORDERS_CHANNEL.value
31
33
  HISTORY_TABLE = commons_enums.DBTables.ORDERS.value
34
+ HISTORICAL_OPEN_ORDERS_TABLE = commons_enums.DBTables.HISTORICAL_ORDERS_UPDATES.value
32
35
  IS_HISTORICAL = False
36
+ ENABLE_HISTORICAL_ORDER_UPDATES_STORAGE = constants.ENABLE_HISTORICAL_ORDERS_UPDATES_STORAGE
33
37
 
34
38
  def __init__(self, exchange_manager, use_live_consumer_in_backtesting=None, is_historical=None):
35
39
  super().__init__(exchange_manager, plot_settings=None,
@@ -54,11 +58,13 @@ class OrdersStorage(abstract_storage.AbstractStorage):
54
58
  cryptocurrency: str,
55
59
  symbol: str,
56
60
  order: dict,
57
- is_new: bool,
61
+ update_type: str,
58
62
  is_from_bot: bool,
59
63
  ):
60
64
  # only store the current snapshot of open orders when order updates are received
61
65
  await self._update_history()
66
+ if self.ENABLE_HISTORICAL_ORDER_UPDATES_STORAGE:
67
+ await self._add_historical_open_orders(order, update_type)
62
68
  await self.trigger_debounced_flush()
63
69
 
64
70
  async def _update_history(self):
@@ -71,6 +77,14 @@ class OrdersStorage(abstract_storage.AbstractStorage):
71
77
  cache=False,
72
78
  )
73
79
 
80
+ async def _add_historical_open_orders(self, order_dict: dict, update_type: str):
81
+ update_time = time.time()
82
+ await self._get_db().log(
83
+ self.HISTORICAL_OPEN_ORDERS_TABLE,
84
+ _format_order_update(self.exchange_manager, order_dict, update_type, update_time),
85
+ cache=False,
86
+ )
87
+
74
88
  async def _store_history(self):
75
89
  await self._update_history()
76
90
  await self._get_db().flush()
@@ -82,6 +96,9 @@ class OrdersStorage(abstract_storage.AbstractStorage):
82
96
  self.exchange_manager.exchange_name,
83
97
  )
84
98
 
99
+ async def get_historical_orders_updates(self):
100
+ return copy.deepcopy(await self._get_db().all(self.HISTORICAL_OPEN_ORDERS_TABLE))
101
+
85
102
  async def get_startup_order_details(self, order_id):
86
103
  return self.startup_orders.get(order_id, None)
87
104
 
@@ -128,6 +145,14 @@ class OrdersStorage(abstract_storage.AbstractStorage):
128
145
  )
129
146
  return order_dict
130
147
 
148
+ @classmethod
149
+ async def clear_database_history(cls, database, flush=True):
150
+ await super().clear_database_history(database, flush=False)
151
+ if cls.ENABLE_HISTORICAL_ORDER_UPDATES_STORAGE:
152
+ await database.delete(cls.HISTORICAL_OPEN_ORDERS_TABLE, None)
153
+ if flush:
154
+ await database.flush()
155
+
131
156
 
132
157
  def _get_group_dict(order):
133
158
  if not order.order_group:
@@ -168,3 +193,31 @@ def _format_order(order, exchange_manager):
168
193
  except Exception as err:
169
194
  commons_logging.get_logger(OrdersStorage.__name__).exception(err, True, f"Error when formatting order: {err}")
170
195
  return {}
196
+
197
+
198
+ def _format_order_update(exchange_manager, order_dict, update_type, update_time):
199
+ order_id = order_dict[enums.ExchangeConstantsOrderColumns.ID.value]
200
+ status = order_dict[enums.ExchangeConstantsOrderColumns.STATUS.value]
201
+ order_update = {
202
+ enums.StoredOrdersAttr.ORDER_ID.value: order_id,
203
+ enums.StoredOrdersAttr.ORDER_STATUS.value: status,
204
+ enums.StoredOrdersAttr.UPDATE_TIME.value: update_time,
205
+ enums.StoredOrdersAttr.UPDATE_TYPE.value: update_type,
206
+ }
207
+ details = None
208
+ try:
209
+ details = _format_order(
210
+ exchange_manager.exchange_personal_data.orders_manager.get_order(
211
+ order_dict[enums.ExchangeConstantsOrderColumns.ID.value]
212
+ ),
213
+ exchange_manager
214
+ )
215
+ except KeyError:
216
+ if status == enums.OrderStatus.OPEN.value:
217
+ # ensure order details are present in open orders
218
+ details = {
219
+ OrdersStorage.ORIGIN_VALUE_KEY: OrdersStorage.sanitize_for_storage(order_dict),
220
+ }
221
+ order_update[enums.StoredOrdersAttr.ORDER_DETAILS.value] = details
222
+ return order_update
223
+
@@ -130,7 +130,7 @@ class SpotRestExchangeTests:
130
130
  cryptocurrency: str,
131
131
  symbol: str,
132
132
  order: dict,
133
- is_new: bool,
133
+ update_type: str,
134
134
  is_from_bot: bool,
135
135
  ):
136
136
  self.channel_callbacks_triggered[channels_name.OctoBotTradingChannelsName.ORDERS_CHANNEL.value] = True
@@ -40,7 +40,7 @@ async def trades_callback(exchange: str, exchange_id: str, cryptocurrency: str,
40
40
  pass
41
41
 
42
42
 
43
- async def order_callback(self, exchange, exchange_id, cryptocurrency, symbol, order, is_new, is_from_bot):
43
+ async def order_callback(self, exchange, exchange_id, cryptocurrency, symbol, order, update_type, is_from_bot):
44
44
  pass
45
45
 
46
46