diff --git a/vnpy/app/cta_strategy/strategies/king_keltner_strategy.py b/vnpy/app/cta_strategy/strategies/king_keltner_strategy.py new file mode 100644 index 00000000..e1b7d964 --- /dev/null +++ b/vnpy/app/cta_strategy/strategies/king_keltner_strategy.py @@ -0,0 +1,152 @@ +from vnpy.app.cta_strategy import ( + CtaTemplate, + StopOrder, + Direction, + TickData, + BarData, + TradeData, + OrderData, + BarGenerator, + ArrayManager, +) + +class KingKeltnerStrategy(CtaTemplate): + """""" + + author = '用Python的交易员' + + kk_length = 11 + kk_dev = 1.6 + trailing_percent = 0.8 + fixed_size = 1 + + kk_up = 0 + kk_down = 0 + intra_trade_high = 0 + intra_trade_low = 0 + + buy_orderidList = [] + short_orderidList = [] + orderList = [] + + parameters = [ 'kk_length', 'kk_dev','fixed_size'] + variables = ['kk_up','kk_down'] + + 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() + + buy_orderidList = [] + short_orderidList = [] + orderList = [] + + 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. + """ + self.bg.update_bar(bar) + + def on_5min_bar(self, bar:BarData): + """""" + for orderid in self.orderList: + self.cancel_order(orderid) + self.orderList = [] + + am = self.am + am.update_bar(bar) + if not am.inited: + return + + self.kk_up, self.kk_down = am.keltner(self.kk_length, self.kk_dev) + + if self.pos == 0: + self.intra_trade_high = bar.high_price + self.intra_trade_low = bar.low_price + self.send_oco_order(self.kk_up, self.kk_down, self.fixed_size) + + elif self.pos > 0: + self.intra_trade_high = max(self.intra_trade_high, bar.high_price) + self.intra_trade_low = bar.low_price + + vt_orderid = self.sell(self.intra_trade_high*(1-self.trailing_percent/100), + abs(self.pos), True) + self.orderList.append(vt_orderid) + + elif self.pos < 0: + self.intra_trade_high = bar.high_price + self.intra_trade_low = min(self.intra_trade_low, bar.low_price) + + vt_orderid = self.cover(self.intra_trade_low*(1+self.trailing_percent/100), + abs(self.pos), True) + self.orderList.append(vt_orderid) + + 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. + """ + if self.pos != 0: + if self.pos > 0: + for short_orderid in self.short_orderidList: + self.cancel_order(short_orderid) + + elif self.pos < 0: + for buy_orderid in self.buy_orderidList: + self.cancel_order(buy_orderid) + + for orderid in (self.buy_orderidList + self.short_orderidList): + if orderid in self.orderList: + self.orderList.remove(orderid) + + self.put_event() + + def send_oco_order(self, buy_price, short_price, volume): + """""" + self.buy_orderidList = self.buy(buy_price, volume, True) + self.short_orderidList = self.short(short_price, volume, True) + + self.orderList.append(self.buy_orderidList) + self.orderList.append(self.short_orderidList) + + def on_stop_order(self, stop_order: StopOrder): + """ + Callback of stop order update. + """ + pass \ No newline at end of file