investing-algorithm-framework 6.9.1__py3-none-any.whl → 7.19.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. investing_algorithm_framework/__init__.py +147 -44
  2. investing_algorithm_framework/app/__init__.py +23 -6
  3. investing_algorithm_framework/app/algorithm/algorithm.py +5 -41
  4. investing_algorithm_framework/app/algorithm/algorithm_factory.py +17 -10
  5. investing_algorithm_framework/app/analysis/__init__.py +15 -0
  6. investing_algorithm_framework/app/analysis/backtest_data_ranges.py +121 -0
  7. investing_algorithm_framework/app/analysis/backtest_utils.py +107 -0
  8. investing_algorithm_framework/app/analysis/permutation.py +116 -0
  9. investing_algorithm_framework/app/analysis/ranking.py +297 -0
  10. investing_algorithm_framework/app/app.py +1322 -707
  11. investing_algorithm_framework/app/context.py +196 -88
  12. investing_algorithm_framework/app/eventloop.py +590 -0
  13. investing_algorithm_framework/app/reporting/__init__.py +16 -5
  14. investing_algorithm_framework/app/reporting/ascii.py +57 -202
  15. investing_algorithm_framework/app/reporting/backtest_report.py +284 -170
  16. investing_algorithm_framework/app/reporting/charts/__init__.py +10 -2
  17. investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +66 -0
  18. investing_algorithm_framework/app/reporting/charts/equity_curve.py +37 -0
  19. investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +11 -26
  20. investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
  21. investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +51 -0
  22. investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +1 -1
  23. investing_algorithm_framework/app/reporting/generate.py +100 -114
  24. investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +40 -32
  25. investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +34 -27
  26. investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +23 -19
  27. investing_algorithm_framework/app/reporting/tables/trades_table.py +1 -1
  28. investing_algorithm_framework/app/reporting/tables/utils.py +1 -0
  29. investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +10 -16
  30. investing_algorithm_framework/app/strategy.py +315 -175
  31. investing_algorithm_framework/app/task.py +5 -3
  32. investing_algorithm_framework/cli/cli.py +30 -12
  33. investing_algorithm_framework/cli/deploy_to_aws_lambda.py +131 -34
  34. investing_algorithm_framework/cli/initialize_app.py +20 -1
  35. investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +18 -6
  36. investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
  37. investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
  38. investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -2
  39. investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +1 -1
  40. investing_algorithm_framework/create_app.py +3 -5
  41. investing_algorithm_framework/dependency_container.py +25 -39
  42. investing_algorithm_framework/domain/__init__.py +45 -38
  43. investing_algorithm_framework/domain/backtesting/__init__.py +21 -0
  44. investing_algorithm_framework/domain/backtesting/backtest.py +503 -0
  45. investing_algorithm_framework/domain/backtesting/backtest_date_range.py +96 -0
  46. investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +242 -0
  47. investing_algorithm_framework/domain/backtesting/backtest_metrics.py +459 -0
  48. investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
  49. investing_algorithm_framework/domain/backtesting/backtest_run.py +605 -0
  50. investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
  51. investing_algorithm_framework/domain/backtesting/combine_backtests.py +280 -0
  52. investing_algorithm_framework/domain/config.py +27 -0
  53. investing_algorithm_framework/domain/constants.py +6 -34
  54. investing_algorithm_framework/domain/data_provider.py +200 -56
  55. investing_algorithm_framework/domain/exceptions.py +34 -1
  56. investing_algorithm_framework/domain/models/__init__.py +10 -19
  57. investing_algorithm_framework/domain/models/base_model.py +0 -6
  58. investing_algorithm_framework/domain/models/data/__init__.py +7 -0
  59. investing_algorithm_framework/domain/models/data/data_source.py +214 -0
  60. investing_algorithm_framework/domain/models/{market_data_type.py → data/data_type.py} +7 -7
  61. investing_algorithm_framework/domain/models/market/market_credential.py +6 -0
  62. investing_algorithm_framework/domain/models/order/order.py +34 -13
  63. investing_algorithm_framework/domain/models/order/order_status.py +1 -1
  64. investing_algorithm_framework/domain/models/order/order_type.py +1 -1
  65. investing_algorithm_framework/domain/models/portfolio/portfolio.py +14 -1
  66. investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +5 -1
  67. investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +51 -11
  68. investing_algorithm_framework/domain/models/position/__init__.py +2 -1
  69. investing_algorithm_framework/domain/models/position/position.py +9 -0
  70. investing_algorithm_framework/domain/models/position/position_size.py +41 -0
  71. investing_algorithm_framework/domain/models/risk_rules/__init__.py +7 -0
  72. investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +51 -0
  73. investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +55 -0
  74. investing_algorithm_framework/domain/models/snapshot_interval.py +0 -1
  75. investing_algorithm_framework/domain/models/strategy_profile.py +19 -151
  76. investing_algorithm_framework/domain/models/time_frame.py +7 -0
  77. investing_algorithm_framework/domain/models/time_interval.py +33 -0
  78. investing_algorithm_framework/domain/models/time_unit.py +63 -1
  79. investing_algorithm_framework/domain/models/trade/__init__.py +0 -2
  80. investing_algorithm_framework/domain/models/trade/trade.py +56 -32
  81. investing_algorithm_framework/domain/models/trade/trade_status.py +8 -2
  82. investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +106 -41
  83. investing_algorithm_framework/domain/models/trade/trade_take_profit.py +161 -99
  84. investing_algorithm_framework/domain/order_executor.py +19 -0
  85. investing_algorithm_framework/domain/portfolio_provider.py +20 -1
  86. investing_algorithm_framework/domain/services/__init__.py +0 -13
  87. investing_algorithm_framework/domain/strategy.py +1 -29
  88. investing_algorithm_framework/domain/utils/__init__.py +5 -1
  89. investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
  90. investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
  91. investing_algorithm_framework/domain/utils/polars.py +17 -14
  92. investing_algorithm_framework/download_data.py +40 -10
  93. investing_algorithm_framework/infrastructure/__init__.py +13 -25
  94. investing_algorithm_framework/infrastructure/data_providers/__init__.py +7 -4
  95. investing_algorithm_framework/infrastructure/data_providers/ccxt.py +811 -546
  96. investing_algorithm_framework/infrastructure/data_providers/csv.py +433 -122
  97. investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
  98. investing_algorithm_framework/infrastructure/database/__init__.py +6 -2
  99. investing_algorithm_framework/infrastructure/database/sql_alchemy.py +81 -0
  100. investing_algorithm_framework/infrastructure/models/__init__.py +0 -13
  101. investing_algorithm_framework/infrastructure/models/order/order.py +9 -3
  102. investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +27 -8
  103. investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +21 -7
  104. investing_algorithm_framework/infrastructure/order_executors/__init__.py +2 -0
  105. investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
  106. investing_algorithm_framework/infrastructure/repositories/repository.py +16 -2
  107. investing_algorithm_framework/infrastructure/repositories/trade_repository.py +2 -2
  108. investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +6 -0
  109. investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +6 -0
  110. investing_algorithm_framework/infrastructure/services/__init__.py +0 -4
  111. investing_algorithm_framework/services/__init__.py +105 -8
  112. investing_algorithm_framework/services/backtesting/backtest_service.py +536 -476
  113. investing_algorithm_framework/services/configuration_service.py +14 -4
  114. investing_algorithm_framework/services/data_providers/__init__.py +5 -0
  115. investing_algorithm_framework/services/data_providers/data_provider_service.py +850 -0
  116. investing_algorithm_framework/{app/reporting → services}/metrics/__init__.py +48 -17
  117. investing_algorithm_framework/{app/reporting → services}/metrics/drawdown.py +10 -10
  118. investing_algorithm_framework/{app/reporting → services}/metrics/equity_curve.py +2 -2
  119. investing_algorithm_framework/{app/reporting → services}/metrics/exposure.py +60 -2
  120. investing_algorithm_framework/services/metrics/generate.py +358 -0
  121. investing_algorithm_framework/{app/reporting → services}/metrics/profit_factor.py +36 -0
  122. investing_algorithm_framework/{app/reporting → services}/metrics/recovery.py +2 -2
  123. investing_algorithm_framework/{app/reporting → services}/metrics/returns.py +146 -147
  124. investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
  125. investing_algorithm_framework/{app/reporting/metrics/sharp_ratio.py → services/metrics/sharpe_ratio.py} +6 -10
  126. investing_algorithm_framework/{app/reporting → services}/metrics/sortino_ratio.py +3 -7
  127. investing_algorithm_framework/services/metrics/trades.py +500 -0
  128. investing_algorithm_framework/services/metrics/volatility.py +97 -0
  129. investing_algorithm_framework/{app/reporting → services}/metrics/win_rate.py +70 -3
  130. investing_algorithm_framework/services/order_service/order_backtest_service.py +21 -31
  131. investing_algorithm_framework/services/order_service/order_service.py +9 -71
  132. investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +0 -2
  133. investing_algorithm_framework/services/portfolios/portfolio_service.py +3 -13
  134. investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +62 -96
  135. investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +0 -3
  136. investing_algorithm_framework/services/repository_service.py +5 -2
  137. investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
  138. investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +113 -0
  139. investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +51 -0
  140. investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +80 -0
  141. investing_algorithm_framework/services/trade_service/__init__.py +7 -1
  142. investing_algorithm_framework/services/trade_service/trade_service.py +51 -29
  143. investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +39 -0
  144. investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +41 -0
  145. investing_algorithm_framework-7.19.15.dist-info/METADATA +537 -0
  146. {investing_algorithm_framework-6.9.1.dist-info → investing_algorithm_framework-7.19.15.dist-info}/RECORD +159 -148
  147. investing_algorithm_framework/app/reporting/evaluation.py +0 -243
  148. investing_algorithm_framework/app/reporting/metrics/risk_free_rate.py +0 -8
  149. investing_algorithm_framework/app/reporting/metrics/volatility.py +0 -69
  150. investing_algorithm_framework/cli/templates/requirements_azure_function.txt.template +0 -3
  151. investing_algorithm_framework/domain/models/backtesting/__init__.py +0 -9
  152. investing_algorithm_framework/domain/models/backtesting/backtest_date_range.py +0 -47
  153. investing_algorithm_framework/domain/models/backtesting/backtest_position.py +0 -120
  154. investing_algorithm_framework/domain/models/backtesting/backtest_reports_evaluation.py +0 -0
  155. investing_algorithm_framework/domain/models/backtesting/backtest_results.py +0 -440
  156. investing_algorithm_framework/domain/models/data_source.py +0 -21
  157. investing_algorithm_framework/domain/models/date_range.py +0 -64
  158. investing_algorithm_framework/domain/models/trade/trade_risk_type.py +0 -34
  159. investing_algorithm_framework/domain/models/trading_data_types.py +0 -48
  160. investing_algorithm_framework/domain/models/trading_time_frame.py +0 -223
  161. investing_algorithm_framework/domain/services/market_data_sources.py +0 -543
  162. investing_algorithm_framework/domain/services/market_service.py +0 -153
  163. investing_algorithm_framework/domain/services/observable.py +0 -51
  164. investing_algorithm_framework/domain/services/observer.py +0 -19
  165. investing_algorithm_framework/infrastructure/models/market_data_sources/__init__.py +0 -16
  166. investing_algorithm_framework/infrastructure/models/market_data_sources/ccxt.py +0 -746
  167. investing_algorithm_framework/infrastructure/models/market_data_sources/csv.py +0 -270
  168. investing_algorithm_framework/infrastructure/models/market_data_sources/pandas.py +0 -312
  169. investing_algorithm_framework/infrastructure/services/market_service/__init__.py +0 -5
  170. investing_algorithm_framework/infrastructure/services/market_service/ccxt_market_service.py +0 -471
  171. investing_algorithm_framework/infrastructure/services/performance_service/__init__.py +0 -7
  172. investing_algorithm_framework/infrastructure/services/performance_service/backtest_performance_service.py +0 -2
  173. investing_algorithm_framework/infrastructure/services/performance_service/performance_service.py +0 -322
  174. investing_algorithm_framework/services/market_data_source_service/__init__.py +0 -10
  175. investing_algorithm_framework/services/market_data_source_service/backtest_market_data_source_service.py +0 -269
  176. investing_algorithm_framework/services/market_data_source_service/data_provider_service.py +0 -350
  177. investing_algorithm_framework/services/market_data_source_service/market_data_source_service.py +0 -377
  178. investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -296
  179. investing_algorithm_framework-6.9.1.dist-info/METADATA +0 -440
  180. /investing_algorithm_framework/{app/reporting → services}/metrics/alpha.py +0 -0
  181. /investing_algorithm_framework/{app/reporting → services}/metrics/beta.py +0 -0
  182. /investing_algorithm_framework/{app/reporting → services}/metrics/cagr.py +0 -0
  183. /investing_algorithm_framework/{app/reporting → services}/metrics/calmar_ratio.py +0 -0
  184. /investing_algorithm_framework/{app/reporting → services}/metrics/mean_daily_return.py +0 -0
  185. /investing_algorithm_framework/{app/reporting → services}/metrics/price_efficiency.py +0 -0
  186. /investing_algorithm_framework/{app/reporting → services}/metrics/standard_deviation.py +0 -0
  187. /investing_algorithm_framework/{app/reporting → services}/metrics/treynor_ratio.py +0 -0
  188. /investing_algorithm_framework/{app/reporting → services}/metrics/ulcer.py +0 -0
  189. /investing_algorithm_framework/{app/reporting → services}/metrics/value_at_risk.py +0 -0
  190. {investing_algorithm_framework-6.9.1.dist-info → investing_algorithm_framework-7.19.15.dist-info}/LICENSE +0 -0
  191. {investing_algorithm_framework-6.9.1.dist-info → investing_algorithm_framework-7.19.15.dist-info}/WHEEL +0 -0
  192. {investing_algorithm_framework-6.9.1.dist-info → investing_algorithm_framework-7.19.15.dist-info}/entry_points.txt +0 -0
@@ -1,440 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: investing-algorithm-framework
3
- Version: 6.9.1
4
- Summary: A framework for creating trading bots
5
- Author: MDUYN
6
- Requires-Python: >=3.10
7
- Classifier: Programming Language :: Python :: 3
8
- Classifier: Programming Language :: Python :: 3.10
9
- Classifier: Programming Language :: Python :: 3.11
10
- Classifier: Programming Language :: Python :: 3.12
11
- Requires-Dist: Flask (>=3.1.0)
12
- Requires-Dist: Flask-Cors (>=3.0.9,<5.0.0)
13
- Requires-Dist: Flask-Migrate (>=2.6.0)
14
- Requires-Dist: SQLAlchemy (>=2.0.18)
15
- Requires-Dist: azure-identity (>=1.19.0,<2.0.0)
16
- Requires-Dist: azure-mgmt-resource (>=23.2.0,<24.0.0)
17
- Requires-Dist: azure-mgmt-storage (>=21.2.1,<22.0.0)
18
- Requires-Dist: azure-mgmt-web (>=7.3.1,<8.0.0)
19
- Requires-Dist: azure-storage-blob (>=12.24.0,<13.0.0)
20
- Requires-Dist: boto3 (>=1.38.41,<2.0.0)
21
- Requires-Dist: ccxt (>=4.2.48)
22
- Requires-Dist: dependency-injector (>=4.40.0)
23
- Requires-Dist: jupyter (>=1.0.0)
24
- Requires-Dist: marshmallow (>=3.5.0)
25
- Requires-Dist: plotly (>=6.1.2,<7.0.0)
26
- Requires-Dist: polars[numpy,pandas] (>=0.20.10)
27
- Requires-Dist: pyarrow (>=19.0.1)
28
- Requires-Dist: python-dateutil (>=2.8.2)
29
- Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
30
- Requires-Dist: schedule (>=1.1.0)
31
- Requires-Dist: tabulate (>=0.9.0)
32
- Requires-Dist: tqdm (>=4.66.1)
33
- Requires-Dist: wrapt (>=1.16.0)
34
- Requires-Dist: yfinance (>=0.2.61,<0.3.0)
35
- Description-Content-Type: text/markdown
36
-
37
- <div align="center"> <h1><a href="https://coding-kitties.github.io/investing-algorithm-framework/" target="_blank">Investing Algorithm Framework</a></h1> <p><b>Rapidly build, backtest, and deploy quantitative strategies and trading bots</b></p> <a target="_blank" href="https://coding-kitties.github.io/investing-algorithm-framework/">📖 View Documentation</a> | <a href="https://coding-kitties.github.io/investing-algorithm-framework/Getting%20Started/installation">🚀 Getting Started</a> </div>
38
-
39
- ---
40
-
41
- <div align="center"> <a href="https://coding-kitties.github.io/investing-algorithm-framework/">
42
- <a target="_blank" href="https://discord.gg/dQsRmGZP"><img src="https://img.shields.io/discord/1345358169777635410.svg?color=7289da&label=TradeBotLab%20Discord&logo=discord&style=flat"></a>
43
- <img src="https://img.shields.io/badge/docs-website-brightgreen"></a> <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/publish.yml"><img src="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/publish.yml/badge.svg"></a> <a href="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml"><img src="https://github.com/coding-kitties/investing-algorithm-framework/actions/workflows/test.yml/badge.svg"></a> <a href="https://pepy.tech/project/investing-algorithm-framework"><img src="https://pepy.tech/badge/investing-algorithm-framework"></a> <a href="https://pypi.org/project/investing-algorithm-framework/"><img src="https://img.shields.io/pypi/v/investing-algorithm-framework.svg"></a> <a href="https://www.reddit.com/r/InvestingBots/"><img src="https://img.shields.io/reddit/subreddit-subscribers/investingbots?style=social"></a> <a href="https://github.com/coding-kitties/investing-algorithm-framework/stargazers"><img src="https://img.shields.io/github/stars/coding-kitties/investing-algorithm-framework.svg?style=social&label=Star"></a>
44
- </div>
45
-
46
- > If you like what we do, consider starring, sharing and contributing!
47
-
48
- <div align="center">
49
- <img src="static/showcase.svg" alt="Investing Algorithm Framework Logo" style="height: 50vh; max-height: 750px;">
50
- </div>
51
-
52
- The investing algorithm framework is a Python framework designed to help you build, backtest, and deploy quantitative trading strategies. It comes with a event-based backtesting engine, ensuring an accurate and realistic evaluation of your strategies. The framework supports live trading with multiple exchanges and has various deployment options including Azure Functions and AWS Lambda.
53
- The framework is designed to be extensible, allowing you to add custom strategies, data providers, and order executors. It also supports multiple data sources, including OHLCV, ticker, and custom data, with integration for both Polars and Pandas.
54
-
55
- ## Sponsors
56
-
57
- <a href="https://www.finterion.com/" target="_blank">
58
- <picture style="height: 30px;">
59
- <source media="(prefers-color-scheme: dark)" srcset="static/sponsors/finterion-dark.png">
60
- <source media="(prefers-color-scheme: light)" srcset="static/sponsors/finterion-light.png">
61
- <img src="static/sponsors/finterion-light.png" alt="Finterion Logo" width="200px" height="50px">
62
- </picture>
63
- </a>
64
-
65
-
66
- ## 🌟 Features
67
-
68
- - [x] Python 3.10+: Cross-platform support for Windows, macOS, and Linux.
69
- - [x] Backtesting: Simulate strategies with detailed performance reports.
70
- - [x] Live Trading: Execute trades in real-time with support for multiple exchanges via ccxt.
71
- - [x] Portfolio Management: Manage portfolios, trades, and positions with persistence via SQLite.
72
- - [x] Market Data Sources: Fetch OHLCV, ticker, and custom data with support for Polars and Pandas.
73
- - [x] Azure Functions Support: Deploy stateless trading bots to Azure.
74
- - [x] Web API: Interact with your bot via REST API.
75
- - [x] PyIndicators Integration: Perform technical analysis directly on your dataframes.
76
- - [x] Extensibility: Add custom strategies, data providers, order executors so you can connect your trading bot to your favorite exchange or broker.
77
-
78
- ## 🚀 Quickstart
79
-
80
- Installation
81
- Install the framework via [PyPI](https://pypi.org/project/investing-algorithm-framework/):
82
-
83
- 1. First install the framework using `pip`. The Investing Algorithm Framework is hosted on [PyPi].
84
-
85
- ```bash
86
- pip install investing-algorithm-framework
87
- ```
88
-
89
- Run the following command to set up your project:
90
-
91
- ```bash
92
- investing-algorithm-framewor init
93
- ```
94
-
95
- For a web-enabled version:
96
-
97
- ```bash
98
- investing-algorithm-framework init --web
99
- ```
100
-
101
- This will create:
102
-
103
- * app.py: The entry point for your bot.
104
- * strategy.py: A sample strategy file to get started.
105
-
106
- > Note: Keep the app.py file as is. You can modify strategy.py and add additional files to build your bot.
107
- > You can always change the app to the web version by changing the `app.py` file.
108
-
109
- ---
110
-
111
- ## 📈 Example: A Simple Trading Bot
112
- The following example trading bot implements a simple moving average strategy.
113
- The strategy will use data from bitvavo exchange and will calculate
114
- the 20, 50 and 100 period exponential moving averages (EMA) and the
115
- 14 period relative strength index (RSI).
116
-
117
- > This example uses [PyIndicators](https://github.com/coding-kitties/pyindicators) for technical analysis.
118
- > This dependency is not part of the framework, but is used to perform technical analysis on the dataframes.
119
- > You can install it using pip: pip install pyindicators.
120
-
121
- ```bash
122
-
123
- ```python
124
- import logging.config
125
- from dotenv import load_dotenv
126
-
127
- from pyindicators import ema, rsi
128
-
129
- from investing_algorithm_framework import create_app, TimeUnit, Context, BacktestDateRange, \
130
- CCXTOHLCVMarketDataSource, CCXTTickerMarketDataSource, DEFAULT_LOGGING_CONFIG, \
131
- TradingStrategy, SnapshotInterval, convert_polars_to_pandas
132
-
133
- load_dotenv()
134
- logging.config.dictConfig(DEFAULT_LOGGING_CONFIG)
135
- logger = logging.getLogger(__name__)
136
-
137
- # OHLCV data for candles
138
- bitvavo_btc_eur_ohlcv_2h = CCXTOHLCVMarketDataSource(
139
- identifier="BTC-ohlcv",
140
- market="BITVAVO",
141
- symbol="BTC/EUR",
142
- time_frame="2h",
143
- window_size=200
144
- )
145
- # Ticker data for orders, trades and positions
146
- bitvavo_btc_eur_ticker = CCXTTickerMarketDataSource(
147
- identifier="BTC-ticker",
148
- market="BITVAVO",
149
- symbol="BTC/EUR",
150
- )
151
-
152
- app = create_app()
153
- # Registered bitvavo market, credentials are read from .env file by default
154
- app.add_market(market="BITVAVO", trading_symbol="EUR", initial_balance=100)
155
-
156
- class MyStrategy(TradingStrategy):
157
- interval = 2
158
- time_unit = TimeUnit.HOUR
159
- data_sources = [bitvavo_btc_eur_ohlcv_2h, bitvavo_btc_eur_ticker]
160
-
161
- def run_strategy(self, context: Context, market_data):
162
-
163
- if context.has_open_orders(target_symbol="BTC"):
164
- logger.info("There are open orders, skipping strategy iteration.")
165
- return
166
-
167
- print(market_data)
168
-
169
- data = convert_polars_to_pandas(market_data["BTC-ohlcv"])
170
- data = ema(data, source_column="Close", period=20, result_column="ema_20")
171
- data = ema(data, source_column="Close", period=50, result_column="ema_50")
172
- data = ema(data, source_column="Close", period=100, result_column="ema_100")
173
- data = rsi(data, source_column="Close", period=14, result_column="rsi_14")
174
-
175
- if context.has_position("BTC") and self.sell_signal(data):
176
- context.create_limit_sell_order(
177
- "BTC", percentage_of_position=100, price=data["Close"].iloc[-1]
178
- )
179
- return
180
-
181
- if not context.has_position("BTC") and self.buy_signal(data):
182
- context.create_limit_buy_order(
183
- "BTC", percentage_of_portfolio=20, price=data["Close"].iloc[-1]
184
- )
185
- return
186
-
187
- def buy_signal(self, data):
188
- if len(data) < 100:
189
- return False
190
- last_row = data.iloc[-1]
191
- if last_row["ema_20"] > last_row["ema_50"] and last_row["ema_50"] > last_row["ema_100"]:
192
- return True
193
- return False
194
-
195
- def sell_signal(self, data):
196
-
197
- if data["ema_20"].iloc[-1] < data["ema_50"].iloc[-1] and \
198
- data["ema_20"].iloc[-2] >= data["ema_50"].iloc[-2]:
199
- return True
200
-
201
- return False
202
-
203
- date_range = BacktestDateRange(
204
- start_date="2023-08-24 00:00:00", end_date="2023-12-02 00:00:00"
205
- )
206
- app.add_strategy(MyStrategy)
207
-
208
- if __name__ == "__main__":
209
- # Run the backtest with a daily snapshot interval for end-of-day granular reporting
210
- backtest_report = app.run_backtest(
211
- backtest_date_range=date_range, initial_amount=100, snapshot_interval=SnapshotInterval.STRATEGY_ITERATION
212
- )
213
- backtest_report.show()
214
- ```
215
-
216
- > You can find more examples [here](./examples) folder.
217
-
218
- ## 🔍 Backtesting
219
-
220
- The framework also supports backtesting and performing backtest experiments. After a backtest, you can print a report that shows the performance of your trading bot.
221
-
222
- To run a single backtest you can use the example code that can be found [here](./examples/backtest_example). Simply run:
223
-
224
- > Its assumed here that you have cloned the repository, installed the framework and
225
- > are in the root of the project.
226
-
227
- ```bash
228
- python examples/backtest_example/run_backtest.py
229
- ```
230
-
231
- ### Backtesting report
232
-
233
- You can use the ```pretty_print_backtest``` function to print a backtest report.
234
- For example if you run the [moving average example trading bot](./examples/backtest_example/run_backtest.py)
235
- you will get the following backtesting report:
236
-
237
- ```bash
238
- :%%%#+- .=*#%%% Backtest report
239
- *%%%%%%%+------=*%%%%%%%- ---------------------------
240
- *%%%%%%%%%%%%%%%%%%%%%%%- Start date: 2023-08-24 00:00:00
241
- .%%%%%%%%%%%%%%%%%%%%%%# End date: 2023-12-02 00:00:00
242
- #%%%####%%%%%%%%**#%%%+ Number of days: 100
243
- .:-+*%%%%- -+..#%%%+.+- +%%%#*=-: Number of runs: 1201
244
- .:-=*%%%%. += .%%# -+.-%%%%=-:.. Number of orders: 15
245
- .:=+#%%%%%*###%%%%#*+#%%%%%%*+-: Initial balance: 400.0
246
- +%%%%%%%%%%%%%%%%%%%= Final balance: 453.07
247
- :++ .=#%%%%%%%%%%%%%*- Total net gain: 18.85 4.7%
248
- :++: :+%%%%%%#-. Growth: 53.07 13.27%
249
- :++: .%%%%%#= Number of trades closed: 2
250
- :++: .#%%%%%#*= Number of trades open(end of backtest): 2
251
- :++- :%%%%%%%%%+= Percentage positive trades: 75.0%
252
- .++- -%%%%%%%%%%%+= Percentage negative trades: 25.0%
253
- .++- .%%%%%%%%%%%%%+= Average trade size: 98.79 EUR
254
- .++- *%%%%%%%%%%%%%*+: Average trade duration: 189.0 hours
255
- .++- %%%%%%%%%%%%%%#+=
256
- =++........:::%%%%%%%%%%%%%%*+-
257
- .=++++++++++**#%%%%%%%%%%%%%++.
258
-
259
- Positions overview
260
- ╭────────────┬──────────┬──────────────────────┬───────────────────────┬──────────────┬───────────────┬───────────────────────────┬────────────────┬───────────────╮
261
- │ Position │ Amount │ Pending buy amount │ Pending sell amount │ Cost (EUR) │ Value (EUR) │ Percentage of portfolio │ Growth (EUR) │ Growth_rate │
262
- ├────────────┼──────────┼──────────────────────┼───────────────────────┼──────────────┼───────────────┼───────────────────────────┼────────────────┼───────────────┤
263
- │ EUR │ 253.09 │ 0 │ 0 │ 253.09 │ 253.09 EUR │ 55.86% │ 0.00 EUR │ 0.00% │
264
- ├────────────┼──────────┼──────────────────────┼───────────────────────┼──────────────┼───────────────┼───────────────────────────┼────────────────┼───────────────┤
265
- │ BTC │ 0.0028 │ 0 │ 0 │ 97.34 │ 99.80 EUR │ 22.03% │ 2.46 EUR │ 2.52% │
266
- ├────────────┼──────────┼──────────────────────┼───────────────────────┼──────────────┼───────────────┼───────────────────────────┼────────────────┼───────────────┤
267
- │ DOT │ 19.9521 │ 0 │ 0 │ 100 │ 100.18 EUR │ 22.11% │ 0.18 EUR │ 0.18% │
268
- ╰────────────┴──────────┴──────────────────────┴───────────────────────┴──────────────┴───────────────┴───────────────────────────┴────────────────┴───────────────╯
269
- Trades overview
270
- ╭───────────────────┬────────────────┬───────────────────────┬───────────────────────────┬──────────────────┬──────────────────┬─────────────┬────────────────────┬──────────────────────────────┬─────────────────────────────────╮
271
- │ Pair (Trade id) │ Status │ Amount (remaining) │ Net gain (EUR) │ Open date │ Close date │ Duration │ Open price (EUR) │ Close price's (EUR) │ High water mark │
272
- ├───────────────────┼────────────────┼───────────────────────┼───────────────────────────┼──────────────────┼──────────────────┼─────────────┼────────────────────┼──────────────────────────────┼─────────────────────────────────┤
273
- │ BTC/EUR (1) │ CLOSED │ 0.0040 (0.0000) BTC │ 1.98 (2.02%) │ 2023-09-13 14:00 │ 2023-09-22 12:00 │ 214.0 hours │ 24490.4 │ 24984.93 │ 25703.77 EUR (2023-09-19 14:00) │
274
- ├───────────────────┼────────────────┼───────────────────────┼───────────────────────────┼──────────────────┼──────────────────┼─────────────┼────────────────────┼──────────────────────────────┼─────────────────────────────────┤
275
- │ DOT/EUR (2) │ CLOSED, SL, TP │ 24.7463 (0.0000) DOT │ 13.53 (13.53%) │ 2023-10-30 04:00 │ 2023-11-15 02:00 │ 382.0 hours │ 4.04 │ 4.23, 4.38, 4.24, 4.25, 4.79 │ 5.45 EUR (2023-11-12 10:00) │
276
- ├───────────────────┼────────────────┼───────────────────────┼───────────────────────────┼──────────────────┼──────────────────┼─────────────┼────────────────────┼──────────────────────────────┼─────────────────────────────────┤
277
- │ BTC/EUR (3) │ CLOSED │ 0.0030 (0.0000) BTC │ -0.20 (-0.20%) │ 2023-11-06 14:00 │ 2023-11-06 16:00 │ 2.0 hours │ 32691.5 │ 32625.87 │ 32625.87 EUR (2023-11-06 16:00) │
278
- ├───────────────────┼────────────────┼───────────────────────┼───────────────────────────┼──────────────────┼──────────────────┼─────────────┼────────────────────┼──────────────────────────────┼─────────────────────────────────┤
279
- │ BTC/EUR (4) │ CLOSED, TP │ 0.0030 (0.0000) BTC │ 3.54 (3.56%) │ 2023-11-07 22:00 │ 2023-11-14 12:00 │ 158.0 hours │ 33126.6 │ 34746.64, 33865.42 │ 34967.12 EUR (2023-11-10 22:00) │
280
- ├───────────────────┼────────────────┼───────────────────────┼───────────────────────────┼──────────────────┼──────────────────┼─────────────┼────────────────────┼──────────────────────────────┼─────────────────────────────────┤
281
- │ BTC/EUR (5) │ OPEN │ 0.0028 (0.0028) BTC │ 2.46 (2.52%) (unrealized) │ 2023-11-29 12:00 │ │ 60.0 hours │ 34765.9 │ │ 35679.63 EUR (2023-12-01 16:00) │
282
- ├───────────────────┼────────────────┼───────────────────────┼───────────────────────────┼──────────────────┼──────────────────┼─────────────┼────────────────────┼──────────────────────────────┼─────────────────────────────────┤
283
- │ DOT/EUR (6) │ OPEN │ 19.9521 (19.9521) DOT │ 0.18 (0.18%) (unrealized) │ 2023-11-30 18:00 │ │ 30.0 hours │ 5.01 │ │ 5.05 EUR (2023-11-30 20:00) │
284
- ╰───────────────────┴────────────────┴───────────────────────┴───────────────────────────┴──────────────────┴──────────────────┴─────────────┴────────────────────┴──────────────────────────────┴─────────────────────────────────╯
285
- Stop losses overview
286
- ╭────────────────────┬───────────────┬──────────┬──────────┬─────────────────────────────────┬──────────────┬────────────────┬───────────────────────────────┬──────────────┬───────────┬───────────────╮
287
- │ Trade (Trade id) │ Status │ Active │ Type │ Stop Loss (Initial Stop Loss) │ Open price │ Sell price's │ High water mark │ Percentage │ Size │ Sold amount │
288
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────┼──────────────┼────────────────┼───────────────────────────────┼──────────────┼───────────┼───────────────┤
289
- │ BTC/EUR (1) │ NOT TRIGGERED │ False │ TRAILING │ 24418.58 (23265.85) (5.0)% EUR │ 24490.37 EUR │ None │ 25703.77 EUR 2023-09-19 14:00 │ 50.0% │ 0.00 BTC │ │
290
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────┼──────────────┼────────────────┼───────────────────────────────┼──────────────┼───────────┼───────────────┤
291
- │ DOT/EUR (2) │ TRIGGERED │ False │ TRAILING │ 4.28 (3.84) (5.0)% EUR │ 4.04 EUR │ 4.239,4.254 │ 4.51 EUR 2023-11-01 20:00 │ 50.0% │ 12.37 DOT │ 12.3732 DOT │
292
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────┼──────────────┼────────────────┼───────────────────────────────┼──────────────┼───────────┼───────────────┤
293
- │ BTC/EUR (3) │ NOT TRIGGERED │ False │ TRAILING │ 31056.93 (31056.93) (5.0)% EUR │ 32691.51 EUR │ None │ 32691.51 EUR │ 50.0% │ 0.00 BTC │ │
294
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────┼──────────────┼────────────────┼───────────────────────────────┼──────────────┼───────────┼───────────────┤
295
- │ BTC/EUR (4) │ NOT TRIGGERED │ False │ TRAILING │ 33218.76 (31470.27) (5.0)% EUR │ 33126.60 EUR │ None │ 34967.12 EUR 2023-11-10 22:00 │ 50.0% │ 0.00 BTC │ │
296
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────┼──────────────┼────────────────┼───────────────────────────────┼──────────────┼───────────┼───────────────┤
297
- │ BTC/EUR (5) │ NOT TRIGGERED │ True │ TRAILING │ 33895.65 (33027.62) (5.0)% EUR │ 34765.92 EUR │ None │ 35679.63 EUR 2023-12-01 16:00 │ 50.0% │ 0.00 BTC │ │
298
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────┼──────────────┼────────────────┼───────────────────────────────┼──────────────┼───────────┼───────────────┤
299
- │ DOT/EUR (6) │ NOT TRIGGERED │ True │ TRAILING │ 4.80 (4.76) (5.0)% EUR │ 5.01 EUR │ None │ 5.05 EUR 2023-11-30 20:00 │ 50.0% │ 9.98 DOT │ │
300
- ╰────────────────────┴───────────────┴──────────┴──────────┴─────────────────────────────────┴──────────────┴────────────────┴───────────────────────────────┴──────────────┴───────────┴───────────────╯
301
- Take profits overview
302
- ╭────────────────────┬───────────────┬──────────┬──────────┬─────────────────────────────────────┬──────────────┬────────────────┬─────────────────────────────────┬──────────────┬─────────────┬───────────────╮
303
- │ Trade (Trade id) │ Status │ Active │ Type │ Take profit (Initial Take Profit) │ Open price │ Sell price's │ High water mark │ Percentage │ Size │ Sold amount │
304
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
305
- │ BTC/EUR (1) │ NOT TRIGGERED │ False │ TRAILING │ 25714.89 (25714.89) (5.0)% EUR │ 24490.37 EUR │ None │ │ 50.0% │ 0.0020 BTC │ │
306
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
307
- │ BTC/EUR (1) │ NOT TRIGGERED │ False │ TRAILING │ 26939.41 (26939.41) (10.0)% EUR │ 24490.37 EUR │ None │ │ 20.0% │ 0.0008 BTC │ │
308
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
309
- │ DOT/EUR (2) │ TRIGGERED │ False │ TRAILING │ 4.24 (4.24) (5.0)% EUR │ 4.04 EUR │ 4.233 │ 4.30 EUR (2023-10-31 00:00) │ 50.0% │ 12.3732 DOT │ 12.3732 DOT │
310
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
311
- │ DOT/EUR (2) │ TRIGGERED │ False │ TRAILING │ 4.45 (4.45) (10.0)% EUR │ 4.04 EUR │ 4.377 │ 4.51 EUR (2023-11-01 20:00) │ 20.0% │ 4.9493 DOT │ 4.9493 DOT │
312
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
313
- │ BTC/EUR (3) │ NOT TRIGGERED │ False │ TRAILING │ 34326.09 (34326.09) (5.0)% EUR │ 32691.51 EUR │ None │ │ 50.0% │ 0.0015 BTC │ │
314
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
315
- │ BTC/EUR (3) │ NOT TRIGGERED │ False │ TRAILING │ 35960.66 (35960.66) (10.0)% EUR │ 32691.51 EUR │ None │ │ 20.0% │ 0.0006 BTC │ │
316
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
317
- │ BTC/EUR (4) │ TRIGGERED │ False │ TRAILING │ 34782.93 (34782.93) (5.0)% EUR │ 33126.60 EUR │ 34746.64 │ 34967.12 EUR (2023-11-10 22:00) │ 50.0% │ 0.0015 BTC │ 0.0015 BTC │
318
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
319
- │ BTC/EUR (4) │ NOT TRIGGERED │ False │ TRAILING │ 36439.26 (36439.26) (10.0)% EUR │ 33126.60 EUR │ None │ │ 20.0% │ 0.0006 BTC │ │
320
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
321
- │ BTC/EUR (5) │ NOT TRIGGERED │ True │ TRAILING │ 36504.22 (36504.22) (5.0)% EUR │ 34765.92 EUR │ None │ │ 50.0% │ 0.0014 BTC │ │
322
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
323
- │ BTC/EUR (5) │ NOT TRIGGERED │ True │ TRAILING │ 38242.51 (38242.51) (10.0)% EUR │ 34765.92 EUR │ None │ │ 20.0% │ 0.0006 BTC │ │
324
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
325
- │ DOT/EUR (6) │ NOT TRIGGERED │ True │ TRAILING │ 5.26 (5.26) (5.0)% EUR │ 5.01 EUR │ None │ │ 50.0% │ 9.9761 DOT │ │
326
- ├────────────────────┼───────────────┼──────────┼──────────┼─────────────────────────────────────┼──────────────┼────────────────┼─────────────────────────────────┼──────────────┼─────────────┼───────────────┤
327
- │ DOT/EUR (6) │ NOT TRIGGERED │ True │ TRAILING │ 5.51 (5.51) (10.0)% EUR │ 5.01 EUR │ None │ │ 20.0% │ 3.9904 DOT │ │
328
- ╰────────────────────┴───────────────┴──────────┴──────────┴─────────────────────────────────────┴──────────────┴────────────────┴─────────────────────────────────┴──────────────┴─────────────┴───────────────╯
329
- ```
330
-
331
- ## 🌐 Deployment to Azure
332
-
333
- Prerequisites
334
-
335
- Ensure Azure Functions Core Tools are installed:
336
-
337
- ```bash
338
- npm install -g azure-functions-core-tools@4 --unsafe-perm true
339
- ```
340
- Deploying to Azure
341
- Use the provided deployment script:
342
-
343
- This script:
344
-
345
- ```
346
- investing-algorithm-framework deploy
347
- ```
348
-
349
- This script:
350
-
351
- * Creates Azure resources (e.g., storage accounts, function apps).
352
- * Sets environment variables for the Azure Function.
353
- * Deploys your bot to Azure.
354
-
355
- ## 📚 Documentation
356
- Comprehensive documentation is available at [github pages](https://coding-kitties.github.io/investing-algorithm-framework/).
357
-
358
- ## 🛠️ Development
359
-
360
- Local Development
361
-
362
- Clone the repository and install dependencies using Poetry:
363
-
364
- The framework is built with poetry. To install the framework for local development, you can run the following commands:
365
-
366
- > Make sure you have poetry installed. If you don't have poetry installed, you can find installation instructions [here](https://python-poetry.org/docs/#installation)
367
-
368
- ```bash
369
- git clone http
370
- cd investing-algorithm-framework
371
- poetry install
372
- ```
373
-
374
- ### Running tests
375
-
376
- To run the tests, you can run the following command:
377
-
378
- ```bash
379
- # In the root of the project
380
- python -m unittest discover -s tests
381
- ```
382
-
383
- ## ⚠️ Disclaimer
384
-
385
- If you use this framework for your investments, do not risk money
386
- which you are afraid to lose, until you have clear understanding how the framework works. We can't stress this enough:
387
-
388
- BEFORE YOU START USING MONEY WITH THE FRAMEWORK, MAKE SURE THAT YOU TESTED
389
- YOUR COMPONENTS THOROUGHLY. USE THE SOFTWARE AT YOUR OWN RISK.
390
- THE AUTHORS AND ALL AFFILIATES ASSUME NO RESPONSIBILITY FOR YOUR INVESTMENT RESULTS.
391
-
392
- Also, make sure that you read the source code of any plugin you use or
393
- implementation of an algorithm made with this framework.
394
-
395
- We welcome contributions! Check out the project board and issues to get started.
396
-
397
- ## Documentation
398
-
399
- All the documentation can be found online
400
- at the [documentation webstie](https://coding-kitties.github.io/investing-algorithm-framework/)
401
-
402
- In most cases, you'll probably never have to change code on this repo directly
403
- if you are building your algorithm/bot. But if you do, check out the
404
- contributing page at the website.
405
-
406
- If you'd like to chat with investing-algorithm-framework users
407
- and developers, [join us on Slack](https://inv-algo-framework.slack.com) or [join us on reddit](https://www.reddit.com/r/InvestingBots/)
408
-
409
- ## 🤝 Contributing
410
-
411
- The investing algorithm framework is a community driven project.
412
- We welcome you to participate, contribute and together help build the future trading bots developed in python.
413
-
414
- To get started, please read the [contributing guide](https://coding-kitties.github.io/investing-algorithm-framework/Contributing&20Guide/contributing).
415
-
416
- Feel like the framework is missing a feature? We welcome your pull requests!
417
- If you want to contribute to the project roadmap, please take a look at the [project board](https://github.com/coding-kitties/investing-algorithm-framework/projects?query=is%3Aopen).
418
- You can pick up a task by assigning yourself to it.
419
-
420
- **Note** before starting any major new feature work, *please open an issue describing what you are planning to do*.
421
- This will ensure that interested parties can give valuable feedback on the feature, and let others know that you are working on it.
422
-
423
- **Important:** Always create your feature or hotfix against the `develop` branch, not `main`.
424
-
425
- ## 📬 Support
426
-
427
- * [Reddit Community](https://www.reddit.com/r/InvestingBots/)
428
- * [Discord Community](https://discord.gg/dQsRmGZP")
429
-
430
-
431
- ## 🏆 Acknowledgements
432
-
433
- We want to thank all contributors to this project. A full list of all the people that contributed to the project can be
434
- found [here](https://github.com/investing-algorithms/investing-algorithm-framework/blob/master/AUTHORS.md)
435
-
436
- ### [Bugs / Issues](https://github.com/investing-algorithms/investing-algorithm-framework/issues?q=is%3Aissue)
437
-
438
- If you discover a bug in the framework, please [search our issue tracker](https://github.com/investing-algorithms/investing-algorithm-framework/issues?q=is%3Aissue)
439
- first. If it hasn't been reported, please [create a new issue](https://github.com/investing-algorithms/investing-algorithm-framework/issues/new).
440
-