易盛极星期货量化教学

68 篇文章 14 订阅
5 篇文章 9 订阅
该博客介绍了使用Python的vnpy以外的期货交易软件,实现基于MA均线交叉的套利合约策略。策略中,当快线穿越慢线时,进行多空开仓,同时考虑了安全性和订单处理,包括开仓、平仓、撤单的逻辑判断,并进行了历史回测和实时下单的操作。
摘要由CSDN通过智能技术生成

我目前量化实盘做期货交易用的是这个软件。主要就是因为它可以做套利合约,还有就是国企的外包,安全(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 = 0
    SKDFLG = 0
    BPKDFLG = 0
    SPKDFLG = 0
    BRP = 0
    SRP = 0
    global BKID
    global SKID
    global BPID
    global SPID
    global BKFLG
    global SKFLG
    global BPFLG
    global SPFLG
    global BKDEL
    global SKDEL
    global BPDEL
    global SPDEL
    global BKM
    global SKM
    global BPM
    global SPM
    global BKP
    global SKP
    global BPP
    global 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 = 1
    if 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 #买平标志归0
    if BKFLG == 1:
        if A_OrderStatus(BKID) == Enum_Filled():
            LogInfo("BPK信号:买开委托成交!")
            if BKDEL > 0: #如果是SPK信号撤单
                SPKDFLG = 1 #开启卖平开处理
            BKFLG = 0 #买开标志归0
            BKDEL = 0 #买开撤单标志归0
        elif A_OrderStatus(BKID) == Enum_Canceled():
            LogInfo("SPK信号:买开委托已撤!")
            SPKDFLG = 1 #开启卖平开处理
            BKFLG = 0 #买开标志归0
            BKDEL = 0 #买开撤单标志归0
        elif 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 #卖平标志归0
    if SKFLG == 1:
        if A_OrderStatus(SKID) == Enum_Filled():
            LogInfo("SPK信号:卖开委托成交!")
            if SKDEL > 0: #如果是BPK信号撤单
                BPKDFLG = 1 #开启买平开处理
            SKFLG = 0 #卖开标志归0
            SKDEL = 0 #卖开撤单标志归0
        elif A_OrderStatus(SKID) == Enum_Canceled():
            LogInfo("BPK信号:卖开委托已撤!")
            BPKDFLG = 1 #开启买平开处理
            SKFLG = 0 #卖开标志归0
            SKDEL = 0 #卖开撤单标志归0
        elif 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 #已发出卖开委托

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神出鬼没,指的就是我!

必须花钱,数据超好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值