PyAlgoEngine 0.7.4.post1__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.4.post1 → pyalgoengine-0.7.5.post1}/PKG-INFO +1 -1
  2. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/PKG-INFO +1 -1
  3. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/__init__.py +1 -1
  4. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/bokeh_server.py +33 -8
  5. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/__init__.py +5 -1
  6. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils_posix.py +6 -0
  7. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/LICENSE +0 -0
  8. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/SOURCES.txt +0 -0
  9. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
  10. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/requires.txt +0 -0
  11. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/top_level.txt +0 -0
  12. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/README.md +0 -0
  13. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/__init__.py +0 -0
  14. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/__init__.py +0 -0
  15. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/doc_server.py +0 -0
  16. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/tester.py +0 -0
  17. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/web_app.py +0 -0
  18. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/demo/__init__.py +0 -0
  19. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/demo/test.py +0 -0
  20. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/__init__.py +0 -0
  21. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/__main__.py +0 -0
  22. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/metrics.py +0 -0
  23. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/replay.py +0 -0
  24. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/sim_match.py +0 -0
  25. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/console_utils.py +0 -0
  26. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/finance_decimal.py +0 -0
  27. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_buffer.py +0 -0
  28. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils.py +0 -0
  29. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils_nt.py +0 -0
  30. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/technical_analysis.py +0 -0
  31. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/telemetrics.py +0 -0
  32. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/trade_utils.py +0 -0
  33. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/__init__.py +0 -0
  34. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/algo_engine.py +0 -0
  35. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/event_engine.py +0 -0
  36. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/market_engine.py +0 -0
  37. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/trade_engine.py +0 -0
  38. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/monitor/__init__.py +0 -0
  39. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/monitor/advanced_data_interface.py +0 -0
  40. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/profile/__init__.py +0 -0
  41. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/profile/cn.py +0 -0
  42. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/strategy/__init__.py +0 -0
  43. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/strategy/strategy_engine.py +0 -0
  44. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/utils/__init__.py +0 -0
  45. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/utils/commit_regularizer.py +0 -0
  46. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/utils/data_utils.py +0 -0
  47. {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/setup.cfg +0 -0
  48. {pyalgoengine-0.7.4.post1 → 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.4.post1
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.4.post1
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.4.post1"
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.')
@@ -9,7 +9,11 @@ def set_logger(logger: logging.Logger):
9
9
  global LOGGER
10
10
  LOGGER = logger
11
11
 
12
- market_utils.LOGGER = logger.getChild('MarketUtils')
12
+ if os.name == 'nt':
13
+ market_utils_nt.LOGGER = logger.getChild('MarketUtils')
14
+ else:
15
+ market_utils_posix.LOGGER = logger.getChild('MarketUtils')
16
+
13
17
  trade_utils.LOGGER = logger.getChild('TradeUtils')
14
18
  technical_analysis.LOGGER = logger.getChild('TA')
15
19
  console_utils.LOGGER = logger.getChild('Console')
@@ -2111,6 +2111,12 @@ class TickData(MarketData):
2111
2111
  self._order_book = OrderBook(ticker=ticker, timestamp=timestamp, bid=bid, ask=ask)
2112
2112
  buffer.order_book = self._order_book._buffer
2113
2113
 
2114
+ if hasattr(self, '_order_book'):
2115
+ buffer.bid_price = self._order_book.best_bid_price
2116
+ buffer.bid_volume = self._order_book.best_bid_volume
2117
+ buffer.ask_price = self._order_book.best_ask_price
2118
+ buffer.ask_volume = self._order_book.best_ask_volume
2119
+
2114
2120
  def __repr__(self) -> str:
2115
2121
  """
2116
2122
  Returns a string representation of the `TickData` instance.