代码如下,

coding:utf-8

#!/usr/bin/env python

from PoboAPI import *
import datetime

#开始时间,用于初始化一些参数
def OnStart(context):
print ("system starting...")
#设定一个全局变量品种
g.code1 = "cu2007C39500.SHFE"
g.code2 = "cu2007C40000.SHFE"
#订阅实时数据,用于驱动OnQuote事件
SubscribeQuote([g.code1,g.code2])
#订阅K线数据,用于驱动OnBar事件
SubscribeBar(g.code1, BarType.Day)
SubscribeBar(g.code2, BarType.Day)
#登录交易账号
context.myacc = None
if context.accounts["回测期货"].Login() :
context.myacc = context.accounts["回测期货"]

def OnQuote(context, code) :
dyndata1 = GetQuote(g.code1)
dyndata2 = GetQuote(g.code2)
if dyndata1 and dyndata2 :
#.now指最新价
now1 = dyndata1.now
now2 = dyndata2.now
#打印最新价
log.info("cu2007-C-39500最新价1: " + str(dyndata1.now))
log.info("cu2007-C-40000最新价2: " + str(dyndata2.now))
#获取K线数据
klinedata1 = GetHisData(g.code1, BarType.Day)
klinedata2 = GetHisData(g.code2, BarType.Day)
#打印K线数据,如最新一根K线的收盘价
if len(klinedata1) > 0 and len(klinedata2) > 0 :
lastspread = klinedata1[-1].close - klinedata2[-1].close #期权价差
log.info("最新价差: " + str(lastspread))
bal = context.myacc.AccountBalance
posmargin=bal.FrozenMargin #持仓冻结保证金

pos = context.myacc.GetPositions()

poslength=len(pos)
print ("持仓合约数: "+str(poslength))
#如果配置好交易账号了,可以根据条件下单,需把下面中的证券测试账号换成您设置的账号名称
if len(klinedata1) > 1 and len(klinedata2) > 1 and lastspread<300 and context.myacc and posmargin<100000000 :
# 两个期权价差小于50就买入价差,开仓策略,open position
print ("buy open the spread ")+str(lastspread)
context.myacc.InsertOrder(g.code1, BSType.BuyOpen, dyndata1.now, 10)
context.myacc.InsertOrder(g.code2, BSType.SellOpen, dyndata2.now, 10)


if len(klinedata1) > 1 and len(klinedata2) > 1 and lastspread>400 and poslength>0 and context.myacc :
# 两个期权价差大于60就卖平价差,平仓,close positions
print ("sell close the spread,take profit ")+str(lastspread)
context.myacc.InsertOrder(g.code1, BSType.SellClose, dyndata1.now, 10)
context.myacc.InsertOrder(g.code2, BSType.BuyClose, dyndata2.now, 10)

if len(klinedata1) > 1 and len(klinedata2) > 1 and lastspread<250 and poslength>0 and context.myacc :
# 两个期权价差小于2就卖平价差,止损,cut loss
print ("sell close the spread,cut loss ")+str(lastspread)
context.myacc.InsertOrder(g.code1, BSType.SellClose, dyndata1.now, 10)
context.myacc.InsertOrder(g.code2, BSType.BuyClose, dyndata2.now, 10)

#委托回报事件,当有委托回报时调用
def OnOrderChange(context, AccountName, order) :
#打印委托信息,id是编号,volume是数量,详细见API文档
print ("委托编号: ") + order.id + (" 账号名称: ") + AccountName
print ("Vol: ") + str(order.volume) + (" Price: " )+ str(order.price)