Skip to content

Commit 878b7b2

Browse files
committed
Refactor order check interval
1 parent 8b7b2f8 commit 878b7b2

File tree

9 files changed

+75
-20
lines changed

9 files changed

+75
-20
lines changed

examples/backtest/run_backtest.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,5 @@
3030
algorithm=algorithm,
3131
start_date=start_date,
3232
end_date=end_date,
33-
pending_order_check_interval="2h",
3433
)
3534
pretty_print_backtest(backtest_report)

examples/test.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import requests
2+
3+
if __name__ == "__main__":
4+
# Endpoint for Treasury Yield Curve Rates API
5+
url = "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v2/accounting/od/avg_interest_rates?filter=record_date:gte:2024-01-01"
6+
7+
# Make a GET request to the API
8+
response = requests.get(url)
9+
10+
if response.status_code == 200:
11+
# Extract risk-free rate from API response (e.g., 10-year Treasury yield)
12+
treasury_yield_data = response.json()
13+
entries = treasury_yield_data["data"]
14+
for entry in entries:
15+
print(entry)
16+
print(entries[-1])
17+
print(entries[-1]["avg_interest_rate_amt"])
18+
# print(treasury_yield_data)
19+
# ten_year_yield = treasury_yield_data["data"][0]["value"]
20+
# risk_free_rate = ten_year_yield / 100 # Convert percentage to decimal
21+
# print("10-Year Treasury Yield (Risk-Free Rate):", risk_free_rate)
22+
else:
23+
print("Failed to retrieve Treasury yield data. Status code:", response.status_code)

investing_algorithm_framework/app/app.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ def _initialize_app_for_backtest(
239239
self,
240240
backtest_start_date,
241241
backtest_end_date,
242-
pending_order_check_interval,
243242
market_data_sources,
243+
pending_order_check_interval=None,
244244
) -> None:
245245
"""
246246
Initialize the app for backtesting by setting the configuration
@@ -261,9 +261,11 @@ def _initialize_app_for_backtest(
261261
configuration_service.config[BACKTESTING_START_DATE] = \
262262
backtest_start_date
263263
configuration_service.config[BACKTESTING_END_DATE] = backtest_end_date
264-
configuration_service.config[
265-
BACKTESTING_PENDING_ORDER_CHECK_INTERVAL
266-
] = pending_order_check_interval
264+
265+
if pending_order_check_interval is not None:
266+
configuration_service.config[
267+
BACKTESTING_PENDING_ORDER_CHECK_INTERVAL
268+
] = pending_order_check_interval
267269

268270
# Create resource dir if not exits
269271
self._create_resource_directory_if_not_exists()
@@ -498,7 +500,6 @@ def run(
498500
while self.algorithm.running:
499501
if number_of_iterations_since_last_orders_check == 30:
500502
logger.info("Checking pending orders")
501-
self.algorithm.check_pending_orders()
502503
number_of_iterations_since_last_orders_check = 1
503504

504505
self.algorithm.run_jobs()
@@ -675,7 +676,7 @@ def run_backtest(
675676
algorithm,
676677
start_date,
677678
end_date,
678-
pending_order_check_interval='1h',
679+
pending_order_check_interval=None,
679680
output_directory=None
680681
) -> BacktestReport:
681682
"""
@@ -740,7 +741,7 @@ def run_backtests(
740741
start_date: Optional[datetime] = None,
741742
end_date: Optional[datetime] = None,
742743
date_ranges: Optional[Tuple[datetime, datetime]] = None,
743-
pending_order_check_interval='1h',
744+
pending_order_check_interval=None,
744745
output_directory=None
745746
) -> List[BacktestReport]:
746747
"""

investing_algorithm_framework/app/strategy.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ def __init__(
6060
)
6161

6262
def run_strategy(self, algorithm, market_data):
63+
# Check pending orders before running the strategy
64+
algorithm.check_pending_orders()
65+
66+
# Run user defined strategy
6367
self.apply_strategy(algorithm=algorithm, market_data=market_data)
6468

6569
def apply_strategy(self, algorithm, market_data):

investing_algorithm_framework/infrastructure/models/market_data_sources/ccxt.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,24 +237,31 @@ class CCXTTickerBacktestMarketDataSource(
237237
backtest_data_directory = None
238238
backtest_data_start_date = None
239239
backtest_data_end_date = None
240-
timeframe = "15m"
240+
timeframe = None
241241
column_names = ["Datetime", "Open", "High", "Low", "Close", "Volume"]
242242

243243
def __init__(
244244
self,
245245
identifier,
246246
market,
247247
symbol=None,
248-
timeframe="15m",
248+
timeframe=None,
249249
):
250250
super().__init__(
251251
identifier=identifier,
252252
market=market,
253253
symbol=symbol,
254254
)
255+
255256
if timeframe is not None:
256257
self.timeframe = timeframe
257258

259+
if self.timeframe is None:
260+
raise OperationalException(
261+
"timeframe should be set for "
262+
"CCXTTickerBacktestMarketDataSource"
263+
)
264+
258265
def prepare_data(
259266
self,
260267
config,

investing_algorithm_framework/services/backtesting/backtest_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def run_backtest_for_profile(self, algorithm, strategy, index_date):
150150
market_data[data_id] = \
151151
self._market_data_source_service.get_data(data_id)
152152

153-
self._order_service.check_pending_orders()
153+
# self._order_service.check_pending_orders()
154154
strategy.run_strategy(algorithm=algorithm, market_data=market_data)
155155

156156
def generate_schedule(

investing_algorithm_framework/services/market_data_source_service/backtest_market_data_source_service.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,12 @@ def get_order_book(self, symbol, market):
109109
)
110110

111111
def get_ohlcv(
112-
self, symbol, from_timestamp, market, time_frame, to_timestamp=None
112+
self,
113+
symbol,
114+
from_timestamp,
115+
time_frame=None,
116+
market=None,
117+
to_timestamp=None
113118
):
114119
market_data_source = self.get_ohlcv_market_data_source(
115120
symbol=symbol, market=market, time_frame=time_frame

investing_algorithm_framework/services/market_data_source_service/market_data_source_service.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ def get_order_book(self, symbol, market=None):
6060
def get_ohlcv(
6161
self,
6262
symbol,
63-
time_frame,
6463
from_timestamp,
64+
time_frame,
6565
market=None,
6666
to_timestamp=None
6767
):
@@ -110,24 +110,36 @@ def get_ticker_market_data_source(self, symbol, market=None):
110110

111111
return None
112112

113-
def get_ohlcv_market_data_source(self, symbol, time_frame, market=None):
113+
def get_ohlcv_market_data_source(
114+
self, symbol, time_frame=None, market=None
115+
):
114116

115117
if self.market_data_sources is not None:
118+
116119
for market_data_source in self._market_data_sources:
117120
if isinstance(market_data_source, OHLCVMarketDataSource):
118121

119-
if market is not None:
122+
if market is not None and time_frame is not None:
120123

121124
if market_data_source.market.lower() == market.lower()\
122125
and market_data_source.symbol.lower() \
123126
== symbol.lower() and \
124127
market_data_source.timeframe == time_frame:
125128
return market_data_source
126-
else:
129+
elif market is not None:
130+
if market_data_source.market.lower() == market.lower()\
131+
and market_data_source.symbol.lower() \
132+
== symbol.lower():
133+
return market_data_source
134+
elif time_frame is not None:
127135
if market_data_source.symbol.lower() \
128136
== symbol.lower() and \
129137
market_data_source.timeframe == time_frame:
130138
return market_data_source
139+
else:
140+
if market_data_source.symbol.lower() \
141+
== symbol.lower():
142+
return market_data_source
131143

132144
return None
133145

investing_algorithm_framework/services/order_service/order_backtest_service.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,18 @@ def check_pending_orders(self):
6767
f"/{order.trading_symbol.upper()}"
6868
position = self.position_repository.get(order.position_id)
6969
portfolio = self.portfolio_repository.get(position.portfolio_id)
70+
timeframe = None
71+
72+
if BACKTESTING_PENDING_ORDER_CHECK_INTERVAL in \
73+
self.configuration_service.config:
74+
timeframe = self.configuration_service\
75+
.config[BACKTESTING_PENDING_ORDER_CHECK_INTERVAL]
7076

7177
if not self._market_data_source_service\
7278
.is_ohlcv_data_source_present(
7379
symbol=symbol,
7480
market=portfolio.market,
75-
time_frame=self.configuration_service
76-
.config[BACKTESTING_PENDING_ORDER_CHECK_INTERVAL]
81+
time_frame=timeframe
7782
):
7883
raise OperationalException(
7984
f"OHLCV data source not found for {symbol} "
@@ -90,12 +95,11 @@ def check_pending_orders(self):
9095
df = self._market_data_source_service.get_ohlcv(
9196
symbol=symbol,
9297
market=portfolio.market,
98+
time_frame=timeframe,
9399
to_timestamp=self.configuration_service.config.get(
94100
BACKTESTING_INDEX_DATETIME
95101
),
96102
from_timestamp=order.get_created_at(),
97-
time_frame=self.configuration_service
98-
.config[BACKTESTING_PENDING_ORDER_CHECK_INTERVAL]
99103
)
100104

101105
if self.has_executed(order, df):

0 commit comments

Comments
 (0)