11import logging
2+ import logging
23import os
34from datetime import timedelta
45
56import polars
7+ from dateutil import parser
68
79from investing_algorithm_framework .domain import RESOURCE_DIRECTORY , \
810 BACKTEST_DATA_DIRECTORY_NAME , DATETIME_FORMAT_BACKTESTING , \
@@ -59,7 +61,7 @@ def __init__(
5961 start_date_func = start_date_func ,
6062 end_date = end_date ,
6163 end_date_func = end_date_func ,
62- window_size = window_size
64+ window_size = window_size ,
6365 )
6466
6567 def prepare_data (
@@ -80,7 +82,6 @@ def prepare_data(
8082 When downloading the data it will use the ccxt library.
8183 """
8284 # Calculating the backtest data start date
83-
8485 difference = self .end_date - self .start_date
8586 total_minutes = 0
8687
@@ -127,7 +128,10 @@ def prepare_data(
127128 )
128129
129130 # Get the OHLCV data from the ccxt market service
130- market_service = CCXTMarketService (self .market_credential_service )
131+ market_service = CCXTMarketService (
132+ market_credential_service = self .market_credential_service ,
133+ )
134+ market_service .config = config
131135 ohlcv = market_service .get_ohlcv (
132136 symbol = self .symbol ,
133137 time_frame = self .timeframe ,
@@ -171,6 +175,7 @@ def get_data(self, backtest_index_date, **kwargs):
171175 from_timestamp = backtest_index_date - timedelta (
172176 minutes = self .total_minutes_timeframe
173177 )
178+ datetime_format = self ._config ["DATETIME_FORMAT" ]
174179 self .backtest_data_index_date = backtest_index_date \
175180 .replace (microsecond = 0 )
176181 from_timestamp = from_timestamp .replace (microsecond = 0 )
@@ -193,8 +198,8 @@ def get_data(self, backtest_index_date, **kwargs):
193198 file_path , columns = self .column_names , separator = ","
194199 )
195200 df = df .filter (
196- (df ['Datetime' ] >= from_timestamp .strftime (DATETIME_FORMAT ))
197- & (df ['Datetime' ] <= to_timestamp .strftime (DATETIME_FORMAT ))
201+ (df ['Datetime' ] >= from_timestamp .strftime (datetime_format ))
202+ & (df ['Datetime' ] <= to_timestamp .strftime (datetime_format ))
198203 )
199204 return df
200205
@@ -209,6 +214,9 @@ def empty(self):
209214 def file_name (self ):
210215 return self ._create_file_path ().split ("/" )[- 1 ]
211216
217+ def write_data_to_file_path (self , data_file , data : polars .DataFrame ):
218+ data .write_csv (data_file )
219+
212220
213221class CCXTTickerBacktestMarketDataSource (
214222 TickerMarketDataSource , BacktestMarketDataSource
@@ -304,7 +312,10 @@ def prepare_data(
304312 )
305313
306314 # Get the OHLCV data from the ccxt market service
307- market_service = CCXTMarketService (self .market_credential_service )
315+ market_service = CCXTMarketService (
316+ market_credential_service = self .market_credential_service
317+ )
318+ market_service .config = config
308319 ohlcv = market_service .get_ohlcv (
309320 symbol = self .symbol ,
310321 time_frame = self .timeframe ,
@@ -363,13 +374,12 @@ def get_data(self, **kwargs):
363374 # Filter the data based on the backtest index date and the end date
364375 df = polars .read_csv (file_path )
365376 df = df .filter (
366- (df ['Datetime' ] >= backtest_index_date
367- .strftime (DATETIME_FORMAT ))
377+ (df ['Datetime' ] >= backtest_index_date .strftime (DATETIME_FORMAT ))
368378 )
369-
370379 first_row = df .head (1 )[0 ]
380+ first_row_datetime = parser .parse (first_row ["Datetime" ][0 ])
371381
372- if first_row [ "Datetime" ][ 0 ] > end_date . strftime ( DATETIME_FORMAT ) :
382+ if first_row_datetime > end_date :
373383 logger .warning (
374384 f"No ticker data available for the given backtest "
375385 f"index date { backtest_index_date } and symbol { self .symbol } "
@@ -386,12 +396,17 @@ def get_data(self, **kwargs):
386396 "datetime" : first_row ["Datetime" ][0 ],
387397 }
388398
399+ def write_data_to_file_path (self , data_file , data : polars .DataFrame ):
400+ data .write_csv (data_file )
401+
389402
390403class CCXTOHLCVMarketDataSource (OHLCVMarketDataSource ):
391404
392405 def get_data (self , ** kwargs ):
393- market_service = CCXTMarketService (self .market_credential_service )
394-
406+ market_service = CCXTMarketService (
407+ market_credential_service = self .market_credential_service ,
408+ )
409+ market_service .config = self .config
395410 if self .start_date is None :
396411 raise OperationalException (
397412 "Either start_date or start_date_func should be set "
@@ -422,7 +437,10 @@ def to_backtest_market_data_source(self) -> BacktestMarketDataSource:
422437class CCXTOrderBookMarketDataSource (OrderBookMarketDataSource ):
423438
424439 def get_data (self , ** kwargs ):
425- market_service = CCXTMarketService (self .market_credential_service )
440+ market_service = CCXTMarketService (
441+ market_credential_service = self .market_credential_service
442+ )
443+ market_service .config = self .config
426444 return market_service .get_order_book (
427445 symbol = self .symbol , market = self .market
428446 )
@@ -438,7 +456,8 @@ def __init__(
438456 identifier ,
439457 market ,
440458 symbol = None ,
441- backtest_timeframe = None
459+ backtest_timeframe = None ,
460+
442461 ):
443462 super ().__init__ (
444463 identifier = identifier ,
@@ -448,7 +467,10 @@ def __init__(
448467 self ._backtest_timeframe = backtest_timeframe
449468
450469 def get_data (self , ** kwargs ):
451- market_service = CCXTMarketService (self .market_credential_service )
470+ market_service = CCXTMarketService (
471+ market_credential_service = self .market_credential_service
472+ )
473+ market_service .config = self .config
452474
453475 if self .market is None :
454476
0 commit comments