def __init__(self): """Constructor""" super(MaSignal, self).__init__() self.fastWindow = 5 self.slowWindow = 20 self.bg = BarGenerator(self.onBar, 5, self.onFiveBar) self.am = ArrayManager()
def __init__(self): """Constructor""" super(CciSignal, self).__init__() self.cciWindow = 30 self.cciLevel = 10 self.cciLong = self.cciLevel self.cciShort = -self.cciLevel self.bg = BarGenerator(self.onBar) self.am = ArrayManager()
def __init__(self): """Constructor""" super(RsiSignal, self).__init__() self.rsiWindow = 14 self.rsiLevel = 20 self.rsiLong = 50 + self.rsiLevel self.rsiShort = 50 - self.rsiLevel self.bg = BarGenerator(self.onBar) self.am = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(MultiTimeframeStrategy, self).__init__(ctaEngine, setting) self.rsiLong = 50 + self.rsiSignal self.rsiShort = 50 - self.rsiSignal # 创建K线合成器对象 self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar) self.am5 = ArrayManager() self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar) self.am15 = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(AtrRsiStrategy, self).__init__(ctaEngine, setting) # 创建K线合成器对象 self.bg = BarGenerator(self.onBar) self.am = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(KkStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, 5, self.onFiveBar) # 创建K线合成器对象 self.am = ArrayManager() self.buyOrderIDList = [] self.shortOrderIDList = [] self.orderList = []
class MaSignal(CtaSignal): """双均线信号""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(MaSignal, self).__init__() self.fastWindow = 5 self.slowWindow = 20 self.bg = BarGenerator(self.onBar, 5, self.onFiveBar) self.am = ArrayManager() #---------------------------------------------------------------------- def onTick(self, tick): """Tick更新""" self.bg.updateTick(tick) #---------------------------------------------------------------------- def onBar(self, bar): """K线更新""" self.bg.updateBar(bar) #---------------------------------------------------------------------- def onFiveBar(self, bar): """5分钟K线更新""" self.am.updateBar(bar) if not self.am.inited: self.setSignalPos(0) fastMa = self.am.sma(self.fastWindow) slowMa = self.am.sma(self.slowWindow) if fastMa > slowMa: self.setSignalPos(1) elif fastMa < slowMa: self.setSignalPos(-1) else: self.setSignalPos(0)
class CciSignal(CtaSignal): """CCI信号""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(CciSignal, self).__init__() self.cciWindow = 30 self.cciLevel = 10 self.cciLong = self.cciLevel self.cciShort = -self.cciLevel self.bg = BarGenerator(self.onBar) self.am = ArrayManager() #---------------------------------------------------------------------- def onTick(self, tick): """Tick更新""" self.bg.updateTick(tick) #---------------------------------------------------------------------- def onBar(self, bar): """K线更新""" self.am.updateBar(bar) if not self.am.inited: self.setSignalPos(0) cciValue = self.am.cci(self.cciWindow) if cciValue >= self.cciLong: self.setSignalPos(1) elif cciValue<= self.cciShort: self.setSignalPos(-1) else: self.setSignalPos(0)
class RsiSignal(CtaSignal): """RSI信号""" #---------------------------------------------------------------------- def __init__(self): """Constructor""" super(RsiSignal, self).__init__() self.rsiWindow = 14 self.rsiLevel = 20 self.rsiLong = 50 + self.rsiLevel self.rsiShort = 50 - self.rsiLevel self.bg = BarGenerator(self.onBar) self.am = ArrayManager() #---------------------------------------------------------------------- def onTick(self, tick): """Tick更新""" self.bg.updateTick(tick) #---------------------------------------------------------------------- def onBar(self, bar): """K线更新""" self.am.updateBar(bar) if not self.am.inited: self.setSignalPos(0) rsiValue = self.am.rsi(self.rsiWindow) if rsiValue >= self.rsiLong: self.setSignalPos(1) elif rsiValue <= self.rsiShort: self.setSignalPos(-1) else: self.setSignalPos(0)
def __init__(self, ctaEngine, setting): """Constructor""" super(TurtleTradingStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar) self.am = ArrayManager()
class TurtleTradingStrategy(CtaTemplate): """海龟交易策略""" className = 'TurtleTradingStrategy' author = u'用Python的交易员' # 策略参数 entryWindow = 55 # 入场通道窗口 exitWindow = 20 # 出场通道窗口 atrWindow = 20 # 计算ATR波动率的窗口 initDays = 10 # 初始化数据所用的天数 fixedSize = 1 # 每次交易的数量 # 策略变量 entryUp = 0 # 入场通道上轨 entryDown = 0 # 入场通道下轨 exitUp = 0 # 出场通道上轨 exitDown = 0 # 出场通道下轨 atrVolatility = 0 # ATR波动率 longEntry = 0 # 多头入场价格 shortEntry = 0 # 空头入场价格 longStop = 0 # 多头止损价格 shortStop = 0 # 空头止损价格 # 参数列表,保存了参数的名称 paramList = ['name', 'className', 'author', 'vtSymbol', 'entryWindow', 'exitWindow', 'atrWindow', 'initDays', 'fixedSize'] # 变量列表,保存了变量的名称 varList = ['inited', 'trading', 'pos', 'entryUp', 'entryDown', 'exitUp', 'exitDown', 'longEntry', 'shortEntry', 'longStop', 'shortStop'] # 同步列表,保存了需要保存到数据库的变量名称 syncList = ['pos'] #---------------------------------------------------------------------- def __init__(self, ctaEngine, setting): """Constructor""" super(TurtleTradingStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar) self.am = ArrayManager() #---------------------------------------------------------------------- def onInit(self): """初始化策略(必须由用户继承实现)""" self.writeCtaLog(u'%s策略初始化' %self.name) # 载入历史数据,并采用回放计算的方式初始化策略数值 initData = self.loadBar(self.initDays) for bar in initData: self.onBar(bar) self.putEvent() #---------------------------------------------------------------------- def onStart(self): """启动策略(必须由用户继承实现)""" self.writeCtaLog(u'%s策略启动' %self.name) self.putEvent() #---------------------------------------------------------------------- def onStop(self): """停止策略(必须由用户继承实现)""" self.writeCtaLog(u'%s策略停止' %self.name) self.putEvent() #---------------------------------------------------------------------- def onTick(self, tick): """收到行情TICK推送(必须由用户继承实现)""" self.bg.updateTick(tick) #---------------------------------------------------------------------- def onBar(self, bar): """收到Bar推送(必须由用户继承实现)""" self.cancelAll() # 保存K线数据 self.am.updateBar(bar) if not self.am.inited: return # 计算指标数值 self.entryUp, self.entryDown = self.am.donchian(self.entryWindow) self.exitUp, self.exitDown = self.am.donchian(self.exitWindow) if not self.pos: self.atrVolatility = self.am.atr(self.atrWindow) # 判断是否要进行交易 if self.pos == 0: self.longEntry = 0 self.shortEntry = 0 self.longStop = 0 self.shortStop = 0 self.sendBuyOrders(self.entryUp) self.sendShortOrders(self.entryDown) elif self.pos > 0: # 加仓逻辑 self.sendBuyOrders(self.longEntry) # 止损逻辑 sellPrice = max(self.longStop, self.exitDown) self.sell(sellPrice, abs(self.pos), True) elif self.pos < 0: # 加仓逻辑 self.sendShortOrders(self.shortEntry) # 止损逻辑 coverPrice = min(self.shortStop, self.exitUp) self.cover(coverPrice, abs(self.pos), True) # 同步数据到数据库 self.saveSyncData() # 发出状态更新事件 self.putEvent() #---------------------------------------------------------------------- def onOrder(self, order): """收到委托变化推送(必须由用户继承实现)""" pass #---------------------------------------------------------------------- def onTrade(self, trade): """成交推送""" if trade.direction == DIRECTION_LONG: self.longEntry = trade.price self.longStop = self.longEntry - self.atrVolatility * 2 else: self.shortEntry = trade.price self.shortStop = self.shortEntry + self.atrVolatility * 2 # 发出状态更新事件 self.putEvent() #---------------------------------------------------------------------- def onStopOrder(self, so): """停止单推送""" pass #---------------------------------------------------------------------- def sendBuyOrders(self, price): """发出一系列的买入停止单""" t = self.pos / self.fixedSize if t < 1: self.buy(price, self.fixedSize, True) if t < 2: self.buy(price + self.atrVolatility*0.5, self.fixedSize, True) if t < 3: self.buy(price + self.atrVolatility, self.fixedSize, True) if t < 4: self.buy(price + self.atrVolatility*1.5, self.fixedSize, True) #---------------------------------------------------------------------- def sendShortOrders(self, price): """""" t = self.pos / self.fixedSize if t > -1: self.short(price, self.fixedSize, True) if t > -2: self.short(price - self.atrVolatility*0.5, self.fixedSize, True) if t > -3: self.short(price - self.atrVolatility, self.fixedSize, True) if t > -4: self.short(price - self.atrVolatility*1.5, self.fixedSize, True)
def __init__(self, ctaEngine, setting): """Constructor""" super(BollChannelStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, 15, self.onXminBar) # 创建K线合成器对象 self.am = ArrayManager()
class MultiTimeframeStrategy(CtaTemplate): """跨时间周期交易策略""" className = 'MultiTimeframeStrategy' author = u'用Python的交易员' # 策略参数 rsiSignal = 20 # RSI信号阈值 rsiWindow = 14 # RSI窗口 fastWindow = 5 # 快速均线窗口 slowWindow = 20 # 慢速均线窗口 initDays = 10 # 初始化数据所用的天数 fixedSize = 1 # 每次交易的数量 # 策略变量 rsiValue = 0 # RSI指标的数值 rsiLong = 0 # RSI买开阈值 rsiShort = 0 # RSI卖开阈值 fastMa = 0 # 5分钟快速均线 slowMa = 0 # 5分钟慢速均线 maTrend = 0 # 均线趋势,多头1,空头-1 # 参数列表,保存了参数的名称 paramList = [ 'name', 'className', 'author', 'vtSymbol', 'rsiSignal', 'rsiWindow', 'fastWindow', 'slowWindow' ] # 变量列表,保存了变量的名称 varList = [ 'inited', 'trading', 'pos', 'rsiValue', 'rsiLong', 'rsiShort', 'fastMa', 'slowMa', 'maTrend' ] # 同步列表,保存了需要保存到数据库的变量名称 syncList = ['pos'] #---------------------------------------------------------------------- def __init__(self, ctaEngine, setting): """Constructor""" super(MultiTimeframeStrategy, self).__init__(ctaEngine, setting) self.rsiLong = 50 + self.rsiSignal self.rsiShort = 50 - self.rsiSignal # 创建K线合成器对象 self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar) self.am5 = ArrayManager() self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar) self.am15 = ArrayManager() #---------------------------------------------------------------------- def onInit(self): """初始化策略(必须由用户继承实现)""" self.writeCtaLog(u'%s策略初始化' % self.name) # 载入历史数据,并采用回放计算的方式初始化策略数值 initData = self.loadBar(self.initDays) for bar in initData: self.onBar(bar) self.putEvent() #---------------------------------------------------------------------- def onStart(self): """启动策略(必须由用户继承实现)""" self.writeCtaLog(u'%s策略启动' % self.name) self.putEvent() #---------------------------------------------------------------------- def onStop(self): """停止策略(必须由用户继承实现)""" self.writeCtaLog(u'%s策略停止' % self.name) self.putEvent() #---------------------------------------------------------------------- def onTick(self, tick): """收到行情TICK推送(必须由用户继承实现)""" # 只需要要在一个BarGenerator中合成1分钟K线 self.bg5.updateTick(tick) #---------------------------------------------------------------------- def onBar(self, bar): """收到Bar推送(必须由用户继承实现)""" # 基于15分钟判断趋势过滤,因此先更新 self.bg15.updateBar(bar) # 基于5分钟判断 self.bg5.updateBar(bar) #---------------------------------------------------------------------- def on5MinBar(self, bar): """5分钟K线""" self.cancelAll() # 保存K线数据 self.am5.updateBar(bar) if not self.am5.inited: return # 如果15分钟数据尚未初始化完毕,则直接返回 if not self.maTrend: return # 计算指标数值 self.rsiValue = self.am5.rsi(self.rsiWindow) # 判断是否要进行交易 # 当前无仓位 if self.pos == 0: if self.maTrend > 0 and self.rsiValue >= self.rsiLong: self.buy(bar.close + 5, self.fixedSize) elif self.maTrend < 0 and self.rsiValue <= self.rsiShort: self.short(bar.close - 5, self.fixedSize) # 持有多头仓位 elif self.pos > 0: if self.maTrend < 0 or self.rsiValue < 50: self.sell(bar.close - 5, abs(self.pos)) # 持有空头仓位 elif self.pos < 0: if self.maTrend > 0 or self.rsiValue > 50: self.cover(bar.close + 5, abs(self.pos)) # 发出状态更新事件 self.putEvent() #---------------------------------------------------------------------- def on15MinBar(self, bar): """15分钟K线推送""" self.am15.updateBar(bar) if not self.am15.inited: return # 计算均线并判断趋势 self.fastMa = self.am15.sma(self.fastWindow) self.slowMa = self.am15.sma(self.slowWindow) if self.fastMa > self.slowMa: self.maTrend = 1 else: self.maTrend = -1 #---------------------------------------------------------------------- def onOrder(self, order): """收到委托变化推送(必须由用户继承实现)""" pass #---------------------------------------------------------------------- def onTrade(self, trade): # 发出状态更新事件 self.putEvent() #---------------------------------------------------------------------- def onStopOrder(self, so): """停止单推送""" pass