- 策略广场
- 多品种跨期布林对冲策略
多品种跨期布林对冲策略
Author:
yuzy, Date: 2022-11-27 14:50:42
Tags:
'''backtest
start: 2022-11-01 00:00:00
end: 2022-11-30 23:59:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''
import json
class Trader:
def __init__(self,q,e,symbolA,symbolB,N,P,OpAmount):
self.q = q
self.e = e
self.symbolA = symbolA
self.symbolB = symbolB
self.N = N
self.P = P
self.OpAmount = OpAmount
self.status = 0
self.isBusy = False
def onTick(self):
if (self.isBusy or not exchange.IO("status")) or not ext.IsTrading(self.symbolA) or not ext.IsTrading(self.symbolB):
Sleep(1000)
return
_C(exchange.SetContractType,self.symbolA)
recordsA = _C(exchange.GetRecords)
_C(exchange.SetContractType,self.symbolB)
recordsB = _C(exchange.GetRecords)
if recordsA[-1]["Time"] != recordsB[-1]["Time"]:
return
minL = min(len(recordsA),len(recordsB))
rA = recordsA.copy()
rA.reverse()
rB = recordsB.copy()
rB.reverse()
arrDiff = []
for i in range(minL):
arrDiff.append(rB[i]["Close"] - rA[i]["Close"])
arrDiff.reverse()
if len(arrDiff) < self.N:
return
boll = TA.BOLL(arrDiff, self.N, self.P)
p = 0
if self.status == 0 :
if arrDiff[-1] > boll[0][-1]:
Log("开仓 A买B卖", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"])
p = 2
elif arrDiff[-1] < boll[2][-1] :
Log("开仓 A卖B买", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"])
p = 1
elif self.status == 1 and arrDiff[-1] > boll[1][-1] :
Log("平仓 A买B卖", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"])
p = 2
elif self.status == 2 and arrDiff[-1] < boll[1][-1] :
Log("平仓 A卖B买", ",A最新价格:", recordsA[-1]["Close"], ",B最新价格:", recordsB[-1]["Close"])
p = 1
if p == 0 :
return
self.isBusy = True
tasks = []
if p == 1:
tasks.append([self.symbolA,"sell" if self.status == 0 else "closebuy"])
tasks.append([self.symbolB,"buy" if self.status == 0 else "closesell"])
elif p == 2:
tasks.append([self.symbolA,"buy" if self.status == 0 else "closesell"])
tasks.append([self.symbolB,"sell" if self.status == 0 else "closebuy"])
def callBack(task,ret):
def callBack(task,ret):
self.isBusy = False
if task["action"] == "sell":
self.status = 2
elif task["action"] == "buy":
self.status = 1
else :
self.status = 0
self.q.pushTask(self.e,tasks[1][0],tasks[1][1],self.OpAmount,callBack)
self.q.pushTask(self.e,tasks[0][0],tasks[0][1],self.OpAmount,callBack)
def main():
SetErrorFilter("ready|login|timeout")
Log("正在与交易服务器连接...")
while not exchange.IO("status"):
Sleep(1000)
Log("与交易服务器连接成功")
iniAccount = _C(exchange.GetAccount)
Log(iniAccount)
def callBack(task,ret):
Log(task["desc"], "成功" if ret else "失败")
q = ext.NewTaskQueue(callBack)
t_arr = []
list_1 = Instruments.split("|")
for i in range(len(list_1)):
symbols = list_1[i].split("&")
symbolA = symbols[0]
symbolB = symbols[1]
t_arr.append(Trader(q,exchange,symbolA,symbolB,N,P,OpAmount))
while True:
q.poll()
for t in t_arr:
t.onTick()
tab = {
"type" : "table",
"title" : "持仓信息",
"cols" :["合约名称" , "持仓方向" , "持仓均价" , "持仓数量" , "持仓盈亏"],
"rows" :[]
}
a = _C(exchange.GetPosition)
for i in range(len(a)):
tab["rows"].append([a[i]["ContractType"], "多" if a[i]["Type"]%2 == 0 else "空", a[i]["Price"], a[i]["Amount"], a[i]["Profit"]])
LogStatus(_D(), "\n`" + json.dumps(tab) +"`")
更多内容