PyAlgoEngine 0.8.0a2__tar.gz → 0.8.0a4__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 (55) hide show
  1. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/PKG-INFO +1 -1
  2. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/PyAlgoEngine.egg-info/PKG-INFO +1 -1
  3. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/PyAlgoEngine.egg-info/SOURCES.txt +0 -3
  4. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/__init__.py +1 -1
  5. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/backtest/sim_match.py +2 -2
  6. pyalgoengine-0.8.0a4/algo_engine/base/__init__.py +60 -0
  7. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/base/trade_utils.py +2 -2
  8. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/engine/algo_engine.py +1 -1
  9. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/engine/trade_engine.py +22 -22
  10. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/strategy/strategy_engine.py +4 -4
  11. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/setup.py +35 -3
  12. pyalgoengine-0.8.0a2/algo_engine/base/__init__.py +0 -44
  13. pyalgoengine-0.8.0a2/algo_engine/base/market_buffer.py +0 -571
  14. pyalgoengine-0.8.0a2/algo_engine/base/market_data_wrapper.py +0 -483
  15. pyalgoengine-0.8.0a2/algo_engine/base/market_utils.py +0 -3092
  16. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/LICENSE +0 -0
  17. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
  18. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/PyAlgoEngine.egg-info/requires.txt +0 -0
  19. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/PyAlgoEngine.egg-info/top_level.txt +0 -0
  20. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/README.md +0 -0
  21. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/__init__.py +0 -0
  22. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/backtest/__init__.py +0 -0
  23. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/backtest/doc_server.py +0 -0
  24. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/backtest/tester.py +0 -0
  25. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/backtest/web_app.py +0 -0
  26. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/bokeh_server.py +0 -0
  27. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/demo/__init__.py +0 -0
  28. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/demo/test.py +0 -0
  29. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/sim_input/__init__.py +0 -0
  30. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/sim_input/client.py +0 -0
  31. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/sim_input/sim_keyboard.py +0 -0
  32. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/sim_input/sim_mouse.py +0 -0
  33. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/apps/sim_input/window.py +0 -0
  34. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/backtest/__init__.py +0 -0
  35. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/backtest/__main__.py +0 -0
  36. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/backtest/metrics.py +0 -0
  37. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/backtest/replay.py +0 -0
  38. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/base/console_utils.py +0 -0
  39. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/base/finance_decimal.py +0 -0
  40. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/base/market_utils_nt.py +0 -0
  41. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/base/market_utils_posix.py +0 -0
  42. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/base/technical_analysis.py +0 -0
  43. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/base/telemetrics.py +0 -0
  44. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/engine/__init__.py +0 -0
  45. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/engine/event_engine.py +0 -0
  46. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/engine/market_engine.py +0 -0
  47. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/monitor/__init__.py +0 -0
  48. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/monitor/advanced_data_interface.py +0 -0
  49. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/profile/__init__.py +0 -0
  50. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/profile/cn.py +0 -0
  51. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/strategy/__init__.py +0 -0
  52. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/utils/__init__.py +0 -0
  53. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/utils/commit_regularizer.py +0 -0
  54. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/algo_engine/utils/data_utils.py +0 -0
  55. {pyalgoengine-0.8.0a2 → pyalgoengine-0.8.0a4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyAlgoEngine
3
- Version: 0.8.0a2
3
+ Version: 0.8.0a4
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.4
2
2
  Name: PyAlgoEngine
3
- Version: 0.8.0a2
3
+ Version: 0.8.0a4
4
4
  Summary: Basic algo engine
5
5
  Home-page: https://github.com/BolunHan/PyAlgoEngine
6
6
  Author: Bolun.Han
@@ -28,9 +28,6 @@ algo_engine/backtest/sim_match.py
28
28
  algo_engine/base/__init__.py
29
29
  algo_engine/base/console_utils.py
30
30
  algo_engine/base/finance_decimal.py
31
- algo_engine/base/market_buffer.py
32
- algo_engine/base/market_data_wrapper.py
33
- algo_engine/base/market_utils.py
34
31
  algo_engine/base/market_utils_nt.py
35
32
  algo_engine/base/market_utils_posix.py
36
33
  algo_engine/base/technical_analysis.py
@@ -1,4 +1,4 @@
1
- __version__ = "0.8.0.alpha2"
1
+ __version__ = "0.8.0.alpha4"
2
2
 
3
3
  import logging
4
4
  import os
@@ -37,9 +37,9 @@ class SimMatch(object):
37
37
  market_data: MarketData | None = kwargs.pop('market_data', None)
38
38
 
39
39
  if order is not None:
40
- if order.order_type == OrderType.LimitOrder:
40
+ if order.order_type == OrderType.ORDER_LIMIT:
41
41
  self.launch_order(order=order)
42
- elif order.order_type == OrderType.CancelOrder:
42
+ elif order.order_type == OrderType.ORDER_CANCEL:
43
43
  self.cancel_order(order=order)
44
44
  else:
45
45
  raise ValueError(f'Invalid order {order}')
@@ -0,0 +1,60 @@
1
+ import logging
2
+ import os
3
+ import pathlib
4
+
5
+ from .telemetrics import LOGGER
6
+ from ..profile import PROFILE
7
+
8
+
9
+ def set_logger(logger: logging.Logger):
10
+ global LOGGER
11
+ LOGGER = logger
12
+
13
+ if os.name == 'nt':
14
+ market_utils_nt.LOGGER = logger.getChild('MarketUtils')
15
+ else:
16
+ market_utils_posix.LOGGER = logger.getChild('MarketUtils')
17
+
18
+ trade_utils.LOGGER = logger.getChild('TradeUtils')
19
+ technical_analysis.LOGGER = logger.getChild('TA')
20
+ console_utils.LOGGER = logger.getChild('Console')
21
+
22
+
23
+ def check_cython_module() -> bool:
24
+ for name in ['market_data', 'transaction', 'tick', 'candlestick']:
25
+ cython_ext = '.pyd' if os.name == 'nt' else '.so'
26
+ for file in pathlib.Path(__file__).parent.glob(f'*{cython_ext}'):
27
+ if file.name.startswith(name):
28
+ break
29
+ else:
30
+ LOGGER.warning(f'Cython module {name} not found!')
31
+ return False
32
+
33
+ return True
34
+
35
+
36
+ from .finance_decimal import FinancialDecimal
37
+
38
+ if check_cython_module():
39
+ from .market_data import MarketData
40
+ from .transaction import TransactionDirection, TransactionOffset, TransactionSide, OrderType, TransactionData, TradeData, OrderData
41
+ from .tick import TickDataLite, TickData
42
+ from .candlestick import BarData, DailyBar
43
+ else:
44
+ import_cmd = f'from .market_utils_{os.name} import TransactionSide, OrderType, MarketData, OrderBook, BarData, DailyBar, CandleStick, TickData, TransactionData, TradeData, OrderData, MarketDataBuffer, MarketDataRingBuffer'
45
+ eval(import_cmd)
46
+
47
+ from .technical_analysis import TechnicalAnalysis
48
+ from .trade_utils import OrderState, TradeInstruction, TradeReport
49
+ from .console_utils import Progress, GetInput, GetArgs, count_ordinal, TerminalStyle, InteractiveShell, ShellTransfer
50
+
51
+ __all__ = [
52
+ 'PROFILE',
53
+ 'FinancialDecimal',
54
+ 'TransactionDirection', 'TransactionOffset', 'TransactionSide', 'OrderType', 'MarketData', 'BarData', 'DailyBar', 'TickDataLite', 'TickData', 'TransactionData', 'TradeData', 'OrderData',
55
+ # 'MarketDataMemoryBuffer', 'OrderBookBuffer', 'BarDataBuffer', 'TickDataBuffer', 'TransactionDataBuffer',
56
+ # 'MarketDataPointer', 'OrderBookPointer', 'BarDataPointer', 'TickDataPointer', 'TransactionDataPointer',
57
+ 'TechnicalAnalysis',
58
+ 'OrderState', 'TradeInstruction', 'TradeReport',
59
+ 'Progress', 'GetInput', 'GetArgs', 'count_ordinal', 'TerminalStyle', 'InteractiveShell', 'ShellTransfer'
60
+ ]
@@ -371,7 +371,7 @@ class TradeInstruction(TradeBaseClass):
371
371
  side: int | float | str | TransactionSide,
372
372
  volume: float,
373
373
  timestamp: float,
374
- order_type: int | float | str | OrderType = OrderType.Generic,
374
+ order_type: int | float | str | OrderType = OrderType.ORDER_GENERIC,
375
375
  limit_price: float = None,
376
376
  order_id: str = None,
377
377
  multiplier: float = None,
@@ -413,7 +413,7 @@ class TradeInstruction(TradeBaseClass):
413
413
  return True
414
414
 
415
415
  def __str__(self):
416
- if self.limit_price is None or self.order_type == OrderType.MarketOrder:
416
+ if self.limit_price is None or self.order_type == OrderType.ORDER_MARKET:
417
417
  return f'<TradeInstruction id={self.order_id}>({self.ticker} {self.order_type.name} {self.side.name} {self.volume}; filled {self.filled_volume:.2f} @ {self.average_price:.2f} now {self.order_state.name})'
418
418
  else:
419
419
  return f'<TradeInstruction id={self.order_id}>({self.ticker} {self.order_type.name} {self.side.name} {self.volume} limit {self.limit_price:.2f}; filled {self.filled_volume:.2f} @ {self.average_price:.2f} now {self.order_state.name})'
@@ -511,7 +511,7 @@ class Passive(AlgoTemplate):
511
511
  limit_adjust_level=limit_adjust_level,
512
512
  mode=limit_mode
513
513
  )
514
- order_type = OrderType.LimitOrder
514
+ order_type = OrderType.ORDER_LIMIT
515
515
  volume = self.target_volume - self.filled_volume - self.working_volume
516
516
 
517
517
  LOGGER.info(f'{self} launching {order_type} {self.ticker} {self.side.name} {volume}')
@@ -18,7 +18,7 @@ import pandas as pd
18
18
  from . import LOGGER
19
19
  from .algo_engine import ALGO_ENGINE, AlgoTemplate
20
20
  from .market_engine import MarketDataService, Singleton
21
- from ..base import TransactionSide, TradeInstruction, MarketData, OrderState, TradeReport
21
+ from ..base import TransactionSide, TransactionDirection as Direction, TransactionOffset as Offset, TradeInstruction, MarketData, OrderState, TradeReport
22
22
 
23
23
  LOGGER = LOGGER.getChild('TradeEngine')
24
24
  __all__ = ['DirectMarketAccess', 'PositionManagementService', 'Balance', 'Inventory', 'RiskProfile']
@@ -328,7 +328,7 @@ class PositionManagementService(object):
328
328
  return
329
329
 
330
330
  to_unwind = abs(exposure)
331
- side = TransactionSide.Sell_to_Unwind if exposure > 0 else TransactionSide.Buy_to_Cover
331
+ side = (Direction.DIRECTION_SHORT if exposure > 0 else Direction.DIRECTION_LONG) | Offset.OFFSET_CLOSE
332
332
  self.open(ticker=ticker, target_volume=to_unwind, trade_side=side)
333
333
 
334
334
  def add_exposure(self, ticker: str, volume: float, notional: float, side: TransactionSide, timestamp: float):
@@ -1144,7 +1144,7 @@ class Inventory(object, metaclass=Singleton):
1144
1144
  self.multiplier = multiplier
1145
1145
 
1146
1146
  class Entry(object):
1147
- def __init__(self, ticker: str, volume: float, price: float, security_type: Inventory.SecurityType, direction: TransactionSide, **kwargs):
1147
+ def __init__(self, ticker: str, volume: float, price: float, security_type: Inventory.SecurityType, direction: Direction, **kwargs):
1148
1148
  if volume < 0:
1149
1149
  LOGGER.warning('volume of Inventory.Entry normally should be positive!')
1150
1150
 
@@ -1159,7 +1159,7 @@ class Inventory(object, metaclass=Singleton):
1159
1159
  self.recalled = kwargs.pop('recalled', 0.)
1160
1160
 
1161
1161
  def __repr__(self):
1162
- return f'<Inventory.Entry>(ticker={self.ticker}, side={self.direction.side_name}, volume={self.volume:,}, fee={self.fee:.2f})'
1162
+ return f'<Inventory.Entry>(ticker={self.ticker}, side={self.direction.name}, volume={self.volume:,}, fee={self.fee:.2f})'
1163
1163
 
1164
1164
  def __add__(self, other):
1165
1165
  if isinstance(other, self.__class__):
@@ -1225,8 +1225,8 @@ class Inventory(object, metaclass=Singleton):
1225
1225
  ticker=self.ticker,
1226
1226
  volume=self.volume,
1227
1227
  price=self.price,
1228
- security_type=self.security_type.name,
1229
- direction=self.direction.side_name,
1228
+ security_type=self.security_type.value,
1229
+ direction=self.direction.value,
1230
1230
  notional=self.notional,
1231
1231
  fee=self.fee,
1232
1232
  recalled=self.recalled
@@ -1250,8 +1250,8 @@ class Inventory(object, metaclass=Singleton):
1250
1250
  ticker=json_dict['ticker'],
1251
1251
  volume=json_dict['volume'],
1252
1252
  price=json_dict['price'],
1253
- security_type=Inventory.SecurityType[json_dict['security_type']],
1254
- direction=TransactionSide(json_dict['direction']),
1253
+ security_type=Inventory.SecurityType(json_dict['security_type']),
1254
+ direction=Direction(json_dict['direction']),
1255
1255
  notional=json_dict['notional'],
1256
1256
  fee=json_dict.get('fee', 0.),
1257
1257
  recalled=json_dict.get('recalled', 0.),
@@ -1273,12 +1273,12 @@ class Inventory(object, metaclass=Singleton):
1273
1273
 
1274
1274
  def __call__(self, ticker: str):
1275
1275
  return dict(
1276
- Long=self.available_volume(ticker=ticker, direction=TransactionSide.LongOpen),
1277
- Short=self.available_volume(ticker=ticker, direction=TransactionSide.ShortOpen)
1276
+ Long=self.available_volume(ticker=ticker, direction=Direction.DIRECTION_LONG),
1277
+ Short=self.available_volume(ticker=ticker, direction=Direction.DIRECTION_SHORT)
1278
1278
  )
1279
1279
 
1280
- def recall(self, ticker: str, volume: float, direction: TransactionSide = TransactionSide.LongOpen):
1281
- key = f'{ticker}.{direction.side_name}'
1280
+ def recall(self, ticker: str, volume: float, direction: Direction = Direction.DIRECTION_LONG):
1281
+ key = f'{ticker}.{direction.name}'
1282
1282
  _ = self._inv.get(key, [])
1283
1283
  to_recall = volume
1284
1284
 
@@ -1300,15 +1300,15 @@ class Inventory(object, metaclass=Singleton):
1300
1300
 
1301
1301
  def add_inv(self, entry: Entry):
1302
1302
  self._tickers.add(entry.ticker)
1303
- key = f'{entry.ticker}.{entry.direction.side_name}'
1303
+ key = f'{entry.ticker}.{entry.direction.name}'
1304
1304
  _ = self._inv.get(key, [])
1305
1305
 
1306
1306
  _.append(entry)
1307
1307
 
1308
1308
  self._inv[key] = _
1309
1309
 
1310
- def get_inv(self, ticker: str, direction: TransactionSide = TransactionSide.LongOpen) -> Entry | None:
1311
- key = f'{ticker}.{direction.side_name}'
1310
+ def get_inv(self, ticker: str, direction: Direction = Direction.DIRECTION_LONG) -> Entry | None:
1311
+ key = f'{ticker}.{direction.name}'
1312
1312
  _ = self._inv.get(key, [])
1313
1313
 
1314
1314
  merged_entry = None
@@ -1320,12 +1320,12 @@ class Inventory(object, metaclass=Singleton):
1320
1320
 
1321
1321
  return merged_entry
1322
1322
 
1323
- def use_inv(self, ticker: str, volume: float, direction: TransactionSide = TransactionSide.LongOpen):
1324
- key = f'{ticker}.{direction.side_name}'
1323
+ def use_inv(self, ticker: str, volume: float, direction: Direction = Direction.DIRECTION_LONG):
1324
+ key = f'{ticker}.{direction.name}'
1325
1325
 
1326
1326
  self._traded[key] = self._traded.get(key, 0.) + volume
1327
1327
 
1328
- def available_volume(self, ticker: str, direction: TransactionSide = TransactionSide.LongOpen) -> float:
1328
+ def available_volume(self, ticker: str, direction: Direction = Direction.DIRECTION_LONG) -> float:
1329
1329
  inv = self.get_inv(ticker=ticker, direction=direction)
1330
1330
 
1331
1331
  if inv is None:
@@ -1393,10 +1393,10 @@ class Inventory(object, metaclass=Singleton):
1393
1393
  inv_dict = {'inv_l': {}, 'inv_s': {}}
1394
1394
 
1395
1395
  for ticker in self._inv:
1396
- if (long_inv := self.get_inv(ticker=ticker, direction=TransactionSide.LongOpen)) is not None:
1396
+ if (long_inv := self.get_inv(ticker=ticker, direction=Direction.DIRECTION_LONG)) is not None:
1397
1397
  inv_dict['inv_l'][ticker] = long_inv.volume
1398
1398
 
1399
- if (short_inv := self.get_inv(ticker=ticker, direction=TransactionSide.ShortOpen)) is not None:
1399
+ if (short_inv := self.get_inv(ticker=ticker, direction=Direction.DIRECTION_SHORT)) is not None:
1400
1400
  inv_dict['inv_s'][ticker] = short_inv.volume
1401
1401
 
1402
1402
  inv_df = pd.DataFrame(inv_dict)
@@ -1422,8 +1422,8 @@ class Inventory(object, metaclass=Singleton):
1422
1422
  info_dict = {'inv_l': {}, 'inv_s': {}}
1423
1423
 
1424
1424
  for ticker in self.tickers:
1425
- inv_l = self.get_inv(ticker, TransactionSide.LongOpen)
1426
- inv_s = self.get_inv(ticker, TransactionSide.ShortOpen)
1425
+ inv_l = self.get_inv(ticker=ticker, direction=Direction.DIRECTION_LONG)
1426
+ inv_s = self.get_inv(ticker=ticker, direction=Direction.DIRECTION_SHORT)
1427
1427
 
1428
1428
  if inv_l is not None:
1429
1429
  info_dict['inv_l'][ticker] = inv_l.volume
@@ -6,7 +6,7 @@ from functools import cached_property
6
6
 
7
7
  from . import LOGGER
8
8
  from ..backtest import SimMatch, ProgressiveReplay
9
- from ..base import MarketData, TradeReport, TradeInstruction, TransactionSide
9
+ from ..base import MarketData, TradeReport, TradeInstruction, TransactionSide, TransactionDirection as Direction, TransactionOffset as Offset
10
10
  from ..engine import PositionManagementService, TOPIC, EVENT_ENGINE
11
11
 
12
12
  LOGGER = LOGGER.getChild('Strategy')
@@ -306,7 +306,7 @@ class StrategyEngine(StrategyEngineTemplate):
306
306
  return executed, remains
307
307
 
308
308
  # then it must be
309
- side = TransactionSide.Sell_to_Unwind if exposure > 0 else TransactionSide.Buy_to_Cover
309
+ side = (Direction.DIRECTION_SHORT if exposure > 0 else Direction.DIRECTION_LONG) | Offset.OFFSET_CLOSE
310
310
 
311
311
  if side.sign > 0: # short position, buy action
312
312
  working_open = working_short
@@ -359,8 +359,8 @@ class StrategyEngine(StrategyEngineTemplate):
359
359
  return
360
360
 
361
361
  if side is None:
362
- trade_side = TransactionSide.Buy_to_Long if volume > 0 else TransactionSide.Sell_to_Short
363
- LOGGER.warning(f'Trade side of open instruction not specified! Presumed to be {trade_side} by the sign of volume!')
362
+ side = (Direction.DIRECTION_SHORT if volume > 0 else Direction.DIRECTION_LONG) | Offset.OFFSET_OPEN
363
+ LOGGER.warning(f'Trade side of open instruction not specified! Presumed to be {side} by the sign of volume!')
364
364
 
365
365
  algo = self.position_tracker.open(
366
366
  ticker=ticker,
@@ -41,13 +41,45 @@ if os.getenv('GITHUB_ACTIONS') == 'true':
41
41
  ext_modules = []
42
42
  else:
43
43
  # Define Cython extension (use the .pyx file)
44
- ext_modules = [
44
+ from Cython.Build import cythonize
45
+
46
+ cython_ext = [
47
+ Extension(
48
+ name="algo_engine.base.market_data",
49
+ sources=["algo_engine/base/market_data.pyx"],
50
+ extra_compile_args=['-O3', '-flto'],
51
+ extra_link_args=['-flto', '-s']
52
+ ),
53
+ Extension(
54
+ name="algo_engine.base.transaction",
55
+ sources=["algo_engine/base/transaction.pyx"],
56
+ extra_compile_args=['-O3', '-flto'],
57
+ extra_link_args=['-flto', '-s']
58
+ ),
59
+ Extension(
60
+ name="algo_engine.base.candlestick",
61
+ sources=["algo_engine/base/candlestick.pyx"],
62
+ extra_compile_args=['-O3', '-flto'],
63
+ extra_link_args=['-flto', '-s']
64
+ ),
45
65
  Extension(
46
- "algo_engine.base.market_utils_posix",
47
- ["algo_engine/base/market_utils_posix.pyx"],
66
+ name="algo_engine.base.tick",
67
+ sources=["algo_engine/base/tick.pyx"],
68
+ extra_compile_args=['-O3', '-flto'],
69
+ extra_link_args=['-flto', '-s']
48
70
  )
49
71
  ]
50
72
 
73
+ ext_modules = cythonize(
74
+ cython_ext,
75
+ compiler_directives={
76
+ 'language_level': "3",
77
+ 'optimize.use_switch': True,
78
+ 'optimize.unpack_method_calls': True,
79
+ 'binding': False
80
+ },
81
+ annotate=False
82
+ )
51
83
 
52
84
  long_description = read("README.md")
53
85
 
@@ -1,44 +0,0 @@
1
- import logging
2
- import os
3
-
4
- from .telemetrics import LOGGER
5
- from ..profile import PROFILE
6
-
7
-
8
- def set_logger(logger: logging.Logger):
9
- global LOGGER
10
- LOGGER = logger
11
-
12
- if os.name == 'nt':
13
- market_utils_nt.LOGGER = logger.getChild('MarketUtils')
14
- else:
15
- market_utils_posix.LOGGER = logger.getChild('MarketUtils')
16
-
17
- trade_utils.LOGGER = logger.getChild('TradeUtils')
18
- technical_analysis.LOGGER = logger.getChild('TA')
19
- console_utils.LOGGER = logger.getChild('Console')
20
-
21
-
22
- from .finance_decimal import FinancialDecimal
23
-
24
- if os.name == 'nt':
25
- from .market_utils_nt import TransactionSide, OrderType, MarketData, OrderBook, BarData, DailyBar, CandleStick, TickData, TransactionData, TradeData, OrderData, MarketDataBuffer, MarketDataRingBuffer
26
- else:
27
- from .market_utils_posix import TransactionSide, OrderType, MarketData, OrderBook, BarData, DailyBar, CandleStick, TickData, TransactionData, TradeData, OrderData, MarketDataBuffer, MarketDataRingBuffer
28
-
29
- # from .market_utils_posix import OrderType
30
- # from .market_utils import TransactionSide, MarketData, OrderBook, BarData, DailyBar, CandleStick, TickData, TransactionData, TradeData
31
- # from .market_buffer import MarketDataPointer, MarketDataMemoryBuffer, OrderBookPointer, OrderBookBuffer, BarDataPointer, BarDataBuffer, TickDataPointer, TickDataBuffer, TransactionDataPointer, TransactionDataBuffer
32
-
33
- from .technical_analysis import TechnicalAnalysis
34
- from .trade_utils import OrderState, TradeInstruction, TradeReport
35
- from .console_utils import Progress, GetInput, GetArgs, count_ordinal, TerminalStyle, InteractiveShell, ShellTransfer
36
-
37
- __all__ = ['PROFILE',
38
- 'FinancialDecimal',
39
- 'TransactionSide', 'OrderType', 'MarketData', 'OrderBook', 'BarData', 'DailyBar', 'CandleStick', 'TickData', 'TransactionData', 'TradeData', 'OrderData', 'MarketDataBuffer', 'MarketDataRingBuffer',
40
- # 'MarketDataMemoryBuffer', 'OrderBookBuffer', 'BarDataBuffer', 'TickDataBuffer', 'TransactionDataBuffer',
41
- # 'MarketDataPointer', 'OrderBookPointer', 'BarDataPointer', 'TickDataPointer', 'TransactionDataPointer',
42
- 'TechnicalAnalysis',
43
- 'OrderState', 'TradeInstruction', 'TradeReport',
44
- 'Progress', 'GetInput', 'GetArgs', 'count_ordinal', 'TerminalStyle', 'InteractiveShell', 'ShellTransfer']