PyAlgoEngine 0.7.5__tar.gz → 0.7.5.post1__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.post1}/PKG-INFO +1 -1
  2. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/PKG-INFO +1 -1
  3. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/__init__.py +1 -1
  4. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/bokeh_server.py +33 -8
  5. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/LICENSE +0 -0
  6. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/SOURCES.txt +0 -0
  7. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
  8. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/requires.txt +0 -0
  9. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/top_level.txt +0 -0
  10. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/README.md +0 -0
  11. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/__init__.py +0 -0
  12. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/__init__.py +0 -0
  13. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/doc_server.py +0 -0
  14. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/tester.py +0 -0
  15. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/web_app.py +0 -0
  16. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/demo/__init__.py +0 -0
  17. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/apps/demo/test.py +0 -0
  18. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/__init__.py +0 -0
  19. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/__main__.py +0 -0
  20. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/metrics.py +0 -0
  21. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/replay.py +0 -0
  22. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/sim_match.py +0 -0
  23. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/__init__.py +0 -0
  24. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/console_utils.py +0 -0
  25. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/finance_decimal.py +0 -0
  26. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_buffer.py +0 -0
  27. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils.py +0 -0
  28. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils_nt.py +0 -0
  29. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils_posix.py +0 -0
  30. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/technical_analysis.py +0 -0
  31. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/telemetrics.py +0 -0
  32. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/base/trade_utils.py +0 -0
  33. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/engine/__init__.py +0 -0
  34. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/engine/algo_engine.py +0 -0
  35. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/engine/event_engine.py +0 -0
  36. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/engine/market_engine.py +0 -0
  37. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/engine/trade_engine.py +0 -0
  38. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/monitor/__init__.py +0 -0
  39. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/monitor/advanced_data_interface.py +0 -0
  40. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/profile/__init__.py +0 -0
  41. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/profile/cn.py +0 -0
  42. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/strategy/__init__.py +0 -0
  43. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/strategy/strategy_engine.py +0 -0
  44. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/utils/__init__.py +0 -0
  45. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/utils/commit_regularizer.py +0 -0
  46. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/algo_engine/utils/data_utils.py +0 -0
  47. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/setup.cfg +0 -0
  48. {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post1}/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.post1
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.post1
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.post1"
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,7 +182,7 @@ 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,
@@ -194,12 +196,35 @@ class DocManager(object):
194
196
  '\n'.join([f'http://{self.bokeh_host}:{self.bokeh_port}{url} => {app}' for url, app in self.doc_server.items()])
195
197
  )
196
198
 
197
- server.start()
199
+ self.bokeh_server.start()
198
200
 
199
- # for url in applications:
200
- # server.io_loop.add_callback(server.show, url)
201
-
202
- server.io_loop.start()
201
+ # Start the Bokeh server IOLoop unless stop_event is triggered
202
+ while not self.stop_event.is_set():
203
+ try:
204
+ self.bokeh_server.io_loop.start()
205
+ except Exception as e:
206
+ LOGGER.error(f"Error in Bokeh server: {e}")
207
+ finally:
208
+ LOGGER.info("Bokeh server has been stopped.")
209
+ break
203
210
 
204
211
  def start(self):
212
+ LOGGER.info(f'Starting Bokeh service...')
205
213
  self.bokeh_thread.start()
214
+
215
+ def stop(self):
216
+ LOGGER.info(f'Stopping Bokeh service...')
217
+
218
+ # Signal the event to stop
219
+ self.stop_event.set()
220
+
221
+ # Stop the Bokeh server gracefully
222
+ if self.bokeh_server is not None:
223
+ self.bokeh_server.io_loop.stop() # Stop the IOLoop
224
+ self.bokeh_server.stop() # Stop the Bokeh server itself
225
+
226
+ # Wait for the Bokeh thread to finish if it's still running
227
+ if self.bokeh_thread.is_alive():
228
+ self.bokeh_thread.join()
229
+
230
+ LOGGER.info('Bokeh service has been stopped.')
File without changes