def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar) self.am = ArrayManager() self.day_start = time(9, 30) self.day_end = time(16, 0)
class SMA2Strategy(CtaTemplate): author = "vnpy course" # 定義參數 fast_window = 5 slow_window = 20 fixed_size = 1 # 定義變數 fast_ma0 = 0 fast_ma1 = 0 slow_ma0 = 0 slow_ma1 = 0 parameters = ["fast_window", "slow_window", "fixed_size"] variables = ["fast_ma0", "fast_ma1", "slow_ma0", "slow_ma1"] def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar) self.am = ArrayManager() self.day_start = time(9, 30) self.day_end = time(16, 0) def on_init(self): """ Callback when strategy is inited. """ self.write_log("策略初始化") self.load_bar(10) def on_start(self): """ Callback when strategy is started. """ self.write_log("策略啟動") self.put_event() def on_stop(self): """ Callback when strategy is stopped. """ self.write_log("策略停止") self.put_event() def on_tick(self, tick: TickData): """ Callback of new tick data update. """ self.bg.update_tick(tick) def on_bar(self, bar: BarData): """ Callback of new bar data update. """ if not self.day_start <= bar.datetime.time() < self.day_end: return self.bg.update_bar(bar) def on_15min_bar(self, bar: BarData): # print('15m', bar.datetime, bar.close_price) self.cancel_all() am = self.am am.update_bar(bar) if not am.inited: return # 計算技術指標 fast_ma = am.sma(self.fast_window, array=True) self.fast_ma0 = fast_ma[-1] self.fast_ma1 = fast_ma[-2] slow_ma = am.sma(self.slow_window, array=True) self.slow_ma0 = slow_ma[-1] self.slow_ma1 = slow_ma[-2] # 判斷均線交叉 cross_over = self.fast_ma0 > self.slow_ma0 and self.fast_ma1 <= self.slow_ma1 cross_below = self.fast_ma0 < self.slow_ma0 and self.fast_ma1 >= self.slow_ma1 if cross_over: if self.pos == 0: self.buy(bar.close_price * 1.01, self.fixed_size) elif self.pos < 0: self.cover(bar.close_price * 1.01, self.fixed_size) elif cross_below: if self.pos == 0: self.short(bar.close_price * 0.99, self.fixed_size) elif self.pos > 0: self.sell(bar.close_price * 0.99, self.fixed_size) self.put_event() def on_order(self, order: OrderData): """ Callback of new order data update. """ pass def on_trade(self, trade: TradeData): """ Callback of new trade data update. """ self.put_event() def on_stop_order(self, stop_order: StopOrder): """ Callback of stop order update. """ pass
class BBANDSStrategy(CtaTemplate): author = "vnpy course" # 定義參數 boll_window = 20 boll_dev = 2 fixed_size = 1 # 定義變數 boll_up0 = 0 boll_up1 = 0 boll_down0 = 0 boll_down1 = 0 boll_mid = 0 parameters = ["boll_window", "boll_dev", "fixed_size"] variables = [ "boll_up0", "boll_up1", "boll_down0", "boll_down1", "boll_mid" ] def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar) self.am = ArrayManager() self.day_start = time(9, 30) self.day_end = time(16, 0) def on_init(self): """ Callback when strategy is inited. """ self.write_log("策略初始化") self.load_bar(10) def on_start(self): """ Callback when strategy is started. """ self.write_log("策略啟動") def on_stop(self): """ Callback when strategy is stopped. """ self.write_log("策略停止") def on_tick(self, tick: TickData): """ Callback of new tick data update. """ self.bg.update_tick(tick) def on_bar(self, bar: BarData): """ Callback of new bar data update. """ if not self.day_start <= bar.datetime.time() < self.day_end: return self.bg.update_bar(bar) def on_15min_bar(self, bar: BarData): self.cancel_all() am = self.am am.update_bar(bar) if not am.inited: return # 計算技術指標 boll_up, boll_down = am.boll(self.boll_window, self.boll_dev, array=True) self.boll_up0 = boll_up[-1] self.boll_up1 = boll_up[-2] self.boll_down0 = boll_down[-1] self.boll_down1 = boll_down[-2] self.boll_mid = am.sma(self.boll_window) if self.pos == 0: if am.close[-1] > self.boll_up0 and am.close[-2] <= self.boll_up1: self.buy(bar.close_price * 1.01, self.fixed_size) elif am.close[-1] < self.boll_down0 and am.close[ -2] >= self.boll_down1: self.short(bar.close_price * 0.99, self.fixed_size) elif self.pos > 0: if bar.close_price <= self.boll_mid: self.sell(bar.close_price * 0.99, abs(self.pos)) elif self.pos < 0: if bar.close_price >= self.boll_mid: self.cover(bar.close_price * 1.01, abs(self.pos)) self.put_event() def on_order(self, order: OrderData): """ Callback of new order data update. """ pass def on_trade(self, trade: TradeData): """ Callback of new trade data update. """ self.put_event() def on_stop_order(self, stop_order: StopOrder): """ Callback of stop order update. """ pass
class MACDStrategy(CtaTemplate): author = "vnpy course" # 定義參數 fast_period = 12 slow_period = 26 signal_period = 9 fixed_size = 1 sl_ratio = 0.02 # 定義變數 macd_value0 = 0 macd_value1 = 0 signal_value0 = 0 signal_value1 = 0 intra_trade_high = 0 intra_trade_low = 0 long_sl = 0 short_sl = 0 parameters = [ "fast_period", "slow_period", "signal_period", "fixed_size", "sl_ratio" ] variables = [ "macd_value0", "macd_value1", "signal_value0", "signal_value1", "intra_trade_high", "intra_trade_low", "long_sl", "short_sl" ] def __init__(self, cta_engine, strategy_name, vt_symbol, setting): """""" super().__init__(cta_engine, strategy_name, vt_symbol, setting) self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar) self.am = ArrayManager() self.day_start = time(9, 30) self.day_end = time(16, 0) def on_init(self): """ Callback when strategy is inited. """ self.write_log("策略初始化") self.load_bar(10) def on_start(self): """ Callback when strategy is started. """ self.write_log("策略启动") def on_stop(self): """ Callback when strategy is stopped. """ self.write_log("策略停止") def on_tick(self, tick: TickData): """ Callback of new tick data update. """ self.bg.update_tick(tick) def on_bar(self, bar: BarData): """ Callback of new bar data update. """ if not self.day_start <= bar.datetime.time() < self.day_end: return self.bg.update_bar(bar) def on_15min_bar(self, bar: BarData): self.cancel_all() am = self.am am.update_bar(bar) if not am.inited: return # 計算技術指標 macd, signal, hist = am.macd(self.fast_period, self.slow_period, self.signal_period, array=True) self.macd_value0 = macd[-1] self.macd_value1 = macd[-2] self.signal_value0 = signal[-1] self.signal_value1 = signal[-2] cross_over = self.macd_value0 > self.signal_value0 and self.macd_value1 <= self.signal_value1 cross_below = self.macd_value0 < self.signal_value0 and self.macd_value1 >= self.signal_value1 if self.pos == 0: if cross_over: self.buy(bar.close_price * 1.01, self.fixed_size) elif cross_below: self.short(bar.close_price * 0.99, self.fixed_size) self.intra_trade_high = bar.high_price self.intra_trade_low = bar.low_price elif self.pos > 0: self.intra_trade_high = max(self.intra_trade_high, bar.high_price) self.long_sl = self.intra_trade_high * (1 - self.sl_ratio) self.sell(self.long_sl, abs(self.pos), stop=True) elif self.pos < 0: self.intra_trade_low = min(self.intra_trade_low, bar.low_price) self.short_sl = self.intra_trade_low * (1 + self.sl_ratio) self.cover(self.short_sl, abs(self.pos), stop=True) self.put_event() def on_order(self, order: OrderData): """ Callback of new order data update. """ pass def on_trade(self, trade: TradeData): """ Callback of new trade data update. """ self.put_event() def on_stop_order(self, stop_order: StopOrder): """ Callback of stop order update. """ pass