我目前量化实盘做期货交易用的是这个软件。主要就是因为它可以做套利合约,还有就是国企的外包,安全(vnpy的狗咬狗害怕)。
策略模板:
设置全局参数变量:
#导入包
import talib
#选择合约代码
code1 = ''
#设置可调参数
g_params['FastLength'] = 5
g_params['SlowLength'] = 20#开仓标志
BKFLG = 0
SKFLG = 0
#平仓标志
BPFLG = 0
SPFLG = 0
#开仓委托
BKID = 0
SKID = 0
#平仓委托
BPID = 0
SPID = 0
#开仓撤单标志
BKDEL = 0
SKDEL = 0
#平仓撤单标志
BPDEL = 0
SPDEL = 0
#平仓委托手数
BKM = 0
SKM = 0
#平仓撤单标志
BPM = 0
SPM = 0
#开仓委托价格
BKP = 0
SKP = 0
#平仓委托价格
BPP = 0
SPP = 0
设置initialize,确定回测范围,下单方法:
def initialize(context): SetBarInterval(code1, 'M', 1, 500)SetTriggerType(5)SetOrderWay(2)SetActual()
设置交易函数
def handle_data(context):
#设置运行常量BKDFLG = 0SKDFLG = 0BPKDFLG = 0SPKDFLG = 0BRP = 0SRP = 0global BKIDglobal SKIDglobal BPIDglobal SPIDglobal BKFLGglobal SKFLGglobal BPFLGglobal SPFLGglobal BKDELglobal SKDELglobal BPDELglobal SPDELglobal BKMglobal SKMglobal BPMglobal SPMglobal BKPglobal SKPglobal BPPglobal SPP#确定数据长度足够if CurrentBar() < g_params['SlowLength']:return#计算所有的技术指标 AvgValue1 = talib.MA(Close(), g_params['FastLength']) #快线周期均值AvgValue2 = talib.MA(Close(), g_params['SlowLength']) #慢线周期均值PlotNumeric("ma1", AvgValue1[-1], 0xFF0000)PlotNumeric("ma2", AvgValue2[-1], 0x00aa00)# 执行下单操作,确定用[-2],是前一天的数据。[-1]是当天,用到了未来函数if MarketPosition() <= 0 and AvgValue1[-2] > AvgValue2[-2]:BPKDFLG = 1if MarketPosition() >= 0 and AvgValue1[-2] < AvgValue2[-2]:SPKDFLG = 1
历史回测检测
#//------------------------历史发单------------------------// if context.strategyStatus() != 'C':if BPKDFLG:#多头建仓Buy(1, Close()[-1])elif SPKDFLG:#空头建仓SellShort(1, Close()[-1])return
实时下单:
#//------------------------实时处理------------------------//if ExchangeStatus(ExchangeName()) != '3':return#//------------------------变量赋值------------------------//N = 2 #下单手数BIDP = 0 if Q_BidPrice() is None else Q_BidPrice() #买一价ASKP = 0 if Q_AskPrice() is None else Q_AskPrice() #卖一价RLP = Q_UpperLimit() #涨停价FLP = Q_LowLimit() #跌停价BRP = A_BuyPositionCanCover() #多头可用持仓SRP = A_SellPositionCanCover() #空头可用持仓if ExchangeName() == 'SHFE': #如果是上期所合约SH = Enum_ExitToday() #平仓参数else: #如果非上期所合约SH = Enum_Exit() #平仓参数#//------------------------成交判断------------------------//if BPFLG == 1:if A_OrderStatus(BPID) == Enum_Filled():LogInfo("BPK信号:买平委托成交!")BKDFLG = 1 #开启买开处理BPFLG = 0 #买平标志归0if BKFLG == 1:if A_OrderStatus(BKID) == Enum_Filled():LogInfo("BPK信号:买开委托成交!")if BKDEL > 0: #如果是SPK信号撤单SPKDFLG = 1 #开启卖平开处理BKFLG = 0 #买开标志归0BKDEL = 0 #买开撤单标志归0elif A_OrderStatus(BKID) == Enum_Canceled():LogInfo("SPK信号:买开委托已撤!")SPKDFLG = 1 #开启卖平开处理BKFLG = 0 #买开标志归0BKDEL = 0 #买开撤单标志归0elif A_OrderStatus(BKID) == Enum_Suspended() or A_OrderStatus(BKID) == Enum_FillPart():if BKDEL == 2: #如果是SPK信号撤单LogInfo("SPK信号:买开委托撤单!")A_DeleteOrder(BKID) #撤掉买开委托挂单BKDEL = 3 #SPK信号撤掉买开委托挂单if SPFLG == 1:if A_OrderStatus(SPID) == Enum_Filled():LogInfo("SPK信号:卖平委托成交!")SKDFLG = 1 #开启卖开处理SPFLG = 0 #卖平标志归0if SKFLG == 1:if A_OrderStatus(SKID) == Enum_Filled():LogInfo("SPK信号:卖开委托成交!")if SKDEL > 0: #如果是BPK信号撤单BPKDFLG = 1 #开启买平开处理SKFLG = 0 #卖开标志归0SKDEL = 0 #卖开撤单标志归0elif A_OrderStatus(SKID) == Enum_Canceled():LogInfo("BPK信号:卖开委托已撤!")BPKDFLG = 1 #开启买平开处理SKFLG = 0 #卖开标志归0SKDEL = 0 #卖开撤单标志归0elif A_OrderStatus(SKID) == Enum_Suspended() or A_OrderStatus(SKID) == Enum_FillPart():if SKDEL == 2: #如果是BPK信号撤单LogInfo("BPK信号:卖开委托撤单!")A_DeleteOrder(SKID) #撤掉卖开委托挂单SKDEL = 3 #BPK信号撤掉卖开委托挂单#//------------------------委托处理------------------------//if BPKDFLG == 1:if SKFLG == 1:if SKDEL == 0:if A_OrderStatus(SKID) == Enum_Suspended() or A_OrderStatus(SKID) == Enum_FillPart():LogInfo("BPK信号:卖开委托撤单!")A_DeleteOrder(SKID) #撤掉卖开委托挂单SKDEL = 1 #BPK信号撤掉卖开委托挂单else:SKDEL = 2 #BPK信号撤掉卖开委托挂单elif SKFLG == 0:if BPFLG == 0:if SRP > 0:BPM = SRP #买平委托手数BPP = RLP #买平委托价格LogInfo("BPK信号:买平委托发出!")retCode, BPID = A_SendOrder(Enum_Buy(), SH, BPM, BPP) #发出买平委托BPFLG = 1 #已发出买平委托elif SRP == 0:BKDFLG = 1 #开启买开处理if BKDFLG == 1:if BKFLG == 0:BKM = N #买开委托手数BKP = ASKP #买开委托价格LogInfo("BPK信号:买开委托发出!")retCode, BKID = A_SendOrder(Enum_Buy(), Enum_Entry(), BKM, BKP) #发出买开委托BKFLG = 1 #已发出买开委托if SPKDFLG == 1:if BKFLG == 1:if BKDEL == 0:if A_OrderStatus(BKID) == Enum_Suspended() or A_OrderStatus(BKID) == Enum_FillPart():LogInfo("SPK信号:买开委托撤单!")A_DeleteOrder(BKID) #撤掉买开委托挂单BKDEL = 1 #SPK信号撤掉买开委托挂单else:BKDEL = 2#SPK信号撤掉买开委托挂单elif BKFLG == 0:if SPFLG == 0:if BRP > 0:SPM = BRP #卖平委托手数SPP = FLP #卖平委托价格LogInfo("SPK信号:卖平委托发出!")retCode, SPID = A_SendOrder(Enum_Sell(), SH, SPM, SPP) #发出卖平委托SPFLG = 1 #已发出卖平委托elif BRP == 0:SKDFLG = 1 #开启卖开处理if SKDFLG == 1:if SKFLG == 0:SKM = N #卖开委托手数SKP = BIDP #卖开委托价格LogInfo("SPK信号:卖开委托发出!");retCode, SKID = A_SendOrder(Enum_Sell(), Enum_Entry(),SKM,SKP) #发出卖开委托SKFLG = 1 #已发出卖开委托