def load_var(self): filename = get_dss() + 'fut/engine/turtle/signal_turtle_var.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.atrVolatility = rec.atrVolatility self.entryUp = rec.entryUp self.entryDown = rec.entryDown self.exitUp = rec.exitUp self.exitDown = rec.exitDown self.longEntry1 = rec.longEntry1 self.longEntry2 = rec.longEntry2 self.longEntry3 = rec.longEntry3 self.longEntry4 = rec.longEntry4 self.longStop = rec.longStop self.shortEntry1 = rec.shortEntry1 self.shortEntry2 = rec.shortEntry2 self.shortEntry3 = rec.shortEntry3 self.shortEntry4 = rec.shortEntry4 self.shortStop = rec.shortStop if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl
def load_var(self): filename = get_dss() + 'fut/check/signal_aberration_var.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl
def open(self, price, change): self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, '多' if change>0 else '空', '开', \ abs(change), price, 0, self.vtSymbol ] ] df = pd.DataFrame(r, columns=['datetime','direction','offset','volume','price','pnl', 'symbol']) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss() + 'fut/engine/dalicta/signal_dalicta_'+self.type+ '_deal_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False)
def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, '多' if change>0 else '空', '开', \ abs(change), price, 0 ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'direction', 'offset', 'volume', 'price', 'pnl' ]) filename = get_dss( ) + 'fut/deal/signal_aberration_' + self.type + '_' + self.vtSymbol + '.csv' df.to_csv(filename, index=False, mode='a', header=False)
def load_var(self): filename = get_dss( ) + 'fut/engine/dalicta/signal_dalicta_' + self.type + '_var_' + self.vtSymbol + '.csv' if os.path.exists(filename): df = pd.read_csv(filename, sep='$') df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl
def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, '多' if change>0 else '空', '开', \ abs(change), price, 0, \ self.intraTradeHigh, self.intraTradeLow, self.stop] ] df = pd.DataFrame(r, columns=['datetime','direction','offset','volume','price','pnl', \ 'intraTradeHigh','intraTradeLow','stop']) filename = get_dss( ) + 'fut/deal/signal_donchian_' + self.type + '_' + self.vtSymbol + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False)
def load_var(self): filename = get_dss() + 'fut/engine/atrrsi/signal_atrrsi_var.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost self.intraTradeHigh = rec.intraTradeHigh self.intraTradeLow = rec.intraTradeLow self.stop = rec.stop if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl
def load_var(self): pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/rsiboll/signal_rsiboll_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost self.intraTradeHigh = rec.intraTradeHigh self.intraTradeLow = rec.intraTradeLow self.stop = rec.stop self.dida = rec.dida if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl
def load_var(self): pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/aberration_enhance/signal_aberration_enhance_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl
class Fut_TurtleSignal(Signal): #---------------------------------------------------------------------- def __init__(self, portfolio, vtSymbol): self.type = 'mix' # 策略参数 self.entryWindow = 100 # 入场通道周期数 self.exitWindow = 50 # 出场通道周期数 self.atrWindow = 20 # 计算ATR周期数 self.profitCheck = True # 是否检查上一笔盈利 self.initBars = 100 # 初始化数据所用的天数 self.minx = 'min15' # 策略临时变量 self.atrVolatility = 0 # ATR波动率 self.entryUp = 0 # 入场通道 self.entryDown = 0 self.exitUp = 0 # 出场通道 self.exitDown = 0 self.longEntry1 = 0 # 多头入场位 self.longEntry2 = 0 self.longEntry3 = 0 self.longEntry4 = 0 self.longStop = 0 # 多头止损位 self.shortEntry1 = 0 # 空头入场位 self.shortEntry2 = 0 self.shortEntry3 = 0 self.shortEntry4 = 0 self.shortStop = 0 # 空头止损位 self.result_list = [] Signal.__init__(self, portfolio, vtSymbol) #---------------------------------------------------------------------- def load_param(self): filename = get_dss() + 'fut/engine/turtle/signal_turtle_param.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.pz == get_contract(self.vtSymbol).pz] if len(df) > 0: rec = df.iloc[0, :] self.entryWindow = rec.entryWindow self.exitWindow = rec.exitWindow #---------------------------------------------------------------------- def set_param(self, param_dict): if 'entryWindow' in param_dict: self.entryWindow = param_dict['entryWindow'] if 'exitWindow' in param_dict: self.exitWindow = param_dict['exitWindow'] #---------------------------------------------------------------------- def onBar(self, bar, minx='min15'): """新推送过来一个bar,进行处理""" self.bar = bar if minx == 'min1': self.on_bar_min1(bar) if minx == 'min15': self.on_bar_minx(bar) #---------------------------------------------------------------------- def on_bar_min1(self, bar): # self.generateSignal(bar) # 在min1周期上,触发信号,产生交易指令 pass #---------------------------------------------------------------------- def on_bar_minx(self, bar): self.am.updateBar(bar) if not self.am.inited: return self.generateSignal(bar) # 在minx周期上,触发信号,产生交易指令 self.calculateIndicator() # 在minx周期上,计算指标 #---------------------------------------------------------------------- def generateSignal(self, bar): """ 判断交易信号 要注意在任何一个数据点:buy/sell/short/cover只允许执行一类动作 """ # 如果指标尚未初始化,则忽略 if self.longEntry1 == 0: return # 优先检查平仓 if self.unit > 0: longExit = max(self.longStop, self.exitDown) if bar.low <= longExit: self.sell(self.calculateTradePrice(DIRECTION_SHORT, bar.low), abs(self.unit)) return elif self.unit < 0: shortExit = min(self.shortStop, self.exitUp) if bar.high >= shortExit: self.cover(self.calculateTradePrice(DIRECTION_LONG, bar.high), abs(self.unit)) return # 没有仓位或者持有多头仓位的时候,可以做多(加仓) if self.unit >= 0: trade = False if bar.high >= self.longEntry1 and self.unit < 1: price = self.calculateTradePrice(DIRECTION_LONG, self.longEntry1) self.buy(price, 1) self.longStop = price - self.atrVolatility * 2 trade = True if bar.high >= self.longEntry2 and self.unit < 2: price = self.calculateTradePrice(DIRECTION_LONG, self.longEntry2) self.buy(price, 1) self.longStop = price - self.atrVolatility * 2 trade = True # if bar.high >= self.longEntry3 and self.unit < 3: # price = self.calculateTradePrice(DIRECTION_LONG, self.longEntry3) # self.buy(price, 1) # self.longStop = price - self.atrVolatility * 2 # trade = True # # if bar.high >= self.longEntry4 and self.unit < 4: # price = self.calculateTradePrice(DIRECTION_LONG, self.longEntry4) # self.buy(price, 1) # self.longStop = price - self.atrVolatility * 2 # trade = True if trade: return # 没有仓位或者持有空头仓位的时候,可以做空(加仓) if self.unit <= 0: if bar.low <= self.shortEntry1 and self.unit > -1: price = self.calculateTradePrice(DIRECTION_SHORT, self.shortEntry1) self.short(price, 1) self.shortStop = price + self.atrVolatility * 2 if bar.low <= self.shortEntry2 and self.unit > -2: price = self.calculateTradePrice(DIRECTION_SHORT, self.shortEntry2) self.short(price, 1) self.shortStop = price + self.atrVolatility * 2 # if bar.low <= self.shortEntry3 and self.unit > -3: # price = self.calculateTradePrice(DIRECTION_SHORT, self.shortEntry3) # self.short( price, 1 ) # self.shortStop = price + self.atrVolatility * 2 # # if bar.low <= self.shortEntry4 and self.unit > -4: # price = self.calculateTradePrice(DIRECTION_SHORT, self.shortEntry4) # self.short( price, 1 ) # self.shortStop = price + self.atrVolatility * 2 #---------------------------------------------------------------------- def calculateIndicator(self): """计算技术指标""" self.entryUp, self.entryDown = self.am.donchian(self.entryWindow) self.exitUp, self.exitDown = self.am.donchian(self.exitWindow) # 有持仓后,ATR波动率和入场位等都不再变化 if self.unit == 0: self.atrVolatility = self.am.atr(self.atrWindow) self.longEntry1 = self.entryUp self.longEntry2 = self.entryUp + self.atrVolatility * 10 self.longEntry3 = self.entryUp + self.atrVolatility * 20 self.longEntry4 = self.entryUp + self.atrVolatility * 30 self.longStop = 0 self.shortEntry1 = self.entryDown self.shortEntry2 = self.entryDown - self.atrVolatility * 10 self.shortEntry3 = self.entryDown - self.atrVolatility * 20 self.shortEntry4 = self.entryDown - self.atrVolatility * 30 self.shortStop = 0 r = [[self.bar.date,self.bar.time,self.bar.close,self.unit,self.entryUp,self.entryDown,self.atrVolatility, \ self.longEntry1,self.longEntry2,self.longEntry3,self.longEntry4, self.longStop, \ self.shortEntry1,self.shortEntry2,self.shortEntry3,self.shortEntry4, self.shortStop ]] df = pd.DataFrame(r) filename = get_dss( ) + 'fut/engine/turtle/bar_turtle_' + self.vtSymbol + '.csv' df.to_csv(filename, index=False, mode='a', header=False) #---------------------------------------------------------------------- def load_var(self): filename = get_dss() + 'fut/engine/turtle/signal_turtle_var.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.atrVolatility = rec.atrVolatility self.entryUp = rec.entryUp self.entryDown = rec.entryDown self.exitUp = rec.exitUp self.exitDown = rec.exitDown self.longEntry1 = rec.longEntry1 self.longEntry2 = rec.longEntry2 self.longEntry3 = rec.longEntry3 self.longEntry4 = rec.longEntry4 self.longStop = rec.longStop self.shortEntry1 = rec.shortEntry1 self.shortEntry2 = rec.shortEntry2 self.shortEntry3 = rec.shortEntry3 self.shortEntry4 = rec.shortEntry4 self.shortStop = rec.shortStop if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl #---------------------------------------------------------------------- def save_var(self): r = [] if self.result is None: r = [ [self.portfolio.result.date, self.vtSymbol, self.unit, \ 0, 0, 0, 0, 0, \ self.atrVolatility,self.entryUp,self.entryDown,self.exitUp,self.exitDown, \ self.longEntry1,self.longEntry2,self.longEntry3,self.longEntry4,self.longStop, \ self.shortEntry1,self.shortEntry2,self.shortEntry3,self.shortEntry4,self.shortStop ] ] else: r = [ [self.portfolio.result.date, self.vtSymbol, self.unit, \ 1, self.result.unit, self.result.entry, self.result.exit, self.result.pnl, \ self.atrVolatility,self.entryUp,self.entryDown,self.exitUp,self.exitDown, \ self.longEntry1,self.longEntry2,self.longEntry3,self.longEntry4,self.longStop, \ self.shortEntry1,self.shortEntry2,self.shortEntry3,self.shortEntry4,self.shortStop ] ] df = pd.DataFrame(r, columns=['datetime','vtSymbol','unit', \ 'has_result','result_unit','result_entry','result_exit', 'result_pnl', \ 'atrVolatility','entryUp','entryDown','exitUp','exitDown', \ 'longEntry1','longEntry2','longEntry3','longEntry4','longStop', \ 'shortEntry1','shortEntry2','shortEntry3','shortEntry4','shortStop' ]) filename = get_dss() + 'fut/engine/turtle/signal_turtle_var.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [[ self.bar.date + ' ' + self.bar.time, '多' if change > 0 else '空', '开', abs(change), price, 0 ]] df = pd.DataFrame(r, columns=[ 'datetime', 'direction', 'offset', 'volume', 'price', 'pnl' ]) filename = get_dss( ) + 'fut/engine/turtle/signal_deal_' + self.portfolio.name + '_' + self.vtSymbol + '.csv' df.to_csv(filename, index=False, mode='a', header=False) #---------------------------------------------------------------------- def close(self, price, change): """平仓""" self.unit = 0 self.result.close(price) r = [[ self.bar.date + ' ' + self.bar.time, '', '平', 0, price, self.result.pnl ]] df = pd.DataFrame(r, columns=[ 'datetime', 'direction', 'offset', 'volume', 'price', 'pnl' ]) filename = get_dss( ) + 'fut/engine/turtle/signal_deal_' + self.portfolio.name + '_' + self.vtSymbol + '.csv' df.to_csv(filename, index=False, mode='a', header=False) self.result_list.append(self.result) self.result = None #---------------------------------------------------------------------- def getLastPnl(self): """获取上一笔交易的盈亏""" if not self.result_list: return 0 result = self.result_list[-1] return result.pnl #---------------------------------------------------------------------- def calculateTradePrice(self, direction, price): """计算成交价格""" # 买入时,停止单成交的最优价格不能低于当前K线开盘价 if direction == DIRECTION_LONG: tradePrice = max(self.bar.open, price) # 卖出时,停止单成交的最优价格不能高于当前K线开盘价 else: tradePrice = min(self.bar.open, price) return tradePrice
class Fut_CciBollSignal_Kong(Signal): #---------------------------------------------------------------------- def __init__(self, portfolio, vtSymbol): self.type = 'kong' # 策略参数 self.bollWindow = 20 # 布林通道窗口数 self.bollDev = 3.1 # 布林通道的偏差 self.cciWindow = 10 # CCI窗口数 self.atrWindow = 30 # ATR窗口数 self.slMultiplier = 3 # 计算止损距离的乘数 self.fixedSize = 1 # 每次交易的数量 self.initBars = 100 # 初始化数据所用的天数 self.minx = 'min15' # 策略临时变量 self.cciValue = 0 # CCI指标数值 self.atrValue = 0 # ATR指标数值 self.bollUp = 0 self.bollDown = 0 self.can_buy = False self.can_short = False # 需要持久化保存的变量 self.cost = 0 self.intraTradeHigh = 0 # 移动止损用的持仓期内最高价 self.intraTradeLow = 0 # 持仓期内的最低点 self.stop = 0 # 多头止损 Signal.__init__(self, portfolio, vtSymbol) #---------------------------------------------------------------------- def load_param(self): filename = get_dss() + 'fut/cfg/signal_cciboll_param.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.pz == get_contract(self.vtSymbol).pz] if len(df) > 0: rec = df.iloc[0, :] self.rsiLength = rec.rsiLength self.trailingPercent = rec.trailingPercent self.victoryPercent = rec.victoryPercent #print('成功加载策略参数', self.rsiLength, self.trailingPercent, self.victoryPercent) #---------------------------------------------------------------------- def set_param(self, param_dict): if 'bollWindow' in param_dict: self.bollWindow = param_dict['bollWindow'] #print('成功设置策略参数 self.bollWindow: ',self.bollWindow) if 'bollDev' in param_dict: self.bollDev = param_dict['bollDev'] #print('成功设置策略参数 self.bollDev: ',self.bollDev) if 'slMultiplier' in param_dict: self.slMultiplier = param_dict['slMultiplier'] #print('成功设置策略参数 self.slMultiplier: ',self.slMultiplier) #---------------------------------------------------------------------- def onBar(self, bar, minx='min5'): """新推送过来一个bar,进行处理""" self.bar = bar if minx == 'min1': self.on_bar_min1(bar) if minx == self.minx: self.on_bar_minx(bar) def on_bar_min1(self, bar): pass # 效果提升不明显。不能加开仓逻辑,大幅降低效果 # if self.unit < 0: # if bar.close >= self.stop: # self.cover(bar.close, abs(self.unit)) def on_bar_minx(self, bar): self.am.updateBar(bar) if not self.am.inited: return #print('here') self.calculateIndicator() # 计算指标 self.generateSignal(bar) # 触发信号,产生交易指令 #---------------------------------------------------------------------- def calculateIndicator(self): """计算技术指标""" atrArray = self.am.atr(1, array=True) self.atrValue = atrArray[-self.atrWindow:].mean() self.bollUp, self.bollDown = self.am.boll(self.bollWindow, self.bollDev) boll_condition = True if self.bar.close < self.bollDown else False self.cciValue = self.am.cci(self.cciWindow) cci_condition = True if self.cciValue < -100 else False self.can_short = False if cci_condition and boll_condition: #if boll_condition: self.can_short = True r = [[ self.bar.date, self.bar.time, self.bar.close, self.can_short, self.bollUp, self.bollDown, self.cciValue, self.atrValue, self.slMultiplier, boll_condition, cci_condition, self.intraTradeLow, self.stop ]] df = pd.DataFrame(r) filename = get_dss( ) + 'fut/engine/cciboll/bar_cciboll_kong_' + self.vtSymbol + '.csv' df.to_csv(filename, index=False, mode='a', header=False) #---------------------------------------------------------------------- def generateSignal(self, bar): # 当前无仓位 if self.unit == 0: self.intraTradeHigh = bar.high self.intraTradeLow = bar.low if self.can_short == True and self.paused == False: self.cost = bar.close self.stop = 100E4 self.intraTradeLow = bar.close self.short(bar.close, self.fixedSize) # 持有空头仓位 elif self.unit < 0: if bar.close >= self.stop: self.cover(bar.close, abs(self.unit)) self.intraTradeLow = min(self.intraTradeLow, bar.low) self.stop = self.intraTradeLow + self.atrValue * self.slMultiplier #---------------------------------------------------------------------- def load_var(self): pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/cciboll/signal_cciboll_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost self.intraTradeHigh = rec.intraTradeHigh self.intraTradeLow = rec.intraTradeLow self.stop = rec.stop if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl #---------------------------------------------------------------------- def save_var(self): r = [] if self.result is None: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, \ 0, 0, 0, 0, 0 ] ] else: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, \ 1, self.result.unit, self.result.entry, self.result.exit, self.result.pnl ] ] df = pd.DataFrame(r, columns=['datetime','vtSymbol','unit','cost', \ 'intraTradeHigh','intraTradeLow','stop', \ 'has_result','result_unit','result_entry','result_exit', 'result_pnl']) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/cciboll/signal_cciboll_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, self.vtSymbol, '多' if change>0 else '空', '开', \ abs(change), price, 0 ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'symbol', 'direction', 'offset', 'volume', 'price', 'pnl' ]) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/cciboll/signal_cciboll_' + self.type + '_deal_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def close(self, price): """平仓""" self.unit = 0 self.result.close(price) r = [ [self.bar.date+' '+self.bar.time, self.vtSymbol, '', '平', \ 0, price, self.result.pnl ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'symbol', 'direction', 'offset', 'volume', 'price', 'pnl' ]) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/cciboll/signal_cciboll_' + self.type + '_deal_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) self.result = None
class Fut_RsiBollSignal_Kong(Signal): #---------------------------------------------------------------------- def __init__(self, portfolio, vtSymbol): self.type = 'kong' # 策略参数 self.rsiLength = 5 # 计算RSI的窗口数 self.rsiEntry = 16 # RSI的开仓信号 self.trailingPercent = 0.7 # 百分比移动止损 self.victoryPercent = 0.3 self.fixedSize = 1 # 每次交易的数量 self.initBars = 100 # 初始化数据所用的天数 self.minx = 'min5' # 初始化RSI入场阈值 self.rsiBuy = 50 + self.rsiEntry self.rsiSell = 50 - self.rsiEntry # 策略临时变量 self.atr_short = 0 self.atr_mid = 0 self.atr_long = 0 self.rsi_value = 0 # RSI指标的数值 self.rsi_ma = 0 self.can_buy = False self.can_short = False self.bollUp = 0 self.bollDown = 0 self.gap = 100 self.dida = 0 # 需要持久化保存的变量 self.cost = 0 self.intraTradeHigh = 0 # 移动止损用的持仓期内最高价 self.intraTradeLow = 0 # 持仓期内的最低点 self.stop = 0 # 多头止损 Signal.__init__(self, portfolio, vtSymbol) #---------------------------------------------------------------------- def load_param(self): filename = get_dss() + 'fut/cfg/signal_rsiboll_param.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.pz == get_contract(self.vtSymbol).pz] if len(df) > 0: rec = df.iloc[0, :] self.rsiLength = rec.rsiLength self.trailingPercent = rec.trailingPercent self.victoryPercent = rec.victoryPercent #print('成功加载策略参数', self.rsiLength, self.trailingPercent, self.victoryPercent) #---------------------------------------------------------------------- def set_param(self, param_dict): if 'atrMaLength' in param_dict: self.atrMaLength = param_dict['atrMaLength'] #print('成功设置策略参数 self.atrMaLength: ',self.atrMaLength) if 'rsiLength' in param_dict: self.rsiLength = param_dict['rsiLength'] #print('成功设置策略参数 self.rsiLength: ',self.rsiLength) if 'trailingPercent' in param_dict: self.trailingPercent = param_dict['trailingPercent'] #print('成功设置策略参数 self.trailingPercent: ',self.trailingPercent) if 'victoryPercent' in param_dict: self.victoryPercent = param_dict['victoryPercent'] #print('成功设置策略参数 self.victoryPercent: ',self.victoryPercent) #---------------------------------------------------------------------- def onBar(self, bar, minx='min5'): """新推送过来一个bar,进行处理""" self.bar = bar if minx == 'min1': self.on_bar_min1(bar) if minx == self.minx: self.on_bar_minx(bar) # r = [[minx,bar.date,bar.time,bar.open,bar.close]] # df = pd.DataFrame(r) # filename = get_dss() + 'fut/engine/rsiboll/bar_' + self.vtSymbol + '.csv' # df.to_csv(filename, index=False, mode='a', header=False) def on_bar_min1(self, bar): # 开盘有大缺口,暂停开仓 if bar.time in ['09:01:00', '21:01:00']: if abs(bar.open - self.am.closeArray[-1]) > self.gap: self.paused = True # 持有多头仓位 if self.unit > 0: if bar.close <= self.stop: # print('平多: ', bar.datetime, self.intraTradeHigh, self.stop, bar.close) self.sell(bar.close, abs(self.unit)) # 持有空头仓位 elif self.unit < 0: if bar.close >= self.stop: # print('平空: ', bar.datetime, self.intraTradeLow, self.stop, bar.close) self.cover(bar.close, abs(self.unit)) def on_bar_minx(self, bar): self.am.updateBar(bar) if not self.am.inited: return #print('here') self.calculateIndicator() # 计算指标 self.generateSignal(bar) # 触发信号,产生交易指令 #---------------------------------------------------------------------- def calculateIndicator(self): """计算技术指标""" atrArray = self.am.atr( 1, array=True ) # 长度为100,有效数据为initBars # print(len(atrArray)); print(atrArray); assert False self.atr_short = atrArray[-3:].mean() self.atr_mid = atrArray[-20:].mean() self.atr_long = atrArray[-50:].mean() atr_condition = True if self.atr_short > self.atr_mid else False self.bollUp, self.bollDown = self.am.boll(60, 3) boll_condition = True if self.bar.close < self.bollDown else False rsiArray = self.am.rsi(self.rsiLength, array=True) self.rsi_value = rsiArray[-1] self.rsi_ma = rsiArray[-35:].mean() rsi_condition = True if self.rsi_value < self.rsiSell and self.rsi_ma > 40 else False self.can_short = False if rsi_condition and boll_condition and atr_condition: self.can_short = True # r = [[self.bar.date,self.bar.time,self.bar.close,self.can_short,self.bollUp,self.bollDown,self.rsi_value,self.rsi_ma,self.atr_short,self.atr_mid,rsi_condition, boll_condition, atr_condition]] # df = pd.DataFrame(r) # filename = get_dss() + 'fut/engine/rsiboll/bar_rsiboll_kong_' + self.vtSymbol + '.csv' # df.to_csv(filename, index=False, mode='a', header=False) #---------------------------------------------------------------------- def generateSignal(self, bar): # 当前无仓位 if self.unit == 0: self.intraTradeHigh = bar.high self.intraTradeLow = bar.low if self.can_short == True and self.paused == False: self.cost = bar.close self.stop = 100E4 self.intraTradeLow = bar.close self.dida = 0 self.short(bar.close, self.fixedSize) # 持有空头仓位 elif self.unit < 0: self.dida += 1 self.intraTradeLow = min(self.intraTradeLow, bar.low) #self.stop = min( self.stop, self.intraTradeLow * (1+self.victoryPercent/100) ) if self.stop > self.cost: self.stop = min( self.stop, self.intraTradeLow * (1 + self.trailingPercent / 100)) else: self.stop = min( self.stop, self.intraTradeLow * (1 + self.victoryPercent / 100)) if bar.close >= self.stop: self.cover(bar.close, abs(self.unit)) elif self.dida >= 15 and bar.close < self.cost and self.stop > self.cost: self.cover(bar.close, abs(self.unit)) #---------------------------------------------------------------------- def load_var(self): pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/rsiboll/signal_rsiboll_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost self.intraTradeHigh = rec.intraTradeHigh self.intraTradeLow = rec.intraTradeLow self.stop = rec.stop self.dida = rec.dida if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl #---------------------------------------------------------------------- def save_var(self): r = [] if self.result is None: r = [ [self.portfolio.result.date, self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, self.dida, \ 0, 0, 0, 0, 0 ] ] else: r = [ [self.portfolio.result.date, self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, self.dida, \ 1, self.result.unit, self.result.entry, self.result.exit, self.result.pnl ] ] df = pd.DataFrame(r, columns=['datetime','vtSymbol','unit','cost', \ 'intraTradeHigh','intraTradeLow', 'stop', 'dida', \ 'has_result','result_unit','result_entry','result_exit', 'result_pnl']) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/rsiboll/signal_rsiboll_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, self.vtSymbol, '多' if change>0 else '空', '开', \ abs(change), price, 0 ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'symbol', 'direction', 'offset', 'volume', 'price', 'pnl' ]) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/rsiboll/signal_rsiboll_' + self.type + '_deal_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def close(self, price): """平仓""" self.unit = 0 self.result.close(price) # 本次盈利超150点,暂停策略至收盘 if self.result.pnl >= 50 + self.gap: self.paused = True r = [ [self.bar.date+' '+self.bar.time, self.vtSymbol, '', '平', \ 0, price, self.result.pnl ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'symbol', 'direction', 'offset', 'volume', 'price', 'pnl' ]) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/rsiboll/signal_rsiboll_' + self.type + '_deal_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) self.result = None
class Fut_MaSignal_Kong(Signal): #---------------------------------------------------------------------- def __init__(self, portfolio, vtSymbol): self.type = 'kong' # 策略参数 self.fixedSize = 1 # 每次交易的数量 self.initBars = 60 # 初始化数据所用的天数 self.minx = 'day' # 策略临时变量 self.can_buy = False self.can_sell = False self.can_short = False self.can_cover = False # 需要持久化保存的变量 self.cost = 0 size_am = 100 assert self.initBars <= size_am Signal.__init__(self, portfolio, vtSymbol) #---------------------------------------------------------------------- def load_param(self): filename = get_dss() + 'fut/engine/ma/signal_ma_param.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.symbol == self.vtSymbol] if len(df) > 0: rec = df.iloc[0, :] print('成功加载策略参数') #---------------------------------------------------------------------- def set_param(self, param_dict): if 'fixedSize' in param_dict: self.fixedSize = param_dict['fixedSize'] print('成功设置策略参数 self.fixedSize: ', self.fixedSize) #---------------------------------------------------------------------- def onBar(self, bar, minx='min1'): """新推送过来一个bar,进行处理""" self.bar = bar if minx == 'day': self.on_bar_minx(bar) def on_bar_minx(self, bar): if self.paused == True: return self.am.updateBar(bar) if not self.am.inited: return self.calculateIndicator() # 计算指标 self.generateSignal(bar) # 触发信号,产生交易指令 #---------------------------------------------------------------------- def calculateIndicator(self): """计算技术指标""" self.can_short = False self.can_cover = False ma_short_arr = self.am.sma(10, array=True) ma_mid_arr = self.am.sma(30, array=True) ma_long_arr = self.am.sma(60, array=True) if self.unit == 0: if ma_short_arr[-2] >= ma_long_arr[-2] and ma_short_arr[ -1] < ma_long_arr[-1]: self.can_short = True if self.unit < 0: if ma_short_arr[-2] <= ma_long_arr[-2] and ma_short_arr[ -1] > ma_long_arr[-1]: self.can_cover = True r = [[ self.bar.date, self.bar.time, self.bar.close, self.can_short, self.can_cover, ma_short_arr[-1], ma_long_arr[-1] ]] df = pd.DataFrame(r) filename = get_dss( ) + 'fut/engine/ma/bar_ma_' + self.type + '_' + self.vtSymbol + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def generateSignal(self, bar): # 开多仓 if self.can_buy == True: self.buy(bar.close, self.fixedSize) self.cost = bar.close # 开空仓 if self.can_short == True: self.short(bar.close, self.fixedSize) self.cost = bar.close # 平多仓 if self.can_sell == True: self.sell(bar.close, self.fixedSize) self.cost = 0 # 平空仓 if self.can_cover == True: self.cover(bar.close, self.fixedSize) self.cost = 0 #---------------------------------------------------------------------- def load_var(self): pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/ma/signal_ma_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl #---------------------------------------------------------------------- def save_var(self): if self.paused == True: return r = [] if self.result is None: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ 0, 0, 0, 0, 0 ] ] else: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ 1, self.result.unit, self.result.entry, self.result.exit, self.result.pnl ] ] df = pd.DataFrame(r, columns=['datetime','vtSymbol','unit','cost', \ 'has_result','result_unit','result_entry','result_exit', 'result_pnl']) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/ma/signal_ma_' + self.type + '_var_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def open(self, price, change): self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, '多' if change>0 else '空', '开', \ abs(change), price, 0, self.vtSymbol ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'direction', 'offset', 'volume', 'price', 'pnl', 'symbol' ]) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/ma/signal_ma_' + self.type + '_deal_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def close(self, price): self.unit = 0 self.result.close(price) r = [ [self.bar.date+' '+self.bar.time, '', '平', \ 0, price, self.result.pnl, self.vtSymbol] ] df = pd.DataFrame(r, columns=[ 'datetime', 'direction', 'offset', 'volume', 'price', 'pnl', 'symbol' ]) pz = str(get_contract(self.vtSymbol).pz) filename = get_dss( ) + 'fut/engine/ma/signal_ma_' + self.type + '_deal_' + pz + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) self.result = None
class Fut_AberrationSignal_Kong(Signal): #---------------------------------------------------------------------- def __init__(self, portfolio, vtSymbol): self.type = 'kong' # 策略参数 self.bollWindow = 80 # 布林通道窗口数 self.bollDev = 2 # 布林通道的偏差 self.fixedSize = 1 # 每次交易的数量 self.initBars = 90 # 初始化数据所用的天数 self.minx = 'min5' # 策略临时变量 self.bollUp = 0 # 布林通道上轨 self.bollDown = 0 # 布林通道下轨 # 需要持久化保存的变量 self.stop = 0 # 多头止损 Signal.__init__(self, portfolio, vtSymbol) #---------------------------------------------------------------------- def load_param(self): filename = get_dss( ) + 'fut/cfg/signal_aberration_' + self.type + '_param.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.pz == get_contract(self.vtSymbol).pz] if len(df) > 0: rec = df.iloc[0, :] self.bollWindow = rec.bollWindow self.bollDev = rec.bollDev print('成功加载策略参数', self.bollWindow, self.bollDev) #---------------------------------------------------------------------- def set_param(self, param_dict): if 'bollWindow' in param_dict: self.bollWindow = param_dict['bollWindow'] print('成功设置策略参数 self.bollWindow: ', self.bollWindow) if 'bollDev' in param_dict: self.bollDev = param_dict['bollDev'] print('成功设置策略参数 self.bollDev: ', self.bollDev) #---------------------------------------------------------------------- def onBar(self, bar, minx='min5'): """新推送过来一个bar,进行处理""" self.bar = bar if minx == 'min1': self.on_bar_min1(bar) else: self.on_bar_minx(bar) # r = [[minx,bar.date,bar.time,bar.open,bar.close]] # df = pd.DataFrame(r) # filename = get_dss() + 'fut/check/bar_' + self.vtSymbol + '.csv' # df.to_csv(filename, index=False, mode='a', header=False) def on_bar_min1(self, bar): pass def on_bar_minx(self, bar): self.am.updateBar(bar) if not self.am.inited: return #print('here') self.calculateIndicator() # 计算指标 self.generateSignal(bar) # 触发信号,产生交易指令 #---------------------------------------------------------------------- def calculateIndicator(self): """计算技术指标""" self.bollUp, self.bollDown = self.am.boll(self.bollWindow, self.bollDev) self.stop = (self.bollUp + self.bollDown) / 2 #---------------------------------------------------------------------- def generateSignal(self, bar): # 当前无仓位 if self.unit == 0: if bar.close < self.bollDown: self.short(bar.close, self.fixedSize) # 持有空头仓位 elif self.unit < 0: if bar.close > self.stop: self.cover(bar.close, abs(self.unit)) #---------------------------------------------------------------------- def load_var(self): filename = get_dss( ) + 'fut/check/signal_aberration_' + self.type + '_var.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl #---------------------------------------------------------------------- def save_var(self): r = [] if self.result is None: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, \ 0, 0, 0, 0, 0 ] ] else: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, \ 1, self.result.unit, self.result.entry, self.result.exit, self.result.pnl ] ] df = pd.DataFrame(r, columns=['datetime','vtSymbol','unit', \ 'has_result','result_unit','result_entry','result_exit', 'result_pnl']) filename = get_dss( ) + 'fut/check/signal_aberration_' + self.type + '_var.csv' df.to_csv(filename, index=False, mode='a', header=False) #---------------------------------------------------------------------- def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, '多' if change>0 else '空', '开', \ abs(change), price, 0 ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'direction', 'offset', 'volume', 'price', 'pnl' ]) filename = get_dss( ) + 'fut/deal/signal_aberration_' + self.type + '_' + self.vtSymbol + '.csv' df.to_csv(filename, index=False, mode='a', header=False) #---------------------------------------------------------------------- def close(self, price): """平仓""" self.unit = 0 self.result.close(price) r = [ [self.bar.date+' '+self.bar.time, '', '平', \ 0, price, self.result.pnl ] ] df = pd.DataFrame(r, columns=[ 'datetime', 'direction', 'offset', 'volume', 'price', 'pnl' ]) filename = get_dss( ) + 'fut/deal/signal_aberration_' + self.type + '_' + self.vtSymbol + '.csv' df.to_csv(filename, index=False, mode='a', header=False) self.result = None
class Fut_AtrRsiSignal(Signal): #---------------------------------------------------------------------- def __init__(self, portfolio, vtSymbol): self.type = 'mix' # 策略参数 self.atrLength = 1 # 计算ATR指标的窗口数 self.atrMaLength = 14 # 计算ATR均线的窗口数 self.rsiLength = 5 # 计算RSI的窗口数 self.rsiEntry = 16 # RSI的开仓信号 self.trailingPercent = 0.7 # 百分比移动止损 self.victoryPercent = 0.3 self.fixedSize = 1 # 每次交易的数量 self.ratio_atrMa = 0.8 self.initBars = 60 # 初始化数据所用的天数 self.minx = 'min5' # 初始化RSI入场阈值 self.rsiBuy = 50 + self.rsiEntry self.rsiSell = 50 - self.rsiEntry # 策略临时变量 self.atrValue = 0 # 最新的ATR指标数值 self.atrMa = 0 # ATR移动平均的数值 self.rsiValue = 0 # RSI指标的数值 self.iswave = True self.can_buy = False self.can_short = False # 需要持久化保存的变量 self.cost = 0 self.intraTradeHigh = 0 # 移动止损用的持仓期内最高价 self.intraTradeLow = 0 # 持仓期内的最低点 self.stop = 0 # 多头止损 self.serialize_list = [ self.atrValue, self.atrMa, self.rsiValue, self.iswave, self.intraTradeHigh, self.intraTradeLow, self.stop ] Signal.__init__(self, portfolio, vtSymbol) #---------------------------------------------------------------------- def load_param(self): filename = get_dss() + 'fut/cfg/signal_atrrsi_param.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.pz == get_contract(self.vtSymbol).pz] if len(df) > 0: rec = df.iloc[0, :] self.rsiLength = rec.rsiLength self.trailingPercent = rec.trailingPercent self.victoryPercent = rec.victoryPercent print('成功加载策略参数', self.rsiLength, self.trailingPercent, self.victoryPercent) #---------------------------------------------------------------------- def set_param(self, param_dict): if 'atrMaLength' in param_dict: self.atrMaLength = param_dict['atrMaLength'] print('成功设置策略参数 self.atrMaLength: ', self.atrMaLength) if 'rsiLength' in param_dict: self.rsiLength = param_dict['rsiLength'] print('成功设置策略参数 self.rsiLength: ', self.rsiLength) if 'trailingPercent' in param_dict: self.trailingPercent = param_dict['trailingPercent'] print('成功设置策略参数 self.trailingPercent: ', self.trailingPercent) if 'victoryPercent' in param_dict: self.victoryPercent = param_dict['victoryPercent'] print('成功设置策略参数 self.victoryPercent: ', self.victoryPercent) #---------------------------------------------------------------------- def onBar(self, bar, minx='min5'): """新推送过来一个bar,进行处理""" self.bar = bar if minx == 'min1': self.on_bar_min1(bar) if minx == self.minx: self.on_bar_minx(bar) # r = [[minx,bar.date,bar.time,bar.open,bar.close]] # df = pd.DataFrame(r) # filename = get_dss() + 'fut/engine/atrrsi/bar_' + self.vtSymbol + '.csv' # df.to_csv(filename, index=False, mode='a', header=False) def on_bar_min1(self, bar): # 持有多头仓位 if self.unit > 0: if bar.close <= self.stop: # print('平多: ', bar.datetime, self.intraTradeHigh, self.stop, bar.close) self.sell(bar.close, abs(self.unit)) # 持有空头仓位 elif self.unit < 0: if bar.close >= self.stop: # print('平空: ', bar.datetime, self.intraTradeLow, self.stop, bar.close) self.cover(bar.close, abs(self.unit)) def on_bar_minx(self, bar): self.am.updateBar(bar) if not self.am.inited: return #print('here') self.calculateIndicator() # 计算指标 self.generateSignal(bar) # 触发信号,产生交易指令 #---------------------------------------------------------------------- def calculateIndicator(self): """计算技术指标""" atrArray = self.am.atr(self.atrLength, array=True) # print(len(atrArray)) self.atrValue = atrArray[-1] self.atrMa = atrArray[-self.atrMaLength:].mean() atrMa10 = atrArray[-10:].mean() atrMa50 = atrArray[-50:].mean() #self.iswave = False if atrMa10 < self.ratio_atrMa * atrMa50 else True self.iswave = False if self.atrMa < self.ratio_atrMa * atrMa50 else True self.rsiValue = self.am.rsi(self.rsiLength) rsiArray20 = self.am.rsi(20, array=True) self.can_buy = False if rsiArray20[-1] > 50 and rsiArray20[-2] > 50 and rsiArray20[-3] > 50: self.can_buy = True self.can_short = False if rsiArray20[-1] < 50 and rsiArray20[-2] < 50 and rsiArray20[-3] < 50: self.can_short = True #---------------------------------------------------------------------- def generateSignal(self, bar): # 当前无仓位 if self.unit == 0: self.intraTradeHigh = bar.high self.intraTradeLow = bar.low # ATR数值上穿其移动平均线,说明行情短期内波动加大 # 即处于趋势的概率较大,适合CTA开仓 if self.atrValue > self.atrMa and self.iswave == False and self.paused == False: # 使用RSI指标的趋势行情时,会在超买超卖区钝化特征,作为开仓信号 #if self.rsiValue > self.rsiBuy and self.can_buy == True: if self.rsiValue > self.rsiBuy: # 这里为了保证成交,选择超价5个整指数点下单 self.cost = bar.close self.stop = 0 self.intraTradeHigh = bar.close self.buy(bar.close, self.fixedSize) #elif self.rsiValue < self.rsiSell and self.can_short == True: elif self.rsiValue < self.rsiSell: self.cost = bar.close self.stop = 100E4 self.intraTradeLow = bar.close self.short(bar.close, self.fixedSize) # 持有多头仓位 elif self.unit > 0: # 计算多头持有期内的最高价,以及重置最低价 self.intraTradeHigh = max(self.intraTradeHigh, bar.high) #self.stop = max( self.stop, self.intraTradeHigh * (1-self.victoryPercent/100) ) if self.stop < self.cost: self.stop = max( self.stop, self.intraTradeHigh * (1 - self.trailingPercent / 100)) else: self.stop = max( self.stop, self.intraTradeHigh * (1 - self.victoryPercent / 100)) if bar.close <= self.stop: # print('平多: ', bar.datetime, self.intraTradeHigh, self.stop, bar.close) self.sell(bar.close, abs(self.unit)) # 持有空头仓位 elif self.unit < 0: self.intraTradeLow = min(self.intraTradeLow, bar.low) #self.stop = min( self.stop, self.intraTradeLow * (1+self.victoryPercent/100) ) if self.stop > self.cost: self.stop = min( self.stop, self.intraTradeLow * (1 + self.trailingPercent / 100)) else: self.stop = min( self.stop, self.intraTradeLow * (1 + self.victoryPercent / 100)) #print(self.stop) if bar.close >= self.stop: # print('平空: ', bar.datetime, self.intraTradeLow, self.stop, bar.close) self.cover(bar.close, abs(self.unit)) #---------------------------------------------------------------------- def load_var(self): filename = get_dss() + 'fut/engine/atrrsi/signal_atrrsi_var.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost self.intraTradeHigh = rec.intraTradeHigh self.intraTradeLow = rec.intraTradeLow self.stop = rec.stop if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl #---------------------------------------------------------------------- def save_var(self): r = [] if self.result is None: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, \ 0, 0, 0, 0, 0 ] ] else: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, \ 1, self.result.unit, self.result.entry, self.result.exit, self.result.pnl ] ] df = pd.DataFrame(r, columns=['datetime','vtSymbol','unit','cost', \ 'intraTradeHigh','intraTradeLow','stop', \ 'has_result','result_unit','result_entry','result_exit', 'result_pnl']) filename = get_dss() + 'fut/engine/atrrsi/signal_atrrsi_var.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, '多' if change>0 else '空', '开', \ abs(change), price, 0, \ self.atrValue, self.atrMa, self.rsiValue, \ self.iswave, self.intraTradeHigh, self.intraTradeLow, \ self.stop] ] df = pd.DataFrame(r, columns=['datetime','direction','offset','volume','price','pnl', \ 'atrValue', 'atrMa', 'rsiValue', 'iswave', \ 'intraTradeHigh','intraTradeLow','stop']) filename = get_dss( ) + 'fut/engine/atrrsi/signal_atrrsi_' + self.vtSymbol + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def close(self, price, change): """平仓""" self.unit = 0 self.result.close(price) r = [ [self.bar.date+' '+self.bar.time, '', '平', \ 0, price, self.result.pnl, \ self.atrValue, self.atrMa, self.rsiValue, \ self.iswave, self.intraTradeHigh, self.intraTradeLow, \ self.stop] ] df = pd.DataFrame(r, columns=['datetime','direction','offset','volume','price','pnl', \ 'atrValue', 'atrMa', 'rsiValue', 'iswave', \ 'intraTradeHigh','intraTradeLow','stop']) filename = get_dss( ) + 'fut/engine/atrrsi/signal_atrrsi_' + self.vtSymbol + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) self.result = None
class Fut_DonchianSignal_Kong(Signal): #---------------------------------------------------------------------- def __init__(self, portfolio, vtSymbol): self.type = 'kong' # 策略参数 self.trailingPercent = 0.3 # 百分比移动止损 self.victoryPercent = 0.3 self.fixedSize = 1 # 每次交易的数量 self.initBars = 90 # 初始化数据所用的天数 self.minx = 'min5' # 策略临时变量 self.can_buy = False self.can_short = False self.channel_up = 0 self.channel_down = 0 # 需要持久化保存的变量 self.cost = 0 self.intraTradeHigh = 0 # 移动止损用的持仓期内最高价 self.intraTradeLow = 0 # 持仓期内的最低点 self.stop = 0 # 多头止损 Signal.__init__(self, portfolio, vtSymbol) #---------------------------------------------------------------------- def load_param(self): filename = get_dss() + 'fut/cfg/signal_donchian_param.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.pz == get_contract(self.vtSymbol).pz] if len(df) > 0: rec = df.iloc[0, :] self.rsiLength = rec.rsiLength self.trailingPercent = rec.trailingPercent self.victoryPercent = rec.victoryPercent print('成功加载策略参数', self.rsiLength, self.trailingPercent, self.victoryPercent) #---------------------------------------------------------------------- def set_param(self, param_dict): if 'atrMaLength' in param_dict: self.atrMaLength = param_dict['atrMaLength'] print('成功设置策略参数 self.atrMaLength: ', self.atrMaLength) if 'rsiLength' in param_dict: self.rsiLength = param_dict['rsiLength'] print('成功设置策略参数 self.rsiLength: ', self.rsiLength) if 'trailingPercent' in param_dict: self.trailingPercent = param_dict['trailingPercent'] print('成功设置策略参数 self.trailingPercent: ', self.trailingPercent) if 'victoryPercent' in param_dict: self.victoryPercent = param_dict['victoryPercent'] print('成功设置策略参数 self.victoryPercent: ', self.victoryPercent) #---------------------------------------------------------------------- def onBar(self, bar, minx='min5'): """新推送过来一个bar,进行处理""" self.bar = bar if minx == 'min1': self.on_bar_min1(bar) else: self.on_bar_minx(bar) # r = [[minx,bar.date,bar.time,bar.open,bar.close]] # df = pd.DataFrame(r) # filename = get_dss() + 'fut/check/bar_' + self.vtSymbol + '.csv' # df.to_csv(filename, index=False, mode='a', header=False) def on_bar_min1(self, bar): # 持有多头仓位 if self.unit > 0: if bar.close <= self.stop: # print('平多: ', bar.datetime, self.intraTradeHigh, self.stop, bar.close) self.sell(bar.close, abs(self.unit)) # 持有空头仓位 elif self.unit < 0: if bar.close >= self.stop: # print('平空: ', bar.datetime, self.intraTradeLow, self.stop, bar.close) self.cover(bar.close, abs(self.unit)) def on_bar_minx(self, bar): self.am.updateBar(bar) if not self.am.inited: return #print('here') self.calculateIndicator() # 计算指标 self.generateSignal(bar) # 触发信号,产生交易指令 #---------------------------------------------------------------------- def calculateIndicator(self): """计算技术指标""" self.channel_up, self.channel_down = self.am.donchian(60, array=True) donchian_condition = True if self.bar.close < self.channel_down[ -2] else False self.can_short = False if donchian_condition: self.can_short = True #---------------------------------------------------------------------- def generateSignal(self, bar): # 当前无仓位 if self.unit == 0: self.intraTradeHigh = bar.high self.intraTradeLow = bar.low if self.can_short == True and self.paused == False: self.cost = bar.close self.stop = 100E4 self.intraTradeLow = bar.close self.short(bar.close, self.fixedSize) # 持有空头仓位 elif self.unit < 0: self.intraTradeLow = min(self.intraTradeLow, bar.low) #self.stop = min( self.stop, self.intraTradeLow * (1+self.victoryPercent/100) ) if self.stop > self.cost: self.stop = min( self.stop, self.intraTradeLow * (1 + self.trailingPercent / 100)) else: self.stop = min( self.stop, self.intraTradeLow * (1 + self.victoryPercent / 100)) #print(self.stop) if bar.close >= self.stop: # print('平空: ', bar.datetime, self.intraTradeLow, self.stop, bar.close) self.cover(bar.close, abs(self.unit)) #---------------------------------------------------------------------- def load_var(self): filename = get_dss( ) + 'fut/check/signal_donchian_' + self.type + '_var.csv' if os.path.exists(filename): df = pd.read_csv(filename) df = df[df.vtSymbol == self.vtSymbol] df = df.sort_values(by='datetime') df = df.reset_index() if len(df) > 0: rec = df.iloc[-1, :] # 取最近日期的记录 self.unit = rec.unit self.cost = rec.cost self.intraTradeHigh = rec.intraTradeHigh self.intraTradeLow = rec.intraTradeLow self.stop = rec.stop if rec.has_result == 1: self.result = SignalResult() self.result.unit = rec.result_unit self.result.entry = rec.result_entry self.result.exit = rec.result_exit self.result.pnl = rec.result_pnl #---------------------------------------------------------------------- def save_var(self): r = [] if self.result is None: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, \ 0, 0, 0, 0, 0 ] ] else: r = [ [self.portfolio.result.date,self.vtSymbol, self.unit, self.cost, \ self.intraTradeHigh, self.intraTradeLow, self.stop, \ 1, self.result.unit, self.result.entry, self.result.exit, self.result.pnl ] ] df = pd.DataFrame(r, columns=['datetime','vtSymbol','unit','cost', \ 'intraTradeHigh','intraTradeLow','stop', \ 'has_result','result_unit','result_entry','result_exit', 'result_pnl']) filename = get_dss( ) + 'fut/check/signal_donchian_' + self.type + '_var.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def open(self, price, change): """开仓""" self.unit += change if not self.result: self.result = SignalResult() self.result.open(price, change) r = [ [self.bar.date+' '+self.bar.time, '多' if change>0 else '空', '开', \ abs(change), price, 0, \ self.intraTradeHigh, self.intraTradeLow, self.stop] ] df = pd.DataFrame(r, columns=['datetime','direction','offset','volume','price','pnl', \ 'intraTradeHigh','intraTradeLow','stop']) filename = get_dss( ) + 'fut/deal/signal_donchian_' + self.type + '_' + self.vtSymbol + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) #---------------------------------------------------------------------- def close(self, price): """平仓""" self.unit = 0 self.result.close(price) r = [ [self.bar.date+' '+self.bar.time, '', '平', \ 0, price, self.result.pnl, \ self.intraTradeHigh, self.intraTradeLow, self.stop] ] df = pd.DataFrame(r, columns=['datetime','direction','offset','volume','price','pnl', \ 'intraTradeHigh','intraTradeLow','stop']) filename = get_dss( ) + 'fut/deal/signal_donchian_' + self.type + '_' + self.vtSymbol + '.csv' if os.path.exists(filename): df.to_csv(filename, index=False, mode='a', header=False) else: df.to_csv(filename, index=False) self.result = None