investing-algorithm-framework 8.3.0__tar.gz → 8.4.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 (286) hide show
  1. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/PKG-INFO +31 -9
  2. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/README.md +29 -7
  3. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/app.py +23 -0
  4. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/context.py +62 -0
  5. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/dashboard.css +4 -0
  6. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +31 -0
  7. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/strategy.py +26 -0
  8. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +1 -1
  9. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +27 -0
  10. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/database/__init__.py +2 -1
  11. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +33 -7
  12. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +5 -0
  13. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +32 -0
  14. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/pyproject.toml +2 -2
  15. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/LICENSE +0 -0
  16. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/__init__.py +0 -0
  17. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/__init__.py +0 -0
  18. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
  19. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/markdown.py +0 -0
  20. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/analysis/ranking.py +0 -0
  21. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/__init__.py +0 -0
  22. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  23. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  24. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  25. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  26. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  27. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  28. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  29. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/backtest_report.py +0 -0
  30. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/backtest_report_old.py +0 -0
  31. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  32. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  33. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
  34. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  35. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  36. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  37. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  38. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  39. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  40. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  41. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  42. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  43. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  44. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  45. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  46. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  47. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  48. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/dashboard.js +0 -0
  49. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  50. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  51. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  52. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  53. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  54. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  55. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  56. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/task.py +0 -0
  57. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  58. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  59. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  60. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  61. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  62. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  63. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  64. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  65. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  66. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  67. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  68. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  69. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  70. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  71. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  72. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/cli.py +0 -0
  73. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  74. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  75. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  76. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/mcp_server.py +0 -0
  77. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  78. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  79. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  80. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  81. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  82. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  83. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  84. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  85. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  86. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  87. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  88. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  89. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  90. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  91. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  92. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  93. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  94. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  95. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  96. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  97. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  98. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/create_app.py +0 -0
  99. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/dependency_container.py +0 -0
  100. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/__init__.py +0 -0
  101. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
  102. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
  103. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
  104. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  105. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  106. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
  107. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  108. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
  109. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
  110. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +0 -0
  111. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
  112. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
  113. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
  114. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/blotter.py +0 -0
  115. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/config.py +0 -0
  116. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/constants.py +0 -0
  117. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  118. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  119. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  120. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  121. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/fx.py +0 -0
  122. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  123. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  124. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  125. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  126. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  127. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  128. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  129. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  130. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  131. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  132. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order.py +0 -0
  133. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  134. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  135. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/order/order_type.py +0 -0
  136. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  137. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  138. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  139. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  140. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  141. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  142. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
  143. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  144. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
  145. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
  146. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
  147. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
  148. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
  149. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  150. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  151. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  152. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  153. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  154. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  155. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  156. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  157. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  158. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  159. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  160. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  161. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  162. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  163. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  164. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  165. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  166. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  167. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  168. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  169. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  170. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  171. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  172. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  173. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  174. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  175. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  176. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  177. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  178. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  179. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  180. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  181. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/download_data.py +0 -0
  182. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  183. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  184. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/alpha_vantage.py +0 -0
  185. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/base_url.py +0 -0
  186. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  187. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  188. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/csv_url.py +0 -0
  189. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/json_url.py +0 -0
  190. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/ohlcv_base.py +0 -0
  191. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  192. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/parquet_url.py +0 -0
  193. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/polygon.py +0 -0
  194. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/data_providers/yahoo.py +0 -0
  195. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  196. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  197. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  198. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  199. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  200. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
  201. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  202. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  203. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  204. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  205. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  206. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  207. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  208. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  209. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  210. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  211. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  212. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  213. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +0 -0
  214. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  215. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  216. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  217. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  218. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  219. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  220. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  221. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  222. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  223. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
  224. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  225. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  226. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  227. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  228. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  229. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  230. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  231. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  232. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
  233. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +0 -0
  234. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/__init__.py +0 -0
  235. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  236. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  237. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/data_providers/data.py +0 -0
  238. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
  239. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  240. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
  241. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  242. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  243. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  244. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  245. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  246. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  247. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  248. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  249. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  250. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  251. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  252. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  253. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  254. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  255. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  256. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  257. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  258. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
  259. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  260. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  261. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  262. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  263. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  264. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  265. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +0 -0
  266. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  267. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/order_service/order_service.py +0 -0
  268. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  269. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  270. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  271. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  272. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  273. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  274. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  275. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  276. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  277. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  278. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  279. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  280. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +0 -0
  281. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  282. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  283. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  284. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
  285. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.0}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
  286. {investing_algorithm_framework-8.3.0 → investing_algorithm_framework-8.4.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.4.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,28 @@ 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%20(main)&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%20(main)&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%20(main)&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
59
+ </a>
60
+ <br>
61
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
62
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=linux%20(dev)&style=flat-square&logo=linux&logoColor=white" alt="linux dev" style="height: 20px;">
63
+ </a>
64
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
65
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=macos%20(dev)&style=flat-square&logo=apple&logoColor=white" alt="macos dev" style="height: 20px;">
66
+ </a>
67
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
68
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=windows%20(dev)&style=flat-square&logo=windows&logoColor=white" alt="windows dev" style="height: 20px;">
53
69
  </a>
54
70
  <a href="https://pypi.org/project/investing-algorithm-framework/">
55
71
  <img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
@@ -102,7 +118,7 @@ Description-Content-Type: text/markdown
102
118
 
103
119
  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
120
 
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.
121
+ 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
122
 
107
123
  <details open>
108
124
  <summary>
@@ -110,6 +126,10 @@ This framework is built around the full loop: **create strategies → backtest t
110
126
  </summary> <br>
111
127
 
112
128
  - 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
129
+ - ⚡ **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
130
+ - 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
131
+ - 🔀 **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
132
+ - 🚀 **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
133
  - ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
114
134
  - 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
115
135
  - 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
@@ -118,7 +138,8 @@ This framework is built around the full loop: **create strategies → backtest t
118
138
  - 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
119
139
  - 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
120
140
  - 🌐 **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
141
+ - � **[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()`
142
+ - �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
122
143
 
123
144
  </details>
124
145
 
@@ -306,13 +327,14 @@ report.save("my_report.html")
306
327
  |---|---|
307
328
  | **[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
329
  | **[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 |
330
+ | **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
310
331
  | **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
311
332
  | **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
312
333
  | **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
313
334
  | **[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
335
  | **[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
336
  | **[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 |
337
+ | **[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
338
  | **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
317
339
  | **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
318
340
 
@@ -347,7 +369,7 @@ python -m unittest discover -s tests
347
369
 
348
370
  - [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
349
371
  - Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
350
- - PRs go against the `develop` branch
372
+ - PRs go against the `dev` branch
351
373
 
352
374
  ## Risk Disclaimer
353
375
 
@@ -3,12 +3,28 @@
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%20(main)&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%20(main)&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%20(main)&style=flat-square&logo=windows&logoColor=white" alt="windows main" style="height: 20px;">
18
+ </a>
19
+ <br>
20
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
21
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=linux%20(dev)&style=flat-square&logo=linux&logoColor=white" alt="linux dev" style="height: 20px;">
22
+ </a>
23
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
24
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=macos%20(dev)&style=flat-square&logo=apple&logoColor=white" alt="macos dev" style="height: 20px;">
25
+ </a>
26
+ <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml?query=branch%3Adev">
27
+ <img src="https://img.shields.io/github/actions/workflow/status/coding-kitties/investing-algorithm-framework/test.yml?branch=dev&label=windows%20(dev)&style=flat-square&logo=windows&logoColor=white" alt="windows dev" style="height: 20px;">
12
28
  </a>
13
29
  <a href="https://pypi.org/project/investing-algorithm-framework/">
14
30
  <img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg?style=flat-square" alt="pypi" style="height: 20px;">
@@ -61,7 +77,7 @@
61
77
 
62
78
  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
79
 
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.
80
+ 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
81
 
66
82
  <details open>
67
83
  <summary>
@@ -69,6 +85,10 @@ This framework is built around the full loop: **create strategies → backtest t
69
85
  </summary> <br>
70
86
 
71
87
  - 📊 **30+ Metrics** — CAGR, Sharpe, Sortino, Calmar, VaR, CVaR, Max DD, Recovery & more
88
+ - ⚡ **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
89
+ - 🏃 **Event-Driven Backtesting** — Once promising strategies are identified via vector backtests, run full event-driven backtests to simulate realistic execution and portfolio management
90
+ - 🔀 **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
91
+ - 🚀 **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
92
  - ⚔️ **Multi-Strategy Comparison** — Rank, filter & compare strategies in a single interactive report
73
93
  - 🪟 **Multi-Window Robustness** — Test across different time periods with window coverage analysis
74
94
  - 📈 **Equity & Drawdown Charts** — Overlay equity curves, rolling Sharpe, drawdown & return distributions
@@ -77,7 +97,8 @@ This framework is built around the full loop: **create strategies → backtest t
77
97
  - 📉 **Benchmark Comparison** — Beat-rate analysis vs Buy & Hold, DCA, risk-free & custom benchmarks
78
98
  - 📄 **One-Click HTML Report** — Self-contained file, no server, dark & light theme, shareable
79
99
  - 🌐 **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
100
+ - � **[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()`
101
+ - �🚀 **Build → Backtest → Deploy** — Local dev, cloud deploy (AWS / Azure), or monetize on Finterion
81
102
 
82
103
  </details>
83
104
 
@@ -265,13 +286,14 @@ report.save("my_report.html")
265
286
  |---|---|
266
287
  | **[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
288
  | **[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 |
289
+ | **[Vectorized Backtesting](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/vector-backtesting)** | Fast signal research and prototyping |
269
290
  | **50+ Metrics** | CAGR, Sharpe, Sortino, max drawdown, win rate, profit factor, recovery factor, volatility, and more |
270
291
  | **[Live Trading](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/application-setup)** | Connect to exchanges via CCXT for real-time execution |
271
292
  | **[Portfolio Management](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/portfolio-configuration)** | Position tracking, trade management, persistence |
272
293
  | **[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
294
  | **[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
295
  | **[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 |
296
+ | **[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
297
  | **[Strategies](https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/strategies)** | OHLCV, tickers, custom data — Polars and Pandas native |
276
298
  | **[Extensible](https://coding-kitties.github.io/investing-algorithm-framework/Advanced%20Concepts/custom-data-providers)** | Custom data providers, order executors, and strategy classes |
277
299
 
@@ -306,7 +328,7 @@ python -m unittest discover -s tests
306
328
 
307
329
  - [Open an issue](https://github.com/coding-kitties/investing-algorithm-framework/issues/new) for bugs or ideas
308
330
  - Read the [Contributing Guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing%20Guide/contributing)
309
- - PRs go against the `develop` branch
331
+ - PRs go against the `dev` branch
310
332
 
311
333
  ## Risk Disclaimer
312
334
 
@@ -368,6 +368,29 @@ class App:
368
368
  logger.info(
369
369
  f"Removing existing database at {database_path}"
370
370
  )
371
+
372
+ # Dispose the existing engine to release file locks
373
+ # (required on Windows where locks are mandatory)
374
+ from investing_algorithm_framework.infrastructure.database \
375
+ import Session
376
+ from sqlalchemy.orm import close_all_sessions
377
+ close_all_sessions()
378
+ bind = Session.kw.get("bind")
379
+
380
+ if bind is not None:
381
+
382
+ try:
383
+ conn = bind.connect()
384
+ conn.invalidate()
385
+ conn.close()
386
+ except Exception:
387
+ pass
388
+
389
+ bind.dispose()
390
+
391
+ import gc
392
+ gc.collect()
393
+
371
394
  os.remove(database_path)
372
395
 
373
396
  # Create the sqlalchemy database uri
@@ -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 = {}
@@ -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")
@@ -112,6 +112,8 @@ class EventBacktestService:
112
112
  backtest_date_range=backtest_date_range,
113
113
  number_of_runs=event_loop_service.total_number_of_runs,
114
114
  risk_free_rate=risk_free_rate,
115
+ recorded_values=event_loop_service.context
116
+ .get_recorded_values(),
115
117
  )
116
118
 
117
119
  def generate_schedule(
@@ -175,6 +177,7 @@ class EventBacktestService:
175
177
  backtest_date_range: BacktestDateRange,
176
178
  number_of_runs: int,
177
179
  risk_free_rate: float,
180
+ recorded_values: dict = None,
178
181
  ) -> BacktestRun:
179
182
  """
180
183
  Create a BacktestRun from the current state after event loop execution.
@@ -184,6 +187,7 @@ class EventBacktestService:
184
187
  backtest_date_range: The date range of the backtest.
185
188
  number_of_runs: Total number of strategy executions.
186
189
  risk_free_rate: Risk-free rate for metrics calculation.
190
+ recorded_values: Optional dict of recorded values from context.
187
191
 
188
192
  Returns:
189
193
  BacktestRun: The completed backtest run with metrics.
@@ -215,6 +219,7 @@ class EventBacktestService:
215
219
  positions=self._position_repository.get_all(
216
220
  {"portfolio": portfolio.id}
217
221
  ),
222
+ recorded_values=recorded_values or {},
218
223
  )
219
224
 
220
225
  # Calculate and add metrics
@@ -75,6 +75,9 @@ class VectorBacktestService:
75
75
  scale_in_signals = strategy.generate_scale_in_signals(data)
76
76
  scale_out_signals = strategy.generate_scale_out_signals(data)
77
77
 
78
+ # Generate optional recorded values
79
+ raw_recorded = strategy.generate_recorded_values(data)
80
+
78
81
  if scale_in_signals is None:
79
82
  scale_in_signals = buy_signals
80
83
 
@@ -798,6 +801,7 @@ class VectorBacktestService:
798
801
  symbols=list(buy_signals.keys()),
799
802
  signals=raw_signals,
800
803
  signal_events=signal_events,
804
+ recorded_values=self._convert_recorded_values(raw_recorded),
801
805
  )
802
806
 
803
807
  # Create backtest metrics
@@ -806,6 +810,34 @@ class VectorBacktestService:
806
810
  )
807
811
  return run
808
812
 
813
+ @staticmethod
814
+ def _convert_recorded_values(raw_recorded):
815
+ """
816
+ Convert recorded values from pandas Series to list-of-tuples format.
817
+
818
+ Args:
819
+ raw_recorded: Dict[str, pd.Series] or None from
820
+ strategy.generate_recorded_values().
821
+
822
+ Returns:
823
+ Dict[str, List[Tuple[datetime, Any]]]: Converted values.
824
+ """
825
+ if raw_recorded is None:
826
+ return {}
827
+
828
+ recorded_values = {}
829
+ for key, series in raw_recorded.items():
830
+ entries = []
831
+ for ts, val in series.items():
832
+ dt = ts
833
+ if isinstance(dt, pd.Timestamp):
834
+ dt = dt.to_pydatetime()
835
+ if hasattr(dt, 'tzinfo') and dt.tzinfo is None:
836
+ dt = dt.replace(tzinfo=timezone.utc)
837
+ entries.append((dt, val))
838
+ recorded_values[key] = entries
839
+ return recorded_values
840
+
809
841
  @staticmethod
810
842
  def get_most_granular_ohlcv_data_source(data_sources):
811
843
  """
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "investing-algorithm-framework"
3
- version = "v8.3.0"
3
+ version = "v8.4.0"
4
4
  description = "A framework for creating trading bots"
5
5
  authors = ["MDUYN"]
6
6
  readme = "README.md"
@@ -12,7 +12,7 @@ python = ">=3.10,<4.0"
12
12
  wrapt = ">=1.16.0"
13
13
  Flask = ">=3.1.0"
14
14
  Flask-Migrate = ">=2.6.0"
15
- Flask-Cors = ">=3.0.9,<5.0.0"
15
+ Flask-Cors = ">=3.0.9,<7.0.0"
16
16
  SQLAlchemy = ">=2.0.18"
17
17
  marshmallow = ">=3.5.0"
18
18
  ccxt = ">=4.2.48"