investing-algorithm-framework 1.5__py3-none-any.whl → 7.25.6__py3-none-any.whl

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 (276) hide show
  1. investing_algorithm_framework/__init__.py +192 -16
  2. investing_algorithm_framework/analysis/__init__.py +16 -0
  3. investing_algorithm_framework/analysis/backtest_data_ranges.py +202 -0
  4. investing_algorithm_framework/analysis/data.py +170 -0
  5. investing_algorithm_framework/analysis/markdown.py +91 -0
  6. investing_algorithm_framework/analysis/ranking.py +298 -0
  7. investing_algorithm_framework/app/__init__.py +29 -4
  8. investing_algorithm_framework/app/algorithm/__init__.py +7 -0
  9. investing_algorithm_framework/app/algorithm/algorithm.py +193 -0
  10. investing_algorithm_framework/app/algorithm/algorithm_factory.py +118 -0
  11. investing_algorithm_framework/app/app.py +2220 -379
  12. investing_algorithm_framework/app/app_hook.py +28 -0
  13. investing_algorithm_framework/app/context.py +1724 -0
  14. investing_algorithm_framework/app/eventloop.py +620 -0
  15. investing_algorithm_framework/app/reporting/__init__.py +27 -0
  16. investing_algorithm_framework/app/reporting/ascii.py +921 -0
  17. investing_algorithm_framework/app/reporting/backtest_report.py +349 -0
  18. investing_algorithm_framework/app/reporting/charts/__init__.py +19 -0
  19. investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +66 -0
  20. investing_algorithm_framework/app/reporting/charts/equity_curve.py +37 -0
  21. investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +74 -0
  22. investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
  23. investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +70 -0
  24. investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +51 -0
  25. investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +79 -0
  26. investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +55 -0
  27. investing_algorithm_framework/app/reporting/generate.py +185 -0
  28. investing_algorithm_framework/app/reporting/tables/__init__.py +11 -0
  29. investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +217 -0
  30. investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +80 -0
  31. investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +147 -0
  32. investing_algorithm_framework/app/reporting/tables/trades_table.py +75 -0
  33. investing_algorithm_framework/app/reporting/tables/utils.py +29 -0
  34. investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +154 -0
  35. investing_algorithm_framework/app/stateless/action_handlers/__init__.py +6 -3
  36. investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +1 -1
  37. investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +2 -1
  38. investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +14 -7
  39. investing_algorithm_framework/app/strategy.py +867 -60
  40. investing_algorithm_framework/app/task.py +5 -3
  41. investing_algorithm_framework/app/web/__init__.py +2 -1
  42. investing_algorithm_framework/app/web/controllers/__init__.py +2 -2
  43. investing_algorithm_framework/app/web/controllers/orders.py +3 -2
  44. investing_algorithm_framework/app/web/controllers/positions.py +2 -2
  45. investing_algorithm_framework/app/web/create_app.py +4 -2
  46. investing_algorithm_framework/app/web/schemas/position.py +1 -0
  47. investing_algorithm_framework/cli/__init__.py +0 -0
  48. investing_algorithm_framework/cli/cli.py +231 -0
  49. investing_algorithm_framework/cli/deploy_to_aws_lambda.py +501 -0
  50. investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
  51. investing_algorithm_framework/cli/initialize_app.py +603 -0
  52. investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
  53. investing_algorithm_framework/cli/templates/app.py.template +18 -0
  54. investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
  55. investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
  56. investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
  57. investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
  58. investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
  59. investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
  60. investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
  61. investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
  62. investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
  63. investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
  64. investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
  65. investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
  66. investing_algorithm_framework/cli/templates/env.example.template +2 -0
  67. investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
  68. investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
  69. investing_algorithm_framework/cli/templates/readme.md.template +135 -0
  70. investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
  71. investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
  72. investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
  73. investing_algorithm_framework/cli/validate_backtest_checkpoints.py +197 -0
  74. investing_algorithm_framework/create_app.py +40 -7
  75. investing_algorithm_framework/dependency_container.py +100 -47
  76. investing_algorithm_framework/domain/__init__.py +97 -30
  77. investing_algorithm_framework/domain/algorithm_id.py +69 -0
  78. investing_algorithm_framework/domain/backtesting/__init__.py +25 -0
  79. investing_algorithm_framework/domain/backtesting/backtest.py +548 -0
  80. investing_algorithm_framework/domain/backtesting/backtest_date_range.py +113 -0
  81. investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +241 -0
  82. investing_algorithm_framework/domain/backtesting/backtest_metrics.py +470 -0
  83. investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
  84. investing_algorithm_framework/domain/backtesting/backtest_run.py +663 -0
  85. investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
  86. investing_algorithm_framework/domain/backtesting/backtest_utils.py +198 -0
  87. investing_algorithm_framework/domain/backtesting/combine_backtests.py +392 -0
  88. investing_algorithm_framework/domain/config.py +59 -136
  89. investing_algorithm_framework/domain/constants.py +18 -37
  90. investing_algorithm_framework/domain/data_provider.py +334 -0
  91. investing_algorithm_framework/domain/data_structures.py +42 -0
  92. investing_algorithm_framework/domain/exceptions.py +51 -1
  93. investing_algorithm_framework/domain/models/__init__.py +26 -19
  94. investing_algorithm_framework/domain/models/app_mode.py +34 -0
  95. investing_algorithm_framework/domain/models/data/__init__.py +7 -0
  96. investing_algorithm_framework/domain/models/data/data_source.py +222 -0
  97. investing_algorithm_framework/domain/models/data/data_type.py +46 -0
  98. investing_algorithm_framework/domain/models/event.py +35 -0
  99. investing_algorithm_framework/domain/models/market/__init__.py +5 -0
  100. investing_algorithm_framework/domain/models/market/market_credential.py +88 -0
  101. investing_algorithm_framework/domain/models/order/__init__.py +3 -4
  102. investing_algorithm_framework/domain/models/order/order.py +198 -65
  103. investing_algorithm_framework/domain/models/order/order_status.py +2 -2
  104. investing_algorithm_framework/domain/models/order/order_type.py +1 -3
  105. investing_algorithm_framework/domain/models/portfolio/__init__.py +6 -2
  106. investing_algorithm_framework/domain/models/portfolio/portfolio.py +98 -3
  107. investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +37 -43
  108. investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +108 -11
  109. investing_algorithm_framework/domain/models/position/__init__.py +2 -1
  110. investing_algorithm_framework/domain/models/position/position.py +20 -0
  111. investing_algorithm_framework/domain/models/position/position_size.py +41 -0
  112. investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -2
  113. investing_algorithm_framework/domain/models/risk_rules/__init__.py +7 -0
  114. investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +51 -0
  115. investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +55 -0
  116. investing_algorithm_framework/domain/models/snapshot_interval.py +45 -0
  117. investing_algorithm_framework/domain/models/strategy_profile.py +19 -141
  118. investing_algorithm_framework/domain/models/time_frame.py +94 -98
  119. investing_algorithm_framework/domain/models/time_interval.py +33 -0
  120. investing_algorithm_framework/domain/models/time_unit.py +66 -2
  121. investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  122. investing_algorithm_framework/domain/models/tracing/trace.py +23 -0
  123. investing_algorithm_framework/domain/models/trade/__init__.py +11 -0
  124. investing_algorithm_framework/domain/models/trade/trade.py +389 -0
  125. investing_algorithm_framework/domain/models/trade/trade_status.py +40 -0
  126. investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +332 -0
  127. investing_algorithm_framework/domain/models/trade/trade_take_profit.py +365 -0
  128. investing_algorithm_framework/domain/order_executor.py +112 -0
  129. investing_algorithm_framework/domain/portfolio_provider.py +118 -0
  130. investing_algorithm_framework/domain/services/__init__.py +11 -0
  131. investing_algorithm_framework/domain/services/market_credential_service.py +37 -0
  132. investing_algorithm_framework/domain/services/portfolios/__init__.py +5 -0
  133. investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +9 -0
  134. investing_algorithm_framework/domain/services/rounding_service.py +27 -0
  135. investing_algorithm_framework/domain/services/state_handler.py +38 -0
  136. investing_algorithm_framework/domain/strategy.py +1 -29
  137. investing_algorithm_framework/domain/utils/__init__.py +15 -5
  138. investing_algorithm_framework/domain/utils/csv.py +22 -0
  139. investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
  140. investing_algorithm_framework/domain/utils/dates.py +57 -0
  141. investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
  142. investing_algorithm_framework/domain/utils/polars.py +53 -0
  143. investing_algorithm_framework/domain/utils/random.py +29 -0
  144. investing_algorithm_framework/download_data.py +244 -0
  145. investing_algorithm_framework/infrastructure/__init__.py +37 -11
  146. investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
  147. investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1152 -0
  148. investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
  149. investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
  150. investing_algorithm_framework/infrastructure/database/__init__.py +6 -2
  151. investing_algorithm_framework/infrastructure/database/sql_alchemy.py +86 -12
  152. investing_algorithm_framework/infrastructure/models/__init__.py +7 -3
  153. investing_algorithm_framework/infrastructure/models/order/__init__.py +2 -2
  154. investing_algorithm_framework/infrastructure/models/order/order.py +53 -53
  155. investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
  156. investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
  157. investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +1 -1
  158. investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +8 -2
  159. investing_algorithm_framework/infrastructure/models/portfolio/{portfolio.py → sql_portfolio.py} +17 -6
  160. investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +3 -1
  161. investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
  162. investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
  163. investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +59 -0
  164. investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +55 -0
  165. investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
  166. investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
  167. investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
  168. investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
  169. investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
  170. investing_algorithm_framework/infrastructure/repositories/__init__.py +10 -4
  171. investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
  172. investing_algorithm_framework/infrastructure/repositories/order_repository.py +16 -5
  173. investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +2 -2
  174. investing_algorithm_framework/infrastructure/repositories/position_repository.py +11 -0
  175. investing_algorithm_framework/infrastructure/repositories/repository.py +84 -30
  176. investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
  177. investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +29 -0
  178. investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +29 -0
  179. investing_algorithm_framework/infrastructure/services/__init__.py +9 -4
  180. investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
  181. investing_algorithm_framework/infrastructure/services/aws/state_handler.py +193 -0
  182. investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
  183. investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
  184. investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +9 -0
  185. investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +2596 -0
  186. investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +285 -0
  187. investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +468 -0
  188. investing_algorithm_framework/services/__init__.py +123 -15
  189. investing_algorithm_framework/services/configuration_service.py +77 -11
  190. investing_algorithm_framework/services/data_providers/__init__.py +5 -0
  191. investing_algorithm_framework/services/data_providers/data_provider_service.py +1058 -0
  192. investing_algorithm_framework/services/market_credential_service.py +40 -0
  193. investing_algorithm_framework/services/metrics/__init__.py +119 -0
  194. investing_algorithm_framework/services/metrics/alpha.py +0 -0
  195. investing_algorithm_framework/services/metrics/beta.py +0 -0
  196. investing_algorithm_framework/services/metrics/cagr.py +60 -0
  197. investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
  198. investing_algorithm_framework/services/metrics/drawdown.py +218 -0
  199. investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
  200. investing_algorithm_framework/services/metrics/exposure.py +210 -0
  201. investing_algorithm_framework/services/metrics/generate.py +358 -0
  202. investing_algorithm_framework/services/metrics/mean_daily_return.py +84 -0
  203. investing_algorithm_framework/services/metrics/price_efficiency.py +57 -0
  204. investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
  205. investing_algorithm_framework/services/metrics/recovery.py +113 -0
  206. investing_algorithm_framework/services/metrics/returns.py +452 -0
  207. investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
  208. investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
  209. investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
  210. investing_algorithm_framework/services/metrics/standard_deviation.py +156 -0
  211. investing_algorithm_framework/services/metrics/trades.py +473 -0
  212. investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  213. investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  214. investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  215. investing_algorithm_framework/services/metrics/volatility.py +118 -0
  216. investing_algorithm_framework/services/metrics/win_rate.py +177 -0
  217. investing_algorithm_framework/services/order_service/__init__.py +9 -0
  218. investing_algorithm_framework/services/order_service/order_backtest_service.py +178 -0
  219. investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
  220. investing_algorithm_framework/services/order_service/order_service.py +826 -0
  221. investing_algorithm_framework/services/portfolios/__init__.py +16 -0
  222. investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +54 -0
  223. investing_algorithm_framework/services/{portfolio_configuration_service.py → portfolios/portfolio_configuration_service.py} +27 -12
  224. investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
  225. investing_algorithm_framework/services/portfolios/portfolio_service.py +188 -0
  226. investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +136 -0
  227. investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +182 -0
  228. investing_algorithm_framework/services/positions/__init__.py +7 -0
  229. investing_algorithm_framework/services/positions/position_service.py +210 -0
  230. investing_algorithm_framework/services/repository_service.py +8 -2
  231. investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
  232. investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +117 -0
  233. investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +51 -0
  234. investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +80 -0
  235. investing_algorithm_framework/services/trade_service/__init__.py +9 -0
  236. investing_algorithm_framework/services/trade_service/trade_service.py +1099 -0
  237. investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +39 -0
  238. investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +41 -0
  239. investing_algorithm_framework-7.25.6.dist-info/METADATA +535 -0
  240. investing_algorithm_framework-7.25.6.dist-info/RECORD +268 -0
  241. {investing_algorithm_framework-1.5.dist-info → investing_algorithm_framework-7.25.6.dist-info}/WHEEL +1 -2
  242. investing_algorithm_framework-7.25.6.dist-info/entry_points.txt +3 -0
  243. investing_algorithm_framework/app/algorithm.py +0 -630
  244. investing_algorithm_framework/domain/models/backtest_profile.py +0 -414
  245. investing_algorithm_framework/domain/models/market_data/__init__.py +0 -11
  246. investing_algorithm_framework/domain/models/market_data/asset_price.py +0 -50
  247. investing_algorithm_framework/domain/models/market_data/ohlcv.py +0 -105
  248. investing_algorithm_framework/domain/models/market_data/order_book.py +0 -63
  249. investing_algorithm_framework/domain/models/market_data/ticker.py +0 -92
  250. investing_algorithm_framework/domain/models/order/order_fee.py +0 -45
  251. investing_algorithm_framework/domain/models/trade.py +0 -78
  252. investing_algorithm_framework/domain/models/trading_data_types.py +0 -47
  253. investing_algorithm_framework/domain/models/trading_time_frame.py +0 -223
  254. investing_algorithm_framework/domain/singleton.py +0 -9
  255. investing_algorithm_framework/domain/utils/backtesting.py +0 -82
  256. investing_algorithm_framework/infrastructure/models/order/order_fee.py +0 -21
  257. investing_algorithm_framework/infrastructure/repositories/order_fee_repository.py +0 -15
  258. investing_algorithm_framework/infrastructure/services/market_backtest_service.py +0 -360
  259. investing_algorithm_framework/infrastructure/services/market_service.py +0 -410
  260. investing_algorithm_framework/infrastructure/services/performance_service.py +0 -192
  261. investing_algorithm_framework/services/backtest_service.py +0 -268
  262. investing_algorithm_framework/services/market_data_service.py +0 -77
  263. investing_algorithm_framework/services/order_backtest_service.py +0 -122
  264. investing_algorithm_framework/services/order_service.py +0 -752
  265. investing_algorithm_framework/services/portfolio_service.py +0 -164
  266. investing_algorithm_framework/services/portfolio_snapshot_service.py +0 -68
  267. investing_algorithm_framework/services/position_cost_service.py +0 -5
  268. investing_algorithm_framework/services/position_service.py +0 -63
  269. investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -225
  270. investing_algorithm_framework-1.5.dist-info/AUTHORS.md +0 -8
  271. investing_algorithm_framework-1.5.dist-info/METADATA +0 -230
  272. investing_algorithm_framework-1.5.dist-info/RECORD +0 -119
  273. investing_algorithm_framework-1.5.dist-info/top_level.txt +0 -1
  274. /investing_algorithm_framework/{infrastructure/services/performance_backtest_service.py → app/reporting/tables/stop_loss_table.py} +0 -0
  275. /investing_algorithm_framework/services/{position_snapshot_service.py → positions/position_snapshot_service.py} +0 -0
  276. {investing_algorithm_framework-1.5.dist-info → investing_algorithm_framework-7.25.6.dist-info}/LICENSE +0 -0
@@ -1,14 +1,18 @@
1
1
  from dependency_injector import containers, providers
2
2
 
3
- from investing_algorithm_framework.app.algorithm import Algorithm
3
+ from investing_algorithm_framework.app.algorithm import AlgorithmFactory
4
+ from investing_algorithm_framework.app.context import Context
4
5
  from investing_algorithm_framework.infrastructure import SQLOrderRepository, \
5
- SQLPositionRepository, MarketService, SQLPortfolioRepository, \
6
- SQLOrderFeeRepository, SQLPortfolioSnapshotRepository, \
7
- SQLPositionSnapshotRepository, PerformanceService
6
+ SQLPositionRepository, SQLPortfolioRepository, BacktestService, \
7
+ SQLPortfolioSnapshotRepository, SQLTradeRepository, \
8
+ SQLPositionSnapshotRepository, SQLTradeStopLossRepository, \
9
+ SQLTradeTakeProfitRepository, SQLOrderMetadataRepository
8
10
  from investing_algorithm_framework.services import OrderService, \
9
- PositionService, PortfolioService, StrategyOrchestratorService, \
10
- PortfolioConfigurationService, MarketDataService, BackTestService, \
11
- ConfigurationService, PortfolioSnapshotService, PositionSnapshotService
11
+ PositionService, PortfolioService, PortfolioConfigurationService, \
12
+ ConfigurationService, PortfolioSnapshotService, \
13
+ PositionSnapshotService, MarketCredentialService, TradeService, \
14
+ PortfolioSyncService, OrderExecutorLookup, PortfolioProviderLookup, \
15
+ DataProviderService, TradeTakeProfitService, TradeStopLossService
12
16
 
13
17
 
14
18
  def setup_dependency_container(app, modules=None, packages=None):
@@ -18,14 +22,27 @@ def setup_dependency_container(app, modules=None, packages=None):
18
22
 
19
23
 
20
24
  class DependencyContainer(containers.DeclarativeContainer):
25
+ """
26
+ Dependency container for the app. It is responsible for managing the
27
+ dependencies of the app.
28
+ """
21
29
  config = providers.Configuration()
22
30
  wiring_config = containers.WiringConfiguration()
23
31
  configuration_service = providers.ThreadSafeSingleton(
24
32
  ConfigurationService,
25
33
  )
34
+ market_credential_service = providers.ThreadSafeSingleton(
35
+ MarketCredentialService
36
+ )
26
37
  order_repository = providers.Factory(SQLOrderRepository)
27
- order_fee_repository = providers.Factory(SQLOrderFeeRepository)
38
+ order_executor_lookup = providers.ThreadSafeSingleton(
39
+ OrderExecutorLookup
40
+ )
41
+ order_metadata_repository = providers.Factory(SQLOrderMetadataRepository)
28
42
  position_repository = providers.Factory(SQLPositionRepository)
43
+ portfolio_provider_lookup = providers.ThreadSafeSingleton(
44
+ PortfolioProviderLookup,
45
+ )
29
46
  portfolio_repository = providers.Factory(SQLPortfolioRepository)
30
47
  position_snapshot_repository = providers.Factory(
31
48
  SQLPositionSnapshotRepository
@@ -33,16 +50,14 @@ class DependencyContainer(containers.DeclarativeContainer):
33
50
  portfolio_snapshot_repository = providers.Factory(
34
51
  SQLPortfolioSnapshotRepository
35
52
  )
36
- market_service = providers.Factory(MarketService)
37
- market_data_service = providers.Factory(
38
- MarketDataService,
39
- market_service=market_service
40
- )
41
- portfolio_configuration_service = providers.ThreadSafeSingleton(
42
- PortfolioConfigurationService,
43
- market_service=market_service,
44
- portfolio_repository=portfolio_repository,
45
- position_repository=position_repository,
53
+ trade_repository = providers.Factory(SQLTradeRepository)
54
+ trade_take_profit_repository = providers\
55
+ .Factory(SQLTradeTakeProfitRepository)
56
+ trade_stop_loss_repository = providers.Factory(SQLTradeStopLossRepository)
57
+ data_provider_service = providers.ThreadSafeSingleton(
58
+ DataProviderService,
59
+ configuration_service=configuration_service,
60
+ market_credential_service=market_credential_service
46
61
  )
47
62
  position_snapshot_service = providers.Factory(
48
63
  PositionSnapshotService,
@@ -50,63 +65,101 @@ class DependencyContainer(containers.DeclarativeContainer):
50
65
  )
51
66
  portfolio_snapshot_service = providers.Factory(
52
67
  PortfolioSnapshotService,
68
+ order_repository=order_repository,
53
69
  repository=portfolio_snapshot_repository,
70
+ portfolio_repository=portfolio_repository,
54
71
  position_snapshot_service=position_snapshot_service,
55
72
  position_repository=position_repository,
73
+ data_provider_service=data_provider_service,
56
74
  )
57
- order_service = providers.Factory(
58
- OrderService,
75
+ portfolio_configuration_service = providers.ThreadSafeSingleton(
76
+ PortfolioConfigurationService,
77
+ portfolio_repository=portfolio_repository,
78
+ position_repository=position_repository,
79
+ )
80
+ trade_service = providers.Factory(
81
+ TradeService,
59
82
  order_repository=order_repository,
60
- order_fee_repository=order_fee_repository,
83
+ trade_take_profit_repository=trade_take_profit_repository,
84
+ trade_stop_loss_repository=trade_stop_loss_repository,
85
+ configuration_service=configuration_service,
86
+ trade_repository=trade_repository,
61
87
  portfolio_repository=portfolio_repository,
62
88
  position_repository=position_repository,
63
- market_service=market_service,
64
- portfolio_configuration_service=portfolio_configuration_service,
65
- portfolio_snapshot_service=portfolio_snapshot_service
89
+ order_metadata_repository=order_metadata_repository,
90
+ )
91
+ trade_take_profit_service = providers.Factory(
92
+ TradeTakeProfitService,
93
+ repository=trade_take_profit_repository,
94
+ )
95
+ trade_stop_loss_service = providers.Factory(
96
+ TradeStopLossService,
97
+ repository=trade_stop_loss_repository,
66
98
  )
67
99
  position_service = providers.Factory(
68
100
  PositionService,
101
+ portfolio_repository=portfolio_repository,
69
102
  repository=position_repository,
70
- market_service=market_service,
103
+ )
104
+ order_service = providers.Factory(
105
+ OrderService,
106
+ configuration_service=configuration_service,
71
107
  order_repository=order_repository,
108
+ portfolio_repository=portfolio_repository,
109
+ position_service=position_service,
110
+ market_credential_service=market_credential_service,
111
+ portfolio_configuration_service=portfolio_configuration_service,
112
+ portfolio_snapshot_service=portfolio_snapshot_service,
113
+ trade_service=trade_service,
114
+ order_executor_lookup=order_executor_lookup,
115
+ portfolio_provider_lookup=portfolio_provider_lookup
72
116
  )
73
117
  portfolio_service = providers.Factory(
74
118
  PortfolioService,
75
- market_service=market_service,
76
- position_repository=position_repository,
119
+ configuration_service=configuration_service,
120
+ market_credential_service=market_credential_service,
77
121
  order_service=order_service,
122
+ position_service=position_service,
78
123
  portfolio_repository=portfolio_repository,
79
124
  portfolio_configuration_service=portfolio_configuration_service,
80
- portfolio_snapshot_service=portfolio_snapshot_service
81
- )
82
- strategy_orchestrator_service = providers.Factory(
83
- StrategyOrchestratorService,
84
- market_data_service=market_data_service
125
+ portfolio_snapshot_service=portfolio_snapshot_service,
126
+ portfolio_provider_lookup=portfolio_provider_lookup
85
127
  )
86
- performance_service = providers.Factory(
87
- PerformanceService,
88
- order_repository=order_repository,
128
+ portfolio_sync_service = providers.Factory(
129
+ PortfolioSyncService,
130
+ trade_service=trade_service,
131
+ configuration_service=configuration_service,
132
+ order_service=order_service,
89
133
  position_repository=position_repository,
90
- portfolio_repository=portfolio_repository
134
+ portfolio_repository=portfolio_repository,
135
+ portfolio_configuration_service=portfolio_configuration_service,
136
+ market_credential_service=market_credential_service,
137
+ portfolio_provider_lookup=portfolio_provider_lookup,
91
138
  )
92
139
  backtest_service = providers.Factory(
93
- BackTestService,
94
- market_data_service=market_data_service,
95
- market_service=market_service,
140
+ BacktestService,
141
+ configuration_service=configuration_service,
96
142
  order_service=order_service,
97
- portfolio_repository=portfolio_repository,
98
- performance_service=performance_service,
143
+ trade_service=trade_service,
144
+ portfolio_service=portfolio_service,
99
145
  position_repository=position_repository,
146
+ portfolio_configuration_service=portfolio_configuration_service,
147
+ portfolio_snapshot_service=portfolio_snapshot_service,
148
+ data_provider_service=data_provider_service,
100
149
  )
101
- algorithm = providers.Factory(
102
- Algorithm,
150
+ context = providers.Factory(
151
+ Context,
103
152
  configuration_service=configuration_service,
104
153
  portfolio_configuration_service=portfolio_configuration_service,
105
154
  portfolio_service=portfolio_service,
106
155
  position_service=position_service,
107
156
  order_service=order_service,
108
- market_service=market_service,
109
- strategy_orchestrator_service=strategy_orchestrator_service,
110
- market_data_service=market_data_service,
157
+ market_credential_service=market_credential_service,
158
+ trade_service=trade_service,
159
+ data_provider_service=data_provider_service,
160
+ trade_stop_loss_service=trade_stop_loss_service,
161
+ trade_take_profit_service=trade_take_profit_service,
162
+ )
163
+ algorithm_factory = providers.Factory(
164
+ AlgorithmFactory,
111
165
  )
112
-
@@ -1,28 +1,47 @@
1
- from .config import Config, Environment
2
- from .models import OrderStatus, OrderSide, OrderType, TimeInterval, \
3
- TimeUnit, TimeFrame, TradingTimeFrame, TradingDataType, Ticker, \
4
- OHLCV, OrderBook, PortfolioConfiguration, AssetPrice, Portfolio, \
5
- Position, Order, OrderFee, BacktestProfile, PositionSnapshot, \
6
- PortfolioSnapshot, StrategyProfile, BacktestPosition, Trade
7
- from .exceptions import OperationalException, ApiException, \
8
- PermissionDeniedApiException, ImproperlyConfigured
1
+ from .config import Environment, DEFAULT_LOGGING_CONFIG, \
2
+ AWS_LAMBDA_LOGGING_CONFIG
9
3
  from .constants import ITEMIZE, ITEMIZED, PER_PAGE, PAGE, ENVIRONMENT, \
10
4
  DATABASE_DIRECTORY_PATH, DATABASE_NAME, DEFAULT_PER_PAGE_VALUE, \
11
5
  DEFAULT_PAGE_VALUE, SQLALCHEMY_DATABASE_URI, RESOURCE_DIRECTORY, \
12
6
  DATETIME_FORMAT, DATETIME_FORMAT_BACKTESTING, BACKTESTING_FLAG, \
13
- BACKTESTING_INDEX_DATETIME, BACKTESTING_START_DATE, CCXT_DATETIME_FORMAT, \
14
- BACKTEST_DATA_DIRECTORY_NAME, TICKER_DATA_TYPE, OHLCV_DATA_TYPE
15
- from .singleton import Singleton
7
+ BACKTESTING_START_DATE, CCXT_DATETIME_FORMAT, \
8
+ BACKTEST_DATA_DIRECTORY_NAME, TICKER_DATA_TYPE, OHLCV_DATA_TYPE, \
9
+ CURRENT_UTC_DATETIME, BACKTESTING_END_DATE, \
10
+ CCXT_DATETIME_FORMAT_WITH_TIMEZONE, \
11
+ APP_MODE, DATABASE_DIRECTORY_NAME, BACKTESTING_INITIAL_AMOUNT, \
12
+ APPLICATION_DIRECTORY, SNAPSHOT_INTERVAL, AWS_S3_STATE_BUCKET_NAME, \
13
+ LAST_SNAPSHOT_DATETIME, DATA_DIRECTORY, INDEX_DATETIME, \
14
+ DATETIME_FORMAT_FILE_NAME, DEFAULT_DATETIME_FORMAT
15
+ from .data_provider import DataProvider
16
+ from .data_structures import PeekableQueue
17
+ from .decimal_parsing import parse_decimal_to_string, parse_string_to_decimal
18
+ from .exceptions import OperationalException, ApiException, DataError, \
19
+ PermissionDeniedApiException, ImproperlyConfigured, NetworkError
20
+ from .models import OrderStatus, OrderSide, OrderType, TimeInterval, \
21
+ TimeUnit, TimeFrame, PortfolioConfiguration, Portfolio, Position, \
22
+ Order, TradeStatus, StrategyProfile, Trade, MarketCredential, \
23
+ AppMode, DataType, DataSource, PortfolioSnapshot, PositionSnapshot, \
24
+ TradeTakeProfit, TradeStopLoss, Event, SnapshotInterval, \
25
+ TakeProfitRule, StopLossRule, PositionSize
26
+ from .order_executor import OrderExecutor
27
+ from .portfolio_provider import PortfolioProvider
28
+ from .services import MarketCredentialService, AbstractPortfolioSyncService, \
29
+ RoundingService, StateHandler
30
+ from .stateless_actions import StatelessActions
31
+ from .strategy import Strategy
16
32
  from .utils import random_string, append_dict_as_row_to_csv, \
17
33
  add_column_headers_to_csv, get_total_amount_of_rows, \
18
- csv_to_list, StoppableThread
19
- from .strategy import Strategy
20
- from .stateless_actions import StatelessActions
21
- from .decimal_parsing import parse_decimal_to_string, parse_string_to_decimal
22
- from .utils.backtesting import pretty_print_backtest
34
+ convert_polars_to_pandas, random_number, is_jupyter_notebook, \
35
+ csv_to_list, StoppableThread, load_csv_into_dict, tqdm, \
36
+ is_timezone_aware, sync_timezones, get_timezone
37
+ from .backtesting import BacktestRun, BacktestSummaryMetrics, \
38
+ BacktestDateRange, Backtest, BacktestMetrics, combine_backtests, \
39
+ BacktestPermutationTest, BacktestEvaluationFocus, \
40
+ generate_backtest_summary_metrics, load_backtests_from_directory, \
41
+ save_backtests_to_directory
42
+ from .algorithm_id import generate_algorithm_id
23
43
 
24
44
  __all__ = [
25
- 'Config',
26
45
  "OrderStatus",
27
46
  "OrderSide",
28
47
  "OrderType",
@@ -40,12 +59,6 @@ __all__ = [
40
59
  "DEFAULT_PER_PAGE_VALUE",
41
60
  "DEFAULT_PAGE_VALUE",
42
61
  "SQLALCHEMY_DATABASE_URI",
43
- "Ticker",
44
- "TradingDataType",
45
- "TradingTimeFrame",
46
- "OHLCV",
47
- "OrderBook",
48
- "Singleton",
49
62
  "random_string",
50
63
  "append_dict_as_row_to_csv",
51
64
  "add_column_headers_to_csv",
@@ -54,7 +67,6 @@ __all__ = [
54
67
  "DATABASE_DIRECTORY_PATH",
55
68
  "DATABASE_NAME",
56
69
  "PortfolioConfiguration",
57
- "AssetPrice",
58
70
  "RESOURCE_DIRECTORY",
59
71
  'ENVIRONMENT',
60
72
  'Environment',
@@ -65,21 +77,76 @@ __all__ = [
65
77
  "Strategy",
66
78
  "DATETIME_FORMAT",
67
79
  "StatelessActions",
68
- "OrderFee",
69
80
  "parse_decimal_to_string",
70
81
  "parse_string_to_decimal",
71
- "BacktestProfile",
72
- "pretty_print_backtest",
82
+ "BacktestRun",
73
83
  "DATETIME_FORMAT_BACKTESTING",
74
84
  "BACKTESTING_FLAG",
75
- "BACKTESTING_INDEX_DATETIME",
76
85
  "PortfolioSnapshot",
77
86
  "BACKTESTING_START_DATE",
78
87
  "StrategyProfile",
79
- "BacktestPosition",
80
88
  "CCXT_DATETIME_FORMAT",
81
89
  "BACKTEST_DATA_DIRECTORY_NAME",
82
90
  "Trade",
83
91
  "TICKER_DATA_TYPE",
84
- "OHLCV_DATA_TYPE"
92
+ "OHLCV_DATA_TYPE",
93
+ "CURRENT_UTC_DATETIME",
94
+ "MarketCredential",
95
+ "PeekableQueue",
96
+ "BACKTESTING_END_DATE",
97
+ "PositionSnapshot",
98
+ "MarketCredentialService",
99
+ "TradeStatus",
100
+ "CCXT_DATETIME_FORMAT_WITH_TIMEZONE",
101
+ "load_csv_into_dict",
102
+ "AbstractPortfolioSyncService",
103
+ "APP_MODE",
104
+ "AppMode",
105
+ "RoundingService",
106
+ "BacktestDateRange",
107
+ "convert_polars_to_pandas",
108
+ "DEFAULT_LOGGING_CONFIG",
109
+ "DATABASE_DIRECTORY_NAME",
110
+ "BACKTESTING_INITIAL_AMOUNT",
111
+ "TradeTakeProfit",
112
+ "TradeStopLoss",
113
+ "StateHandler",
114
+ "APPLICATION_DIRECTORY",
115
+ "DataProvider",
116
+ "NetworkError",
117
+ "DataSource",
118
+ "OrderExecutor",
119
+ "PortfolioProvider",
120
+ "random_number",
121
+ "is_timezone_aware",
122
+ "sync_timezones",
123
+ "get_timezone",
124
+ "Event",
125
+ "SNAPSHOT_INTERVAL",
126
+ "SnapshotInterval",
127
+ "AWS_S3_STATE_BUCKET_NAME",
128
+ "AWS_LAMBDA_LOGGING_CONFIG",
129
+ "DataType",
130
+ "DataSource",
131
+ "Backtest",
132
+ "BacktestMetrics",
133
+ "BacktestSummaryMetrics",
134
+ "BacktestPermutationTest",
135
+ "LAST_SNAPSHOT_DATETIME",
136
+ "DATA_DIRECTORY",
137
+ "INDEX_DATETIME",
138
+ "DATETIME_FORMAT_FILE_NAME",
139
+ "is_jupyter_notebook",
140
+ "tqdm",
141
+ "DEFAULT_DATETIME_FORMAT",
142
+ "BacktestEvaluationFocus",
143
+ 'combine_backtests',
144
+ 'PositionSize',
145
+ 'generate_backtest_summary_metrics',
146
+ 'DataError',
147
+ 'TakeProfitRule',
148
+ 'StopLossRule',
149
+ "load_backtests_from_directory",
150
+ "save_backtests_to_directory",
151
+ "generate_algorithm_id",
85
152
  ]
@@ -0,0 +1,69 @@
1
+ import hashlib
2
+ from typing import Dict
3
+ import json
4
+
5
+
6
+ def generate_algorithm_id(
7
+ algorithm=None,
8
+ strategy=None,
9
+ params: Dict = None,
10
+ post_fix=None,
11
+ pre_fix=None
12
+ ) -> str:
13
+ """
14
+ Generate a short, consistent unique id for the given params.
15
+ The id will always be the same for the same params.
16
+
17
+ Args:
18
+ algorithm: (optional) Algorithm instance to generate ID for.
19
+ strategy: (optional) Strategy instance to generate ID for.
20
+ params (Dict, optional): Strategy parameters
21
+ (must be JSON serializable).
22
+ You can optionally pass 'length' to control ID length.
23
+ post_fix (str, optional): String to append to the end of the ID.
24
+ pre_fix (str, optional): String to prepend to the start of the ID.
25
+
26
+ Returns:
27
+ str: A deterministic unique identifier for the strategy.
28
+ """
29
+
30
+ if algorithm is not None:
31
+ if hasattr(algorithm, "algorithm_id"):
32
+ return algorithm.algorithm_id
33
+
34
+ if hasattr(algorithm, "strategies") \
35
+ and len(algorithm.strategies) > 0:
36
+ first_strategy = algorithm.strategies[0]
37
+
38
+ if first_strategy is not None:
39
+ return f"{first_strategy.__class__.__name__}"
40
+
41
+ raise ValueError(
42
+ "Cannot generate algorithm ID from the provided algorithm "
43
+ "instance. Please provide 'params' instead."
44
+ )
45
+
46
+ if strategy is not None:
47
+ return strategy.__class__.__name__
48
+
49
+ length = params.get("length", 8)
50
+
51
+ # Remove "length" if present so it doesn't affect the hash
52
+ clean_params = {k: v for k, v in params.items() if k != "length"}
53
+
54
+ # Create a canonical string representation (sorted keys)
55
+ params_str = json.dumps(clean_params, sort_keys=True)
56
+
57
+ # Hash the params string
58
+ hash_digest = hashlib.sha256(params_str.encode("utf-8")).hexdigest()
59
+
60
+ # Return shortened hash
61
+ result = hash_digest[:length]
62
+
63
+ if post_fix:
64
+ result = result + post_fix
65
+
66
+ if pre_fix:
67
+ result = pre_fix + result
68
+
69
+ return result
@@ -0,0 +1,25 @@
1
+ from .backtest_summary_metrics import BacktestSummaryMetrics
2
+ from .backtest_date_range import BacktestDateRange
3
+ from .backtest_metrics import BacktestMetrics
4
+ from .backtest_run import BacktestRun
5
+ from .backtest import Backtest
6
+ from .backtest_permutation_test import BacktestPermutationTest
7
+ from .backtest_evaluation_focuss import BacktestEvaluationFocus
8
+ from .combine_backtests import combine_backtests, \
9
+ generate_backtest_summary_metrics
10
+ from .backtest_utils import load_backtests_from_directory, \
11
+ save_backtests_to_directory
12
+
13
+ __all__ = [
14
+ "Backtest",
15
+ "BacktestSummaryMetrics",
16
+ "BacktestDateRange",
17
+ "BacktestMetrics",
18
+ "BacktestRun",
19
+ "BacktestPermutationTest",
20
+ "BacktestEvaluationFocus",
21
+ "combine_backtests",
22
+ "generate_backtest_summary_metrics",
23
+ "load_backtests_from_directory",
24
+ "save_backtests_to_directory",
25
+ ]