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)
Example #4
0
    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)
Example #5
0
 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
Example #6
0
    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)
Example #7
0
 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
Example #8
0
 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
Example #9
0
 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
Example #12
0
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
Example #13
0
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
Example #14
0
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
Example #15
0
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
Example #16
0
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