跨期布林线对冲

Author: yuzy, Date: 2022-11-17 11:35:32
Tags:


'''backtest
start: 2022-01-01 09:00:00
end: 2022-11-17 15:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''

#商品期货跨品种套利研究策略
p = ext.NewPositionManager()
def onTick():
    infoA = exchange.SetContractType(symbolA)
    recordsA = exchange.GetRecords()
    
    infoB = exchange.SetContractType(symbolB)
    recordsB = exchange.GetRecords()
    
    if not recordsA or not recordsB:
        return
    pos = exchange.GetPosition()
    if pos is None:  #如果获取持仓结果为空,就返回继续下一轮循环。
        return
    #接着使用商品期货交易类库的函数按照持仓多空头进行分类
    LPsymbolA = p.GetPosition(symbolA,PD_LONG)
    SPsymbolA = p.GetPosition(symbolA,PD_SHORT)
    LPsymbolB = p.GetPosition(symbolB,PD_LONG)
    SPsymbolB = p.GetPosition(symbolB,PD_SHORT)
    
    # 计算差价K线
        #判断如果两个合约的倒数第一根K线的时间不一致,就返回
        #主要是为了确保后边用于计算两个合约价差准确,两者K线数据的时间必须要同步。
    if recordsA[-1]["Time"] != recordsB[-1]["Time"]: 
        return 
        ##因为两个合约的挂牌时间不一致,所以获取的K线数量会不一致,获取两者最小的长度
    minL = min(len(recordsA), len(recordsB))
    rA = recordsA.copy() #复制合约A的K线数据列表
    rB = recordsB.copy()

    rA.reverse() #对列表的元素进行反向排序,表示越是最新K线越靠前。
    rB.reverse()
 
    arrDiff = []  #定义价差空数组
    for i in range(minL):#通过遍历,计算两者每根K线的收盘价差,并且在arrDiff列表末尾添加新的对象
        arrDiff.append(rB[i]["Close"] - rA[i]["Close"])
    arrDiff.reverse() #arrDiff列表反向排序
    if len(arrDiff) < N:
        return 

        # 计算布林指标
    boll = TA.BOLL(arrDiff, N, P)
    #调用画线类库的画BOLL指标线函数,画布林线指标图。(标签、数据、时间)
    ext.PlotLine("上轨", boll[0][-2], recordsA[-2]["Time"])
    ext.PlotLine("中轨", boll[1][-2], recordsA[-2]["Time"])
    ext.PlotLine("下轨", boll[2][-2], recordsA[-2]["Time"])
    ext.PlotLine("收盘价差价", arrDiff[-2], recordsA[-2]["Time"])
    #在状态栏显示当前实时的上中下轨数据,以及当前收盘价数据
    LogStatus(_D(), "上轨:", boll[0][-1], "\n", "中轨:", boll[1][-1], "\n", "下轨:", boll[2][-1], "\n", "当前收盘差价:", arrDiff[-1])
    if not LPsymbolA and not SPsymbolA and not LPsymbolB and not SPsymbolB:#首先无持仓情况下
        if arrDiff[-1] > boll[0][-1]: #如果当前收盘价价差触及上轨,A买入开多,B卖出开空
            Log("开仓 A买B卖", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"], "#FF0000")
            p.OpenLong(symbolA,1)
            p.OpenShort(symbolB,1)
            ext.PlotFlag(recordsA[-1]["Time"], "A买B卖", "正")   #同时在boll指标图表画标记
        elif arrDiff[-1] < boll[2][-1]:  #如果当前收盘价触及下轨,A卖出开空,B买入开多
            Log("开仓 A卖B买", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"], "#FF0000")
            p.OpenShort(symbolA,1)
            p.OpenLong(symbolB,1)
            ext.PlotFlag(recordsA[-1]["Time"], "A卖B买", "反")
    #当持有A多头,B空头,且当前收盘价价差触及中轨,则A卖出平多,B买入平空
    elif LPsymbolA and SPsymbolB and not SPsymbolA and not LPsymbolB and arrDiff[-1] < boll[1][-1]:
        Log("平仓 A卖B买", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"], "#FF0000")
        p.Cover(symbolA)
        p.Cover(symbolB)
        ext.PlotFlag(recordsA[-1]["Time"], "A卖B买", "正平")
    #当持有A空头,B多头,且当前收盘价价差触及中轨,则A买入平空,B卖出平多
    elif SPsymbolA and LPsymbolB and not LPsymbolA and not SPsymbolB and arrDiff[-1] > boll[1][-1]:
        Log("平仓 A买B卖", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"], "#FF0000")
        p.Cover(symbolA)
        p.Cover(symbolB)
        ext.PlotFlag(recordsA[-1]["Time"], "A买B卖", "反平")
def main():
    while True:
        if exchange.IO("status"):
            onTick()
        else:
            LogStatus(_D(),"未连接")
        Sleep(500)

更多内容