Skip to content

Commit 640804e

Browse files
authored
Merge pull request #403 from coding-kitties/release/dev-to-main
Release: merge dev into main
2 parents 2d3a242 + ad32cce commit 640804e

31 files changed

Lines changed: 12283 additions & 1792 deletions

docusaurus/docs/Getting Started/deployment.md

Lines changed: 131 additions & 453 deletions
Large diffs are not rendered by default.

docusaurus/docs/Getting Started/tasks.md

Lines changed: 156 additions & 531 deletions
Large diffs are not rendered by default.

docusaurus/docs/Getting Started/trades.md

Lines changed: 189 additions & 398 deletions
Large diffs are not rendered by default.

docusaurus/docusaurus.config.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// @ts-check
22
// Note: type annotations allow type checking and IDEs autocompletion
33

4-
const lightCodeTheme = require('prism-react-renderer/themes/github');
5-
const darkCodeTheme = require('prism-react-renderer/themes/dracula');
4+
const {themes} = require('prism-react-renderer');
5+
const lightCodeTheme = themes.github;
6+
const darkCodeTheme = themes.dracula;
67

78
/** @type {import('@docusaurus/types').Config} */
89
const config = {

docusaurus/sidebar.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ const sidebars = {
6161
},
6262
{
6363
type: 'doc',
64-
id: 'Data/market-data-sources',
64+
id: 'Data/data-sources',
6565
},
6666
{
6767
type: 'doc',
68-
id: 'Data/multiple-market-data-sources',
68+
id: 'Data/backtest_data',
6969
},
7070
],
7171
},

investing_algorithm_framework/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
SnapshotInterval, AWS_S3_STATE_BUCKET_NAME, BacktestEvaluationFocus, \
2525
save_backtests_to_directory, BacktestMetrics, DATA_DIRECTORY
2626
from .infrastructure import AzureBlobStorageStateHandler, \
27-
CSVOHLCVDataProvider, CCXTOHLCVDataProvider, PandasOHLCVDataProvider, \
27+
CSVOHLCVDataProvider, CSVTickerDataProvider, \
28+
CCXTOHLCVDataProvider, CCXTTickerDataProvider, \
29+
PandasOHLCVDataProvider, \
2830
AWSS3StorageStateHandler
2931
from .create_app import create_app
3032
from .download_data import download, download_v2, DownloadResult, \
@@ -109,7 +111,9 @@
109111
'select_backtest_date_ranges',
110112
'DataType',
111113
'CSVOHLCVDataProvider',
114+
'CSVTickerDataProvider',
112115
"CCXTOHLCVDataProvider",
116+
"CCXTTickerDataProvider",
113117
"DataProvider",
114118
"get_annual_volatility",
115119
"get_sortino_ratio",

investing_algorithm_framework/app/app.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2124,11 +2124,10 @@ def add_strategy(self, strategy, throw_exception=True) -> None:
21242124

21252125
has_duplicates = False
21262126

2127-
for i in range(len(self._strategies)):
2128-
for j in range(i + 1, len(self._strategies)):
2129-
if self._strategies[i].worker_id == strategy.worker_id:
2130-
has_duplicates = True
2131-
break
2127+
for existing_strategy in self._strategies:
2128+
if existing_strategy.strategy_id == strategy.strategy_id:
2129+
has_duplicates = True
2130+
break
21322131

21332132
if has_duplicates:
21342133
raise OperationalException(

investing_algorithm_framework/app/reporting/tables/trade_metrics_table.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ def create_html_trade_metrics_table(results, report):
8888
copy_results['Worst Trade'] = f"{worst_trade['net_gain']:.2f} {report.trading_symbol}"
8989
copy_results['Worst Trade Date'] = safe_format_date(worst_trade['opened_at'], format_str=DEFAULT_DATETIME_FORMAT)
9090

91-
copy_results['Trades Average Gain'] = f"{safe_format(copy_results['average_trade_gain'], string_format)} {report.trading_symbol} {copy_results['trades_average_gain_percentage']:.2f}%"
92-
copy_results['Trades Average Loss'] = f"{safe_format(copy_results['average_trade_loss'], string_format)} {report.trading_symbol} {copy_results['trades_average_loss_percentage']:.2f}%"
91+
copy_results['Trades Average Gain'] = f"{safe_format(copy_results['average_trade_gain'], string_format)} {report.trading_symbol} {copy_results['average_trade_gain_percentage']:.2f}%"
92+
copy_results['Trades Average Loss'] = f"{safe_format(copy_results['average_trade_loss'], string_format)} {report.trading_symbol} {copy_results['average_trade_loss_percentage']:.2f}%"
9393
copy_results['Average Trade Duration'] = f"{copy_results['average_trade_duration']:.2f} hours"
9494
copy_results['Number of Trades'] = f"{copy_results['number_of_trades']}"
9595
copy_results['Win Rate'] = f"{copy_results['win_rate']:.2f}%"

investing_algorithm_framework/app/strategy.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from investing_algorithm_framework.domain import OperationalException, \
88
Position, PositionSize, TimeUnit, StrategyProfile, Trade, \
9-
DataSource, OrderSide, StopLossRule, TakeProfitRule, Order, \
9+
DataSource, DataType, OrderSide, StopLossRule, TakeProfitRule, Order, \
1010
INDEX_DATETIME
1111
from .context import Context
1212

@@ -156,6 +156,32 @@ def __init__(
156156
f"Interval not set for strategy instance {self.strategy_id}"
157157
)
158158

159+
# Check if scheduling interval is faster than the smallest
160+
# OHLCV data source timeframe
161+
ohlcv_timeframes = [
162+
ds.time_frame.amount_of_minutes
163+
for ds in self.data_sources
164+
if ds.time_frame is not None
165+
and DataType.OHLCV.equals(ds.data_type)
166+
]
167+
168+
if ohlcv_timeframes:
169+
scheduling_interval = \
170+
self.time_unit.amount_of_minutes * self.interval
171+
smallest_timeframe = min(ohlcv_timeframes)
172+
173+
if scheduling_interval < smallest_timeframe:
174+
raise OperationalException(
175+
f"Strategy '{self.strategy_id}' scheduling interval "
176+
f"({self.interval} {self.time_unit.value.lower()}"
177+
f"{'s' if self.interval > 1 else ''}"
178+
f" = {scheduling_interval} min) is faster than "
179+
f"the smallest OHLCV data source timeframe "
180+
f"({smallest_timeframe} min). The strategy would "
181+
f"run without new data. Increase the scheduling "
182+
f"interval or use a smaller data timeframe."
183+
)
184+
159185
# Initialize stop_losses as a new list per instance
160186
if stop_losses is not None:
161187
self.stop_losses = list(stop_losses)

investing_algorithm_framework/infrastructure/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
SQLOrderMetadataRepository
1111
from .services import AzureBlobStorageStateHandler, AWSS3StorageStateHandler, \
1212
BacktestService
13-
from .data_providers import CSVOHLCVDataProvider, get_default_data_providers, \
13+
from .data_providers import CSVOHLCVDataProvider, \
14+
CSVTickerDataProvider, get_default_data_providers, \
1415
get_default_ohlcv_data_providers, CCXTOHLCVDataProvider, \
15-
PandasOHLCVDataProvider
16+
CCXTTickerDataProvider, PandasOHLCVDataProvider
1617
from .order_executors import CCXTOrderExecutor, BacktestOrderExecutor
1718
from .portfolio_providers import CCXTPortfolioProvider
1819

@@ -40,12 +41,14 @@
4041
"SQLTradeStopLossRepository",
4142
"SQLOrderMetadataRepository",
4243
"CSVOHLCVDataProvider",
44+
"CSVTickerDataProvider",
4345
"CCXTOrderExecutor",
4446
"CCXTPortfolioProvider",
4547
"get_default_data_providers",
4648
"get_default_ohlcv_data_providers",
4749
"AWSS3StorageStateHandler",
4850
"CCXTOHLCVDataProvider",
51+
"CCXTTickerDataProvider",
4952
"BacktestOrderExecutor",
5053
"PandasOHLCVDataProvider",
5154
"BacktestService",

0 commit comments

Comments
 (0)