作者:爱茶语 ;来源:维恩的派论坛
open_pos = 20 #交易手数
#拆单追价参数
disassembleSingle = 10 #拆单下单量阈值
disassembleTimeTotal = 15 #拆单总时间15秒
disassembleInterval = 5 #拆单时间间隔5秒,拆单次数为disassembleTimeTotal/disassembleInterval
chaseInterval = 10 #未成交追单时间间隔10秒 def __init__(self, ctaEngine, setting):
"""Constructor"""
super(APADXTICKStrategy, self).__init__(ctaEngine, setting)
"""
如果是多合约实例的话,变量需要放在__init__里面
"""
# 策略变量
self.bar = None # K线对象
self.barMinute = EMPTY_STRING # K线当前的分钟
self.minutebar = None # minuteK线对象
self.bufferCount = 0 # 目前已经缓存了的数据的计数
self.barList = []
self.order = {} #委托订单号
self.order_second = None #当前委托秒数
self.XMhighArray = np.zeros(self.bufferSize) # X分钟K线最高价的数组
self.XMlowArray = np.zeros(self.bufferSize) # X分钟K线最低价的数组
self.XMcloseArray = np.zeros(self.bufferSize) # X分钟K线收盘价的数组
self.XMopenArray = np.zeros(self.bufferSize) # X分钟K线开盘价的数组
self.dayCloseArray = np.zeros(self.bufferSize) # 日线收盘价的数组
self.dayHighArray = np.zeros(self.bufferSize) # 日线最高价的数组
self.dayLowArray = np.zeros(self.bufferSize) # 日线最低价的数组
self.LongEnterable1 = False
self.ShortEnterable1 = False
self.SellEnterable1 = False
self.CoverEnterable1 = False
self.longTriger = False
self.shortTriger = False
self.sellTriger = False
self.coverTriger = False
self.chaselongTriger = False
self.chasesellTriger = False
self.chaseshortTriger = False
self.chasecoverTriger = False
self.orderFinished = False
#指标初始化
self.lastPrice = EMPTY_INT
self.buyPrice = EMPTY_INT
self.shortPrice = EMPTY_INT
self.dayClose = EMPTY_INT
self.dayHigh = EMPTY_INT
self.dayLow = EMPTY_INT
self.tickSecond = EMPTY_INT
self.sellPrice = EMPTY_INT
self.coverPrice = EMPTY_INT
self.adx = EMPTY_INT
self.longtradeVolume = 0
self.shorttradeVolume = 0
self.selltradeVolume = 0
self.covertradeVolume = 0
def onInit(self):
self.writeCtaLog('{}策略初始化'.format(self.name))
# 载入历史数据,并采用回放计算的方式初始化策略数值
initData = self.loadTick(self.initDays)
for Tick in initData:
self.onTick(Tick)
self.putEvent()
#----------------------------------------------------------------------
def onStart(self):
"""启动策略(必须由用户继承实现)"""
self.writeCtaLog('{}策略启动'.format(self.name))
self.putEvent()
#----------------------------------------------------------------------
def onStop(self):
"""停止策略(必须由用户继承实现)"""
self.writeCtaLog('{}策略停止'.format(self.name))
self.putEvent()
#----------------------------------------------------------------------
def onTick(self, tick):
"""收到行情TICK推送(必须由用户继承实现)"""
self.tickSecond = tick.datetime.second
self.lastPrice = tick.lastPrice
#委托单全部成交或撤销才能发开仓单
if not self.order:
self.OrderFinished = True
elif self.order['status'] == '未成交' or self.order['status'] == '部分成交':
self.OrderFinished = False
else:
self.OrderFinished = True
#拆单开仓模块
if self.LongEnterable1 and tick.lastPrice >= self.buyPrice and self.pos >= 0:
#如果开仓仓位大于拆单阈值disassembleSingle,分intself.disassembleTimeTotal/self.disassembleInterval次数完成开仓,间隔disassembleInterval秒
#self.open_pos - abs(self.pos) < int(self.open_pos/(self.disassembleTimeTotal/self.disassembleInterval)) 开仓手数减去当前仓位小于拆单手数时只发开仓手数减去当前仓位的单子,防止总开仓手数大于self.opne_pos
if self.open_pos > self.disassembleSingle and self.open_pos - abs(self.pos) > int(self.open_pos/(self.disassembleTimeTotal/self.disassembleInterval)):
self.longTriger =False
if self.tickSecond % self.disassembleInterval == 0 and self.tickSecond != 0 and (not self.longTriger) and (self.orderFinished):
self.buy(tick.bidPrice1,int(self.open_pos/(self.disassembleTimeTotal/self.disassembleInterval)))
self.longTriger =True
elif self.open_pos > self.disassembleSingle and self.open_pos - abs(self.pos) < int(self.open_pos/(self.disassembleTimeTotal/self.disassembleInterval)):
self.longTriger =False
if self.tickSecond % self.disassembleInterval == 0 and self.tickSecond != 0 and (not self.longTriger) and (self.orderFinished):
self.buy(tick.bidPrice1,int(self.open_pos - abs(self.pos)))
self.longTriger =True
elif abs(self.pos) ==0 and self.open_pos <= self.disassembleSingle and (not self.longTriger) and (self.orderFinished):
self.buy(tick.bidPrice1,self.open_pos)
self.longTriger = True
if self.ShortEnterable1 and tick.lastPrice <= self.shortPrice and self.pos <= 0:
if self.open_pos > self.disassembleSingle and self.open_pos - abs(self.pos) > int(self.open_pos/(self.disassembleTimeTotal/self.disassembleInterval)):
self.shortTriger =False
if self.tickSecond % self.disassembleInterval == 0 and self.tickSecond != 0 and (not self.shortTriger) and (self.orderFinished):
self.short(tick.askPrice1,int(self.open_pos/(self.disassembleTimeTotal/self.disassembleInterval)))
self.shortTriger =True
elif self.open_pos > self.disassembleSingle and self.open_pos - abs(self.pos) < int(self.open_pos/(self.disassembleTimeTotal/self.disassembleInterval)):
self.shortTriger =False
if self.tickSecond % self.disassembleInterval == 0 and self.tickSecond != 0 and (not self.shortTriger) and (self.orderFinished):
self.short(tick.askPrice1,int(self.open_pos - abs(self.pos)))
self.shortTriger =True
elif abs(self.pos) ==0 and self.open_pos <= self.disassembleSingle and (not self.shortTriger) and (self.orderFinished):
self.short(tick.askPrice1,self.open_pos)
self.shortTriger = True
#拆单平仓模块
if copy.deepcopy(self.SellEnterable1) and self.pos > 0:
if abs(self.pos) > self.disassembleSingle:
self.sellTriger=False
if self.tickSecond % self.disassembleInterval == 0 and self.tickSecond != 0 and (not self.sellTriger) and (self.orderFinished):
self.sell(tick.askPrice1,int(abs(self.pos)/(self.disassembleTimeTotal/self.disassembleInterval)))
self.sellTriger = True
elif abs(self.pos) <= self.disassembleSingle and (not self.sellTriger) and (self.orderFinished):
self.sell(tick.askPrice1,abs(self.pos))
self.sellTriger = True
elif copy.deepcopy(self.CoverEnterable1) and self.pos < 0:
if abs(self.pos) > self.disassembleSingle:
self.coverTriger=False
if self.tickSecond % self.disassembleInterval == 0 and self.tickSecond != 0 and (not self.coverTriger) and (self.orderFinished):
self.cover(tick.bidPrice1,int(abs(self.pos)/(self.disassembleTimeTotal/self.disassembleInterval)))
self.coverTriger = True
elif abs(self.pos) <= self.disassembleSingle and (not self.coverTriger) and (self.orderFinished):
self.cover(tick.bidPrice1,abs(self.pos))
self.coverTriger = True
#委托超过chaseInterval秒未成交撤单追价
if not self.order:
pass
elif self.order['direction'] == '多' and self.order['offset'] == '开仓' and self.order['status'] == '未成交':
if self.tickSecond % self.chaseInterval == 0 and self.tickSecond != 0:
self.longtradeVolume = self.order['totalVolume']
if self.longtradeVolume > 0 and (not self.chaselongTriger):
# 撤销之前发出的尚未成交的委托(包括限价单和停止单)
self.cancelAll()
self.chaselongTriger = True
elif self.order['direction'] == '空' and (self.order['offset'] == '平仓' or self.order['offset'] == '平今') and self.order['status'] == '未成交':
if self.tickSecond % self.chaseInterval == 0 and self.tickSecond != 0:
self.selltradeVolume = self.order['totalVolume']
if self.selltradeVolume > 0 and (not self.chasesellTriger):
# 撤销之前发出的尚未成交的委托(包括限价单和停止单)
self.cancelAll()
self.chasesellTriger = True
elif self.order['direction'] == '空' and self.order['offset'] == '开仓' and self.order['status'] == '未成交':
if self.tickSecond % self.chaseInterval == 0 and self.tickSecond != 0:
self.shorttradeVolume = self.order['totalVolume']
if self.shorttradeVolume > 0 and (not self.chaseshortTriger):
# 撤销之前发出的尚未成交的委托(包括限价单和停止单)
self.cancelAll()
self.chaseshortTriger = True
elif self.order['direction'] == '多' and (self.order['offset'] == '平仓' or self.order['offset'] == '平今') and self.order['status'] == '未成交':
if self.tickSecond % self.chaseInterval == 0 and self.tickSecond != 0:
self.covertradeVolume = self.order['totalVolume']
if self.covertradeVolume > 0 and (not self.chasecoverTriger):
# 撤销之前发出的尚未成交的委托(包括限价单和停止单)
self.cancelAll()
self.chasecoverTriger =True
#self.chaseInterval+1秒追价,避免追加单被撤
if self.chaselongTriger:
if self.tickSecond % (self.chaseInterval+1) == 0 and self.tickSecond != 0:
self.buy(tick.askPrice1,self.longtradeVolume)
self.chaselongTriger = False
if self.chasesellTriger:
if self.tickSecond % (self.chaseInterval+1) == 0 and self.tickSecond != 0:
self.sell(tick.bidPrice1,self.selltradeVolume)
self.chasesellTriger = False
if self.chaseshortTriger:
if self.tickSecond % (self.chaseInterval+1) == 0 and self.tickSecond != 0:
self.short(tick.bidPrice1,self.shorttradeVolume)
self.chaseshortTriger = False
if self.chasecoverTriger:
if self.tickSecond % (self.chaseInterval+1) == 0 and self.tickSecond != 0:
self.cover(tick.askPrice1,self.covertradeVolume)
self.chasecoverTriger = False
#成交触发后,触发器设置为未触发
if self.pos == 0:
self.CoverEnterable1 = False
self.SellEnterable1 = False
self.coverTriger = False
self.sellTriger = False
if abs(self.pos) !=0:
self.longTriger = False
self.shortTriger = False
#----------------------------------------------------------------------
def onOrder(self, order):
"""收到委托变化推送(必须由用户继承实现)"""
self.order = order.__dict__