Exemplo n.º 1
0
 def __init__(self):
     """Constructor"""
     super(AtrSignal, self).__init__()
     self.atrWindow = 30
     self.bg = BarGenerator(self.onBar, 15, self.on15Bar)
     self.am = ArrayManager()
     self.atrValue = 0.0
Exemplo n.º 2
0
 def __init__(self, ctaEngine, setting):
     """Constructor"""
     super(Turtle01Strategy1M, self).__init__(ctaEngine, setting)
     self.bg = BarGenerator(self.onBar,
                            xmin=3,
                            onXminBar=self.on3MBar,
                            onDayBar=self.ondayBar)
     self.am = ArrayManager(
         max(self.longDays, self.shortDays, self.atrDays) + 1)
     self.barList = []
     if len(Turtle01Strategy1M.cust_Setting) > 0:
         for cust in Turtle01Strategy1M.cust_Setting:
             if cust["StrategyGroup"] == "Turtle":
                 capAmtTurtle = float(cust["CaptialAmt"])
                 minBarTypeTurtle = cust["MinuteBarGen"]
                 break
             elif cust["StrategyGroup"] == "Default":
                 capAmtDefault = float(cust["CaptialAmt"])
                 minBarTypeDefault = cust["MinuteBarGen"]
         if capAmtTurtle > 0:
             self.capAmount = capAmtTurtle
             self.minBarType = minBarTypeTurtle
             self.unitCalcMethod = "custsetting"
         elif capAmtDefault > 0:
             self.capAmount = capAmtDefault
             self.minBarType = minBarTypeDefault
             self.unitCalcMethod = "custsetting"
         else:
             self.unitCalcMethod = "ctasetting"
Exemplo n.º 3
0
 def __init__(self, ctaEngine, setting):
     """Constructor"""
     super(Turtle01Strategy, self).__init__(ctaEngine, setting) 
     
     self.bg = BarGenerator(self.onBar,onDayBar = self.ondayBar)
     self.am = ArrayManager(max(self.longDays,self.shortDays,self.atrDays)+1)
     self.barList = []
Exemplo n.º 4
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(HLBeatStrategy, self).__init__(ctaEngine, setting)
        self.bm = MyBarGenerator(self.onBar, self.xMinBar, self.onFiveBar)
        self.am = ArrayManager()

        self.ctaEngine.eventEngine.register(EVENT_TIMER, self.onTimeFunc)
Exemplo n.º 5
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(tempStrategy, self).__init__(ctaEngine, setting)
        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager()
        self.lastzhibiao = zhibiao(0, 0, 0)
        self.celve0 = zerocelve()
        # self.celve1 = ceshi()
        self.tickCelvezu = [self.celve0]
        self.barCelvezu = [self.celve0]

        self.tickadd = 1

        #断网恢复变量
        self.stopcount = None

        #交易时间和监控联网状态变量
        self.yepan = False
        self.yepanhour = None
        self.yepanminute = None
        self.lastbardatetime = None

        self.tradetime = None

        #控制开仓和平仓稳定变量
        self.tradecount = 0

        self.tradingcelve = [self.celve0]
Exemplo n.º 6
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(TripleMAStrategy02, self).__init__(ctaEngine, setting)

        self.bm = BarGenerator(self.onBar, 5, self.onFiveBar)
        # 由于maWindow3的长度是120,所以ArrayManager的size要增加至150
        self.am = ArrayManager(size=150)
Exemplo n.º 7
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(DualThrust_IntraDayStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar, onDayBar=self.ondayBar)
        self.am = ArrayManager()
        self.barList = []
Exemplo n.º 8
0
    def __init__(self, ctaEngine, setting):

        # 首先找到策略的父类(就是类CtaTemplate),然后把DoubleMaStrategy的对象转换为类CtaTemplate的对象
        super(MultiFrameMaStrategy, self).__init__(ctaEngine, setting)

        # 生成仓位记录的字典
        symbol = self.symbolList[0]
        self.Longpos = symbol.replace('.','_')+"_LONG"
        self.Shortpos = symbol.replace('.','_')+"_SHORT"


        self.bg60 = BarGenerator(self.onBar, 60, self.on60MinBar)
        self.bg60Dict = {
            sym: self.bg60
            for sym in self.symbolList
        }


        self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar)
        self.bg15Dict = {
            sym: self.bg15
            for sym in self.symbolList
        }

        # 生成Bar数组
        self.am60Dict = {
            sym: ArrayManager(size=self.slowWindow+10)
            for sym in self.symbolList
        }

        self.am15Dict = {
            sym: ArrayManager(size=self.slowWindow+10)
            for sym in self.symbolList
        }
Exemplo n.º 9
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(DoubleMaStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager()
        self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar)
        self.am15 = ArrayManager()
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(BollingerBotStrategy01, self).__init__(ctaEngine, setting)

        self.bm = BarGenerator(self.onBar, 5, self.onFiveBar)
        self.am = ArrayManager(30)
        self.orderList = []
        self.entryPriceList = []
Exemplo n.º 11
0
    def __init__(self):
        """Constructor"""
        super(BollSignal, self).__init__()

        self.bollWindow = 18
        self.bollDev = 5
        # self.bollUp, self.bollDown = 0.0,0.0
        self.bg = BarGenerator(self.onBar, 15, self.on15Bar)
        self.am = ArrayManager()
Exemplo n.º 12
0
    def __init__(self):
        """Constructor"""
        super(MaSignal, self).__init__()

        self.fastWindow = 5
        self.slowWindow = 20

        self.bg = BarGenerator(self.onBar, 5, self.onFiveBar)
        self.am = ArrayManager()
Exemplo n.º 13
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(KeltnerCommonStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar,
                               onDayBar=self.ondayBar,
                               vtSymbol=self.vtSymbol)
        self.am = ArrayManager()
        self.barList = []
        # Read Parameters from Setting files
        if 'strParams' in setting:
            self.params = setting['strParams']
            if len(self.params) >= 3:
                for p in self.params:
                    if p[0] == 'unit':
                        self.fixedSize = p[1]
                    if p[0] == 'p1':
                        self.kUpper = p[1]
                    if p[0] == 'p2':
                        self.kLower = p[1]
                    if p[0] == 'p3':
                        self.maDays = p[1]
                    if p[0] == 'p4':
                        self.atrDays = p[1]
                    if p[0] == 'p5':
                        self.initDays = p[1]
                    if p[0] == 'p6':
                        self.rsilen = p[1]
                    if p[0] == 'p7':
                        self.rsiconfig = p[1]
        else:
            # 策略参数
            self.fixedSize = 1
            self.kUpper = 2
            self.kLower = 2

            self.maDays = 13
            self.atrDays = 20
            self.initDays = 55  # original value is 10
            self.rsiconfig = 50
            self.rsilen = 21
        #print(self.fixedSize,self.kUpper,self.kLower,self.maDays,self.initDays)
        self.atrAvg = 0
        self.maHigh = 0
        self.maLow = 0
        self.longEntry = 0
        self.shortEntry = 0
        self.longExit = 0
        self.shortExit = 0

        #exitTime = time(hour=15, minute=20) #will not cover position when day close

        self.longEntered = False
        self.shortEntered = False

        self.loginterval = 15
        self.logcountdown = 0
Exemplo n.º 14
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(DoubleMaStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager()
        self.lastzhibiao = zhibiao()
        self.celve0 = zerocelve()
        self.tickCelvezu = [celve0]
        self.barCelvezu = [celve0]
Exemplo n.º 15
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(DT_IntraDayCommonStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar,
                               onDayBar=self.ondayBar,
                               vtSymbol=self.vtSymbol)
        self.am = ArrayManager()
        self.barList = []
        self.longEntry1 = 0
        self.shortEntry1 = 0
        # Read Parameters from Setting files
        if 'strParams' in setting:
            self.params = setting['strParams']
            if len(self.params) >= 3:
                for p in self.params:
                    if p[0] == 'unit':
                        self.fixedSize = p[1]
                    if p[0] == 'p1':
                        self.k1 = p[1]
                    if p[0] == 'p2':
                        self.k2 = p[1]
                    if p[0] == 'p3':
                        self.rangeDays = p[1]
                    if p[0] == 'p4':
                        self.atrDays = p[1]
                    if p[0] == 'p5':
                        self.initDays = p[1]

        else:
            # 策略参数
            self.fixedSize = 1
            self.k1 = 0.4
            self.k2 = 0.4

            self.rangeDays = 4
            self.atrDays = 20
            self.initDays = 55  # original value is 10
        #print(self.fixedSize,self.k1,self.k2,self.rangeDays,self.initDays)
        self.dayOpen = 0
        self.rangeHigh = 0
        self.rangeLow = 0
        self.rangeHighClose = 0
        self.rangeLowClose = 0
        self.range1 = 0
        self.range2 = 0
        self.atrValue = 0

        self.range = 0
        self.longEntry = 0
        self.shortEntry = 0
        self.exitTime = time(
            hour=15, minute=20)  #will not cover position when day close
        self.longEntered = False
        self.shortEntered = False
Exemplo n.º 16
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(JDualThrust_IntraDayStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar,
                               onDayBar=self.ondayBar,
                               vtSymbol=self.vtSymbol)
        self.am = ArrayManager()
        self.barList = []
        self.timeinterval = 4
        self.countdown = 0
Exemplo n.º 17
0
    def __init__(self):
        """Constructor"""
        super(CciSignal, self).__init__()

        self.cciWindow = 10
        self.cciLevel = 20
        self.cciLong = self.cciLevel
        self.cciShort = -self.cciLevel
        self.cciValue = 0.0
        self.bg = BarGenerator(self.onBar, 15, self.on15Bar)
        self.am = ArrayManager()
Exemplo n.º 18
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(SARKELStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar, self.barMins,
                               self.onXminBar)  # 创建K线合成器对象
        self.am = ArrayManager()

        self.bgclose = BarGenerator(self.onBar, self.barMinsClose,
                                    self.onminBarClose)
        self.amClose = ArrayManager()
Exemplo n.º 19
0
    def __init__(self):
        """Constructor"""
        super(RsiSignal, self).__init__()

        self.rsiWindow = 14
        self.rsiLevel = 20
        self.rsiLong = 50 + self.rsiLevel
        self.rsiShort = 50 - self.rsiLevel

        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager()
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(TripleMAStrategy05, self).__init__(ctaEngine, setting)
        self.entryPriceList = []
        self.bm = BarGenerator(self.onBar, 5, self.onFiveBar)
        self.am = ArrayManager(size=150)

        self.backTesting = True
        # 策略信号
        self.buySig = False
        self.shortSig = False
        self.sellSig = False
        self.coverSig = False
Exemplo n.º 21
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(MultiTimeframeStrategy, self).__init__(ctaEngine, setting)

        self.rsiLong = 50 + self.rsiSignal
        self.rsiShort = 50 - self.rsiSignal

        # 创建K线合成器对象
        self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar)
        self.am5 = ArrayManager()

        self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar)
        self.am15 = ArrayManager()
Exemplo n.º 22
0
 def __init__(self, ctaEngine, setting):
     """Constructor"""
     super(MultiTimeframeStrategy, self).__init__(ctaEngine, setting)
     
     self.rsiLong = 50 + self.rsiSignal
     self.rsiShort = 50 - self.rsiSignal
     
     # 创建K线合成器对象
     self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar)
     self.am5 = ArrayManager()
     
     self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar)
     self.am15 = ArrayManager()
Exemplo n.º 23
0
 def __init__(self, ctaEngine, setting):
     """Constructor"""
     super(M60M5MacdStrategy, self).__init__(ctaEngine, setting)
     
     self.rsiLong = 50 + self.rsiSignal
     self.rsiShort = 50 - self.rsiSignal
     
     # 创建K线合成器对象
     self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar)
     self.am5 = ArrayManager()
     
     
     self.bg60 = BarGenerator(self.onBar, 60, self.on60MinBar)
     self.am60 = ArrayManager()        
Exemplo n.º 24
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(AtrRsiStrategy, self).__init__(ctaEngine, setting)

        # 创建K线合成器对象
        self.bm = BarManager(self.onBar)
        self.am = ArrayManager()
Exemplo n.º 25
0
    def onInit(self):
        """初始化策略(必须由用户继承实现)"""
        self.activeSymbol = self.symbolList[0]  # 主动品种
        self.passiveSymbol = self.symbolList[1]  # 被动品种

        # 构造K线合成器对象
        self.bgDict = {
            sym: BarGenerator(self.onBar)
            for sym in self.symbolList
        }

        self.amDict = {sym: ArrayManager() for sym in self.symbolList}

        # 载入1分钟历史数据,并采用回放计算的方式初始化策略参数
        # 可选参数:["1min","5min","15min","30min","60min","4hour","1day","1week","1month"]
        pastbar1 = self.loadHistoryBar(self.activeSymbol,
                                       type_="1min",
                                       size=self.initbars)

        pastbar2 = self.loadHistoryBar(self.passiveSymbol,
                                       type_="1min",
                                       size=self.initbars)

        for bar1, bar2 in zip(pastbar1, pastbar2):
            self.amDict[self.activeSymbol].updateBar(bar1)  # 更新数据矩阵(optional)
            self.amDict[self.passiveSymbol].updateBar(bar2)

        # self.onBar(bar)  # 是否直接推送到onBar
        self.putEvent()  # putEvent 能刷新UI界面的信息
        '''
Exemplo n.º 26
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(strategy_Volatility_RB, self).__init__(ctaEngine, setting)

        self.initDays = max(self.BK_BEFORE_DAY,
                            self.SK_BEFORE_DAY)  # 初始化数据所用的天数
        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager(self.initDays)

        self.strategyStartpos = 1890
        self.strategyEndpos = 2358
        self.all_bar = []
        self.SP_style = 0000
        self.BP_style = 0000
        self.BKPRICE = EMPTY_FLOAT_WH
        self.BKDATE = EMPTY_FLOAT_WH
        self.SKPRICE = EMPTY_FLOAT_WH
        self.SKDATE = EMPTY_FLOAT_WH
        self.tradeday = 0
        # 注意策略类中的可变对象属性(通常是list和dict等),在策略初始化时需要重新创建,
        # 否则会出现多个策略实例之间数据共享的情况,有可能导致潜在的策略逻辑错误风险,
        # 策略类中的这些可变对象属性可以选择不写,全都放在__init__下面,写主要是为了阅读
        # 策略时方便(更多是个编程习惯的选择)
        self.BKWeekProfit = [0, 0, 0, 0, 0, 0, 0]
        self.SKWeekProfit = [0, 0, 0, 0, 0, 0, 0]
        self.LongBestday = [0, 1, 2, 3]  #[0,1,2] 20190627
        self.ShortBestday = [1, 2, 3]
Exemplo n.º 27
0
 def addSymbolFreq(self, symbol, freq, size = 50):
     key = symbol + '_' + freq
     self.symbolFreqData[key] = ArrayManager(size=size)
     data_list=[]
     if freq == '1MIN':
         data_list = self.mainEngine.dbQuery( MINUTE_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING)
     elif freq == '5MIN':
         data_list = self.mainEngine.dbQuery( MINUTE_5_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING)
     elif freq == '15MIN':
         data_list = self.mainEngine.dbQuery( MINUTE_15_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING)
     elif freq == '30MIN':
         data_list = self.mainEngine.dbQuery( MINUTE_30_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING)
     elif freq == '60MIN':
         data_list = self.mainEngine.dbQuery( MINUTE_60_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING)
     elif freq == 'D':
         data_list = self.mainEngine.dbQuery( DAILY_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING)
     elif freq == 'W':
         data_list = self.mainEngine.dbQuery( WEEKLY_DB_NAME, symbol, d={}, sortKey='datetime', sortDirection=ASCENDING)
                                    
     if np.size(data_list) >= size:
         data_list = data_list[-1*size:]
         
     for data in data_list:
         bar = VtBarData()
         bar.close = data['close']
         bar.open = data['open']
         bar.high = data['high']
         bar.low = data['low']
         self.symbolFreqData[key].updateBar(bar)
Exemplo n.º 28
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(BollChannelStrategy, self).__init__(ctaEngine, setting)

        self.bg = BarGenerator(self.onBar, 15, self.onXminBar)  # 创建K线合成器对象
        self.bg30 = BarGenerator(self.onBar, 30, self.on30minBar)
        self.am = ArrayManager()
Exemplo n.º 29
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(ShortTermStrategy, self).__init__(ctaEngine, setting)

        # 注意策略类中的可变对象属性(通常是list和dict等),在策略初始化时需要重新创建,
        # 否则会出现多个策略实例之间数据共享的情况,有可能导致潜在的策略逻辑错误风险,
        # 策略类中的这些可变对象属性可以选择不写,全都放在__init__下面,写主要是为了阅读
        # 策略时方便(更多是个编程习惯的选择)
        self.short_term_list_first = []
        self.short_term_list_all = []
        self.short_term_last_three_first_index = []
        self.short_term_last_two_low_all_index = []
        self.short_term_last_two_high_all_index = []
        self.short_term_open_last_three_first_index = []
        self.short_term_open_last_two_all_index = []
        self.all_bar = []
        self.BK_style = EMPTY_INT_WH  # 2-->所有的低点 21利用低点 22利用高点
        self.SK_style = EMPTY_INT_WH  # 2-->所有的高点 21利用高点 22利用低点
        self.BKPRICE = EMPTY_FLOAT_WH
        self.SKPRICE = EMPTY_FLOAT_WH
        self.initDays = self.E_LONG_ALL if self.LongOrShort == True else self.SK_E_LONG_ALL
        self.MAXCLOSE_AFTER_OPEN = EMPTY_FLOAT_WH  #建仓后close的最大值
        self.strategyStartpos = 1343
        self.strategyEndpos = 1826
        self.SP_style = 0000
        self.tradeday = 0
        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager(self.initDays)
Exemplo n.º 30
0
    def __init__(self, ctaEngine, setting):

        # 策略参数
        self.contract_size = 100
        self.MaxTolerate = 0
        self.maxHold = 0
        self.Ticks = 4  #追单数量
        self.stopping = False
        self.stoppingdt = None  # 止损后最小开仓时间
        self.stoppPeriods = 15  # 止损后15分钟不能开仓
        self.ShortSignalSpread = None
        self.LongSignalSpread = None
        self.short_enter_price = None
        self.short_exit_price = None
        self.long_enter_price = None
        self.long_exit_price = None
        self.maxHold = 0
        self.maxWin = 0
        self.minLose = 0
        self.mutiple = 0
        self.minEnterPrice = 0
        self.volume = 0
        self.init_asset = 0
        """Constructor"""
        super(tick_strategy, self).__init__(ctaEngine, setting)

        # 策略变量
        self.bm = BarManager(self.onBar, 1)  # 创建K线合成器对象
        self.am = ArrayManager()
Exemplo n.º 31
0
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(TestStrategy, self).__init__(ctaEngine, setting)
        vtSymbolset=setting['vtSymbol']        # 读取交易品种
        vtSymbolList=vtSymbolset.split(',')    
        self.activeSymbol = vtSymbolList[0]    # 主动品种
        self.passiveSymbol = vtSymbolList[1]   # 被动品种
        self.symbolList = [self.activeSymbol, self.passiveSymbol]
        
        # 给持仓字典设置名称,为了方便调用
        # MONGO数据库不支持字段名含有 "." ,需特别处理)
        self.asLongpos = self.activeSymbol.replace(".","_")+"_LONG"
        self.asShortpos = self.activeSymbol.replace(".","_")+"_SHORT"
        self.psLongpos = self.passiveSymbol.replace(".","_")+"_LONG"
        self.psShortpos = self.passiveSymbol.replace(".","_")+"_SHORT"
        
        # 构造K线合成器对象
        self.bgDict = {
            sym: BarGenerator(self.onBar)
            for sym in self.symbolList
        }
        
        self.amDict = {
            sym: ArrayManager()
            for sym in self.symbolList
        }

        # 价差缓存列表
        self.spreadBuffer = []        
Exemplo n.º 32
0
 def __init__(self):
     """Constructor"""
     super(MaSignal, self).__init__()
     
     self.fastWindow = 5
     self.slowWindow = 20
     
     self.bg = BarGenerator(self.onBar, 5, self.onFiveBar)
     self.am = ArrayManager()        
Exemplo n.º 33
0
 def __init__(self):
     """Constructor"""
     super(RsiSignal, self).__init__()
     
     self.rsiWindow = 14
     self.rsiLevel = 20
     self.rsiLong = 50 + self.rsiLevel
     self.rsiShort = 50 - self.rsiLevel
     
     self.bg = BarGenerator(self.onBar)
     self.am = ArrayManager()
Exemplo n.º 34
0
 def __init__(self):
     """Constructor"""
     super(CciSignal, self).__init__()
     
     self.cciWindow = 30
     self.cciLevel = 10
     self.cciLong = self.cciLevel
     self.cciShort = -self.cciLevel
     
     self.bg = BarGenerator(self.onBar)
     self.am = ArrayManager()        
Exemplo n.º 35
0
class MaSignal(CtaSignal):
    """双均线信号"""
    
    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        super(MaSignal, self).__init__()
        
        self.fastWindow = 5
        self.slowWindow = 20
        
        self.bg = BarGenerator(self.onBar, 5, self.onFiveBar)
        self.am = ArrayManager()        
        
    #----------------------------------------------------------------------
    def onTick(self, tick):
        """Tick更新"""
        self.bg.updateTick(tick)
        
    #----------------------------------------------------------------------
    def onBar(self, bar):
        """K线更新"""
        self.bg.updateBar(bar)
    
    #----------------------------------------------------------------------
    def onFiveBar(self, bar):
        """5分钟K线更新"""
        self.am.updateBar(bar)
        
        if not self.am.inited:
            self.setSignalPos(0)
            
        fastMa = self.am.sma(self.fastWindow)
        slowMa = self.am.sma(self.slowWindow)
        
        if fastMa > slowMa:
            self.setSignalPos(1)
        elif fastMa < slowMa:
            self.setSignalPos(-1)
        else:
            self.setSignalPos(0)
Exemplo n.º 36
0
class RsiSignal(CtaSignal):
    """RSI信号"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        super(RsiSignal, self).__init__()
        
        self.rsiWindow = 14
        self.rsiLevel = 20
        self.rsiLong = 50 + self.rsiLevel
        self.rsiShort = 50 - self.rsiLevel
        
        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager()
        
    #----------------------------------------------------------------------
    def onTick(self, tick):
        """Tick更新"""
        self.bg.updateTick(tick)
        
    #----------------------------------------------------------------------
    def onBar(self, bar):
        """K线更新"""
        self.am.updateBar(bar)
        
        if not self.am.inited:
            self.setSignalPos(0)
            
        rsiValue = self.am.rsi(self.rsiWindow)
        
        if rsiValue >= self.rsiLong:
            self.setSignalPos(1)
        elif rsiValue <= self.rsiShort:
            self.setSignalPos(-1)
        else:
            self.setSignalPos(0)
Exemplo n.º 37
0
class CciSignal(CtaSignal):
    """CCI信号"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        super(CciSignal, self).__init__()
        
        self.cciWindow = 30
        self.cciLevel = 10
        self.cciLong = self.cciLevel
        self.cciShort = -self.cciLevel
        
        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager()        
        
    #----------------------------------------------------------------------
    def onTick(self, tick):
        """Tick更新"""
        self.bg.updateTick(tick)
        
    #----------------------------------------------------------------------
    def onBar(self, bar):
        """K线更新"""
        self.am.updateBar(bar)
        
        if not self.am.inited:
            self.setSignalPos(0)
            
        cciValue = self.am.cci(self.cciWindow)
        
        if cciValue >= self.cciLong:
            self.setSignalPos(1)
        elif cciValue<= self.cciShort:
            self.setSignalPos(-1)    
        else:
            self.setSignalPos(0)
Exemplo n.º 38
0
 def __init__(self, ctaEngine, setting):
     """Constructor"""
     super(TurtleTradingStrategy, self).__init__(ctaEngine, setting)
     
     self.bg = BarGenerator(self.onBar)
     self.am = ArrayManager()
Exemplo n.º 39
0
class TurtleTradingStrategy(CtaTemplate):
    """海龟交易策略"""
    className = 'TurtleTradingStrategy'
    author = u'用Python的交易员'

    # 策略参数
    entryWindow = 55                    # 入场通道窗口
    exitWindow = 20                     # 出场通道窗口
    atrWindow = 20                      # 计算ATR波动率的窗口
    initDays = 10                       # 初始化数据所用的天数
    fixedSize = 1                       # 每次交易的数量

    # 策略变量
    entryUp = 0                         # 入场通道上轨
    entryDown = 0                       # 入场通道下轨
    exitUp = 0                          # 出场通道上轨
    exitDown = 0                        # 出场通道下轨
    atrVolatility = 0                   # ATR波动率
    
    longEntry = 0                       # 多头入场价格
    shortEntry = 0                      # 空头入场价格
    longStop = 0                        # 多头止损价格
    shortStop = 0                       # 空头止损价格
    
    # 参数列表,保存了参数的名称
    paramList = ['name',
                 'className',
                 'author',
                 'vtSymbol',
                 'entryWindow',
                 'exitWindow',
                 'atrWindow',
                 'initDays',
                 'fixedSize']    

    # 变量列表,保存了变量的名称
    varList = ['inited',
               'trading',
               'pos',
               'entryUp',
               'entryDown',
               'exitUp',
               'exitDown',
               'longEntry',
               'shortEntry',
               'longStop',
               'shortStop']  
    
    # 同步列表,保存了需要保存到数据库的变量名称
    syncList = ['pos']

    #----------------------------------------------------------------------
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(TurtleTradingStrategy, self).__init__(ctaEngine, setting)
        
        self.bg = BarGenerator(self.onBar)
        self.am = ArrayManager()
        
    #----------------------------------------------------------------------
    def onInit(self):
        """初始化策略(必须由用户继承实现)"""
        self.writeCtaLog(u'%s策略初始化' %self.name)
        
        # 载入历史数据,并采用回放计算的方式初始化策略数值
        initData = self.loadBar(self.initDays)
        for bar in initData:
            self.onBar(bar)

        self.putEvent()

    #----------------------------------------------------------------------
    def onStart(self):
        """启动策略(必须由用户继承实现)"""
        self.writeCtaLog(u'%s策略启动' %self.name)
        self.putEvent()

    #----------------------------------------------------------------------
    def onStop(self):
        """停止策略(必须由用户继承实现)"""
        self.writeCtaLog(u'%s策略停止' %self.name)
        self.putEvent()

    #----------------------------------------------------------------------
    def onTick(self, tick):
        """收到行情TICK推送(必须由用户继承实现)""" 
        self.bg.updateTick(tick)

    #----------------------------------------------------------------------
    def onBar(self, bar):
        """收到Bar推送(必须由用户继承实现)"""
        self.cancelAll()
    
        # 保存K线数据
        self.am.updateBar(bar)
        if not self.am.inited:
            return
        
        # 计算指标数值
        self.entryUp, self.entryDown = self.am.donchian(self.entryWindow)
        self.exitUp, self.exitDown = self.am.donchian(self.exitWindow)
        
        if not self.pos:
            self.atrVolatility = self.am.atr(self.atrWindow)
        
        # 判断是否要进行交易
        if self.pos == 0:
            self.longEntry = 0
            self.shortEntry = 0
            self.longStop = 0
            self.shortStop = 0
            
            self.sendBuyOrders(self.entryUp)
            self.sendShortOrders(self.entryDown)
    
        elif self.pos > 0:
            # 加仓逻辑
            self.sendBuyOrders(self.longEntry)
            
            # 止损逻辑
            sellPrice = max(self.longStop, self.exitDown)
            self.sell(sellPrice, abs(self.pos), True)
    
        elif self.pos < 0:
            # 加仓逻辑
            self.sendShortOrders(self.shortEntry)
            
            # 止损逻辑
            coverPrice = min(self.shortStop, self.exitUp)
            self.cover(coverPrice, abs(self.pos), True)
        
        # 同步数据到数据库
        self.saveSyncData()        
    
        # 发出状态更新事件
        self.putEvent()        

    #----------------------------------------------------------------------
    def onOrder(self, order):
        """收到委托变化推送(必须由用户继承实现)"""
        pass

    #----------------------------------------------------------------------
    def onTrade(self, trade):
        """成交推送"""
        if trade.direction == DIRECTION_LONG:
            self.longEntry = trade.price
            self.longStop = self.longEntry - self.atrVolatility * 2
        else:
            self.shortEntry = trade.price
            self.shortStop = self.shortEntry + self.atrVolatility * 2
        
        # 发出状态更新事件
        self.putEvent()

    #----------------------------------------------------------------------
    def onStopOrder(self, so):
        """停止单推送"""
        pass
    
    #----------------------------------------------------------------------
    def sendBuyOrders(self, price):
        """发出一系列的买入停止单"""
        t = self.pos / self.fixedSize
        
        if t < 1:
            self.buy(price, self.fixedSize, True)

        if t < 2:
            self.buy(price + self.atrVolatility*0.5, self.fixedSize, True)
                
        if t < 3:
            self.buy(price + self.atrVolatility, self.fixedSize, True)

        if t < 4:
            self.buy(price + self.atrVolatility*1.5, self.fixedSize, True)    
    
    #----------------------------------------------------------------------
    def sendShortOrders(self, price):
        """"""
        t = self.pos / self.fixedSize
        
        if t > -1:
            self.short(price, self.fixedSize, True)
        
        if t > -2:
            self.short(price - self.atrVolatility*0.5, self.fixedSize, True)
    
        if t > -3:
            self.short(price - self.atrVolatility, self.fixedSize, True)
    
        if t > -4:
            self.short(price - self.atrVolatility*1.5, self.fixedSize, True)            
Exemplo n.º 40
0
class MultiTimeframeStrategy(CtaTemplate):
    """跨时间周期交易策略"""
    className = 'MultiTimeframeStrategy'
    author = u'用Python的交易员'

    # 策略参数
    rsiSignal = 20          # RSI信号阈值
    rsiWindow = 14          # RSI窗口
    fastWindow = 5          # 快速均线窗口
    slowWindow = 20         # 慢速均线窗口
    
    initDays = 10           # 初始化数据所用的天数
    fixedSize = 1           # 每次交易的数量

    # 策略变量
    rsiValue = 0                        # RSI指标的数值
    rsiLong = 0                         # RSI买开阈值
    rsiShort = 0                        # RSI卖开阈值
    fastMa = 0                          # 5分钟快速均线
    slowMa = 0                          # 5分钟慢速均线
    maTrend = 0                         # 均线趋势,多头1,空头-1
    
    # 参数列表,保存了参数的名称
    paramList = ['name',
                 'className',
                 'author',
                 'vtSymbol',
                 'rsiSignal',
                 'rsiWindow',
                 'fastWindow',
                 'slowWindow']    

    # 变量列表,保存了变量的名称
    varList = ['inited',
               'trading',
               'pos',
               'rsiValue',
               'rsiLong',
               'rsiShort',
               'fastMa',
               'slowMa',
               'maTrend']  
    
    # 同步列表,保存了需要保存到数据库的变量名称
    syncList = ['pos']

    #----------------------------------------------------------------------
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(MultiTimeframeStrategy, self).__init__(ctaEngine, setting)
        
        self.rsiLong = 50 + self.rsiSignal
        self.rsiShort = 50 - self.rsiSignal
        
        # 创建K线合成器对象
        self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar)
        self.am5 = ArrayManager()
        
        self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar)
        self.am15 = ArrayManager()
        
    #----------------------------------------------------------------------
    def onInit(self):
        """初始化策略(必须由用户继承实现)"""
        self.writeCtaLog(u'%s策略初始化' %self.name)
    
        # 载入历史数据,并采用回放计算的方式初始化策略数值
        initData = self.loadBar(self.initDays)
        for bar in initData:
            self.onBar(bar)

        self.putEvent()

    #----------------------------------------------------------------------
    def onStart(self):
        """启动策略(必须由用户继承实现)"""
        self.writeCtaLog(u'%s策略启动' %self.name)
        self.putEvent()

    #----------------------------------------------------------------------
    def onStop(self):
        """停止策略(必须由用户继承实现)"""
        self.writeCtaLog(u'%s策略停止' %self.name)
        self.putEvent()

    #----------------------------------------------------------------------
    def onTick(self, tick):
        """收到行情TICK推送(必须由用户继承实现)"""
        # 只需要要在一个BarGenerator中合成1分钟K线
        self.bg5.updateTick(tick)

    #----------------------------------------------------------------------
    def onBar(self, bar):
        """收到Bar推送(必须由用户继承实现)"""
        # 基于15分钟判断趋势过滤,因此先更新
        self.bg15.updateBar(bar)
        
        # 基于5分钟判断
        self.bg5.updateBar(bar)
        
    #----------------------------------------------------------------------
    def on5MinBar(self, bar):
        """5分钟K线"""
        self.cancelAll()

        # 保存K线数据
        self.am5.updateBar(bar)
        if not self.am5.inited:
            return
        
        # 如果15分钟数据尚未初始化完毕,则直接返回
        if not self.maTrend:
            return

        # 计算指标数值
        self.rsiValue = self.am5.rsi(self.rsiWindow)

        # 判断是否要进行交易
        
        # 当前无仓位
        if self.pos == 0:
            if self.maTrend > 0 and self.rsiValue >= self.rsiLong:
                self.buy(bar.close+5, self.fixedSize)
                
            elif self.maTrend < 0 and self.rsiValue <= self.rsiShort:
                self.short(bar.close-5, self.fixedSize)

        # 持有多头仓位
        elif self.pos > 0:
            if self.maTrend < 0 or self.rsiValue < 50:
                self.sell(bar.close-5, abs(self.pos))
            
        # 持有空头仓位
        elif self.pos < 0:
            if self.maTrend > 0 or self.rsiValue > 50:
                self.cover(bar.close+5, abs(self.pos))

        # 发出状态更新事件
        self.putEvent()        
    
    #----------------------------------------------------------------------
    def on15MinBar(self, bar):
        """15分钟K线推送"""
        self.am15.updateBar(bar)
        
        if not self.am15.inited:
            return
        
        # 计算均线并判断趋势
        self.fastMa = self.am15.sma(self.fastWindow)
        self.slowMa = self.am15.sma(self.slowWindow)
        
        if self.fastMa > self.slowMa:
            self.maTrend = 1
        else:
            self.maTrend = -1

    #----------------------------------------------------------------------
    def onOrder(self, order):
        """收到委托变化推送(必须由用户继承实现)"""
        pass

    #----------------------------------------------------------------------
    def onTrade(self, trade):
        # 发出状态更新事件
        self.putEvent()

    #----------------------------------------------------------------------
    def onStopOrder(self, so):
        """停止单推送"""
        pass