investing-algorithm-framework 8.3.0__tar.gz → 8.5.0__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 (288) hide show
  1. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/PKG-INFO +21 -9
  2. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/README.md +19 -7
  3. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/__init__.py +9 -0
  4. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/app.py +26 -2
  5. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/context.py +62 -0
  6. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/backtest_report.py +7 -3
  7. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/backtest_report_old.py +6 -3
  8. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/dashboard.css +4 -0
  9. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +31 -0
  10. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/strategy.py +26 -0
  11. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +1 -1
  12. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +27 -0
  13. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/database/__init__.py +2 -1
  14. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +33 -7
  15. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +127 -35
  16. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +5 -0
  17. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +32 -0
  18. investing_algorithm_framework-8.5.0/investing_algorithm_framework/notebook/__init__.py +3 -0
  19. investing_algorithm_framework-8.5.0/investing_algorithm_framework/notebook/magic.py +401 -0
  20. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/pyproject.toml +2 -2
  21. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/LICENSE +0 -0
  22. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/__init__.py +0 -0
  23. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
  24. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/markdown.py +0 -0
  25. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/analysis/ranking.py +0 -0
  26. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/__init__.py +0 -0
  27. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  28. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  29. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  30. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  31. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  32. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  33. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  34. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  35. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  36. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
  37. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  38. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  39. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  40. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  41. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  42. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  43. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  44. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  45. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  46. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  47. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  48. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  49. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  50. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  51. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/dashboard.js +0 -0
  52. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  53. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  54. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  55. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  56. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  57. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  58. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  59. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/task.py +0 -0
  60. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  61. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  62. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  63. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  64. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  65. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  66. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  67. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  68. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  69. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  70. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  71. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  72. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  73. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  74. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  75. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/cli.py +0 -0
  76. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  77. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  78. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  79. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/mcp_server.py +0 -0
  80. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  81. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  82. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  83. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  84. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  85. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  86. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  87. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  88. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  89. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  90. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  91. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  92. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  93. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  94. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  95. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  96. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  97. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  98. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  99. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  100. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  101. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/create_app.py +0 -0
  102. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/dependency_container.py +0 -0
  103. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/__init__.py +0 -0
  104. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
  105. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
  106. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
  107. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  108. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  109. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
  110. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  111. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
  112. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
  113. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +0 -0
  114. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
  115. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
  116. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
  117. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/blotter.py +0 -0
  118. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/config.py +0 -0
  119. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/constants.py +0 -0
  120. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  121. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  122. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  123. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  124. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/fx.py +0 -0
  125. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  126. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  127. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  128. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  129. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  130. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  131. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  132. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  133. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  134. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  135. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  136. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  137. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  138. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  139. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  140. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  141. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  142. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  143. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  144. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  145. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
  146. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  147. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
  148. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
  149. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
  150. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
  151. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
  152. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  153. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  154. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  155. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  156. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  157. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  158. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  159. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  160. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  161. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  162. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  163. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  164. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  165. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  166. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  167. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  168. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  169. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  170. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  171. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  172. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  173. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  174. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  175. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  176. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  177. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  178. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  179. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  180. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  181. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  182. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  183. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  184. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/download_data.py +0 -0
  185. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  186. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  187. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/alpha_vantage.py +0 -0
  188. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/base_url.py +0 -0
  189. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  190. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  191. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/csv_url.py +0 -0
  192. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/json_url.py +0 -0
  193. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/ohlcv_base.py +0 -0
  194. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  195. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/parquet_url.py +0 -0
  196. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/polygon.py +0 -0
  197. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/data_providers/yahoo.py +0 -0
  198. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  199. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  200. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  201. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  202. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  203. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
  204. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  205. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  206. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  207. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  208. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  209. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  210. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  211. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  212. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  213. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  214. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  215. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  216. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  217. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  218. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  219. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  220. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  221. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  222. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  223. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  224. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  225. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  226. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
  227. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  228. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  229. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  230. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  231. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  232. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  233. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  234. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  235. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
  236. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/__init__.py +0 -0
  237. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  238. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  239. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/data_providers/data.py +0 -0
  240. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
  241. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  242. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
  243. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  244. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  245. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  246. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  247. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  248. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  249. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  250. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  251. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  252. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  253. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  254. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  255. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  256. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  257. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  258. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  259. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  260. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
  261. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  262. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  263. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  264. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  265. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  266. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  267. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  268. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  269. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  270. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  271. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  272. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  273. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  274. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  275. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  276. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  277. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  278. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  279. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  280. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  281. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  282. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  283. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  284. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  285. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  286. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
  287. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
  288. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.5.0}/investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: investing-algorithm-framework
3
- Version: 8.3.0
3
+ Version: 8.5.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10,<4.0
@@ -13,7 +13,7 @@ Provides-Extra: alpha-vantage
13
13
  Provides-Extra: polygon
14
14
  Provides-Extra: yahoo
15
15
  Requires-Dist: Flask (>=3.1.0)
16
- Requires-Dist: Flask-Cors (>=3.0.9,<5.0.0)
16
+ Requires-Dist: Flask-Cors (>=3.0.9,<7.0.0)
17
17
  Requires-Dist: Flask-Migrate (>=2.6.0)
18
18
  Requires-Dist: SQLAlchemy (>=2.0.18)
19
19
  Requires-Dist: alpha_vantage (>=3.0.0,<4.0.0) ; extra == "alpha-vantage" or extra == "all"
@@ -44,12 +44,18 @@ Description-Content-Type: text/markdown
44
44
  </h1>
45
45
 
46
46
  <p align="center">
47
- <i align="center">Create trading strategies. Compare them side by side. Pick the best one. 🚀</i>
47
+ <i align="center">Create trading strategies. Compare them side by side. Pick the best one and Deploy 🚀</i>
48
48
  </p>
49
49
 
50
50
  <h4 align="center">
51
- <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml">
52
- <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=master&label=tests&style=flat-square" alt="tests" style="height: 20px;">
51
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
52
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=linux&style=flat-square&logo=linux&logoColor=white" alt="linux main" style="height: 20px;">
53
+ </a>
54
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
55
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=macos&style=flat-square&logo=apple&logoColor=white" alt="macos main" style="height: 20px;">
56
+ </a>
57
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
58
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=windows&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
53
59
  </a>
54
60
  <a href="https://pypi.org/project/investing-algorithm-framework/">
55
61
  <img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
@@ -102,7 +108,7 @@ Description-Content-Type: text/markdown
102
108
 
103
109
  Most quant frameworks stop at "here's your backtest result." You get a number, maybe a chart, and then you're on your own figuring out which strategy is actually better.
104
110
 
105
- This framework is built around the full loop: **create strategies → backtest them → compare them in a single report → deploy the winner.** It generates a self-contained HTML dashboard that lets you rank, filter, and visually compare every strategy you've tested — all in one view, no notebooks required.
111
+ This framework is built around the full loop: **create strategies → vector backtest for signals analysis → compare them in a single report → event backtest the most promising strategies → deploy the winner.** It generates a self-contained HTML dashboard that lets you rank, filter, and visually compare every strategy you've tested — all in one view, no notebooks required.
106
112
 
107
113
  <details open>
108
114
  <summary>
@@ -110,6 +116,10 @@ This framework is built around the full loop: **create strategies → backtest t
110
116
  </summary> <br>
111
117
 
112
118
  - 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
119
+ - ⚡ **Vector Backtesting for Signal Analysis** — Quickly test your strategy logic on historical data to see how signals would have behaved before committing to full event-driven backtests
120
+ - 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
121
+ - 🔀 **Permutation Testing / Monte Carlo Simulations** — Assess the statistical robustness of your strategies by running them across randomized market scenarios to see how often your results could occur by chance
122
+ - 🚀 **Deployment** — Once the best strategy is identified through backtesting and comparison, deploy it to production locally or in the cloud (AWS Lambda / Azure Functions) to start live trading
113
123
  - ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
114
124
  - 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
115
125
  - 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
@@ -118,7 +128,8 @@ This framework is built around the full loop: **create strategies → backtest t
118
128
  - 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
119
129
  - 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
120
130
  - 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
121
- - 🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
131
+ - � **[Record Custom Variables](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/recording-variables)** — Track any indicator or metric during backtests with `context.record()`
132
+ - �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
122
133
 
123
134
  </details>
124
135
 
@@ -306,13 +317,14 @@ report.save("my_report.html")
306
317
  |---|---|
307
318
  | **[Backtest Report Dashboard](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** | Self-contained HTML report with ranking tables, equity curves, metric charts, heatmaps, and strategy comparison |
308
319
  | **[Event-Driven Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtesting)** | Realistic, order-by-order simulation |
309
- | **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/vector-backtesting)** | Fast signal research and prototyping |
320
+ | **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
310
321
  | **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
311
322
  | **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
312
323
  | **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
313
324
  | **[Cloud Deployment](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/deployment)** | Deploy to AWS Lambda, Azure Functions, or run as a web service |
314
325
  | **[Market Data Providers](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Built-in providers for CCXT, Yahoo Finance, Alpha Vantage, and Polygon — or build your own |
315
326
  | **[Load External Data](https://coding-kitties.github.io/investing-algorithm-framework/Data/external-data)** | Fetch CSV, JSON, or Parquet from any URL with caching, date parsing, and pre/post-processing |
327
+ | **[Record Custom Variables](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/recording-variables)** | Track any indicator or metric during backtests with `context.record()` |
316
328
  | **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
317
329
  | **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
318
330
 
@@ -347,7 +359,7 @@ python -m unittest discover -s tests
347
359
 
348
360
  - [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
349
361
  - Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
350
- - PRs go against the `develop` branch
362
+ - PRs go against the `dev` branch
351
363
 
352
364
  ## Risk Disclaimer
353
365
 
@@ -3,12 +3,18 @@
3
3
  </h1>
4
4
 
5
5
  <p align="center">
6
- <i align="center">Create trading strategies. Compare them side by side. Pick the best one. 🚀</i>
6
+ <i align="center">Create trading strategies. Compare them side by side. Pick the best one and Deploy 🚀</i>
7
7
  </p>
8
8
 
9
9
  <h4 align="center">
10
- <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml">
11
- <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=master&label=tests&style=flat-square" alt="tests" style="height: 20px;">
10
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
11
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=linux&style=flat-square&logo=linux&logoColor=white" alt="linux main" style="height: 20px;">
12
+ </a>
13
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
14
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=macos&style=flat-square&logo=apple&logoColor=white" alt="macos main" style="height: 20px;">
15
+ </a>
16
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Amain">
17
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=main&label=windows&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
12
18
  </a>
13
19
  <a href="https://pypi.org/project/investing-algorithm-framework/">
14
20
  <img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
@@ -61,7 +67,7 @@
61
67
 
62
68
  Most quant frameworks stop at "here's your backtest result." You get a number, maybe a chart, and then you're on your own figuring out which strategy is actually better.
63
69
 
64
- This framework is built around the full loop: **create strategies → backtest them → compare them in a single report → deploy the winner.** It generates a self-contained HTML dashboard that lets you rank, filter, and visually compare every strategy you've tested — all in one view, no notebooks required.
70
+ This framework is built around the full loop: **create strategies → vector backtest for signals analysis → compare them in a single report → event backtest the most promising strategies → deploy the winner.** It generates a self-contained HTML dashboard that lets you rank, filter, and visually compare every strategy you've tested — all in one view, no notebooks required.
65
71
 
66
72
  <details open>
67
73
  <summary>
@@ -69,6 +75,10 @@ This framework is built around the full loop: **create strategies → backtest t
69
75
  </summary> <br>
70
76
 
71
77
  - 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
78
+ - ⚡ **Vector Backtesting for Signal Analysis** — Quickly test your strategy logic on historical data to see how signals would have behaved before committing to full event-driven backtests
79
+ - 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
80
+ - 🔀 **Permutation Testing / Monte Carlo Simulations** — Assess the statistical robustness of your strategies by running them across randomized market scenarios to see how often your results could occur by chance
81
+ - 🚀 **Deployment** — Once the best strategy is identified through backtesting and comparison, deploy it to production locally or in the cloud (AWS Lambda / Azure Functions) to start live trading
72
82
  - ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
73
83
  - 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
74
84
  - 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
@@ -77,7 +87,8 @@ This framework is built around the full loop: **create strategies → backtest t
77
87
  - 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
78
88
  - 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
79
89
  - 🌐 **Load External Data** — Fetch CSV, JSON, or Parquet from any URL with caching and auto-refresh
80
- - 🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
90
+ - � **[Record Custom Variables](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/recording-variables)** — Track any indicator or metric during backtests with `context.record()`
91
+ - �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
81
92
 
82
93
  </details>
83
94
 
@@ -265,13 +276,14 @@ report.save("my_report.html")
265
276
  |---|---|
266
277
  | **[Backtest Report Dashboard](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtest-reports)** | Self-contained HTML report with ranking tables, equity curves, metric charts, heatmaps, and strategy comparison |
267
278
  | **[Event-Driven Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/backtesting)** | Realistic, order-by-order simulation |
268
- | **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/vector-backtesting)** | Fast signal research and prototyping |
279
+ | **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
269
280
  | **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
270
281
  | **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
271
282
  | **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
272
283
  | **[Cloud Deployment](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/deployment)** | Deploy to AWS Lambda, Azure Functions, or run as a web service |
273
284
  | **[Market Data Providers](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Built-in providers for CCXT, Yahoo Finance, Alpha Vantage, and Polygon — or build your own |
274
285
  | **[Load External Data](https://coding-kitties.github.io/investing-algorithm-framework/Data/external-data)** | Fetch CSV, JSON, or Parquet from any URL with caching, date parsing, and pre/post-processing |
286
+ | **[Record Custom Variables](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/recording-variables)** | Track any indicator or metric during backtests with `context.record()` |
275
287
  | **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
276
288
  | **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
277
289
 
@@ -306,7 +318,7 @@ python -m unittest discover -s tests
306
318
 
307
319
  - [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
308
320
  - Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
309
- - PRs go against the `develop` branch
321
+ - PRs go against the `dev` branch
310
322
 
311
323
  ## Risk Disclaimer
312
324
 
@@ -254,4 +254,13 @@ __all__ = [
254
254
  "VolumeBasedFill",
255
255
  "FXRateProvider",
256
256
  "StaticFXRateProvider",
257
+ "load_ipython_extension",
257
258
  ]
259
+
260
+
261
+ def load_ipython_extension(ipython):
262
+ """Allow ``%load_ext investing_algorithm_framework`` to register
263
+ the ``%backtest`` / ``%%backtest`` magic commands."""
264
+ from investing_algorithm_framework.notebook import load_ipython_extension \
265
+ as _load
266
+ _load(ipython)
@@ -279,10 +279,11 @@ class App:
279
279
 
280
280
  if SQLALCHEMY_DATABASE_URI not in config \
281
281
  or config[SQLALCHEMY_DATABASE_URI] is None:
282
- path = "sqlite:///" + os.path.join(
282
+ db_path = os.path.join(
283
283
  configuration_service.config[DATABASE_DIRECTORY_PATH],
284
284
  configuration_service.config[DATABASE_NAME]
285
285
  )
286
+ path = "sqlite:///" + db_path.replace("\\", "/")
286
287
  configuration_service.add_value(SQLALCHEMY_DATABASE_URI, path)
287
288
 
288
289
  def initialize_backtest_config(
@@ -368,10 +369,33 @@ class App:
368
369
  logger.info(
369
370
  f"Removing existing database at {database_path}"
370
371
  )
372
+
373
+ # Dispose the existing engine to release file locks
374
+ # (required on Windows where locks are mandatory)
375
+ from investing_algorithm_framework.infrastructure.database \
376
+ import Session
377
+ from sqlalchemy.orm import close_all_sessions
378
+ close_all_sessions()
379
+ bind = Session.kw.get("bind")
380
+
381
+ if bind is not None:
382
+
383
+ try:
384
+ conn = bind.connect()
385
+ conn.invalidate()
386
+ conn.close()
387
+ except Exception:
388
+ pass
389
+
390
+ bind.dispose()
391
+
392
+ import gc
393
+ gc.collect()
394
+
371
395
  os.remove(database_path)
372
396
 
373
397
  # Create the sqlalchemy database uri
374
- path = f"sqlite:///{database_path}"
398
+ path = "sqlite:///" + database_path.replace("\\", "/")
375
399
  self.set_config(SQLALCHEMY_DATABASE_URI, path)
376
400
 
377
401
  # Setup sql if needed
@@ -53,6 +53,7 @@ class Context:
53
53
  self._blotter = None
54
54
  self._fx_rate_provider = None
55
55
  self._base_currency = None
56
+ self._recorded_values = {} # key -> list of (datetime, value)
56
57
 
57
58
  def _validate_target_symbol(self, target_symbol, market=None):
58
59
  """
@@ -2334,3 +2335,64 @@ class Context:
2334
2335
  list[Transaction]: Recorded transactions.
2335
2336
  """
2336
2337
  return self._blotter.get_transactions()
2338
+
2339
+ def record(self, **kwargs):
2340
+ """
2341
+ Record arbitrary key-value pairs at the current backtest timestamp.
2342
+
2343
+ This method allows you to store any custom indicator, metric, or
2344
+ variable during a backtest. Each key creates a time series of
2345
+ values that can be retrieved after the backtest completes via
2346
+ ``BacktestRun.recorded_values``.
2347
+
2348
+ The values are stored as a list of ``(datetime, value)`` tuples
2349
+ per key, allowing you to track any indicator over time.
2350
+
2351
+ This method only records during backtesting. In live mode it is
2352
+ a no-op.
2353
+
2354
+ Args:
2355
+ **kwargs: Arbitrary key-value pairs to record. Keys are
2356
+ strings, values can be any type (float, int, str,
2357
+ dict, list, etc.).
2358
+
2359
+ Example::
2360
+
2361
+ def on_run(self, context, data):
2362
+ context.record(
2363
+ rsi=compute_rsi(data),
2364
+ sma_20=compute_sma(data, 20),
2365
+ signal_strength=0.85,
2366
+ )
2367
+ """
2368
+ is_backtest = self.configuration_service.config.get(
2369
+ BACKTESTING_FLAG, False
2370
+ )
2371
+
2372
+ if not is_backtest:
2373
+ return
2374
+
2375
+ current_datetime = self.configuration_service.config.get(
2376
+ INDEX_DATETIME
2377
+ )
2378
+
2379
+ for key, value in kwargs.items():
2380
+ if key not in self._recorded_values:
2381
+ self._recorded_values[key] = []
2382
+ self._recorded_values[key].append((current_datetime, value))
2383
+
2384
+ def get_recorded_values(self):
2385
+ """
2386
+ Get all recorded values from the context.
2387
+
2388
+ Returns:
2389
+ dict: A dictionary mapping keys to lists of
2390
+ ``(datetime, value)`` tuples.
2391
+ """
2392
+ return self._recorded_values
2393
+
2394
+ def clear_recorded_values(self):
2395
+ """
2396
+ Clear all recorded values from the context.
2397
+ """
2398
+ self._recorded_values = {}
@@ -1,9 +1,11 @@
1
1
  import os
2
2
  import csv
3
3
  import base64
4
+ import tempfile
4
5
  import webbrowser
5
6
  import logging
6
7
  from dataclasses import dataclass, field
8
+ from pathlib import Path
7
9
  from typing import List, Union
8
10
  from datetime import datetime, timedelta
9
11
 
@@ -185,12 +187,14 @@ class BacktestReport:
185
187
  if not self.html_report:
186
188
  self.html_report = self._build_html()
187
189
 
188
- path = "/tmp/backtest_report.html"
190
+ path = os.path.join(tempfile.gettempdir(), "backtest_report.html")
189
191
  with open(path, "w", encoding="utf-8") as f:
190
192
  f.write(self.html_report)
191
193
 
194
+ file_uri = Path(path).as_uri()
195
+
192
196
  if browser:
193
- webbrowser.open(f"file://{path}")
197
+ webbrowser.open(file_uri)
194
198
  return
195
199
 
196
200
  try:
@@ -203,7 +207,7 @@ class BacktestReport:
203
207
  except (NameError, ImportError):
204
208
  pass
205
209
 
206
- webbrowser.open(f"file://{path}")
210
+ webbrowser.open(file_uri)
207
211
 
208
212
  def save(self, path):
209
213
  if not self.html_report:
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import os
3
+ import tempfile
3
4
  from pathlib import Path
4
5
  import webbrowser
5
6
  from dataclasses import dataclass
@@ -117,12 +118,14 @@ class BacktestReport:
117
118
  self._create_html_report(backtest_date_range)
118
119
 
119
120
  # Save the html report to a tmp location
120
- path = "/tmp/backtest_report.html"
121
+ path = os.path.join(tempfile.gettempdir(), "backtest_report.html")
121
122
  with open(path, "w") as html_file:
122
123
  html_file.write(self.html_report)
123
124
 
125
+ file_uri = Path(path).as_uri()
126
+
124
127
  if browser:
125
- webbrowser.open(f"file://{path}")
128
+ webbrowser.open(file_uri)
126
129
 
127
130
  def in_jupyter_notebook():
128
131
  try:
@@ -134,7 +137,7 @@ class BacktestReport:
134
137
  if in_jupyter_notebook():
135
138
  display(HTML(self.html_report))
136
139
  else:
137
- webbrowser.open(f"file://{path}")
140
+ webbrowser.open(file_uri)
138
141
 
139
142
  def _create_html_report(self, backtest_date_range: BacktestDateRange):
140
143
  """
@@ -262,6 +262,10 @@ body { font-family:'Inter',-apple-system,sans-serif; background:var(--bg); color
262
262
  .fin-hero-sub { font-size:0.88rem; color:var(--text-secondary); line-height:1.7; max-width:560px; margin:0 auto; }
263
263
  .finterion-cta { display:inline-block; margin-top:1.25rem; padding:0.65rem 1.75rem; background:var(--accent); color:#000; font-weight:600; font-size:0.82rem; border-radius:8px; text-decoration:none; transition:opacity 0.15s; }
264
264
  .finterion-cta:hover { opacity:0.85; }
265
+ .finterion-connect-btn { display:inline-block; margin-top:0.5rem; padding:0.55rem 1.5rem; background:transparent; color:var(--accent); font-weight:600; font-size:0.82rem; border-radius:8px; border:2px solid var(--accent); cursor:pointer; transition:all 0.15s; font-family:'Inter',sans-serif; }
266
+ .finterion-connect-btn:hover { background:var(--accent); color:#000; }
267
+ .fin-user-info { display:inline-flex; align-items:center; gap:0.5rem; margin-top:1rem; padding:0.5rem 1rem; background:var(--surface2); border:1px solid var(--border); border-radius:8px; font-size:0.8rem; color:var(--text-secondary); }
268
+ .fin-user-dot { width:8px; height:8px; border-radius:50%; background:#22c55e; flex-shrink:0; }
265
269
 
266
270
  /* feature cards */
267
271
  .fin-features { display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:1rem; margin-bottom:0.5rem; }
@@ -7,6 +7,7 @@
7
7
  <style>
8
8
  {{ css }}
9
9
  </style>
10
+ <script src="https://finterion.com/sdk/finterion-auth.js"></script>
10
11
  </head>
11
12
  <body>
12
13
 
@@ -479,6 +480,13 @@
479
480
  </p>
480
481
  <a class="finterion-cta" href="https://finterion.com" target="_blank"
481
482
  rel="noopener noreferrer">Get Started &rarr;</a>
483
+ <div style="margin-top:1.25rem">
484
+ <button id="connect-btn" class="finterion-connect-btn">Connect to Finterion</button>
485
+ </div>
486
+ <div id="finterion-user-info" class="fin-user-info" style="display:none">
487
+ <span class="fin-user-dot"></span>
488
+ Connected as <strong id="finterion-username"></strong>
489
+ </div>
482
490
  </div>
483
491
 
484
492
  {# Features #}
@@ -559,6 +567,29 @@ const RUN_LABELS = {{ run_labels | tojson }};
559
567
  const BENCHMARKS = {{ benchmarks | tojson }};
560
568
  // ===== STATIC JS =====
561
569
  {{ js }}
570
+
571
+ // ===== FINTERION AUTH =====
572
+ (function() {
573
+ if (typeof FinterionAuth === 'undefined') return;
574
+ var auth = new FinterionAuth();
575
+ var btn = document.getElementById('connect-btn');
576
+ if (!btn) return;
577
+ btn.addEventListener('click', function() {
578
+ auth.login()
579
+ .then(function(user) {
580
+ var info = document.getElementById('finterion-user-info');
581
+ var name = document.getElementById('finterion-username');
582
+ if (info && name) {
583
+ name.textContent = user.username;
584
+ info.style.display = 'inline-flex';
585
+ }
586
+ btn.style.display = 'none';
587
+ })
588
+ .catch(function(err) {
589
+ console.log('Auth flow cancelled');
590
+ });
591
+ });
592
+ })();
562
593
  </script>
563
594
 
564
595
  <button class="compare-btn" id="compare-btn"
@@ -850,6 +850,32 @@ class TradingStrategy:
850
850
  """
851
851
  return None
852
852
 
853
+ def generate_recorded_values(
854
+ self, data: Dict[str, Any]
855
+ ) -> Union[Dict[str, pd.Series], None]:
856
+ """
857
+ Optional method to generate recorded values for vectorized
858
+ backtesting. Override this to record arbitrary indicators,
859
+ metrics, or variables as time series during a vectorized
860
+ backtest.
861
+
862
+ Each key in the returned dict becomes a recorded variable
863
+ with the Series index as timestamps and the Series values
864
+ as the recorded data.
865
+
866
+ This is the vectorized equivalent of calling
867
+ ``context.record()`` in event-driven backtests.
868
+
869
+ Args:
870
+ data (Dict[str, Any]): The market data for the strategy.
871
+
872
+ Returns:
873
+ Dict[str, Series] | None: A dictionary where keys are
874
+ variable names and values are pandas Series with the
875
+ recorded values. Return None to not record anything.
876
+ """
877
+ return None
878
+
853
879
  def on_trade_closed(self, context: Context, trade: Trade):
854
880
  pass
855
881
 
@@ -50,7 +50,7 @@ def validate_and_create_checkpoints(
50
50
  verbose_file_handle = None
51
51
 
52
52
  if verbose_output_file is not None:
53
- verbose_file_handle = open(verbose_output_file, 'w')
53
+ verbose_file_handle = open(verbose_output_file, 'w', encoding='utf-8')
54
54
 
55
55
  def echo(msg):
56
56
  verbose_file_handle.write(msg + "\n")
@@ -112,6 +112,7 @@ class BacktestRun:
112
112
  metadata: Dict[str, str] = field(default_factory=dict)
113
113
  signals: Dict[str, Dict[str, Any]] = field(default_factory=dict)
114
114
  signal_events: List[Dict[str, Any]] = field(default_factory=list)
115
+ recorded_values: Dict[str, List] = field(default_factory=dict)
115
116
 
116
117
  def to_dict(self) -> dict:
117
118
  """
@@ -167,6 +168,16 @@ class BacktestRun:
167
168
  "date": ensure_iso(evt["date"])
168
169
  } for evt in self.signal_events
169
170
  ],
171
+ "recorded_values": {
172
+ key: [
173
+ {
174
+ "datetime": ensure_iso(entry[0]),
175
+ "value": entry[1]
176
+ }
177
+ for entry in entries
178
+ ]
179
+ for key, entries in self.recorded_values.items()
180
+ },
170
181
  }
171
182
 
172
183
  @staticmethod
@@ -330,10 +341,26 @@ class BacktestRun:
330
341
  pass
331
342
  signal_events.append(parsed)
332
343
 
344
+ # Parse recorded_values
345
+ raw_recorded = data.pop("recorded_values", {})
346
+ recorded_values = {}
347
+ for key, entries in raw_recorded.items():
348
+ parsed_entries = []
349
+ for entry in entries:
350
+ dt = entry.get("datetime")
351
+ if isinstance(dt, str):
352
+ try:
353
+ dt = datetime.fromisoformat(dt)
354
+ except (ValueError, TypeError):
355
+ pass
356
+ parsed_entries.append((dt, entry.get("value")))
357
+ recorded_values[key] = parsed_entries
358
+
333
359
  return BacktestRun(
334
360
  backtest_metrics=backtest_metrics,
335
361
  signals=signals,
336
362
  signal_events=signal_events,
363
+ recorded_values=recorded_values,
337
364
  **data
338
365
  )
339
366
 
@@ -1,5 +1,5 @@
1
1
  from .sql_alchemy import Session, setup_sqlalchemy, SQLBaseModel, \
2
- create_all_tables, clear_db, SqliteDecimal
2
+ create_all_tables, clear_db, teardown_sqlalchemy, SqliteDecimal
3
3
 
4
4
  __all__ = [
5
5
  "Session",
@@ -7,5 +7,6 @@ __all__ = [
7
7
  "SQLBaseModel",
8
8
  "create_all_tables",
9
9
  "clear_db",
10
+ "teardown_sqlalchemy",
10
11
  "SqliteDecimal"
11
12
  ]
@@ -3,7 +3,7 @@ from decimal import Decimal
3
3
 
4
4
  from sqlalchemy import create_engine, StaticPool, String
5
5
  from sqlalchemy import inspect
6
- from sqlalchemy.orm import DeclarativeBase, sessionmaker
6
+ from sqlalchemy.orm import DeclarativeBase, sessionmaker, close_all_sessions
7
7
  from sqlalchemy import TypeDecorator
8
8
 
9
9
  from investing_algorithm_framework.domain import SQLALCHEMY_DATABASE_URI, \
@@ -83,6 +83,34 @@ def create_all_tables():
83
83
  SQLBaseModel.metadata.create_all(bind=Session().bind)
84
84
 
85
85
 
86
+ def teardown_sqlalchemy():
87
+ """
88
+ Dispose the engine and close all sessions to release file locks.
89
+ This is essential on Windows where file locks are mandatory and
90
+ prevent deletion of SQLite database files while connections are open.
91
+ """
92
+ close_all_sessions()
93
+ bind = Session.kw.get("bind")
94
+
95
+ if bind is not None:
96
+
97
+ # StaticPool._close_connection() is a no-op, so
98
+ # engine.dispose() alone won't close the underlying DBAPI
99
+ # connection. Use invalidate() which bypasses the pool's
100
+ # _close_connection and calls dialect.do_close() directly,
101
+ # ensuring the sqlite3 file lock is released on Windows.
102
+ try:
103
+ conn = bind.connect()
104
+ conn.invalidate()
105
+ conn.close()
106
+ except Exception:
107
+ pass
108
+
109
+ bind.dispose()
110
+
111
+ Session.configure(bind=None)
112
+
113
+
86
114
  from sqlalchemy import event
87
115
  from sqlalchemy.orm import mapper
88
116
  from datetime import timezone
@@ -98,6 +126,7 @@ def clear_db(db_uri):
98
126
  Returns:
99
127
  None
100
128
  """
129
+ engine = None
101
130
  # Drop all tables before deleting file
102
131
  try:
103
132
  engine = create_engine(db_uri)
@@ -107,12 +136,9 @@ def clear_db(db_uri):
107
136
  SQLBaseModel.metadata.drop_all(bind=engine)
108
137
  except Exception as e:
109
138
  logger.error(f"Error dropping tables: {e}")
110
-
111
- # # Clear mappers (if using classical mappings)
112
- # try:
113
- # clear_mappers()
114
- # except Exception:
115
- # pass # ignore if not needed
139
+ finally:
140
+ if engine is not None:
141
+ engine.dispose()
116
142
 
117
143
 
118
144
  @event.listens_for(mapper, "load")