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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. investing_algorithm_framework/__init__.py +195 -16
  2. investing_algorithm_framework/analysis/__init__.py +16 -0
  3. investing_algorithm_framework/analysis/backtest_data_ranges.py +202 -0
  4. investing_algorithm_framework/analysis/data.py +170 -0
  5. investing_algorithm_framework/analysis/markdown.py +91 -0
  6. investing_algorithm_framework/analysis/ranking.py +298 -0
  7. investing_algorithm_framework/app/__init__.py +31 -4
  8. investing_algorithm_framework/app/algorithm/__init__.py +7 -0
  9. investing_algorithm_framework/app/algorithm/algorithm.py +193 -0
  10. investing_algorithm_framework/app/algorithm/algorithm_factory.py +118 -0
  11. investing_algorithm_framework/app/app.py +2233 -264
  12. investing_algorithm_framework/app/app_hook.py +28 -0
  13. investing_algorithm_framework/app/context.py +1724 -0
  14. investing_algorithm_framework/app/eventloop.py +620 -0
  15. investing_algorithm_framework/app/reporting/__init__.py +27 -0
  16. investing_algorithm_framework/app/reporting/ascii.py +921 -0
  17. investing_algorithm_framework/app/reporting/backtest_report.py +349 -0
  18. investing_algorithm_framework/app/reporting/charts/__init__.py +19 -0
  19. investing_algorithm_framework/app/reporting/charts/entry_exist_signals.py +66 -0
  20. investing_algorithm_framework/app/reporting/charts/equity_curve.py +37 -0
  21. investing_algorithm_framework/app/reporting/charts/equity_curve_drawdown.py +74 -0
  22. investing_algorithm_framework/app/reporting/charts/line_chart.py +11 -0
  23. investing_algorithm_framework/app/reporting/charts/monthly_returns_heatmap.py +70 -0
  24. investing_algorithm_framework/app/reporting/charts/ohlcv_data_completeness.py +51 -0
  25. investing_algorithm_framework/app/reporting/charts/rolling_sharp_ratio.py +79 -0
  26. investing_algorithm_framework/app/reporting/charts/yearly_returns_barchart.py +55 -0
  27. investing_algorithm_framework/app/reporting/generate.py +185 -0
  28. investing_algorithm_framework/app/reporting/tables/__init__.py +11 -0
  29. investing_algorithm_framework/app/reporting/tables/key_metrics_table.py +217 -0
  30. investing_algorithm_framework/app/reporting/tables/stop_loss_table.py +0 -0
  31. investing_algorithm_framework/app/reporting/tables/time_metrics_table.py +80 -0
  32. investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py +147 -0
  33. investing_algorithm_framework/app/reporting/tables/trades_table.py +75 -0
  34. investing_algorithm_framework/app/reporting/tables/utils.py +29 -0
  35. investing_algorithm_framework/app/reporting/templates/report_template.html.j2 +154 -0
  36. investing_algorithm_framework/app/stateless/action_handlers/__init__.py +6 -3
  37. investing_algorithm_framework/app/stateless/action_handlers/action_handler_strategy.py +1 -1
  38. investing_algorithm_framework/app/stateless/action_handlers/check_online_handler.py +2 -1
  39. investing_algorithm_framework/app/stateless/action_handlers/run_strategy_handler.py +14 -7
  40. investing_algorithm_framework/app/stateless/exception_handler.py +1 -1
  41. investing_algorithm_framework/app/strategy.py +873 -52
  42. investing_algorithm_framework/app/task.py +5 -3
  43. investing_algorithm_framework/app/web/__init__.py +2 -1
  44. investing_algorithm_framework/app/web/controllers/__init__.py +2 -2
  45. investing_algorithm_framework/app/web/controllers/orders.py +4 -3
  46. investing_algorithm_framework/app/web/controllers/portfolio.py +1 -1
  47. investing_algorithm_framework/app/web/controllers/positions.py +3 -3
  48. investing_algorithm_framework/app/web/create_app.py +4 -2
  49. investing_algorithm_framework/app/web/error_handler.py +1 -1
  50. investing_algorithm_framework/app/web/schemas/order.py +2 -2
  51. investing_algorithm_framework/app/web/schemas/position.py +1 -0
  52. investing_algorithm_framework/cli/__init__.py +0 -0
  53. investing_algorithm_framework/cli/cli.py +231 -0
  54. investing_algorithm_framework/cli/deploy_to_aws_lambda.py +501 -0
  55. investing_algorithm_framework/cli/deploy_to_azure_function.py +718 -0
  56. investing_algorithm_framework/cli/initialize_app.py +603 -0
  57. investing_algorithm_framework/cli/templates/.gitignore.template +178 -0
  58. investing_algorithm_framework/cli/templates/app.py.template +18 -0
  59. investing_algorithm_framework/cli/templates/app_aws_lambda_function.py.template +48 -0
  60. investing_algorithm_framework/cli/templates/app_azure_function.py.template +14 -0
  61. investing_algorithm_framework/cli/templates/app_web.py.template +18 -0
  62. investing_algorithm_framework/cli/templates/aws_lambda_dockerfile.template +22 -0
  63. investing_algorithm_framework/cli/templates/aws_lambda_dockerignore.template +92 -0
  64. investing_algorithm_framework/cli/templates/aws_lambda_readme.md.template +110 -0
  65. investing_algorithm_framework/cli/templates/aws_lambda_requirements.txt.template +2 -0
  66. investing_algorithm_framework/cli/templates/azure_function_function_app.py.template +65 -0
  67. investing_algorithm_framework/cli/templates/azure_function_host.json.template +15 -0
  68. investing_algorithm_framework/cli/templates/azure_function_local.settings.json.template +8 -0
  69. investing_algorithm_framework/cli/templates/azure_function_requirements.txt.template +3 -0
  70. investing_algorithm_framework/cli/templates/data_providers.py.template +17 -0
  71. investing_algorithm_framework/cli/templates/env.example.template +2 -0
  72. investing_algorithm_framework/cli/templates/env_azure_function.example.template +4 -0
  73. investing_algorithm_framework/cli/templates/market_data_providers.py.template +9 -0
  74. investing_algorithm_framework/cli/templates/readme.md.template +135 -0
  75. investing_algorithm_framework/cli/templates/requirements.txt.template +2 -0
  76. investing_algorithm_framework/cli/templates/run_backtest.py.template +20 -0
  77. investing_algorithm_framework/cli/templates/strategy.py.template +124 -0
  78. investing_algorithm_framework/cli/validate_backtest_checkpoints.py +197 -0
  79. investing_algorithm_framework/create_app.py +43 -9
  80. investing_algorithm_framework/dependency_container.py +121 -33
  81. investing_algorithm_framework/domain/__init__.py +109 -22
  82. investing_algorithm_framework/domain/algorithm_id.py +69 -0
  83. investing_algorithm_framework/domain/backtesting/__init__.py +25 -0
  84. investing_algorithm_framework/domain/backtesting/backtest.py +548 -0
  85. investing_algorithm_framework/domain/backtesting/backtest_date_range.py +113 -0
  86. investing_algorithm_framework/domain/backtesting/backtest_evaluation_focuss.py +241 -0
  87. investing_algorithm_framework/domain/backtesting/backtest_metrics.py +470 -0
  88. investing_algorithm_framework/domain/backtesting/backtest_permutation_test.py +275 -0
  89. investing_algorithm_framework/domain/backtesting/backtest_run.py +663 -0
  90. investing_algorithm_framework/domain/backtesting/backtest_summary_metrics.py +162 -0
  91. investing_algorithm_framework/domain/backtesting/backtest_utils.py +198 -0
  92. investing_algorithm_framework/domain/backtesting/combine_backtests.py +392 -0
  93. investing_algorithm_framework/domain/config.py +60 -138
  94. investing_algorithm_framework/domain/constants.py +23 -34
  95. investing_algorithm_framework/domain/data_provider.py +334 -0
  96. investing_algorithm_framework/domain/data_structures.py +42 -0
  97. investing_algorithm_framework/domain/decimal_parsing.py +40 -0
  98. investing_algorithm_framework/domain/exceptions.py +51 -1
  99. investing_algorithm_framework/domain/models/__init__.py +29 -14
  100. investing_algorithm_framework/domain/models/app_mode.py +34 -0
  101. investing_algorithm_framework/domain/models/base_model.py +3 -1
  102. investing_algorithm_framework/domain/models/data/__init__.py +7 -0
  103. investing_algorithm_framework/domain/models/data/data_source.py +222 -0
  104. investing_algorithm_framework/domain/models/data/data_type.py +46 -0
  105. investing_algorithm_framework/domain/models/event.py +35 -0
  106. investing_algorithm_framework/domain/models/market/__init__.py +5 -0
  107. investing_algorithm_framework/domain/models/market/market_credential.py +88 -0
  108. investing_algorithm_framework/domain/models/order/__init__.py +3 -4
  109. investing_algorithm_framework/domain/models/order/order.py +243 -86
  110. investing_algorithm_framework/domain/models/order/order_status.py +2 -2
  111. investing_algorithm_framework/domain/models/order/order_type.py +1 -3
  112. investing_algorithm_framework/domain/models/portfolio/__init__.py +7 -2
  113. investing_algorithm_framework/domain/models/portfolio/portfolio.py +134 -1
  114. investing_algorithm_framework/domain/models/portfolio/portfolio_configuration.py +37 -37
  115. investing_algorithm_framework/domain/models/portfolio/portfolio_snapshot.py +208 -0
  116. investing_algorithm_framework/domain/models/position/__init__.py +3 -2
  117. investing_algorithm_framework/domain/models/position/position.py +29 -0
  118. investing_algorithm_framework/domain/models/position/position_size.py +41 -0
  119. investing_algorithm_framework/domain/models/position/{position_cost.py → position_snapshot.py} +16 -8
  120. investing_algorithm_framework/domain/models/risk_rules/__init__.py +7 -0
  121. investing_algorithm_framework/domain/models/risk_rules/stop_loss_rule.py +51 -0
  122. investing_algorithm_framework/domain/models/risk_rules/take_profit_rule.py +55 -0
  123. investing_algorithm_framework/domain/models/snapshot_interval.py +45 -0
  124. investing_algorithm_framework/domain/models/strategy_profile.py +33 -0
  125. investing_algorithm_framework/domain/models/time_frame.py +94 -98
  126. investing_algorithm_framework/domain/models/time_interval.py +33 -0
  127. investing_algorithm_framework/domain/models/time_unit.py +111 -2
  128. investing_algorithm_framework/domain/models/tracing/__init__.py +0 -0
  129. investing_algorithm_framework/domain/models/tracing/trace.py +23 -0
  130. investing_algorithm_framework/domain/models/trade/__init__.py +11 -0
  131. investing_algorithm_framework/domain/models/trade/trade.py +389 -0
  132. investing_algorithm_framework/domain/models/trade/trade_status.py +40 -0
  133. investing_algorithm_framework/domain/models/trade/trade_stop_loss.py +332 -0
  134. investing_algorithm_framework/domain/models/trade/trade_take_profit.py +365 -0
  135. investing_algorithm_framework/domain/order_executor.py +112 -0
  136. investing_algorithm_framework/domain/portfolio_provider.py +118 -0
  137. investing_algorithm_framework/domain/services/__init__.py +11 -0
  138. investing_algorithm_framework/domain/services/market_credential_service.py +37 -0
  139. investing_algorithm_framework/domain/services/portfolios/__init__.py +5 -0
  140. investing_algorithm_framework/domain/services/portfolios/portfolio_sync_service.py +9 -0
  141. investing_algorithm_framework/domain/services/rounding_service.py +27 -0
  142. investing_algorithm_framework/domain/services/state_handler.py +38 -0
  143. investing_algorithm_framework/domain/strategy.py +1 -29
  144. investing_algorithm_framework/domain/utils/__init__.py +16 -4
  145. investing_algorithm_framework/domain/utils/csv.py +22 -0
  146. investing_algorithm_framework/domain/utils/custom_tqdm.py +22 -0
  147. investing_algorithm_framework/domain/utils/dates.py +57 -0
  148. investing_algorithm_framework/domain/utils/jupyter_notebook_detection.py +19 -0
  149. investing_algorithm_framework/domain/utils/polars.py +53 -0
  150. investing_algorithm_framework/domain/utils/random.py +29 -0
  151. investing_algorithm_framework/download_data.py +244 -0
  152. investing_algorithm_framework/infrastructure/__init__.py +39 -11
  153. investing_algorithm_framework/infrastructure/data_providers/__init__.py +36 -0
  154. investing_algorithm_framework/infrastructure/data_providers/ccxt.py +1152 -0
  155. investing_algorithm_framework/infrastructure/data_providers/csv.py +568 -0
  156. investing_algorithm_framework/infrastructure/data_providers/pandas.py +599 -0
  157. investing_algorithm_framework/infrastructure/database/__init__.py +6 -2
  158. investing_algorithm_framework/infrastructure/database/sql_alchemy.py +87 -13
  159. investing_algorithm_framework/infrastructure/models/__init__.py +13 -4
  160. investing_algorithm_framework/infrastructure/models/decimal_parser.py +14 -0
  161. investing_algorithm_framework/infrastructure/models/order/__init__.py +2 -2
  162. investing_algorithm_framework/infrastructure/models/order/order.py +73 -73
  163. investing_algorithm_framework/infrastructure/models/order/order_metadata.py +44 -0
  164. investing_algorithm_framework/infrastructure/models/order_trade_association.py +10 -0
  165. investing_algorithm_framework/infrastructure/models/portfolio/__init__.py +3 -2
  166. investing_algorithm_framework/infrastructure/models/portfolio/portfolio_snapshot.py +37 -0
  167. investing_algorithm_framework/infrastructure/models/portfolio/{portfolio.py → sql_portfolio.py} +57 -3
  168. investing_algorithm_framework/infrastructure/models/position/__init__.py +2 -2
  169. investing_algorithm_framework/infrastructure/models/position/position.py +16 -11
  170. investing_algorithm_framework/infrastructure/models/position/position_snapshot.py +23 -0
  171. investing_algorithm_framework/infrastructure/models/trades/__init__.py +9 -0
  172. investing_algorithm_framework/infrastructure/models/trades/trade.py +130 -0
  173. investing_algorithm_framework/infrastructure/models/trades/trade_stop_loss.py +59 -0
  174. investing_algorithm_framework/infrastructure/models/trades/trade_take_profit.py +55 -0
  175. investing_algorithm_framework/infrastructure/order_executors/__init__.py +21 -0
  176. investing_algorithm_framework/infrastructure/order_executors/backtest_oder_executor.py +28 -0
  177. investing_algorithm_framework/infrastructure/order_executors/ccxt_order_executor.py +200 -0
  178. investing_algorithm_framework/infrastructure/portfolio_providers/__init__.py +19 -0
  179. investing_algorithm_framework/infrastructure/portfolio_providers/ccxt_portfolio_provider.py +199 -0
  180. investing_algorithm_framework/infrastructure/repositories/__init__.py +13 -5
  181. investing_algorithm_framework/infrastructure/repositories/order_metadata_repository.py +17 -0
  182. investing_algorithm_framework/infrastructure/repositories/order_repository.py +32 -19
  183. investing_algorithm_framework/infrastructure/repositories/portfolio_repository.py +2 -2
  184. investing_algorithm_framework/infrastructure/repositories/portfolio_snapshot_repository.py +56 -0
  185. investing_algorithm_framework/infrastructure/repositories/position_repository.py +47 -4
  186. investing_algorithm_framework/infrastructure/repositories/position_snapshot_repository.py +21 -0
  187. investing_algorithm_framework/infrastructure/repositories/repository.py +85 -31
  188. investing_algorithm_framework/infrastructure/repositories/trade_repository.py +71 -0
  189. investing_algorithm_framework/infrastructure/repositories/trade_stop_loss_repository.py +29 -0
  190. investing_algorithm_framework/infrastructure/repositories/trade_take_profit_repository.py +29 -0
  191. investing_algorithm_framework/infrastructure/services/__init__.py +9 -2
  192. investing_algorithm_framework/infrastructure/services/aws/__init__.py +6 -0
  193. investing_algorithm_framework/infrastructure/services/aws/state_handler.py +193 -0
  194. investing_algorithm_framework/infrastructure/services/azure/__init__.py +5 -0
  195. investing_algorithm_framework/infrastructure/services/azure/state_handler.py +158 -0
  196. investing_algorithm_framework/infrastructure/services/backtesting/__init__.py +9 -0
  197. investing_algorithm_framework/infrastructure/services/backtesting/backtest_service.py +2596 -0
  198. investing_algorithm_framework/infrastructure/services/backtesting/event_backtest_service.py +285 -0
  199. investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py +468 -0
  200. investing_algorithm_framework/services/__init__.py +127 -10
  201. investing_algorithm_framework/services/configuration_service.py +95 -0
  202. investing_algorithm_framework/services/data_providers/__init__.py +5 -0
  203. investing_algorithm_framework/services/data_providers/data_provider_service.py +1058 -0
  204. investing_algorithm_framework/services/market_credential_service.py +40 -0
  205. investing_algorithm_framework/services/metrics/__init__.py +119 -0
  206. investing_algorithm_framework/services/metrics/alpha.py +0 -0
  207. investing_algorithm_framework/services/metrics/beta.py +0 -0
  208. investing_algorithm_framework/services/metrics/cagr.py +60 -0
  209. investing_algorithm_framework/services/metrics/calmar_ratio.py +40 -0
  210. investing_algorithm_framework/services/metrics/drawdown.py +218 -0
  211. investing_algorithm_framework/services/metrics/equity_curve.py +24 -0
  212. investing_algorithm_framework/services/metrics/exposure.py +210 -0
  213. investing_algorithm_framework/services/metrics/generate.py +358 -0
  214. investing_algorithm_framework/services/metrics/mean_daily_return.py +84 -0
  215. investing_algorithm_framework/services/metrics/price_efficiency.py +57 -0
  216. investing_algorithm_framework/services/metrics/profit_factor.py +165 -0
  217. investing_algorithm_framework/services/metrics/recovery.py +113 -0
  218. investing_algorithm_framework/services/metrics/returns.py +452 -0
  219. investing_algorithm_framework/services/metrics/risk_free_rate.py +28 -0
  220. investing_algorithm_framework/services/metrics/sharpe_ratio.py +137 -0
  221. investing_algorithm_framework/services/metrics/sortino_ratio.py +74 -0
  222. investing_algorithm_framework/services/metrics/standard_deviation.py +156 -0
  223. investing_algorithm_framework/services/metrics/trades.py +473 -0
  224. investing_algorithm_framework/services/metrics/treynor_ratio.py +0 -0
  225. investing_algorithm_framework/services/metrics/ulcer.py +0 -0
  226. investing_algorithm_framework/services/metrics/value_at_risk.py +0 -0
  227. investing_algorithm_framework/services/metrics/volatility.py +118 -0
  228. investing_algorithm_framework/services/metrics/win_rate.py +177 -0
  229. investing_algorithm_framework/services/order_service/__init__.py +9 -0
  230. investing_algorithm_framework/services/order_service/order_backtest_service.py +178 -0
  231. investing_algorithm_framework/services/order_service/order_executor_lookup.py +110 -0
  232. investing_algorithm_framework/services/order_service/order_service.py +826 -0
  233. investing_algorithm_framework/services/portfolios/__init__.py +16 -0
  234. investing_algorithm_framework/services/portfolios/backtest_portfolio_service.py +54 -0
  235. investing_algorithm_framework/services/{portfolio_configuration_service.py → portfolios/portfolio_configuration_service.py} +27 -12
  236. investing_algorithm_framework/services/portfolios/portfolio_provider_lookup.py +106 -0
  237. investing_algorithm_framework/services/portfolios/portfolio_service.py +188 -0
  238. investing_algorithm_framework/services/portfolios/portfolio_snapshot_service.py +136 -0
  239. investing_algorithm_framework/services/portfolios/portfolio_sync_service.py +182 -0
  240. investing_algorithm_framework/services/positions/__init__.py +7 -0
  241. investing_algorithm_framework/services/positions/position_service.py +210 -0
  242. investing_algorithm_framework/services/positions/position_snapshot_service.py +18 -0
  243. investing_algorithm_framework/services/repository_service.py +8 -2
  244. investing_algorithm_framework/services/trade_order_evaluator/__init__.py +9 -0
  245. investing_algorithm_framework/services/trade_order_evaluator/backtest_trade_oder_evaluator.py +117 -0
  246. investing_algorithm_framework/services/trade_order_evaluator/default_trade_order_evaluator.py +51 -0
  247. investing_algorithm_framework/services/trade_order_evaluator/trade_order_evaluator.py +80 -0
  248. investing_algorithm_framework/services/trade_service/__init__.py +9 -0
  249. investing_algorithm_framework/services/trade_service/trade_service.py +1099 -0
  250. investing_algorithm_framework/services/trade_service/trade_stop_loss_service.py +39 -0
  251. investing_algorithm_framework/services/trade_service/trade_take_profit_service.py +41 -0
  252. investing_algorithm_framework-7.25.6.dist-info/METADATA +535 -0
  253. investing_algorithm_framework-7.25.6.dist-info/RECORD +268 -0
  254. {investing_algorithm_framework-1.3.1.dist-info → investing_algorithm_framework-7.25.6.dist-info}/WHEEL +1 -2
  255. investing_algorithm_framework-7.25.6.dist-info/entry_points.txt +3 -0
  256. investing_algorithm_framework/app/algorithm.py +0 -410
  257. investing_algorithm_framework/domain/models/market_data/__init__.py +0 -11
  258. investing_algorithm_framework/domain/models/market_data/asset_price.py +0 -50
  259. investing_algorithm_framework/domain/models/market_data/ohlcv.py +0 -76
  260. investing_algorithm_framework/domain/models/market_data/order_book.py +0 -63
  261. investing_algorithm_framework/domain/models/market_data/ticker.py +0 -92
  262. investing_algorithm_framework/domain/models/order/order_fee.py +0 -45
  263. investing_algorithm_framework/domain/models/trading_data_types.py +0 -47
  264. investing_algorithm_framework/domain/models/trading_time_frame.py +0 -205
  265. investing_algorithm_framework/domain/singleton.py +0 -9
  266. investing_algorithm_framework/infrastructure/models/order/order_fee.py +0 -21
  267. investing_algorithm_framework/infrastructure/models/position/position_cost.py +0 -32
  268. investing_algorithm_framework/infrastructure/repositories/order_fee_repository.py +0 -15
  269. investing_algorithm_framework/infrastructure/repositories/position_cost_repository.py +0 -16
  270. investing_algorithm_framework/infrastructure/services/market_service.py +0 -422
  271. investing_algorithm_framework/services/market_data_service.py +0 -75
  272. investing_algorithm_framework/services/order_service.py +0 -464
  273. investing_algorithm_framework/services/portfolio_service.py +0 -105
  274. investing_algorithm_framework/services/position_cost_service.py +0 -5
  275. investing_algorithm_framework/services/position_service.py +0 -50
  276. investing_algorithm_framework/services/strategy_orchestrator_service.py +0 -219
  277. investing_algorithm_framework/setup_logging.py +0 -40
  278. investing_algorithm_framework-1.3.1.dist-info/AUTHORS.md +0 -8
  279. investing_algorithm_framework-1.3.1.dist-info/METADATA +0 -172
  280. investing_algorithm_framework-1.3.1.dist-info/RECORD +0 -103
  281. investing_algorithm_framework-1.3.1.dist-info/top_level.txt +0 -1
  282. {investing_algorithm_framework-1.3.1.dist-info → investing_algorithm_framework-7.25.6.dist-info}/LICENSE +0 -0
@@ -1,45 +0,0 @@
1
- from investing_algorithm_framework.domain.models.base_model import BaseModel
2
-
3
-
4
- class OrderFee(BaseModel):
5
- def __init__(self, currency, cost, rate):
6
- self.currency = currency
7
- self.cost = cost
8
- self.rate = rate
9
-
10
- def get_currency(self):
11
- return self.currency
12
-
13
- def set_currency(self, currency):
14
- self.currency = currency
15
-
16
- def get_cost(self):
17
- return self.cost
18
-
19
- def set_cost(self, cost):
20
- self.cost = cost
21
-
22
- def get_rate(self):
23
- return self.rate
24
-
25
- @staticmethod
26
- def from_ccxt_fee(ccxt_fee):
27
- return OrderFee(
28
- currency=ccxt_fee.get('currency'),
29
- cost=ccxt_fee.get('cost'),
30
- rate=ccxt_fee.get('rate'),
31
- )
32
-
33
- def to_dict(self):
34
- return {
35
- "currency": self.currency,
36
- "cost": self.cost,
37
- "rate": self.rate
38
- }
39
-
40
- def __repr__(self):
41
- return self.repr(
42
- currency=self.get_currency(),
43
- cost=self.get_cost(),
44
- rate=self.get_rate(),
45
- )
@@ -1,47 +0,0 @@
1
- from enum import Enum
2
-
3
-
4
- class TradingDataType(Enum):
5
- TICKER = 'TICKER'
6
- ORDER_BOOK = 'ORDER_BOOK'
7
- OHLCV = "OHLCV"
8
-
9
- @staticmethod
10
- def from_value(value):
11
-
12
- if isinstance(value, TradingDataType):
13
- for trading_data_type in TradingDataType:
14
-
15
- if value == trading_data_type:
16
- return trading_data_type
17
-
18
- elif isinstance(value, str):
19
- return TradingDataType.from_string(value)
20
-
21
- raise ValueError(
22
- "Could not convert value to trading data type"
23
- )
24
-
25
- @staticmethod
26
- def from_string(value: str):
27
-
28
- if isinstance(value, str):
29
- for order_type in TradingDataType:
30
-
31
- if value.upper() == order_type.value:
32
- return order_type
33
-
34
- raise ValueError(
35
- "Could not convert value to trading data type"
36
- )
37
-
38
- def equals(self, other):
39
-
40
- if other is None:
41
- return False
42
-
43
- if isinstance(other, Enum):
44
- return self.value == other.value
45
-
46
- else:
47
- return TradingDataType.from_string(other) == self
@@ -1,205 +0,0 @@
1
- from enum import Enum
2
- from datetime import timedelta, datetime
3
-
4
- from investing_algorithm_framework.domain.exceptions import \
5
- OperationalException
6
-
7
-
8
- class TradingTimeFrame(Enum):
9
- ONE_MINUTE = "ONE_MINUTE"
10
- FIFTEEN_MINUTE = "FIFTEEN_MINUTE"
11
- ONE_HOUR = "ONE_HOUR"
12
- ONE_DAY = 'ONE_DAY'
13
- ONE_MONTH = "ONE_MONTH"
14
- ONE_YEAR = "ONE_YEAR"
15
-
16
- def create_time_frame_from_limit(self, limit: int = 50):
17
-
18
- if TradingTimeFrame.ONE_MINUTE.equals(self):
19
- hold = 1
20
- start_date = datetime.now() - timedelta(minutes=limit)
21
- elif TradingTimeFrame.FIFTEEN_MINUTE.equals(self):
22
- hold = 15
23
- start_date = datetime.now() - timedelta(minutes=(limit * 15))
24
- elif TradingTimeFrame.ONE_HOUR.equals(self):
25
- hold = 60
26
- start_date = datetime.now() - timedelta(hours=limit)
27
- elif TradingTimeFrame.ONE_DAY.equals(self):
28
- hold = 60 * 24
29
- start_date = datetime.now() - timedelta(days=limit)
30
- elif TradingTimeFrame.ONE_MONTH.equals(self):
31
- hold = 60 * 24 * 30
32
- start_date = datetime.now() - timedelta(weeks=(4 * limit))
33
- else:
34
- hold = 60 * 24 * 365
35
- start_date = datetime.now() - timedelta(days=(limit * 365))
36
-
37
- iteration = 1
38
- dates = []
39
- while iteration < limit or \
40
- start_date + timedelta(minutes=hold) < datetime.now():
41
- dates.append(start_date + timedelta(minutes=hold))
42
- start_date += timedelta(minutes=hold)
43
- iteration += 1
44
-
45
- dates.append(datetime.now())
46
- return dates
47
-
48
- def create_time_frame_from_start_date(self, start_date: datetime):
49
-
50
- if start_date > datetime.now():
51
- raise OperationalException("Start date cannot be in the future")
52
-
53
- if TradingTimeFrame.ONE_MINUTE.equals(self):
54
- hold = 1
55
- elif TradingTimeFrame.FIFTEEN_MINUTE.equals(self):
56
- hold = 15
57
- elif TradingTimeFrame.ONE_HOUR.equals(self):
58
- hold = 60
59
- elif TradingTimeFrame.ONE_DAY.equals(self):
60
- hold = 60 * 24
61
- elif TradingTimeFrame.ONE_MONTH.equals(self):
62
- hold = 60 * 24 * 30
63
- else:
64
- hold = 60 * 24 * 365
65
-
66
- iteration = 1
67
- dates = []
68
-
69
- while start_date < datetime.now():
70
- dates.append(start_date + timedelta(minutes=hold))
71
- start_date += timedelta(minutes=hold)
72
- iteration += 1
73
-
74
- dates.append(datetime.now())
75
- return dates
76
-
77
- def to_ccxt_string(self):
78
-
79
- if TradingTimeFrame.ONE_MINUTE.equals(self):
80
- return "1m"
81
-
82
- if TradingTimeFrame.FIFTEEN_MINUTE.equals(self):
83
- return "15m"
84
-
85
- if TradingTimeFrame.ONE_HOUR.equals(self):
86
- return "1h"
87
-
88
- if TradingTimeFrame.ONE_DAY.equals(self):
89
- return "1d"
90
-
91
- if TradingTimeFrame.ONE_MONTH.equals(self):
92
- return "1m"
93
-
94
- if TradingTimeFrame.ONE_YEAR.equals(self):
95
- return "1y"
96
-
97
- raise OperationalException("Data time unit value is not supported")
98
-
99
- @staticmethod
100
- def from_value(value):
101
-
102
- if isinstance(value, TradingTimeFrame):
103
- for data_time_unit in TradingTimeFrame:
104
-
105
- if value == data_time_unit:
106
- return data_time_unit
107
-
108
- elif isinstance(value, str):
109
- return TradingTimeFrame.from_string(value)
110
-
111
- raise ValueError(
112
- "Could not convert value to data time unit"
113
- )
114
-
115
- @staticmethod
116
- def from_string(value: str):
117
-
118
- if isinstance(value, str):
119
- for data_time_unit in TradingTimeFrame:
120
-
121
- if value.upper() == data_time_unit.value:
122
- return data_time_unit
123
-
124
- raise ValueError(
125
- "Could not convert value to data time unit"
126
- )
127
-
128
- def equals(self, other):
129
-
130
- if other is None:
131
- return False
132
-
133
- if isinstance(other, Enum):
134
- return self.value == other.value
135
-
136
- else:
137
- return TradingTimeFrame.from_string(other) == self
138
-
139
- def create_start_date(self, limit=50):
140
-
141
- if TradingTimeFrame.ONE_MINUTE.equals(self):
142
- return datetime.now() - timedelta(minutes=limit)
143
-
144
- if TradingTimeFrame.FIFTEEN_MINUTE.equals(self):
145
- return datetime.now() - timedelta(minutes=(limit * 15))
146
-
147
- if TradingTimeFrame.ONE_HOUR.equals(self):
148
- return datetime.now() - timedelta(hours=limit)
149
-
150
- if TradingTimeFrame.ONE_DAY.equals(self):
151
- return datetime.now() - timedelta(days=limit)
152
-
153
- if TradingTimeFrame.ONE_MONTH.equals(self):
154
- return datetime.now() - timedelta(weeks=(4 * limit))
155
-
156
- if TradingTimeFrame.ONE_YEAR.equals(self):
157
- return datetime.now() - timedelta(days=(limit * 365))
158
-
159
- raise OperationalException("Data time unit value is not supported")
160
-
161
- @property
162
- def minutes(self):
163
-
164
- if TradingTimeFrame.ONE_MINUTE.equals(self):
165
- return 1
166
-
167
- if TradingTimeFrame.FIFTEEN_MINUTE.equals(self):
168
- return 15
169
-
170
- if TradingTimeFrame.ONE_HOUR.equals(self):
171
- return 60
172
-
173
- if TradingTimeFrame.ONE_DAY.equals(self):
174
- return 60 * 24
175
-
176
- if TradingTimeFrame.ONE_MONTH.equals(self):
177
- return 60 * 24 * 30
178
-
179
- if TradingTimeFrame.ONE_YEAR.equals(self):
180
- return 60 * 24 * 365
181
-
182
- raise OperationalException("Data time frame value is not supported")
183
-
184
- @property
185
- def milliseconds(self):
186
-
187
- if TradingTimeFrame.ONE_MINUTE.equals(self):
188
- return 60 * 1000
189
-
190
- if TradingTimeFrame.FIFTEEN_MINUTE.equals(self):
191
- return 15 * 60 * 1000
192
-
193
- if TradingTimeFrame.ONE_HOUR.equals(self):
194
- return 60 * 60 * 1000
195
-
196
- if TradingTimeFrame.ONE_DAY.equals(self):
197
- return 60 * 60 * 24 * 1000
198
-
199
- if TradingTimeFrame.ONE_MONTH.equals(self):
200
- return 60 * 60 * 24 * 30 * 1000
201
-
202
- if TradingTimeFrame.ONE_YEAR.equals(self):
203
- return 60 * 60 * 24 * 365 * 1000
204
-
205
- raise OperationalException("Data time frame value is not supported")
@@ -1,9 +0,0 @@
1
- class Singleton(type):
2
- _instances = {}
3
-
4
- def __call__(cls, *args, **kwargs):
5
- if cls not in cls._instances:
6
- cls._instances[cls] = \
7
- super(Singleton, cls).__call__(*args, **kwargs)
8
-
9
- return cls._instances[cls]
@@ -1,21 +0,0 @@
1
- from sqlalchemy import Column, Integer, String, Float, ForeignKey
2
- from sqlalchemy.orm import relationship
3
-
4
- from investing_algorithm_framework.domain import OrderFee
5
- from investing_algorithm_framework.infrastructure.database import SQLBaseModel
6
- from investing_algorithm_framework.infrastructure.models.model_extension \
7
- import SQLAlchemyModelExtension
8
-
9
-
10
- class SQLOrderFee(OrderFee, SQLBaseModel, SQLAlchemyModelExtension):
11
- __tablename__ = "order_fees"
12
- id = Column(Integer, primary_key=True, unique=True)
13
- currency = Column(String)
14
- cost = Column(Float)
15
- rate = Column(Float)
16
- order_id = Column(Integer, ForeignKey('orders.id'))
17
- order = relationship("SQLOrder", back_populates="fee")
18
-
19
- def __init__(self, currency, cost, rate, order_id):
20
- super().__init__(currency, cost, rate)
21
- self.order_id = order_id
@@ -1,32 +0,0 @@
1
- from datetime import datetime
2
-
3
- from sqlalchemy import Column, Integer, Float, ForeignKey, DateTime
4
- from sqlalchemy.orm import relationship
5
-
6
- from investing_algorithm_framework.domain import PositionCost
7
- from investing_algorithm_framework.infrastructure.database import SQLBaseModel
8
- from investing_algorithm_framework.infrastructure.models.model_extension \
9
- import SQLAlchemyModelExtension
10
-
11
-
12
- class SQLPositionCost(SQLBaseModel, PositionCost, SQLAlchemyModelExtension):
13
- __tablename__ = "position_costs"
14
- id = Column(Integer, primary_key=True, unique=True)
15
- price = Column(Float)
16
- amount = Column(Float)
17
- created_at = Column(DateTime)
18
- position_id = Column(Integer, ForeignKey('positions.id'))
19
- position = relationship("SQLPosition", back_populates="position_costs")
20
-
21
- def __init__(
22
- self,
23
- price=0,
24
- amount=0,
25
- position_id=None,
26
- created_at=None,
27
- ):
28
- super(SQLPositionCost, self).__init__()
29
- self.amount = amount
30
- self.price = price
31
- self.position_id = position_id
32
- self.created_at = created_at
@@ -1,15 +0,0 @@
1
- from investing_algorithm_framework.infrastructure.models import SQLOrderFee
2
- from .repository import Repository
3
-
4
-
5
- class SQLOrderFeeRepository(Repository):
6
- base_class = SQLOrderFee
7
- DEFAULT_NOT_FOUND_MESSAGE = "Order fee not found"
8
-
9
- def _apply_query_params(self, db, query, query_params):
10
- order_query_param = self.get_query_param("order", query_params)
11
-
12
- if order_query_param:
13
- query = query.filter_by(order_id=order_query_param)
14
-
15
- return query
@@ -1,16 +0,0 @@
1
- from investing_algorithm_framework.infrastructure.models import SQLPositionCost
2
- from .repository import Repository
3
-
4
-
5
- class SQLPositionCostRepository(Repository):
6
- base_class = SQLPositionCost
7
- DEFAULT_NOT_FOUND_MESSAGE = "Position cost not found"
8
-
9
- def _apply_query_params(self, db, query, query_params):
10
- position_query_param = self.get_query_param("position", query_params)
11
-
12
- if position_query_param:
13
- query = query.filter_by(position_id=position_query_param)
14
-
15
- query = query.order_by(SQLPositionCost.created_at.desc())
16
- return query