作者:爱茶语 ;来源:维恩的派论坛

 
 

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__