@@ -826,60 +826,59 @@ def check_data_completeness(
826826 show_progress = show_progress
827827 )
828828 data_provider_service = self .container .data_provider_service ()
829+ unique_data_sources = set (data_sources )
829830
830- for strategy in strategies :
831+ for data_source in unique_data_sources :
831832
832- for data_source in strategy .data_sources :
833+ if DataType .OHLCV .equals (data_source .data_type ):
834+ required_start_date = backtest_date_range .start_date - \
835+ timedelta (
836+ minutes = TimeFrame .from_value (
837+ data_source .time_frame
838+ ).amount_of_minutes * data_source .window_size
839+ )
840+ number_of_required_data_points = \
841+ data_source .get_number_of_required_data_points (
842+ backtest_date_range .start_date ,
843+ backtest_date_range .end_date
844+ )
833845
834- if DataType .OHLCV .equals (data_source .data_type ):
835- required_start_date = backtest_date_range .start_date - \
836- timedelta (
837- minutes = TimeFrame .from_value (
838- data_source .time_frame
839- ).amount_of_minutes * data_source .window_size
840- )
841- number_of_required_data_points = \
842- data_source .get_number_of_required_data_points (
846+ try :
847+ data_provider = data_provider_service .get (data_source )
848+ number_of_available_data_points = \
849+ data_provider .get_number_of_data_points (
843850 backtest_date_range .start_date ,
844851 backtest_date_range .end_date
845852 )
846853
847- try :
848- data_provider = data_provider_service .get (data_source )
849- number_of_available_data_points = \
850- data_provider .get_number_of_data_points (
851- backtest_date_range .start_date ,
852- backtest_date_range .end_date
853- )
854-
855- missing_dates = \
856- data_provider .get_missing_data_dates (
857- required_start_date ,
858- backtest_date_range .end_date
859- )
860- if len (missing_dates ) > 0 :
861- missing_data_info [data_source .identifier ] = {
862- "data_source_id" : data_source .identifier ,
863- "completeness_percentage" : (
864- (
865- number_of_available_data_points /
866- number_of_required_data_points
867- ) * 100
868- ),
869- "missing_data_points" : len (
870- missing_dates
871- ),
872- "missing_dates" : missing_dates ,
873- "data_source_file_path" :
874- data_provider .get_data_source_file_path ()
875- }
876-
877- except Exception as e :
878- raise DataError (
879- f"Error getting data provider for data source "
880- f"{ data_source .identifier } "
881- f"({ data_source .symbol } ): { str (e )} "
854+ missing_dates = \
855+ data_provider .get_missing_data_dates (
856+ required_start_date ,
857+ backtest_date_range .end_date
882858 )
859+ if len (missing_dates ) > 0 :
860+ missing_data_info [data_source .identifier ] = {
861+ "data_source_id" : data_source .identifier ,
862+ "completeness_percentage" : (
863+ (
864+ number_of_available_data_points /
865+ number_of_required_data_points
866+ ) * 100
867+ ),
868+ "missing_data_points" : len (
869+ missing_dates
870+ ),
871+ "missing_dates" : missing_dates ,
872+ "data_source_file_path" :
873+ data_provider .get_data_source_file_path ()
874+ }
875+
876+ except Exception as e :
877+ raise DataError (
878+ f"Error getting data provider for data source "
879+ f"{ data_source .identifier } "
880+ f"({ data_source .symbol } ): { str (e )} "
881+ )
883882
884883 if len (missing_data_info .keys ()) > 0 :
885884 return False , missing_data_info
@@ -999,7 +998,8 @@ def run_vector_backtests(
999998 risk_free_rate = risk_free_rate ,
1000999 skip_data_sources_initialization = True ,
10011000 market = market ,
1002- trading_symbol = trading_symbol
1001+ trading_symbol = trading_symbol ,
1002+ continue_on_error = continue_on_error
10031003 )
10041004 backtests .append (backtest )
10051005 else :
0 commit comments