investing-algorithm-framework 8.1.0__tar.gz → 8.2.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 (277) hide show
  1. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/PKG-INFO +8 -2
  2. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/README.md +7 -1
  3. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/context.py +284 -2
  4. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/backtest_report.py +92 -11
  5. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/templates/dashboard.css +0 -8
  6. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/templates/dashboard.js +161 -15
  7. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/templates/dashboard_template.html.j2 +2 -127
  8. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/strategy.py +66 -1
  9. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/order/order.py +19 -3
  10. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/order/order_type.py +1 -0
  11. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +23 -0
  12. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/order_service/order_backtest_service.py +5 -1
  13. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/order_service/order_service.py +60 -0
  14. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +70 -1
  15. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/pyproject.toml +1 -1
  16. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/LICENSE +0 -0
  17. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/__init__.py +0 -0
  18. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/analysis/__init__.py +0 -0
  19. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/analysis/backtest_data_ranges.py +0 -0
  20. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/analysis/markdown.py +0 -0
  21. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/analysis/ranking.py +0 -0
  22. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/__init__.py +0 -0
  23. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/algorithm/__init__.py +0 -0
  24. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/algorithm/algorithm.py +0 -0
  25. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/algorithm/algorithm_factory.py +0 -0
  26. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/app.py +0 -0
  27. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/app_hook.py +0 -0
  28. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/eventloop.py +0 -0
  29. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/__init__.py +0 -0
  30. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/ascii.py +0 -0
  31. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/backtest_report_old.py +0 -0
  32. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/__init__.py +0 -0
  33. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +0 -0
  34. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/equity_curve.py +0 -0
  35. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +0 -0
  36. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/line_chart.py +0 -0
  37. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +0 -0
  38. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +0 -0
  39. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +0 -0
  40. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +0 -0
  41. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/generate.py +0 -0
  42. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/tables/__init__.py +0 -0
  43. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +0 -0
  44. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  45. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +0 -0
  46. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +0 -0
  47. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/tables/trades_table.py +0 -0
  48. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/tables/utils.py +0 -0
  49. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +0 -0
  50. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/stateless/__init__.py +0 -0
  51. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/stateless/action_handlers/__init__.py +0 -0
  52. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +0 -0
  53. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +0 -0
  54. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +0 -0
  55. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/stateless/exception_handler.py +0 -0
  56. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/task.py +0 -0
  57. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/__init__.py +0 -0
  58. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/controllers/__init__.py +0 -0
  59. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/controllers/orders.py +0 -0
  60. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/controllers/portfolio.py +0 -0
  61. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/controllers/positions.py +0 -0
  62. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/create_app.py +0 -0
  63. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/error_handler.py +0 -0
  64. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/responses.py +0 -0
  65. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/run_strategies.py +0 -0
  66. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/schemas/__init__.py +0 -0
  67. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/schemas/order.py +0 -0
  68. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/schemas/portfolio.py +0 -0
  69. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/schemas/position.py +0 -0
  70. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/app/web/setup_cors.py +0 -0
  71. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/__init__.py +0 -0
  72. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/cli.py +0 -0
  73. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/deploy_to_aws_lambda.py +0 -0
  74. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/deploy_to_azure_function.py +0 -0
  75. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/initialize_app.py +0 -0
  76. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/mcp_server.py +0 -0
  77. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/.gitignore.template +0 -0
  78. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/app.py.template +0 -0
  79. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +0 -0
  80. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/app_azure_function.py.template +0 -0
  81. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/app_web.py.template +0 -0
  82. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +0 -0
  83. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +0 -0
  84. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +0 -0
  85. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +0 -0
  86. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +0 -0
  87. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/azure_function_host.json.template +0 -0
  88. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +0 -0
  89. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +0 -0
  90. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/data_providers.py.template +0 -0
  91. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/env.example.template +0 -0
  92. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/env_azure_function.example.template +0 -0
  93. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/market_data_providers.py.template +0 -0
  94. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/readme.md.template +0 -0
  95. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/requirements.txt.template +0 -0
  96. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/run_backtest.py.template +0 -0
  97. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/templates/strategy.py.template +0 -0
  98. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/cli/validate_backtest_checkpoints.py +0 -0
  99. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/create_app.py +0 -0
  100. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/dependency_container.py +0 -0
  101. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/__init__.py +0 -0
  102. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/algorithm_id.py +0 -0
  103. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/__init__.py +0 -0
  104. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest.py +0 -0
  105. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest_date_range.py +0 -0
  106. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +0 -0
  107. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest_metrics.py +0 -0
  108. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +0 -0
  109. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest_run.py +0 -0
  110. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +0 -0
  111. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/backtest_utils.py +0 -0
  112. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/combine_backtests.py +0 -0
  113. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/templates/backtest.html +0 -0
  114. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-dark.png +0 -0
  115. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/backtesting/templates/finterion-light.png +0 -0
  116. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/config.py +0 -0
  117. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/constants.py +0 -0
  118. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/data_provider.py +0 -0
  119. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/data_structures.py +0 -0
  120. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/decimal_parsing.py +0 -0
  121. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/exceptions.py +0 -0
  122. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/__init__.py +0 -0
  123. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/app_mode.py +0 -0
  124. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/base_model.py +0 -0
  125. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/data/__init__.py +0 -0
  126. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/data/data_source.py +0 -0
  127. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/data/data_type.py +0 -0
  128. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/event.py +0 -0
  129. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/market/__init__.py +0 -0
  130. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/market/market_credential.py +0 -0
  131. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/order/__init__.py +0 -0
  132. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/order/order_side.py +0 -0
  133. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/order/order_status.py +0 -0
  134. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/portfolio/__init__.py +0 -0
  135. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio.py +0 -0
  136. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +0 -0
  137. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +0 -0
  138. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/position/__init__.py +0 -0
  139. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/position/position.py +0 -0
  140. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/position/position_size.py +0 -0
  141. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/position/position_snapshot.py +0 -0
  142. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/risk_rules/__init__.py +0 -0
  143. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/risk_rules/scaling_rule.py +0 -0
  144. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +0 -0
  145. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +0 -0
  146. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/risk_rules/trading_cost.py +0 -0
  147. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/snapshot_interval.py +0 -0
  148. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/strategy_profile.py +0 -0
  149. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/time_frame.py +0 -0
  150. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/time_interval.py +0 -0
  151. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/time_unit.py +0 -0
  152. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  153. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/tracing/trace.py +0 -0
  154. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/trade/__init__.py +0 -0
  155. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/trade/trade.py +0 -0
  156. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/trade/trade_status.py +0 -0
  157. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +0 -0
  158. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/models/trade/trade_take_profit.py +0 -0
  159. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/order_executor.py +0 -0
  160. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/portfolio_provider.py +0 -0
  161. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/services/__init__.py +0 -0
  162. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/services/market_credential_service.py +0 -0
  163. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/services/portfolios/__init__.py +0 -0
  164. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +0 -0
  165. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/services/rounding_service.py +0 -0
  166. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/services/state_handler.py +0 -0
  167. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/stateless_actions.py +0 -0
  168. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/strategy.py +0 -0
  169. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/__init__.py +0 -0
  170. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/csv.py +0 -0
  171. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/custom_tqdm.py +0 -0
  172. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/dates.py +0 -0
  173. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +0 -0
  174. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/polars.py +0 -0
  175. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/random.py +0 -0
  176. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/signatures.py +0 -0
  177. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/stoppable_thread.py +0 -0
  178. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/domain/utils/synchronized.py +0 -0
  179. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/download_data.py +0 -0
  180. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/__init__.py +0 -0
  181. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/data_providers/__init__.py +0 -0
  182. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/data_providers/ccxt.py +0 -0
  183. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/data_providers/csv.py +0 -0
  184. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/data_providers/pandas.py +0 -0
  185. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/database/__init__.py +0 -0
  186. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/database/sql_alchemy.py +0 -0
  187. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/__init__.py +0 -0
  188. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/decimal_parser.py +0 -0
  189. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/model_extension.py +0 -0
  190. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/order/__init__.py +0 -0
  191. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/order/order.py +0 -0
  192. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/order/trade_allocation.py +0 -0
  193. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/order_trade_association.py +0 -0
  194. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +0 -0
  195. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +0 -0
  196. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/portfolio/sql_portfolio.py +0 -0
  197. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/position/__init__.py +0 -0
  198. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/position/position.py +0 -0
  199. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +0 -0
  200. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/trades/__init__.py +0 -0
  201. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade.py +0 -0
  202. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +0 -0
  203. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +0 -0
  204. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/order_executors/__init__.py +0 -0
  205. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +0 -0
  206. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +0 -0
  207. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +0 -0
  208. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/__init__.py +0 -0
  209. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/order_repository.py +0 -0
  210. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +0 -0
  211. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +0 -0
  212. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/position_repository.py +0 -0
  213. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +0 -0
  214. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/repository.py +0 -0
  215. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_allocation_repository.py +0 -0
  216. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_repository.py +0 -0
  217. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +0 -0
  218. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +0 -0
  219. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/__init__.py +0 -0
  220. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/aws/__init__.py +0 -0
  221. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/aws/state_handler.py +0 -0
  222. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/azure/__init__.py +0 -0
  223. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/azure/state_handler.py +0 -0
  224. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +0 -0
  225. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +0 -0
  226. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +0 -0
  227. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +0 -0
  228. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/__init__.py +0 -0
  229. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/configuration_service.py +0 -0
  230. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/data_providers/__init__.py +0 -0
  231. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/data_providers/data.py +0 -0
  232. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/data_providers/data_provider_service.py +0 -0
  233. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/market_credential_service.py +0 -0
  234. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/__init__.py +0 -0
  235. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/alpha.py +0 -0
  236. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/beta.py +0 -0
  237. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/cagr.py +0 -0
  238. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/calmar_ratio.py +0 -0
  239. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/drawdown.py +0 -0
  240. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/equity_curve.py +0 -0
  241. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/exposure.py +0 -0
  242. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/generate.py +0 -0
  243. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/mean_daily_return.py +0 -0
  244. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/price_efficiency.py +0 -0
  245. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/profit_factor.py +0 -0
  246. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/recovery.py +0 -0
  247. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/returns.py +0 -0
  248. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/risk_free_rate.py +0 -0
  249. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/sharpe_ratio.py +0 -0
  250. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/sortino_ratio.py +0 -0
  251. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/standard_deviation.py +0 -0
  252. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/trades.py +0 -0
  253. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  254. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  255. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  256. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/volatility.py +0 -0
  257. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/metrics/win_rate.py +0 -0
  258. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/order_service/__init__.py +0 -0
  259. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/order_service/order_executor_lookup.py +0 -0
  260. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/portfolios/__init__.py +0 -0
  261. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +0 -0
  262. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/portfolios/portfolio_configuration_service.py +0 -0
  263. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -0
  264. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/portfolios/portfolio_service.py +0 -0
  265. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +0 -0
  266. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -0
  267. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/positions/__init__.py +0 -0
  268. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/positions/position_service.py +0 -0
  269. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/positions/position_snapshot_service.py +0 -0
  270. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/repository_service.py +0 -0
  271. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/trade_order_evaluator/__init__.py +0 -0
  272. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +0 -0
  273. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +0 -0
  274. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/trade_service/__init__.py +0 -0
  275. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/trade_service/trade_service.py +0 -0
  276. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.0}/investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +0 -0
  277. {investing_algorithm_framework-8.1.0 → investing_algorithm_framework-8.2.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.1.0
3
+ Version: 8.2.0
4
4
  Summary: A framework for creating trading bots
5
5
  Author: MDUYN
6
6
  Requires-Python: >=3.10
@@ -55,7 +55,7 @@ Description-Content-Type: text/markdown
55
55
  <img src="https://img.shields.io/badge/apache%202.0-blue.svg?style=flat-square&label=license" alt="license" style="height: 20px;">
56
56
  </a>
57
57
  <br>
58
- <a href="https://discord.gg/dQsRmGZP">
58
+ <a href="https://discord.gg/jQsnnYZgzR">
59
59
  <img src="https://img.shields.io/badge/discord-7289da.svg?style=flat-square&logo=discord" alt="discord" style="height: 20px;">
60
60
  </a>
61
61
  <a href="https://www.reddit.com/r/InvestingBots/">
@@ -70,6 +70,12 @@ Description-Content-Type: text/markdown
70
70
  <img src="static/showcase.svg" alt="dashboard" style="max-width: 100%;">
71
71
  </p>
72
72
 
73
+ <p align="center">
74
+ <a href="https://discord.gg/jQsnnYZgzR">
75
+ <img src="https://img.shields.io/badge/Join%20our%20Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white" alt="Join our Discord">
76
+ </a>
77
+ </p>
78
+
73
79
  <p align="center">
74
80
  <sub><b>Sponsored by</b></sub>
75
81
  <br>
@@ -20,7 +20,7 @@
20
20
  <img src="https://img.shields.io/badge/apache%202.0-blue.svg?style=flat-square&label=license" alt="license" style="height: 20px;">
21
21
  </a>
22
22
  <br>
23
- <a href="https://discord.gg/dQsRmGZP">
23
+ <a href="https://discord.gg/jQsnnYZgzR">
24
24
  <img src="https://img.shields.io/badge/discord-7289da.svg?style=flat-square&logo=discord" alt="discord" style="height: 20px;">
25
25
  </a>
26
26
  <a href="https://www.reddit.com/r/InvestingBots/">
@@ -35,6 +35,12 @@
35
35
  <img src="static/showcase.svg" alt="dashboard" style="max-width: 100%;">
36
36
  </p>
37
37
 
38
+ <p align="center">
39
+ <a href="https://discord.gg/jQsnnYZgzR">
40
+ <img src="https://img.shields.io/badge/Join%20our%20Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white" alt="Join our Discord">
41
+ </a>
42
+ </p>
43
+
38
44
  <p align="center">
39
45
  <sub><b>Sponsored by</b></sub>
40
46
  <br>
@@ -51,6 +51,57 @@ class Context:
51
51
  self.trade_take_profit_service: TradeTakeProfitService = \
52
52
  trade_take_profit_service
53
53
 
54
+ def _validate_target_symbol(self, target_symbol, market=None):
55
+ """
56
+ Validate the target_symbol for order creation:
57
+ 1. Prevents orders where target_symbol equals trading_symbol
58
+ (e.g. EUR/EUR).
59
+ 2. Checks that a data source exists for the
60
+ target_symbol/trading_symbol combination (e.g. BTC/EUR).
61
+
62
+ Args:
63
+ target_symbol: The symbol of the asset to trade
64
+ market: The market to check against
65
+
66
+ Raises:
67
+ OperationalException: If validation fails
68
+ """
69
+ portfolio = self.portfolio_service.find({"market": market})
70
+ trading_symbol = portfolio.trading_symbol
71
+
72
+ # Check target_symbol != trading_symbol
73
+ if target_symbol.upper() == trading_symbol.upper():
74
+ raise OperationalException(
75
+ f"target_symbol '{target_symbol}' is the same as "
76
+ f"the trading_symbol '{trading_symbol}'. "
77
+ f"This would result in a "
78
+ f"'{trading_symbol}/{trading_symbol}' "
79
+ f"order which is not valid. "
80
+ f"To skip this check, set validate_symbol=False "
81
+ f"or omit the parameter."
82
+ )
83
+
84
+ # Check that a data source is registered for this pair
85
+ expected_symbol = f"{target_symbol}/{trading_symbol}".upper()
86
+ known_symbols = set()
87
+
88
+ if self.data_provider_service.data_provider_index is not None:
89
+ for data_source, _ in \
90
+ self.data_provider_service \
91
+ .data_provider_index.get_all():
92
+ if data_source.symbol is not None:
93
+ known_symbols.add(data_source.symbol.upper())
94
+
95
+ if expected_symbol not in known_symbols:
96
+ sorted_symbols = sorted(known_symbols)
97
+ raise OperationalException(
98
+ f"No data source registered for '{expected_symbol}'. "
99
+ f"A data source is required to track price history. "
100
+ f"Registered data source symbols: {sorted_symbols}. "
101
+ f"To skip this check, set validate_symbol=False "
102
+ f"or omit the parameter."
103
+ )
104
+
54
105
  @property
55
106
  def config(self):
56
107
  """
@@ -78,7 +129,8 @@ class Context:
78
129
  market=None,
79
130
  execute=True,
80
131
  validate=True,
81
- sync=True
132
+ sync=True,
133
+ validate_symbol=False
82
134
  ) -> Order:
83
135
  """
84
136
  Function to create an order. This function will create an order
@@ -96,10 +148,15 @@ class Context:
96
148
  validate: If set to True, the order will be validated
97
149
  sync: If set to True, the created order will be synced
98
150
  with the portfolio of the algorithm.
151
+ validate_symbol: Default False. If set to True,
152
+ validates that target_symbol is not the trading_symbol.
99
153
 
100
154
  Returns:
101
155
  The order created
102
156
  """
157
+ if validate_symbol:
158
+ self._validate_target_symbol(target_symbol, market=market)
159
+
103
160
  portfolio = self.portfolio_service.find({"market": market})
104
161
  order_data = {
105
162
  "target_symbol": target_symbol,
@@ -162,7 +219,8 @@ class Context:
162
219
  execute=True,
163
220
  validate=True,
164
221
  sync=True,
165
- metadata=None
222
+ metadata=None,
223
+ validate_symbol=False
166
224
  ) -> Order:
167
225
  """
168
226
  Function to create a limit order. This function will create a limit
@@ -193,10 +251,15 @@ class Context:
193
251
  sync (optional): Default True. If set to True,
194
252
  the created order will be synced with the
195
253
  portfolio of the algorithm
254
+ validate_symbol (optional): Default False. If set to True,
255
+ validates that target_symbol is not the trading_symbol.
196
256
 
197
257
  Returns:
198
258
  Order: Instance of the order created
199
259
  """
260
+ if validate_symbol:
261
+ self._validate_target_symbol(target_symbol, market=market)
262
+
200
263
  portfolio = self.portfolio_service.find({"market": market})
201
264
 
202
265
  if percentage_of_portfolio is not None:
@@ -270,6 +333,225 @@ class Context:
270
333
  order_data, execute=execute, validate=validate, sync=sync
271
334
  )
272
335
 
336
+ def create_market_order(
337
+ self,
338
+ target_symbol,
339
+ order_side,
340
+ amount=None,
341
+ amount_trading_symbol=None,
342
+ percentage=None,
343
+ percentage_of_portfolio=None,
344
+ percentage_of_position=None,
345
+ precision=None,
346
+ market=None,
347
+ execute=True,
348
+ validate=True,
349
+ sync=True,
350
+ metadata=None
351
+ ) -> Order:
352
+ """
353
+ Function to create a market order. Market orders execute at
354
+ the best available price. In backtesting, this means the
355
+ open price of the next candle (+ slippage).
356
+
357
+ An estimated price (current latest price) is used for amount
358
+ calculation and cash reservation. The actual fill price is
359
+ determined at fill time and the portfolio is reconciled.
360
+
361
+ Args:
362
+ target_symbol: The symbol of the asset to trade
363
+ order_side: The side of the order (BUY or SELL)
364
+ amount (optional): The amount of the asset to trade
365
+ amount_trading_symbol (optional): The amount of the
366
+ trading symbol to trade
367
+ percentage (optional): The percentage of the portfolio
368
+ to allocate to the order
369
+ percentage_of_portfolio (optional): The percentage
370
+ of the portfolio to allocate to the order
371
+ percentage_of_position (optional): The percentage
372
+ of the position to allocate to the
373
+ order. (Only supported for SELL orders)
374
+ precision (optional): The precision of the amount
375
+ market (optional): The market to trade the asset
376
+ execute (optional): Default True. If set to True,
377
+ the order will be executed
378
+ validate (optional): Default True. If set to
379
+ True, the order will be validated
380
+ sync (optional): Default True. If set to True,
381
+ the created order will be synced with the
382
+ portfolio of the algorithm
383
+ metadata (optional): Additional metadata for the order
384
+
385
+ Returns:
386
+ Order: Instance of the order created
387
+ """
388
+ portfolio = self.portfolio_service.find({"market": market})
389
+ full_symbol = (f"{target_symbol}/{portfolio.trading_symbol}")
390
+ estimated_price = self.get_latest_price(full_symbol, market=market)
391
+
392
+ if estimated_price is None:
393
+ raise OperationalException(
394
+ f"Cannot create market order for {target_symbol}: "
395
+ f"no price data available to estimate order size."
396
+ )
397
+
398
+ if percentage_of_portfolio is not None:
399
+ if not OrderSide.BUY.equals(order_side):
400
+ raise OperationalException(
401
+ "Percentage of portfolio is only supported for BUY orders."
402
+ )
403
+
404
+ net_size = portfolio.get_net_size()
405
+ size = net_size * (percentage_of_portfolio / 100)
406
+ amount = size / estimated_price
407
+
408
+ elif percentage_of_position is not None:
409
+
410
+ if not OrderSide.SELL.equals(order_side):
411
+ raise OperationalException(
412
+ "Percentage of position is only supported for SELL orders."
413
+ )
414
+
415
+ position = self.position_service.find(
416
+ {
417
+ "symbol": target_symbol,
418
+ "portfolio": portfolio.id
419
+ }
420
+ )
421
+ amount = position.get_amount() * (percentage_of_position / 100)
422
+
423
+ elif percentage is not None:
424
+ net_size = portfolio.get_net_size()
425
+ size = net_size * (percentage / 100)
426
+ amount = size / estimated_price
427
+
428
+ if precision is not None:
429
+ amount = RoundingService.round_down(amount, precision)
430
+
431
+ if amount_trading_symbol is not None:
432
+ amount = amount_trading_symbol / estimated_price
433
+
434
+ if amount is None:
435
+ raise OperationalException(
436
+ "The amount parameter is required to create a market order. "
437
+ "Either the amount, amount_trading_symbol, percentage, "
438
+ "percentage_of_portfolio or percentage_of_position "
439
+ "parameter must be specified."
440
+ )
441
+
442
+ logger.info(
443
+ f"Creating market order: {target_symbol} "
444
+ f"{order_side} {amount} @ estimated {estimated_price}"
445
+ )
446
+
447
+ order_metadata = metadata if metadata is not None else {}
448
+ order_metadata["estimated_price"] = estimated_price
449
+
450
+ order_data = {
451
+ "target_symbol": target_symbol,
452
+ "price": estimated_price,
453
+ "amount": amount,
454
+ "order_type": OrderType.MARKET.value,
455
+ "order_side": OrderSide.from_value(order_side).value,
456
+ "portfolio_id": portfolio.id,
457
+ "status": OrderStatus.CREATED.value,
458
+ "trading_symbol": portfolio.trading_symbol,
459
+ "metadata": order_metadata,
460
+ }
461
+
462
+ if BACKTESTING_FLAG in self.configuration_service.config \
463
+ and self.configuration_service.config[BACKTESTING_FLAG]:
464
+ order_data["created_at"] = \
465
+ self.configuration_service.config[INDEX_DATETIME]
466
+
467
+ return self.order_service.create(
468
+ order_data, execute=execute, validate=validate, sync=sync
469
+ )
470
+
471
+ def create_market_buy_order(
472
+ self,
473
+ target_symbol,
474
+ amount=None,
475
+ percentage_of_portfolio=None,
476
+ market=None,
477
+ portfolio_id=None,
478
+ metadata=None
479
+ ) -> Order:
480
+ """
481
+ Function to create a market buy order.
482
+
483
+ Args:
484
+ target_symbol (str): The symbol of the asset to buy
485
+ amount (float, optional): The amount of the asset to buy
486
+ percentage_of_portfolio (float, optional): The percentage of the
487
+ portfolio to buy.
488
+ market (str, optional): the portfolio corresponding to the market
489
+ to buy the asset
490
+ portfolio_id (str, optional): The ID of the portfolio to buy
491
+ the asset from.
492
+ metadata (dict, optional): Additional metadata for the order
493
+
494
+ Returns:
495
+ Order: The order created
496
+ """
497
+
498
+ if amount is None and percentage_of_portfolio is None:
499
+ raise OperationalException(
500
+ "Either amount or percentage_of_portfolio must be specified "
501
+ "to create a market buy order."
502
+ )
503
+
504
+ return self.create_market_order(
505
+ target_symbol=target_symbol,
506
+ order_side=OrderSide.BUY,
507
+ amount=amount,
508
+ percentage_of_portfolio=percentage_of_portfolio,
509
+ market=market,
510
+ metadata=metadata
511
+ )
512
+
513
+ def create_market_sell_order(
514
+ self,
515
+ target_symbol,
516
+ amount=None,
517
+ percentage_of_position=None,
518
+ market=None,
519
+ portfolio_id=None,
520
+ metadata=None
521
+ ) -> Order:
522
+ """
523
+ Function to create a market sell order.
524
+
525
+ Args:
526
+ target_symbol (str): The symbol of the asset to sell
527
+ amount (float, optional): The amount of the asset to sell
528
+ percentage_of_position (float, optional): The percentage of the
529
+ position to sell.
530
+ market (str, optional): the portfolio corresponding to the market
531
+ to sell the asset
532
+ portfolio_id (str, optional): The ID of the portfolio to sell
533
+ the asset from.
534
+ metadata (dict, optional): Additional metadata for the order
535
+
536
+ Returns:
537
+ Order: The order created
538
+ """
539
+
540
+ if amount is None and percentage_of_position is None:
541
+ raise OperationalException(
542
+ "Either amount or percentage_of_position must be specified "
543
+ "to create a market sell order."
544
+ )
545
+
546
+ return self.create_market_order(
547
+ target_symbol=target_symbol,
548
+ order_side=OrderSide.SELL,
549
+ amount=amount,
550
+ percentage_of_position=percentage_of_position,
551
+ market=market,
552
+ metadata=metadata
553
+ )
554
+
273
555
  def create_limit_sell_order(
274
556
  self,
275
557
  target_symbol,
@@ -10,7 +10,7 @@ from datetime import datetime, timedelta
10
10
  from jinja2 import Environment, FileSystemLoader
11
11
 
12
12
  from investing_algorithm_framework.domain import (
13
- Backtest, OperationalException
13
+ Backtest, OperationalException, tqdm
14
14
  )
15
15
 
16
16
  logger = logging.getLogger("investing_algorithm_framework")
@@ -34,7 +34,7 @@ _TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'templates')
34
34
 
35
35
 
36
36
  def _read_template(filename):
37
- with open(os.path.join(_TEMPLATE_DIR, filename), 'r') as f:
37
+ with open(os.path.join(_TEMPLATE_DIR, filename), 'r', encoding='utf-8') as f:
38
38
  return f.read()
39
39
 
40
40
 
@@ -88,6 +88,70 @@ def _is_na(val):
88
88
  return False
89
89
 
90
90
 
91
+ def _downsample(series, max_points=300):
92
+ """Downsample a time-series list to at most *max_points* entries.
93
+
94
+ Uses the Largest-Triangle-Three-Buckets (LTTB) algorithm to
95
+ preserve visual fidelity while drastically reducing data size
96
+ for the browser. Always keeps the first and last points.
97
+ """
98
+ if not series or len(series) <= max_points:
99
+ return series
100
+
101
+ n = len(series)
102
+ # Each element is [value, date_str]
103
+ sampled = [series[0]]
104
+ bucket_size = (n - 2) / (max_points - 2)
105
+
106
+ a_idx = 0
107
+ for i in range(1, max_points - 1):
108
+ # Calculate bucket boundaries
109
+ avg_start = int((i) * bucket_size) + 1
110
+ avg_end = int((i + 1) * bucket_size) + 1
111
+ if avg_end > n - 1:
112
+ avg_end = n - 1
113
+
114
+ # Average point of next bucket
115
+ avg_x = 0
116
+ avg_y = 0
117
+ count = avg_end - avg_start
118
+ if count <= 0:
119
+ count = 1
120
+ avg_end = avg_start + 1
121
+ for j in range(avg_start, avg_end):
122
+ avg_x += j
123
+ avg_y += series[j][0]
124
+ avg_x /= count
125
+ avg_y /= count
126
+
127
+ # Current bucket boundaries
128
+ range_start = int((i - 1) * bucket_size) + 1
129
+ range_end = int(i * bucket_size) + 1
130
+ if range_end > n - 1:
131
+ range_end = n - 1
132
+
133
+ # Pick the point with the largest triangle area
134
+ a_x = a_idx
135
+ a_y = series[a_idx][0]
136
+ max_area = -1
137
+ best_idx = range_start
138
+
139
+ for j in range(range_start, range_end):
140
+ area = abs(
141
+ (a_x - avg_x) * (series[j][0] - a_y)
142
+ - (a_x - j) * (avg_y - a_y)
143
+ ) * 0.5
144
+ if area > max_area:
145
+ max_area = area
146
+ best_idx = j
147
+
148
+ sampled.append(series[best_idx])
149
+ a_idx = best_idx
150
+
151
+ sampled.append(series[-1])
152
+ return sampled
153
+
154
+
91
155
  @dataclass
92
156
  class BacktestReport:
93
157
  backtests: List[Backtest] = field(default_factory=list)
@@ -122,7 +186,7 @@ class BacktestReport:
122
186
  self.html_report = self._build_html()
123
187
 
124
188
  path = "/tmp/backtest_report.html"
125
- with open(path, "w") as f:
189
+ with open(path, "w", encoding="utf-8") as f:
126
190
  f.write(self.html_report)
127
191
 
128
192
  if browser:
@@ -144,7 +208,7 @@ class BacktestReport:
144
208
  def save(self, path):
145
209
  if not self.html_report:
146
210
  self.html_report = self._build_html()
147
- with open(path, "w") as f:
211
+ with open(path, "w", encoding="utf-8") as f:
148
212
  f.write(self.html_report)
149
213
 
150
214
  @staticmethod
@@ -162,6 +226,7 @@ class BacktestReport:
162
226
  def open(
163
227
  backtests: List[Backtest] = None,
164
228
  directory_path: Union[str, List[str], None] = None,
229
+ show_progress: bool = False,
165
230
  ) -> "BacktestReport":
166
231
  loaded = []
167
232
  source_tags = []
@@ -178,11 +243,12 @@ class BacktestReport:
178
243
  else:
179
244
  dir_paths = []
180
245
 
246
+ # Collect all backtest paths first for progress tracking
247
+ backtest_paths = []
181
248
  for dp in dir_paths:
182
249
  tag = os.path.basename(os.path.normpath(dp))
183
250
  if BacktestReport._is_backtest(dp):
184
- loaded.append(Backtest.open(dp))
185
- source_tags.append(tag)
251
+ backtest_paths.append((dp, tag))
186
252
  else:
187
253
  for root, dirs, _ in os.walk(dp):
188
254
  for dir_name in dirs:
@@ -192,10 +258,20 @@ class BacktestReport:
192
258
  if BacktestReport._is_backtest(
193
259
  subdir
194
260
  ):
195
- loaded.append(
196
- Backtest.open(subdir)
261
+ backtest_paths.append(
262
+ (subdir, tag)
197
263
  )
198
- source_tags.append(tag)
264
+
265
+ iterator = backtest_paths
266
+ if show_progress:
267
+ iterator = tqdm(
268
+ backtest_paths,
269
+ desc="Loading backtests",
270
+ )
271
+
272
+ for path, tag in iterator:
273
+ loaded.append(Backtest.open(path))
274
+ source_tags.append(tag)
199
275
 
200
276
  for bt in backtests:
201
277
  if not isinstance(bt, Backtest):
@@ -339,10 +415,10 @@ class BacktestReport:
339
415
  initial = ec[0][0] if ec else 1
340
416
  if initial == 0:
341
417
  initial = 1
342
- rep_eq = [
418
+ rep_eq = _downsample([
343
419
  [(v / initial - 1) * 100, _fmt_date(d)]
344
420
  for v, d in ec
345
- ]
421
+ ])
346
422
 
347
423
  # Run IDs / mappings / labels
348
424
  run_ids, run_name_map, run_labels_list = [], {}, []
@@ -680,6 +756,11 @@ class BacktestReport:
680
756
  ),
681
757
  })
682
758
 
759
+ # Downsample heavy time series for browser perf
760
+ eq = _downsample(eq)
761
+ dd = _downsample(dd)
762
+ rs = _downsample(rs)
763
+
683
764
  run_data[rid] = {
684
765
  'label': label,
685
766
  'EQ': eq,
@@ -288,10 +288,6 @@ body { font-family:'Inter',-apple-system,sans-serif; background:var(--bg); color
288
288
  .fin-bottom-cta p { font-size:0.85rem; color:var(--text-secondary); margin-bottom:0; }
289
289
  .dot { width:8px; height:8px; border-radius:50%; display:inline-block; }
290
290
 
291
- /* gen-note */
292
- .gen-note { text-align:center; padding:2rem 0 1rem; color:var(--text-dim); font-size:0.72rem; position:fixed; bottom:0; left:260px; right:0; background:var(--bg); border-top:1px solid var(--border); z-index:5; }
293
- .gen-note a { color:var(--accent); text-decoration:none; }
294
-
295
291
  /* compare */
296
292
  .compare-btn { display:none; align-items:center; gap:0.4rem; font-family:'Inter',sans-serif; font-size:0.85rem; font-weight:600; padding:0.65rem 1.5rem; border-radius:10px; border:none; background:var(--accent); color:#000; cursor:pointer; position:fixed; bottom:2rem; left:50%; transform:translateX(-50%); z-index:1000; box-shadow:0 4px 20px rgba(0,0,0,0.4); transition:all 0.25s ease; }
297
293
  .compare-btn:hover { opacity:0.9; transform:translateX(-50%) scale(1.03); }
@@ -321,8 +317,6 @@ body { font-family:'Inter',-apple-system,sans-serif; background:var(--bg); color
321
317
  .notes-pane.expanded.open { right:0; }
322
318
  body.notes-open .main { width:calc(100vw - 260px - 420px); }
323
319
  body.notes-open.notes-expanded .main { width:calc(100vw - 260px - 50vw); }
324
- body.notes-open .gen-note { right:420px; }
325
- body.notes-open.notes-expanded .gen-note { right:50vw; }
326
320
  body.notes-open .top-controls { right:calc(420px + 1.25rem); }
327
321
  body.notes-open.notes-expanded .top-controls { right:calc(50vw + 1.25rem); }
328
322
 
@@ -511,11 +505,9 @@ body.notes-open.notes-expanded .top-controls { right:calc(50vw + 1.25rem); }
511
505
  @media (max-width:900px) {
512
506
  .sidebar { display:none; }
513
507
  .main { margin-left:0; padding:1.5rem 1rem 4rem; }
514
- .gen-note { left:0; }
515
508
  .grid-2x2 { grid-template-columns:1fr; }
516
509
  .grid-2x3 { grid-template-columns:1fr; }
517
510
  .notes-pane { width:100%; right:-100%; }
518
511
  body.notes-open .main { width:100%; }
519
- body.notes-open .gen-note { right:0; }
520
512
  body.notes-open .top-controls { right:1.25rem; }
521
513
  }