PyAlgoEngine 0.4.0.post1__tar.gz → 0.4.1__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 (35) hide show
  1. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/PKG-INFO +1 -6
  2. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/PyAlgoEngine.egg-info/PKG-INFO +1 -6
  3. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/PyAlgoEngine.egg-info/SOURCES.txt +9 -2
  4. PyAlgoEngine-0.4.1/PyAlgoEngine.egg-info/requires.txt +4 -0
  5. PyAlgoEngine-0.4.1/algo_engine/__init__.py +39 -0
  6. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/back_test/__init__.py +11 -0
  7. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/back_test/__main__.py +4 -4
  8. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/back_test/replay.py +3 -2
  9. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/back_test/sim_match.py +11 -6
  10. PyAlgoEngine-0.4.1/algo_engine/base/__init__.py +28 -0
  11. PyAlgoEngine-0.4.1/algo_engine/base/console_utils.py +1070 -0
  12. PyAlgoEngine-0.4.1/algo_engine/base/finance_decimal.py +258 -0
  13. PyAlgoEngine-0.4.1/algo_engine/base/market_utils.py +1522 -0
  14. PyAlgoEngine-0.4.1/algo_engine/base/technical_analysis.py +406 -0
  15. PyAlgoEngine-0.4.1/algo_engine/base/telemetrics.py +78 -0
  16. PyAlgoEngine-0.4.1/algo_engine/base/trade_utils.py +709 -0
  17. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/engine/__init__.py +13 -0
  18. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/engine/algo_engine.py +82 -46
  19. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/engine/event_engine.py +1 -1
  20. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/engine/market_engine.py +7 -6
  21. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/engine/trade_engine.py +11 -7
  22. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/monitor/advanced_data_interface.py +1 -2
  23. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/profile/__init__.py +19 -8
  24. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/profile/cn.py +31 -13
  25. {pyalgoengine-0.4.0.post1/algo_engine/strategie → PyAlgoEngine-0.4.1/algo_engine/strategy}/__init__.py +10 -3
  26. {pyalgoengine-0.4.0.post1/algo_engine/strategie → PyAlgoEngine-0.4.1/algo_engine/strategy}/strategy_engine.py +3 -2
  27. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/setup.py +1 -2
  28. pyalgoengine-0.4.0.post1/PyAlgoEngine.egg-info/requires.txt +0 -5
  29. pyalgoengine-0.4.0.post1/algo_engine/__init__.py +0 -74
  30. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/LICENSE +0 -0
  31. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
  32. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/PyAlgoEngine.egg-info/top_level.txt +0 -0
  33. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/README.md +0 -0
  34. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/algo_engine/monitor/__init__.py +0 -0
  35. {pyalgoengine-0.4.0.post1 → PyAlgoEngine-0.4.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyAlgoEngine
3
- Version: 0.4.0.post1
3
+ Version: 0.4.1
4
4
  Summary: Basic algo engine
5
5
  Home-page: https://github.com/BolunHan/PyAlgoEngine
6
6
  Author: Bolun.Han
@@ -14,11 +14,6 @@ Classifier: Operating System :: OS Independent
14
14
  Requires-Python: >=3.1
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: numpy
18
- Requires-Dist: pandas
19
- Requires-Dist: exchange_calendars
20
- Requires-Dist: PyQuantKit>=0.3.0
21
- Requires-Dist: PyEventEngine>=0.3.0.post3
22
17
 
23
18
  # PyAlgoEngine
24
19
  python algo trading engine
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyAlgoEngine
3
- Version: 0.4.0.post1
3
+ Version: 0.4.1
4
4
  Summary: Basic algo engine
5
5
  Home-page: https://github.com/BolunHan/PyAlgoEngine
6
6
  Author: Bolun.Han
@@ -14,11 +14,6 @@ Classifier: Operating System :: OS Independent
14
14
  Requires-Python: >=3.1
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: numpy
18
- Requires-Dist: pandas
19
- Requires-Dist: exchange_calendars
20
- Requires-Dist: PyQuantKit>=0.3.0
21
- Requires-Dist: PyEventEngine>=0.3.0.post3
22
17
 
23
18
  # PyAlgoEngine
24
19
  python algo trading engine
@@ -11,6 +11,13 @@ algo_engine/back_test/__init__.py
11
11
  algo_engine/back_test/__main__.py
12
12
  algo_engine/back_test/replay.py
13
13
  algo_engine/back_test/sim_match.py
14
+ algo_engine/base/__init__.py
15
+ algo_engine/base/console_utils.py
16
+ algo_engine/base/finance_decimal.py
17
+ algo_engine/base/market_utils.py
18
+ algo_engine/base/technical_analysis.py
19
+ algo_engine/base/telemetrics.py
20
+ algo_engine/base/trade_utils.py
14
21
  algo_engine/engine/__init__.py
15
22
  algo_engine/engine/algo_engine.py
16
23
  algo_engine/engine/event_engine.py
@@ -20,5 +27,5 @@ algo_engine/monitor/__init__.py
20
27
  algo_engine/monitor/advanced_data_interface.py
21
28
  algo_engine/profile/__init__.py
22
29
  algo_engine/profile/cn.py
23
- algo_engine/strategie/__init__.py
24
- algo_engine/strategie/strategy_engine.py
30
+ algo_engine/strategy/__init__.py
31
+ algo_engine/strategy/strategy_engine.py
@@ -0,0 +1,4 @@
1
+ numpy
2
+ pandas
3
+ exchange_calendars
4
+ PyEventEngine>=0.3.0.post4
@@ -0,0 +1,39 @@
1
+ __version__ = "0.4.1"
2
+
3
+ import logging
4
+ import os
5
+ import traceback
6
+
7
+ from . import profile
8
+ from .base.telemetrics import LOGGER
9
+
10
+ if 'ALGO_DIR' in os.environ:
11
+ WORKING_DIRECTORY = os.path.realpath(os.environ['ALGO_DIR'])
12
+ else:
13
+ WORKING_DIRECTORY = str(os.getcwd())
14
+
15
+
16
+ def set_logger(logger: logging.Logger):
17
+ base.set_logger(logger=logger)
18
+ engine.set_logger(logger=logger.getChild('Engine'))
19
+ back_test.set_logger(logger=logger.getChild('BackTest'))
20
+ strategy.set_logger(logger=logger.getChild('Strategy'))
21
+
22
+
23
+ from . import base
24
+ from . import engine
25
+ from . import back_test
26
+ from . import strategy
27
+
28
+ engine.LOGGER.info(f'AlgoEngine version {__version__}')
29
+
30
+ # import addon module
31
+ try:
32
+ from . import algo_addon
33
+
34
+ engine.LOGGER.info(f'PyAlgoEngineAddons import successful, version {algo_addon.__version__}')
35
+ except ImportError:
36
+ algo_addon = None
37
+ engine.LOGGER.debug(f'Install PyAlgoEngineAddons to use additional trading algos module\n{traceback.format_exc()}')
38
+
39
+ __all__ = ['LOGGER', 'base', 'engine', 'back_test', 'strategy', 'algo_addon']
@@ -1,7 +1,18 @@
1
+ import logging
2
+
1
3
  from .. import LOGGER
2
4
 
3
5
  LOGGER = LOGGER.getChild('BackTest')
4
6
 
7
+
8
+ def set_logger(logger: logging.Logger):
9
+ global LOGGER
10
+ LOGGER = logger
11
+
12
+ replay.LOGGER = LOGGER.getChild('Replay')
13
+ sim_match.LOGGER = LOGGER.getChild('SimMatch')
14
+
15
+
5
16
  from .replay import Replay, SimpleReplay, ProgressiveReplay
6
17
  from .sim_match import SimMatch
7
18
 
@@ -3,12 +3,12 @@ __package__ = 'algo_engine.back_test'
3
3
  import datetime
4
4
  from typing import Callable
5
5
 
6
- import EventEngine
6
+ import event_engine
7
7
 
8
8
  from ..engine import TOPIC, MarketDataService, Balance, RiskProfile, PositionManagementService
9
9
  from ..engine.algo_engine import AlgoRegistry, AlgoEngine
10
- from ..strategie import EventDMA
11
- from ..strategie.strategy_engine import StrategyEngine
10
+ from ..strategy import EventDMA
11
+ from ..strategy.strategy_engine import StrategyEngine
12
12
 
13
13
 
14
14
  def test_stop(code=0):
@@ -29,7 +29,7 @@ def test_start(start_date: datetime.date, end_date: datetime.date, data_loader:
29
29
 
30
30
 
31
31
  # in backtest, the global objects is newly inited to separate from production
32
- EVENT_ENGINE = EventEngine.EventEngine()
32
+ EVENT_ENGINE = event_engine.EventEngine()
33
33
  MDS = MarketDataService()
34
34
  ALGO_REGISTRY = AlgoRegistry()
35
35
  ALGO_ENGINE = AlgoEngine(mds=MDS, registry=ALGO_REGISTRY)
@@ -3,9 +3,10 @@ import datetime
3
3
  import inspect
4
4
  from typing import Iterable
5
5
 
6
- from PyQuantKit import Progress, TickData, TransactionData, TradeData, OrderBook
7
-
8
6
  from . import LOGGER
7
+ from ..base import Progress, TickData, TransactionData, TradeData, OrderBook
8
+
9
+ LOGGER = LOGGER.getChild('Replay')
9
10
 
10
11
 
11
12
  class Replay(object, metaclass=abc.ABCMeta):
@@ -1,9 +1,11 @@
1
1
  import datetime
2
2
 
3
- from PyQuantKit import OrderType, MarketData, BarData, TradeData, TickData, OrderState, OrderBook, TradeReport, TradeInstruction
4
-
5
3
  from . import LOGGER
4
+ from ..base import OrderType, MarketData, BarData, TradeData, TickData, OrderState, OrderBook, TradeReport, TradeInstruction
6
5
  from ..engine.event_engine import TOPIC, EVENT_ENGINE
6
+ from ..profile import PROFILE
7
+
8
+ LOGGER = LOGGER.getChild('SimMatch')
7
9
 
8
10
 
9
11
  class SimMatch(object):
@@ -67,7 +69,10 @@ class SimMatch(object):
67
69
  # raise ValueError(f'Invalid instruction {order}, instruction must have a LimitPrice')
68
70
 
69
71
  order.set_order_state(order_state=OrderState.Placed, timestamp=self.timestamp)
70
- self.working[order.order_id] = order
72
+
73
+ if not self.instant_fill:
74
+ self.working[order.order_id] = order
75
+
71
76
  self.on_order(order=order, **kwargs)
72
77
 
73
78
  if self.instant_fill:
@@ -253,7 +258,7 @@ class SimMatch(object):
253
258
  order_id=order.order_id,
254
259
  price=match_price,
255
260
  multiplier=order.multiplier,
256
- fee=self.fee * match_volume * match_price * order.multiplier
261
+ fee=self.fee_rate * match_volume * match_price * order.multiplier
257
262
  )
258
263
 
259
264
  LOGGER.info(f'[{self.market_time:%Y-%m-%d %H:%M:%S}] Sim-filled {order.ticker} {order.side.name} {report.volume:,.2f} @ {report.price:.2f}')
@@ -280,11 +285,11 @@ class SimMatch(object):
280
285
  self.cancel_order(order_id=order_id)
281
286
 
282
287
  def clear(self):
283
- self.fee = 0.
288
+ # self.fee_rate = 0.
284
289
  self.working.clear()
285
290
  self.history.clear()
286
291
  self.timestamp = 0.
287
292
 
288
293
  @property
289
294
  def market_time(self) -> datetime.datetime:
290
- return datetime.datetime.fromtimestamp(self.timestamp)
295
+ return datetime.datetime.fromtimestamp(self.timestamp, tz=PROFILE.timezone)
@@ -0,0 +1,28 @@
1
+ import logging
2
+
3
+ from .telemetrics import LOGGER
4
+ from ..profile import PROFILE
5
+
6
+
7
+ def set_logger(logger: logging.Logger):
8
+ global LOGGER
9
+ LOGGER = logger
10
+
11
+ market_utils.LOGGER = logger.getChild('MarketUtils')
12
+ trade_utils.LOGGER = logger.getChild('TradeUtils')
13
+ technical_analysis.LOGGER = logger.getChild('TA')
14
+ console_utils.LOGGER = logger.getChild('Console')
15
+
16
+
17
+ from .finance_decimal import FinancialDecimal
18
+ from .market_utils import TransactionSide, MarketData, OrderBook, BarData, TickData, TransactionData, TradeData, OrderBookBuffer, BarDataBuffer, TickDataBuffer, TransactionDataBuffer
19
+ from .technical_analysis import TechnicalAnalysis
20
+ from .trade_utils import OrderState, OrderType, TradeInstruction, TradeReport
21
+ from .console_utils import Progress, GetInput, GetArgs, count_ordinal, TerminalStyle, InteractiveShell, ShellTransfer
22
+
23
+ __all__ = ['PROFILE',
24
+ 'FinancialDecimal',
25
+ 'TransactionSide', 'MarketData', 'OrderBook', 'BarData', 'TickData', 'TransactionData', 'TradeData', 'OrderBookBuffer', 'BarDataBuffer', 'TickDataBuffer', 'TransactionDataBuffer',
26
+ 'TechnicalAnalysis',
27
+ 'OrderState', 'OrderType', 'TradeInstruction', 'TradeReport',
28
+ 'Progress', 'GetInput', 'GetArgs', 'count_ordinal', 'TerminalStyle', 'InteractiveShell', 'ShellTransfer']