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.
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PKG-INFO +1 -1
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/PKG-INFO +1 -1
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/__init__.py +1 -1
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/bokeh_server.py +33 -8
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/__init__.py +5 -1
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils_posix.py +6 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/LICENSE +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/SOURCES.txt +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/requires.txt +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/top_level.txt +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/README.md +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/doc_server.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/tester.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/web_app.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/demo/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/demo/test.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/__main__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/metrics.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/replay.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/backtest/sim_match.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/console_utils.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/finance_decimal.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_buffer.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils_nt.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/technical_analysis.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/telemetrics.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/trade_utils.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/algo_engine.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/event_engine.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/market_engine.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/engine/trade_engine.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/monitor/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/monitor/advanced_data_interface.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/profile/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/profile/cn.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/strategy/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/strategy/strategy_engine.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/utils/__init__.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/utils/commit_regularizer.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/utils/data_utils.py +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/setup.cfg +0 -0
- {pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/setup.py +0 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
199
|
+
self.bokeh_server.start()
|
|
198
200
|
|
|
199
|
-
#
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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')
|
{pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/market_utils_posix.py
RENAMED
|
@@ -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.
|
|
File without changes
|
|
File without changes
|
{pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/PyAlgoEngine.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/apps/backtest/doc_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/base/technical_analysis.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/monitor/advanced_data_interface.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/strategy/strategy_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyalgoengine-0.7.4.post1 → pyalgoengine-0.7.5.post1}/algo_engine/utils/commit_regularizer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|