def test06(self):
        '''测试ExpectedIndex数学期望方差指标'''
        futurecommodity.setDataDirAfterVerified()
        theKLineList = futurecommodity.getContractKLineList("AP1901", True)

        futurelogger.log(theKLineList)
        fiMacd = futureindex.ExpectedIndex(26)
        futurelogger.log(fiMacd.cal(theKLineList))
    def test05(self):
        '''测试macd指标'''
        futurecommodity.setDataDirAfterVerified()
        theKLineList = futurecommodity.getContractKLineList("AP1901", True)

        futurelogger.log(theKLineList)
        fiMacd = futureindex.MacdIndex(12, 26, 9)
        futurelogger.log(fiMacd.cal(theKLineList))
    def testName(self):
        theKLineList = futurecommodity.getContractKLineList("AP1901")

        #scs = futurestrategy.SimpleChannelCloseStrategy(20)
        mcs = futurestrategy.MaChannelStrategy(3, 18)
        signalList = mcs.signal(theKLineList)
        combineList = futureindex.combineIndexLists(
            [theKLineList.getTimeList(), signalList])
        futurelogger.log(combineList)
    def test04(self):
        '''测试rsi指标'''
        futurecommodity.setDataDirAfterVerified()
        theKLineList = futurecommodity.getContractKLineList("AP1901", True)

        futurelogger.log(theKLineList)
        fiRsi6 = futureindex.RsiIndex(6)
        futurelogger.log(fiRsi6.cal(theKLineList))
        fiRsi12 = futureindex.RsiIndex(3)
        futurelogger.log(fiRsi12.cal(theKLineList))
        fiRsi24 = futureindex.RsiIndex(24)
        futurelogger.log(fiRsi24.cal(theKLineList))
 def test03(self):
     kList = futurecommodity.getContractKLineList("AP1901")
     theDate01 = datetime.datetime.strptime('2018-09-16', "%Y-%m-%d")
     theDate02 = datetime.datetime.strptime('2018-09-21', "%Y-%m-%d")
     sub01 = kList.getSubscript(theDate01)
     sub02 = kList.getSubscript(theDate02)
     if sub01 is None:
         print("sub01 is None")
     else:
         print("sub01 time:" + kList.getKLine(sub01).timeString())
     if sub02 is None:
         print("sub02 is None")
     else:
         print("sub02 time:" + kList.getKLine(sub02).timeString())
Ejemplo n.º 6
0
 def trade(self):
     '''根据指定的时间、品种、交易策略,返回生成的交易记录字典'''
     transactionDict = {}
     for theCommodityCode in self.__commodityCodeList:
         theTransList = []
         dateList = futuretools.getDaysList(self.beginDate, self.endDate)
         contractName = futurecommodity.getMainContractName(
             theCommodityCode, dateList[0])
         if contractName is None:
             #如果在dateList[0]时没有一个主力合约,那么就要往后找到一个有主力合约的日子
             for theDate in dateList:
                 contractName = futurecommodity.getMainContractName(
                     theCommodityCode, theDate)
                 if contractName is not None:
                     break
             if contractName is None:
                 transactionDict[theCommodityCode] = []
                 continue
             dateList = futuretools.getDaysList(theDate, self.endDate)
                 
         theKLineList = futurecommodity.getContractKLineList(contractName)
         self.__strategy.prepareIndexList(theKLineList)
         transaction = None
         for theDate in dateList:
             if (transaction is None) and (contractName != futurecommodity.
                             getMainContractName(theCommodityCode, theDate)):
                 #如果主力合约换掉了,那么要重新刷新信号量
                 contractNameNext = futurecommodity.getMainContractName(
                     theCommodityCode, theDate)
                 if contractNameNext is None:
                     continue
                 contractName = contractNameNext
                 theKLineList = futurecommodity.getContractKLineList(contractName)
                 self.__strategy.prepareIndexList(theKLineList)
                 
             sub = theKLineList.getSubscript(theDate)
             if sub is None:
                 continue
             else:
                 lastSub = sub
             
             isHaveToCloseTrans = self.__isHaveToCloseTrans(theDate, contractName,
                 theKLineList.getKLine(sub).close(), transaction)
             if (transaction is not None) and (isHaveToCloseTrans[0]):
                 #如果因交易设置原因必须平仓则平仓
                 if self.__isAbleToTrade(False, transaction.getDirection(), theKLineList, sub):
                     transaction.close(theDate, theKLineList.getKLine(sub).close(),
                                       isHaveToCloseTrans[1])
                     theTransList.append(transaction)
                     transaction = None
             
             if (contractName != futurecommodity.getMainContractName(
                 theCommodityCode, theDate)) and (transaction is None):
                 #如果主力合约换掉了,那么要重新刷新信号量
                 contractName = futurecommodity.getMainContractName(
                     theCommodityCode, theDate)
                 theKLineList = futurecommodity.getContractKLineList(contractName)
                 self.__strategy.prepareIndexList(theKLineList)
                 sub = theKLineList.getSubscript(theDate)
                 if sub is None:
                     continue
                 else:
                     lastSub = sub
             
             if transaction is None:
                 #如果当前没有仓位
                 if self.__isContractNearExpire(contractName, theDate)[0]:
                     continue
                 tradeSignal = self.__strategy.signal(theKLineList, sub, transaction)
                 if tradeSignal.isLong() or tradeSignal.isShort():
                     if self.__isAbleToTrade(True, tradeSignal.getOpenDirection(), theKLineList, sub):
                         transaction = Transaction(contractName, theDate, 
                                 theKLineList.getKLine(sub).close(), tradeSignal)
             elif transaction.isLong():
                 #如果当前是多头
                 tradeSignal = self.__strategy.signal(theKLineList, sub, transaction)
                 if tradeSignal.isShort():
                     if self.__isAbleToTrade(False, DIRECTION_LONG, theKLineList, sub):
                         transaction.close(theDate, theKLineList.getKLine(sub).close(),
                                     "空头信号,平多仓")
                         theTransList.append(transaction)
                         if self.__isContractNearExpire(contractName, theDate
                                                     )[0] is False:
                             transaction = Transaction(contractName, theDate, 
                                     theKLineList.getKLine(sub).close(), tradeSignal)
                 elif tradeSignal.isPingduo():
                     if self.__isAbleToTrade(False, DIRECTION_LONG, theKLineList, sub):
                         transaction.close(theDate, theKLineList.getKLine(sub).close(),
                                     "平多信号,平多仓")
                         theTransList.append(transaction)
                         transaction = None
             else:
                 #如果当前是空头
                 tradeSignal = self.__strategy.signal(theKLineList, sub, transaction)
                 if tradeSignal.isLong():
                     if self.__isAbleToTrade(False, DIRECTION_SHORT, theKLineList, sub):
                         transaction.close(theDate, theKLineList.getKLine(sub).close(),
                                     "多头信号,平空仓")
                         theTransList.append(transaction)
                         if self.__isContractNearExpire(contractName, theDate
                                                     )[0] is False:
                             transaction = Transaction(contractName, theDate, 
                                     theKLineList.getKLine(sub).close(), tradeSignal)
                 elif tradeSignal.isPingkong():
                     if self.__isAbleToTrade(False, DIRECTION_SHORT, theKLineList, sub):
                         transaction.close(theDate, theKLineList.getKLine(sub).close(),
                                     "平空信号,平空仓")
                         theTransList.append(transaction)
                         transaction = None
         
         if transaction is not None:
             transaction.close(theKLineList.getKLine(
                 lastSub).time(), theKLineList.getKLine(
                 lastSub).close(),"已到交易时段的最后一天,平仓了结")
             theTransList.append(transaction)
         transactionDict[theCommodityCode] = theTransList
     return transactionDict