PyAlgoEngine 0.7.5__tar.gz → 0.7.5.post2__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 (48) hide show
  1. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PKG-INFO +1 -1
  2. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/PKG-INFO +1 -1
  3. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/__init__.py +1 -1
  4. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/bokeh_server.py +34 -8
  5. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_utils_posix.py +2 -2
  6. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/LICENSE +0 -0
  7. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/SOURCES.txt +0 -0
  8. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
  9. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/requires.txt +0 -0
  10. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/top_level.txt +0 -0
  11. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/README.md +0 -0
  12. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/__init__.py +0 -0
  13. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/__init__.py +0 -0
  14. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/doc_server.py +0 -0
  15. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/tester.py +0 -0
  16. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/web_app.py +0 -0
  17. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/demo/__init__.py +0 -0
  18. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/demo/test.py +0 -0
  19. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/__init__.py +0 -0
  20. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/__main__.py +0 -0
  21. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/metrics.py +0 -0
  22. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/replay.py +0 -0
  23. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/sim_match.py +0 -0
  24. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/__init__.py +0 -0
  25. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/console_utils.py +0 -0
  26. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/finance_decimal.py +0 -0
  27. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_buffer.py +0 -0
  28. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_utils.py +0 -0
  29. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_utils_nt.py +0 -0
  30. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/technical_analysis.py +0 -0
  31. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/telemetrics.py +0 -0
  32. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/trade_utils.py +0 -0
  33. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/__init__.py +0 -0
  34. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/algo_engine.py +0 -0
  35. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/event_engine.py +0 -0
  36. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/market_engine.py +0 -0
  37. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/trade_engine.py +0 -0
  38. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/monitor/__init__.py +0 -0
  39. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/monitor/advanced_data_interface.py +0 -0
  40. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/profile/__init__.py +0 -0
  41. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/profile/cn.py +0 -0
  42. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/strategy/__init__.py +0 -0
  43. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/strategy/strategy_engine.py +0 -0
  44. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/utils/__init__.py +0 -0
  45. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/utils/commit_regularizer.py +0 -0
  46. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/utils/data_utils.py +0 -0
  47. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/setup.cfg +0 -0
  48. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyAlgoEngine
3
- Version: 0.7.5
3
+ Version: 0.7.5.post2
4
4
  Summary: Basic algo engine
5
5
  Home-page: https://github.com/BolunHan/PyAlgoEngine
6
6
  Author: Bolun.Han
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyAlgoEngine
3
- Version: 0.7.5
3
+ Version: 0.7.5.post2
4
4
  Summary: Basic algo engine
5
5
  Home-page: https://github.com/BolunHan/PyAlgoEngine
6
6
  Author: Bolun.Han
@@ -1,4 +1,4 @@
1
- __version__ = "0.7.5"
1
+ __version__ = "0.7.5.post2"
2
2
 
3
3
  import logging
4
4
  import os
@@ -2,7 +2,7 @@ import abc
2
2
  import uuid
3
3
  from copy import deepcopy
4
4
  from functools import partial
5
- from threading import Thread, Lock
5
+ from threading import Thread, Lock, Event
6
6
  from typing import overload
7
7
 
8
8
  from . import LOGGER
@@ -144,7 +144,9 @@ class DocManager(object):
144
144
 
145
145
  self.doc_server: dict[str, DocServer] = {}
146
146
  self.doc_url: dict[DocServer, str] = {}
147
- self.bokeh_thread = Thread(target=self.serve_bokeh, daemon=True)
147
+ self.bokeh_thread = Thread(target=self.serve_bokeh)
148
+ self.stop_event = Event()
149
+ self.bokeh_server = None
148
150
 
149
151
  def __getitem__(self, url: str):
150
152
  return self.doc_server.__getitem__(url)
@@ -180,12 +182,13 @@ class DocManager(object):
180
182
  LOGGER.info(f"Binding network interface: {interface}, IP Address: {addr.address}")
181
183
  websocket_origin.append(f"{addr.address}:{self.port}")
182
184
 
183
- server = Server(
185
+ self.bokeh_server = Server(
184
186
  applications=self.doc_server,
185
187
  address=self.bokeh_host,
186
188
  port=self.bokeh_port,
187
189
  check_unused_sessions_milliseconds=(self.bokeh_check_unused_sessions * 1000),
188
190
  allow_websocket_origin=[f"{self.bokeh_host}:{self.bokeh_port}"] + websocket_origin,
191
+ use_xheaders=True,
189
192
  # num_procs=1
190
193
  )
191
194
 
@@ -194,12 +197,35 @@ class DocManager(object):
194
197
  '\n'.join([f'http://{self.bokeh_host}:{self.bokeh_port}{url} => {app}' for url, app in self.doc_server.items()])
195
198
  )
196
199
 
197
- server.start()
200
+ self.bokeh_server.start()
198
201
 
199
- # for url in applications:
200
- # server.io_loop.add_callback(server.show, url)
201
-
202
- server.io_loop.start()
202
+ # Start the Bokeh server IOLoop unless stop_event is triggered
203
+ while not self.stop_event.is_set():
204
+ try:
205
+ self.bokeh_server.io_loop.start()
206
+ except Exception as e:
207
+ LOGGER.error(f"Error in Bokeh server: {e}")
208
+ finally:
209
+ LOGGER.info("Bokeh server has been stopped.")
210
+ break
203
211
 
204
212
  def start(self):
213
+ LOGGER.info(f'Starting Bokeh service...')
205
214
  self.bokeh_thread.start()
215
+
216
+ def stop(self):
217
+ LOGGER.info(f'Stopping Bokeh service...')
218
+
219
+ # Signal the event to stop
220
+ self.stop_event.set()
221
+
222
+ # Stop the Bokeh server gracefully
223
+ if self.bokeh_server is not None:
224
+ self.bokeh_server.io_loop.stop() # Stop the IOLoop
225
+ self.bokeh_server.stop() # Stop the Bokeh server itself
226
+
227
+ # Wait for the Bokeh thread to finish if it's still running
228
+ if self.bokeh_thread.is_alive():
229
+ self.bokeh_thread.join()
230
+
231
+ LOGGER.info('Bokeh service has been stopped.')
@@ -1379,7 +1379,7 @@ class OrderBook(MarketData):
1379
1379
  float: The best bid volume, or NaN if not available.
1380
1380
  """
1381
1381
  if book := self.bid:
1382
- return book[0][1]
1382
+ return book.at_level(0)[1]
1383
1383
  else:
1384
1384
  return math.nan
1385
1385
 
@@ -1392,7 +1392,7 @@ class OrderBook(MarketData):
1392
1392
  float: The best ask volume, or NaN if not available.
1393
1393
  """
1394
1394
  if book := self.ask:
1395
- return book[0][1]
1395
+ return book.at_level(0)[1]
1396
1396
  else:
1397
1397
  return math.nan
1398
1398
 
File without changes