def __init__(self, strategy_engine, strategy_name: str, spread: SpreadData, setting: dict): """""" super().__init__(strategy_engine, strategy_name, spread, setting) self.bg = BarGenerator(self.on_spread_bar) self.am = ArrayManager()
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = XminBarGenerator(self.on_bar, 1, self.on_hour_bar, interval=Interval.HOUR) self.am = ArrayManager() self.liq_price = 0 self.trading_size = 0 self.on_bar_time = time1(0, 0) self.clearance_time = time1(14, 57) self.liq_time = time1(14, 59) self.day_clearance = False self.buy_svt_orderids = [] self.sell_svt_orderids = [] self.short_svt_orderids = [] self.cover_svt_orderids = [] self.sell_lvt_orderids = [] self.cover_lvt_orderids = []
class Single_bar: """ 用来生成单品种的K线 """ def __init__(self, strategy: StrategyTemplate, vt_symbol: str): """""" # 和portfolio的接口 self.portfolio = strategy self.vt_symbol = vt_symbol # 需要合成的K线周期设置 self.bar_interval = self.portfolio.bar_interval self.bar_frequency = self.portfolio.bar_frequency # K线合成工具和储存容器 self.bg = BarGenerator(self.on_bar, self.bar_interval, self.on_5min_bar, self.bar_frequency) self.am = ArrayManager() # K线合成计数 self.bar_count = 0 def on_bar(self, bar: BarData): """ Callback of new bar data update. """ self.bg.update_bar(bar) def on_5min_bar(self, bar: BarData): """""" self.bar_count += 1 self.am.update_bar(bar)
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super(TurtleSignalStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar) self.am = ArrayManager()
def __init__(self, strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict): """""" super().__init__(strategy_engine, strategy_name, vt_symbols, setting) # self.y_symbol = (self.vt_symbols[0].split('.'))[0] # self.x_symbol = (self.vt_symbols[1].split('.'))[1] self.y_symbol = self.vt_symbols[0] self.x_symbol = self.vt_symbols[1] self.x_fixed_size = int(np.abs(self.fixed_size * self.x_multiplier)) self.y_fixed_size = int(np.abs(self.fixed_size * self.y_multiplier)) self.open_direction_dict['x_symbol'] = 0 self.open_direction_dict['y_symbol'] = 0 self.close_direction_dict['x_symbol'] = 0 self.close_direction_dict['y_symbol'] = 0 self.ams: Dict = {} self.ams[self.y_symbol] = ArrayManager(size=self.hedge_ratio_window + 50) self.ams[self.x_symbol] = ArrayManager(size=self.hedge_ratio_window + 50) self.sam = SpreadArrayManager( size=max(self.std_window, self.mean_window) + 50)
def clear_all(self) -> None: """ Clear all data in the item. """ super().clear_all() self._arrayManager = ArrayManager(max(self.MA_PARAMS) + 1) self.mas = defaultdict(dict) self.last_ix = 0 self.last_picture = QtGui.QPicture()
def __init__(self, manager: BarManager): """""" super().__init__(manager) # self.periods = [5, 10, 20, 30, 60] self.init_setting() self._arrayManager = ArrayManager(max(self.MA_PARAMS) + 1) self.mas = defaultdict(dict) self.last_ix = 0 self.last_picture = QtGui.QPicture()
def __init__(self, fast_window: int, slow_window: int): """""" super(MaSignal, self).__init__() self.fast_window = fast_window self.slow_window = slow_window self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar) self.am = ArrayManager()
def __init__(self, manager: BarManager): """""" super().__init__(manager) self.init_setting() self._arrayManager = ArrayManager(150) self.last_ix = 0 self.last_picture = QtGui.QPicture() self.incs = defaultdict(dict) self.br_max = 0 self.br_min = 0
def __init__(self, cci_window: int, cci_level: float): """""" super(CciSignal, self).__init__() self.cci_window = cci_window self.cci_level = cci_level self.cci_long = self.cci_level self.cci_short = -self.cci_level self.bg = BarGenerator(self.on_bar) self.am = ArrayManager()
def __init__(self, rsi_window: int, rsi_level: float): """Constructor""" super(RsiSignal, self).__init__() self.rsi_window = rsi_window self.rsi_level = rsi_level self.rsi_long = 50 + self.rsi_level self.rsi_short = 50 - self.rsi_level self.bg = BarGenerator(self.on_bar) self.am = ArrayManager()
def clear_all(self) -> None: """ Clear all data in the item. """ super().clear_all() self._arrayManager = ArrayManager(150) self.last_ix = 0 self.last_picture = QtGui.QPicture() self.rsis = defaultdict(dict) self.br_max = -np.inf self.br_min = np.inf
def __init__(self, manager: BarManager): """""" super().__init__(manager) # self.periods = [6, 12, 24] self.init_setting() self._arrayManager = ArrayManager(150) self.rsis = defaultdict(dict) self.last_ix = 0 self.br_max = -np.inf self.br_min = np.inf self.last_picture = QtGui.QPicture()
def draw_his(zscore_data, test_data): # RSRS标准分分布 am = ArrayManager(200, zscore_data, 18) rsrs = [] for bar in test_data: am.update_bar(bar) rsrs.append(am.rsrs_std()) ser = pd.Series(rsrs) ser.hist(bins=50, color='b', edgecolor='gray', alpha=0.7, grid=False) plt.show()
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super(MultiTimeframeStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting) self.rsi_long = 50 + self.rsi_signal self.rsi_short = 50 - self.rsi_signal self.bg5 = BarGenerator(self.on_bar, 5, self.on_5min_bar) self.am5 = ArrayManager() self.bg15 = BarGenerator(self.on_bar, 15, self.on_15min_bar) self.am15 = ArrayManager()
def __init__(self, strategy_engine, strategy_name: str, spread: SpreadData, setting: dict): """""" super().__init__(strategy_engine, strategy_name, spread, setting) self.bg = BarGenerator(self.on_open_spread_bar, self.open_window, self.on_open_spread_bar) self.am = ArrayManager() self.spread_pos = 0.0 self.boll_up = 0.0 self.boll_down = 0.0 self.boll_mid = 0.0
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super(BollChannelStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar) self.am = ArrayManager()
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = XminBarGenerator(self.on_bar, self.interval, self.on_xmin_bar) self.am = ArrayManager() self.liq_price = 0 self.on_bar_time = time1(0, 0) self.clearance_time = time1(14, 57) self.liq_time = time1(14, 59) trade_record_fields = [ "vt_symbol", "orderid", "tradeid", "offset", "direction", "price", "volume", "datetime", "strategy", "strategy_name" ] self.trade_record_file = open( "D:/CTA/1-策略开发/1-开发中的策略/14-oscillator_drive/backtesting_trade_record.csv", "a", newline="") self.trade_record_file_writer = csv.DictWriter(self.trade_record_file, trade_record_fields) self.trade_record_file_writer.writeheader()
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = XminBarGenerator(self.on_bar, self.interval, self.on_xmin_bar) self.am = ArrayManager() self.liq_price = 0 self.trading_size = 0 self.on_bar_time = time1(0, 0) self.clearance_time = time1(14, 57) # 清仓开始时间 self.liq_time = time1(14, 59) # 交易所结算开始时间 self.day_clearance = False self.buy_svt_orderids = [] self.sell_svt_orderids = [] self.short_svt_orderids = [] self.cover_svt_orderids = [] self.sell_lvt_orderids = [] self.cover_lvt_orderids = [] # 2021年5月10日有极端行情,收益异常高,不具有普遍参考价值,因此在回测中跳过这一天 extreme_date = "2021-05-10" extreme_date = time.strptime(extreme_date, "%Y-%m-%d") year, month, day = extreme_date[:3] self.extreme_date = datetime.date(year, month, day)
def __init__( self, strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict ): """""" super().__init__(strategy_engine, strategy_name, vt_symbols, setting) self.bgs: Dict[str, BarGenerator] = {} self.ams: Dict[str, ArrayManager] = {} self.rsi_data: Dict[str, float] = {} self.atr_data: Dict[str, float] = {} self.atr_ma: Dict[str, float] = {} self.intra_trade_high: Dict[str, float] = {} self.intra_trade_low: Dict[str, float] = {} self.targets: Dict[str, int] = {} self.last_tick_time: datetime = None # Obtain contract info for vt_symbol in self.vt_symbols: def on_bar(bar: BarData): """""" pass self.bgs[vt_symbol] = BarGenerator(on_bar) self.ams[vt_symbol] = ArrayManager() self.targets[vt_symbol] = 0
def __init__(self, strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict): super(TurtleStrategy, self).__init__(strategy_engine, strategy_name, vt_symbols, setting) self.vt_symbols = vt_symbols # 合约的list self.total_long = 0 # 所有合约的多仓位和 self.total_short = 0 # 所有合约的空仓位和 self.context = { symbol: { 'entry_long': 0, # 开/加多仓价格阈值 'entry_short': 0, # 开/加空仓价格阈值 'exit_long': 0, # 平多仓价格阈值 'exit_short': 0, # 平空仓价格阈值 'atr_value': 0, # ATR 'stop_loss_long': 0, # 多仓止损价格 'stop_loss_short': 0, # 空仓止损价格 'multiplier': 0, # 合约规模 'unit': 0, # 仓位 'am': ArrayManager(), } for symbol in vt_symbols } def on_bar(bar: BarData): pass self.bgs = {symbol: BarGenerator(on_bar) for symbol in vt_symbols} self.last_tick_time: datetime = None
def __init__( self, strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict ): """""" super().__init__(strategy_engine, strategy_name, vt_symbols, setting) self.last_tick_time: datetime = None self.ams:Dict[str, ArrayManager] = {} self.bgs: Dict[str, BarGenerator] = {} # 策略内动态调整OLS相关参数,小数参数会被int() self.short_entry_multiplier = abs(self.entry_multiplier) self.short_exit_multiplier = 0 self.long_entry_multiplier = -abs(self.entry_multiplier) self.long_exit_multiplier = 0 self.mean_window = int(self.std_window * self.std_mean_window_ratio) self.y_symbol = self.vt_symbols[0] self.x_symbol = self.vt_symbols[1] self.x_fixed_size = np.abs(self.fixed_size * 1) self.y_fixed_size = np.abs(self.fixed_size * 1) self.x_pos_target = 0 self.y_pos_target = 0 # 实例化缓存期货品种价格序列容器 for vt_symbol in self.vt_symbols: self.ams[vt_symbol] = ArrayManager(size=max(self.std_window,self.mean_window)+50) #实例化bg容器 for vt_symbol in self.vt_symbols: def on_bar(bar: BarData): """""" pass self.bgs[vt_symbol] = BarGenerator(on_bar) # 实例化缓存价差价格序列容器 self.sam = SpreadArrayManager(size=max(self.std_window,self.mean_window)+50)
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = XminBarGenerator(self.on_bar, self.interval, self.on_xmin_bar) self.am = ArrayManager() self.liq_price = 0 self.trading_size = 0 self.on_bar_time = time1(0, 0) self.clearance_time = time1(14, 57) # 清仓开始时间 self.liq_time = time1(14, 59) # 交易所结算开始时间 self.day_clearance = False self.buy_svt_orderids = [] self.sell_svt_orderids = [] self.short_svt_orderids = [] self.cover_svt_orderids = [] self.buy_lvt_orderids = [] self.sell_lvt_orderids = [] self.short_lvt_orderids = [] self.cover_lvt_orderids = [] self.path = Path.cwd() self.trade_record_dict = {} self.tick_count = 0 trade_record_fields = [ "vt_symbol", "orderid", "tradeid", "offset", "direction", "price", "volume", "datetime", "strategy" ] self.trade_record_wb = openpyxl.load_workbook( self.path / "strategies" / "PaperAccount_reord_table.xlsx") self.trade_record_wb.iso_dates = True sheet_names = self.trade_record_wb.sheetnames if self.strategy_name not in sheet_names: self.trade_record_sheet = self.trade_record_wb.create_sheet( index=0, title=self.strategy_name) else: self.trade_record_sheet = self.trade_record_wb[self.strategy_name] if not self.trade_record_sheet.cell(row=1, column=1).value: for i in range(1, len(trade_record_fields) + 1): column = get_column_letter(i) self.trade_record_sheet[column + str(1)] = trade_record_fields[i - 1] self.trade_record_sheet.freeze_panes = "A2" self.trade_record_wb.save(self.path / "strategies" / "PaperAccount_reord_table.xlsx")
def __init__(self, strategy: StrategyTemplate, vt_symbol: str): """""" # 和portfolio的接口 self.portfolio = strategy self.vt_symbol = vt_symbol # 需要合成的K线周期设置 self.bar_interval = self.portfolio.bar_interval self.bar_frequency = self.portfolio.bar_frequency # K线合成工具和储存容器 self.bg = BarGenerator(self.on_bar, self.bar_interval, self.on_5min_bar, self.bar_frequency) self.am = ArrayManager() # K线合成计数 self.bar_count = 0
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super(DualThrustStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar) self.am = ArrayManager() self.bars = []
def __init__(self, strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict): """""" super().__init__(strategy_engine, strategy_name, vt_symbols, setting) self.vt_symbol = vt_symbols[0] self.bg = BarGenerator(self.on_bar) self.am = ArrayManager()
def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super(KingKeltnerStrategy, self).__init__( cta_engine, strategy_name, vt_symbol, setting ) self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar) self.am = ArrayManager()
def calculate_adaptive_channel(am: ArrayManager, n: int, dev: float): """""" ma = am.sma(n) std = am.std(n) boll_up = ma + std * dev boll_down = ma - std * dev kk_up = ma + atr * dev kk_down = ma - atr * dev donchian_up = am.high[-n:].max() donchian_down = am.low[-n:].min() channel_up = max(boll_up, kk_up, donchian_up) channel_down = min(boll_down, kk_down, donchian_down) return channel_up, channel_down
def __init__(self, strategy: StrategyTemplate, vt_symbol: str): """""" self.portfolio = strategy self.vt_symbol = vt_symbol self.long_ma_window = self.portfolio.long_ma_window self.short_ma_window = self.portfolio.short_ma_window self.trailing_percent = self.portfolio.trailing_percent self.fixed_size = self.portfolio.fixed_size self.long_ma_value = 0 self.short_ma_value = 0 self.intra_trade_high = 0 self.intra_trade_low = 0 self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar) self.am = ArrayManager()
def __init__(self, strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict): """""" super().__init__(strategy_engine, strategy_name, vt_symbols, setting) self.bgs: Dict[str, BarGenerator] = {} self.ams: Dict[str, ArrayManager] = {} self.intra_trade_lows: Dict[str, float] = {} self.intra_trade_highs: Dict[str, float] = {} self.atr_values: Dict[str, float] = {} self.atr_mas: Dict[str, float] = {} self.rsi_values: Dict[str, float] = {} def on_bar(bar: BarData): """""" pass self.bgs[self.vt_symbols[0]] = BarGenerator(on_bar, 15, self.on_15min_symbol_bar1) self.bgs[self.vt_symbols[1]] = BarGenerator(on_bar, 15, self.on_15min_symbol_bar2) # self.bgs[self.vt_symbols[2]] = BarGenerator(on_bar,15,self.on_15min_symbol_bar3) self.ams[self.vt_symbols[0]] = ArrayManager() self.ams[self.vt_symbols[1]] = ArrayManager() # self.ams[self.vt_symbols[2]] = ArrayManager() self.intra_trade_lows[self.vt_symbols[0]] = 0 self.intra_trade_lows[self.vt_symbols[1]] = 0 # self.intra_trade_lows[self.vt_symbols[2]] = 0 self.intra_trade_highs[self.vt_symbols[0]] = 0 self.intra_trade_highs[self.vt_symbols[1]] = 0 # self.intra_trade_highs[self.vt_symbols[2]] = 0 self.atr_values[self.vt_symbols[0]] = 0 self.atr_values[self.vt_symbols[1]] = 0 # self.atr_values[self.vt_symbols[2]] = 0 self.atr_mas[self.vt_symbols[0]] = 0 self.atr_mas[self.vt_symbols[1]] = 0 # self.atr_mas[self.vt_symbols[2]] = 0 self.rsi_values[self.vt_symbols[0]] = 0 self.rsi_values[self.vt_symbols[1]] = 0