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.
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PKG-INFO +1 -1
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/PKG-INFO +1 -1
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/__init__.py +1 -1
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/bokeh_server.py +34 -8
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_utils_posix.py +2 -2
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/LICENSE +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/SOURCES.txt +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/requires.txt +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/PyAlgoEngine.egg-info/top_level.txt +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/README.md +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/doc_server.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/tester.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/backtest/web_app.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/demo/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/apps/demo/test.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/__main__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/metrics.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/replay.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/backtest/sim_match.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/console_utils.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/finance_decimal.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_buffer.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_utils.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/market_utils_nt.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/technical_analysis.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/telemetrics.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/base/trade_utils.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/algo_engine.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/event_engine.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/market_engine.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/engine/trade_engine.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/monitor/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/monitor/advanced_data_interface.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/profile/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/profile/cn.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/strategy/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/strategy/strategy_engine.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/utils/__init__.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/utils/commit_regularizer.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/utils/data_utils.py +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/setup.cfg +0 -0
- {pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/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,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
|
-
|
|
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
|
-
|
|
200
|
+
self.bokeh_server.start()
|
|
198
201
|
|
|
199
|
-
#
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
|
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
|
|
1395
|
+
return book.at_level(0)[1]
|
|
1396
1396
|
else:
|
|
1397
1397
|
return math.nan
|
|
1398
1398
|
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyalgoengine-0.7.5 → pyalgoengine-0.7.5.post2}/algo_engine/monitor/advanced_data_interface.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
|