def __init__(self): """Constructor""" super(AtrSignal, self).__init__() self.atrWindow = 30 self.bg = BarGenerator(self.onBar, 15, self.on15Bar) self.am = ArrayManager() self.atrValue = 0.0
def __init__(self, ctaEngine, setting): """Constructor""" super(Turtle01Strategy1M, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, xmin=3, onXminBar=self.on3MBar, onDayBar=self.ondayBar) self.am = ArrayManager( max(self.longDays, self.shortDays, self.atrDays) + 1) self.barList = [] if len(Turtle01Strategy1M.cust_Setting) > 0: for cust in Turtle01Strategy1M.cust_Setting: if cust["StrategyGroup"] == "Turtle": capAmtTurtle = float(cust["CaptialAmt"]) minBarTypeTurtle = cust["MinuteBarGen"] break elif cust["StrategyGroup"] == "Default": capAmtDefault = float(cust["CaptialAmt"]) minBarTypeDefault = cust["MinuteBarGen"] if capAmtTurtle > 0: self.capAmount = capAmtTurtle self.minBarType = minBarTypeTurtle self.unitCalcMethod = "custsetting" elif capAmtDefault > 0: self.capAmount = capAmtDefault self.minBarType = minBarTypeDefault self.unitCalcMethod = "custsetting" else: self.unitCalcMethod = "ctasetting"
def __init__(self, ctaEngine, setting): """Constructor""" super(Turtle01Strategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar,onDayBar = self.ondayBar) self.am = ArrayManager(max(self.longDays,self.shortDays,self.atrDays)+1) self.barList = []
def __init__(self, ctaEngine, setting): """Constructor""" super(HLBeatStrategy, self).__init__(ctaEngine, setting) self.bm = MyBarGenerator(self.onBar, self.xMinBar, self.onFiveBar) self.am = ArrayManager() self.ctaEngine.eventEngine.register(EVENT_TIMER, self.onTimeFunc)
def __init__(self, ctaEngine, setting): """Constructor""" super(tempStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar) self.am = ArrayManager() self.lastzhibiao = zhibiao(0, 0, 0) self.celve0 = zerocelve() # self.celve1 = ceshi() self.tickCelvezu = [self.celve0] self.barCelvezu = [self.celve0] self.tickadd = 1 #断网恢复变量 self.stopcount = None #交易时间和监控联网状态变量 self.yepan = False self.yepanhour = None self.yepanminute = None self.lastbardatetime = None self.tradetime = None #控制开仓和平仓稳定变量 self.tradecount = 0 self.tradingcelve = [self.celve0]
def __init__(self, ctaEngine, setting): """Constructor""" super(TripleMAStrategy02, self).__init__(ctaEngine, setting) self.bm = BarGenerator(self.onBar, 5, self.onFiveBar) # 由于maWindow3的长度是120,所以ArrayManager的size要增加至150 self.am = ArrayManager(size=150)
def __init__(self, ctaEngine, setting): """Constructor""" super(DualThrust_IntraDayStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, onDayBar=self.ondayBar) self.am = ArrayManager() self.barList = []
def __init__(self, ctaEngine, setting): # 首先找到策略的父类(就是类CtaTemplate),然后把DoubleMaStrategy的对象转换为类CtaTemplate的对象 super(MultiFrameMaStrategy, self).__init__(ctaEngine, setting) # 生成仓位记录的字典 symbol = self.symbolList[0] self.Longpos = symbol.replace('.','_')+"_LONG" self.Shortpos = symbol.replace('.','_')+"_SHORT" self.bg60 = BarGenerator(self.onBar, 60, self.on60MinBar) self.bg60Dict = { sym: self.bg60 for sym in self.symbolList } self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar) self.bg15Dict = { sym: self.bg15 for sym in self.symbolList } # 生成Bar数组 self.am60Dict = { sym: ArrayManager(size=self.slowWindow+10) for sym in self.symbolList } self.am15Dict = { sym: ArrayManager(size=self.slowWindow+10) for sym in self.symbolList }
def __init__(self, ctaEngine, setting): """Constructor""" super(DoubleMaStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar) self.am = ArrayManager() self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar) self.am15 = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(BollingerBotStrategy01, self).__init__(ctaEngine, setting) self.bm = BarGenerator(self.onBar, 5, self.onFiveBar) self.am = ArrayManager(30) self.orderList = [] self.entryPriceList = []
def __init__(self): """Constructor""" super(BollSignal, self).__init__() self.bollWindow = 18 self.bollDev = 5 # self.bollUp, self.bollDown = 0.0,0.0 self.bg = BarGenerator(self.onBar, 15, self.on15Bar) self.am = ArrayManager()
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, ctaEngine, setting): """Constructor""" super(KeltnerCommonStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, onDayBar=self.ondayBar, vtSymbol=self.vtSymbol) self.am = ArrayManager() self.barList = [] # Read Parameters from Setting files if 'strParams' in setting: self.params = setting['strParams'] if len(self.params) >= 3: for p in self.params: if p[0] == 'unit': self.fixedSize = p[1] if p[0] == 'p1': self.kUpper = p[1] if p[0] == 'p2': self.kLower = p[1] if p[0] == 'p3': self.maDays = p[1] if p[0] == 'p4': self.atrDays = p[1] if p[0] == 'p5': self.initDays = p[1] if p[0] == 'p6': self.rsilen = p[1] if p[0] == 'p7': self.rsiconfig = p[1] else: # 策略参数 self.fixedSize = 1 self.kUpper = 2 self.kLower = 2 self.maDays = 13 self.atrDays = 20 self.initDays = 55 # original value is 10 self.rsiconfig = 50 self.rsilen = 21 #print(self.fixedSize,self.kUpper,self.kLower,self.maDays,self.initDays) self.atrAvg = 0 self.maHigh = 0 self.maLow = 0 self.longEntry = 0 self.shortEntry = 0 self.longExit = 0 self.shortExit = 0 #exitTime = time(hour=15, minute=20) #will not cover position when day close self.longEntered = False self.shortEntered = False self.loginterval = 15 self.logcountdown = 0
def __init__(self, ctaEngine, setting): """Constructor""" super(DoubleMaStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar) self.am = ArrayManager() self.lastzhibiao = zhibiao() self.celve0 = zerocelve() self.tickCelvezu = [celve0] self.barCelvezu = [celve0]
def __init__(self, ctaEngine, setting): """Constructor""" super(DT_IntraDayCommonStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, onDayBar=self.ondayBar, vtSymbol=self.vtSymbol) self.am = ArrayManager() self.barList = [] self.longEntry1 = 0 self.shortEntry1 = 0 # Read Parameters from Setting files if 'strParams' in setting: self.params = setting['strParams'] if len(self.params) >= 3: for p in self.params: if p[0] == 'unit': self.fixedSize = p[1] if p[0] == 'p1': self.k1 = p[1] if p[0] == 'p2': self.k2 = p[1] if p[0] == 'p3': self.rangeDays = p[1] if p[0] == 'p4': self.atrDays = p[1] if p[0] == 'p5': self.initDays = p[1] else: # 策略参数 self.fixedSize = 1 self.k1 = 0.4 self.k2 = 0.4 self.rangeDays = 4 self.atrDays = 20 self.initDays = 55 # original value is 10 #print(self.fixedSize,self.k1,self.k2,self.rangeDays,self.initDays) self.dayOpen = 0 self.rangeHigh = 0 self.rangeLow = 0 self.rangeHighClose = 0 self.rangeLowClose = 0 self.range1 = 0 self.range2 = 0 self.atrValue = 0 self.range = 0 self.longEntry = 0 self.shortEntry = 0 self.exitTime = time( hour=15, minute=20) #will not cover position when day close self.longEntered = False self.shortEntered = False
def __init__(self, ctaEngine, setting): """Constructor""" super(JDualThrust_IntraDayStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, onDayBar=self.ondayBar, vtSymbol=self.vtSymbol) self.am = ArrayManager() self.barList = [] self.timeinterval = 4 self.countdown = 0
def __init__(self): """Constructor""" super(CciSignal, self).__init__() self.cciWindow = 10 self.cciLevel = 20 self.cciLong = self.cciLevel self.cciShort = -self.cciLevel self.cciValue = 0.0 self.bg = BarGenerator(self.onBar, 15, self.on15Bar) self.am = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(SARKELStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, self.barMins, self.onXminBar) # 创建K线合成器对象 self.am = ArrayManager() self.bgclose = BarGenerator(self.onBar, self.barMinsClose, self.onminBarClose) self.amClose = 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(TripleMAStrategy05, self).__init__(ctaEngine, setting) self.entryPriceList = [] self.bm = BarGenerator(self.onBar, 5, self.onFiveBar) self.am = ArrayManager(size=150) self.backTesting = True # 策略信号 self.buySig = False self.shortSig = False self.sellSig = False self.coverSig = False
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(M60M5MacdStrategy, 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.bg60 = BarGenerator(self.onBar, 60, self.on60MinBar) self.am60 = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(AtrRsiStrategy, self).__init__(ctaEngine, setting) # 创建K线合成器对象 self.bm = BarManager(self.onBar) self.am = ArrayManager()
def onInit(self): """初始化策略(必须由用户继承实现)""" self.activeSymbol = self.symbolList[0] # 主动品种 self.passiveSymbol = self.symbolList[1] # 被动品种 # 构造K线合成器对象 self.bgDict = { sym: BarGenerator(self.onBar) for sym in self.symbolList } self.amDict = {sym: ArrayManager() for sym in self.symbolList} # 载入1分钟历史数据,并采用回放计算的方式初始化策略参数 # 可选参数:["1min","5min","15min","30min","60min","4hour","1day","1week","1month"] pastbar1 = self.loadHistoryBar(self.activeSymbol, type_="1min", size=self.initbars) pastbar2 = self.loadHistoryBar(self.passiveSymbol, type_="1min", size=self.initbars) for bar1, bar2 in zip(pastbar1, pastbar2): self.amDict[self.activeSymbol].updateBar(bar1) # 更新数据矩阵(optional) self.amDict[self.passiveSymbol].updateBar(bar2) # self.onBar(bar) # 是否直接推送到onBar self.putEvent() # putEvent 能刷新UI界面的信息 '''
def __init__(self, ctaEngine, setting): """Constructor""" super(strategy_Volatility_RB, self).__init__(ctaEngine, setting) self.initDays = max(self.BK_BEFORE_DAY, self.SK_BEFORE_DAY) # 初始化数据所用的天数 self.bg = BarGenerator(self.onBar) self.am = ArrayManager(self.initDays) self.strategyStartpos = 1890 self.strategyEndpos = 2358 self.all_bar = [] self.SP_style = 0000 self.BP_style = 0000 self.BKPRICE = EMPTY_FLOAT_WH self.BKDATE = EMPTY_FLOAT_WH self.SKPRICE = EMPTY_FLOAT_WH self.SKDATE = EMPTY_FLOAT_WH self.tradeday = 0 # 注意策略类中的可变对象属性(通常是list和dict等),在策略初始化时需要重新创建, # 否则会出现多个策略实例之间数据共享的情况,有可能导致潜在的策略逻辑错误风险, # 策略类中的这些可变对象属性可以选择不写,全都放在__init__下面,写主要是为了阅读 # 策略时方便(更多是个编程习惯的选择) self.BKWeekProfit = [0, 0, 0, 0, 0, 0, 0] self.SKWeekProfit = [0, 0, 0, 0, 0, 0, 0] self.LongBestday = [0, 1, 2, 3] #[0,1,2] 20190627 self.ShortBestday = [1, 2, 3]
def addSymbolFreq(self, symbol, freq, size = 50): key = symbol + '_' + freq self.symbolFreqData[key] = ArrayManager(size=size) data_list=[] if freq == '1MIN': data_list = self.mainEngine.dbQuery( MINUTE_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING) elif freq == '5MIN': data_list = self.mainEngine.dbQuery( MINUTE_5_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING) elif freq == '15MIN': data_list = self.mainEngine.dbQuery( MINUTE_15_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING) elif freq == '30MIN': data_list = self.mainEngine.dbQuery( MINUTE_30_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING) elif freq == '60MIN': data_list = self.mainEngine.dbQuery( MINUTE_60_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING) elif freq == 'D': data_list = self.mainEngine.dbQuery( DAILY_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING) elif freq == 'W': data_list = self.mainEngine.dbQuery( WEEKLY_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING) if np.size(data_list) >= size: data_list = data_list[-1*size:] for data in data_list: bar = VtBarData() bar.close = data['close'] bar.open = data['open'] bar.high = data['high'] bar.low = data['low'] self.symbolFreqData[key].updateBar(bar)
def __init__(self, ctaEngine, setting): """Constructor""" super(BollChannelStrategy, self).__init__(ctaEngine, setting) self.bg = BarGenerator(self.onBar, 15, self.onXminBar) # 创建K线合成器对象 self.bg30 = BarGenerator(self.onBar, 30, self.on30minBar) self.am = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(ShortTermStrategy, self).__init__(ctaEngine, setting) # 注意策略类中的可变对象属性(通常是list和dict等),在策略初始化时需要重新创建, # 否则会出现多个策略实例之间数据共享的情况,有可能导致潜在的策略逻辑错误风险, # 策略类中的这些可变对象属性可以选择不写,全都放在__init__下面,写主要是为了阅读 # 策略时方便(更多是个编程习惯的选择) self.short_term_list_first = [] self.short_term_list_all = [] self.short_term_last_three_first_index = [] self.short_term_last_two_low_all_index = [] self.short_term_last_two_high_all_index = [] self.short_term_open_last_three_first_index = [] self.short_term_open_last_two_all_index = [] self.all_bar = [] self.BK_style = EMPTY_INT_WH # 2-->所有的低点 21利用低点 22利用高点 self.SK_style = EMPTY_INT_WH # 2-->所有的高点 21利用高点 22利用低点 self.BKPRICE = EMPTY_FLOAT_WH self.SKPRICE = EMPTY_FLOAT_WH self.initDays = self.E_LONG_ALL if self.LongOrShort == True else self.SK_E_LONG_ALL self.MAXCLOSE_AFTER_OPEN = EMPTY_FLOAT_WH #建仓后close的最大值 self.strategyStartpos = 1343 self.strategyEndpos = 1826 self.SP_style = 0000 self.tradeday = 0 self.bg = BarGenerator(self.onBar) self.am = ArrayManager(self.initDays)
def __init__(self, ctaEngine, setting): # 策略参数 self.contract_size = 100 self.MaxTolerate = 0 self.maxHold = 0 self.Ticks = 4 #追单数量 self.stopping = False self.stoppingdt = None # 止损后最小开仓时间 self.stoppPeriods = 15 # 止损后15分钟不能开仓 self.ShortSignalSpread = None self.LongSignalSpread = None self.short_enter_price = None self.short_exit_price = None self.long_enter_price = None self.long_exit_price = None self.maxHold = 0 self.maxWin = 0 self.minLose = 0 self.mutiple = 0 self.minEnterPrice = 0 self.volume = 0 self.init_asset = 0 """Constructor""" super(tick_strategy, self).__init__(ctaEngine, setting) # 策略变量 self.bm = BarManager(self.onBar, 1) # 创建K线合成器对象 self.am = ArrayManager()
def __init__(self, ctaEngine, setting): """Constructor""" super(TestStrategy, self).__init__(ctaEngine, setting) vtSymbolset=setting['vtSymbol'] # 读取交易品种 vtSymbolList=vtSymbolset.split(',') self.activeSymbol = vtSymbolList[0] # 主动品种 self.passiveSymbol = vtSymbolList[1] # 被动品种 self.symbolList = [self.activeSymbol, self.passiveSymbol] # 给持仓字典设置名称,为了方便调用 # MONGO数据库不支持字段名含有 "." ,需特别处理) self.asLongpos = self.activeSymbol.replace(".","_")+"_LONG" self.asShortpos = self.activeSymbol.replace(".","_")+"_SHORT" self.psLongpos = self.passiveSymbol.replace(".","_")+"_LONG" self.psShortpos = self.passiveSymbol.replace(".","_")+"_SHORT" # 构造K线合成器对象 self.bgDict = { sym: BarGenerator(self.onBar) for sym in self.symbolList } self.amDict = { sym: ArrayManager() for sym in self.symbolList } # 价差缓存列表 self.spreadBuffer = []
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()
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 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)
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)
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)
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