就是我仿照非独立自定义合约的代码写的,有一点不同是我是先在工作区的策略单元加载了两个合约,然后想输出一个新的独立合约
出现的问题就是在第一次data1出现没有数据的时候,自定义合约的Bar会复制上一根,而不是同样没有数据;之后data0和data1再一次有数据的第一根,自定义合约对应的时间反而不产生数据了
这是我的代码
Params
//此处添加参数
Numeric beginTime(20120101.000000); //订阅数据源开始时间
Vars
//新建合约变量
String data0freq; //数据源周期
Integer data0priceScale;
Integer data0minMove; //
Integer data0contractUnit; //
Integer data0bigPointValue; //
Integer data0marginRatio; //
Integer data0baseShares; //
Global Integer myCodeId;
CodeProperty myPty;
Global Integer cnt(10);
Bar barTmp1;
Bar barTmp2;
Tick tickTmp1;
Tick tickTmp2;
Numeric nowTime;
Integer i(0);
//////////////////////////
Defs
Integer CreateBar(BarRef lBar,BarRef rBar0, BarRef rBar1)
{
lBar.open = rBar0.open - rBar1.open;
lBar.close = rBar0.close - rBar1.close;
lBar.high = Max(Max(Max(rBar0.close - rBar1.close, Max(rBar0.High - rBar1.High, rBar0.Low - rBar1.Low)), rBar0.open - rBar1.open), rBar0.close - rBar1.close);
lBar.low = Min(Min(Min(rBar0.close - rBar1.close, Min(rBar0.High - rBar1.High, rBar0.Low - rBar1.Low)), rBar0.open - rBar1.open), rBar0.close - rBar1.close);
lBar.volume = Min(rBar0.volume, rBar1.volume);
lBar.openInt = Min(rBar0.openInt, rBar1.openInt);
lBar.lastDateTime = rBar0.lastDateTime;
Return 1;
}
Integer CreateTick(TickRef lTick,TickRef rTick0, TickRef rTick1)
{
lTick.open = rTick0.open - rTick1.open;
lTick.last = rTick0.last - rTick1.last;
lTick.high = Max(Max(rTick0.last - rTick1.last, Max(rTick0.High - rTick1.High, rTick0.Low - rTick1.Low)), rTick0.open - rTick1.open);
lTick.low = Min(Min(rTick0.last - rTick1.last, Min(rTick0.High - rTick1.High, rTick0.Low - rTick1.Low)), rTick0.open - rTick1.open);
lTick.volume = Min(rTick0.volume, rTick1.volume);
lTick.openInt = Min(rTick0.openInt, rTick1.openInt);
lTick.totalVolume = Min(rTick0.totalVolume, rTick1.totalVolume);
Return 1;
}
Integer DoPushBar(Integer layerId,Integer refLayerId0,Integer refLayerId1,Numeric datetime)
{
//抛bar数据
If(Data[layerId].Frequency==\"tick\")
{
Data[refLayerId0].GetTick(tickTmp1);
Data[myCodeId].tickTmp1=Data[myCodeId].tickTmp2;//清空
Data[refLayerId1].GetTick(tickTmp1);
Data[myCodeId].tickTmp1=Data[myCodeId].tickTmp2;//清空
CreateTick(Data[layerId].tickTmp1,Data[refLayerId0].tickTmp1,Data[refLayerId1].tickTmp1);
Data[layerId].tickTmp1.dateTime=datetime;
Data[layerId].PushBar(tickTmp1);
}
Else
{
Data[refLayerId0].GetBar(barTmp1);
Data[myCodeId].barTmp1=Data[myCodeId].barTmp2;//清空
Data[refLayerId1].GetBar(barTmp1);
Data[myCodeId].barTmp1=Data[myCodeId].barTmp2;//清空
CreateBar(Data[layerId].barTmp1,Data[refLayerId0].barTmp1,Data[refLayerId1].barTmp1);
Data[layerId].barTmp1.dateTime=datetime;
Data[layerId].barTmp1.lastDateTime=Data[refLayerId0].barTmp1.lastDateTime;
Data[layerId].PushBar(barTmp1);
}
Return 1;
}
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
//SubscribeBar(sym,freq,beginTime);
data0freq = Data0.Frequency();
data0priceScale = data0.priceScale();
data0minMove = data0.minMove();
data0contractUnit = data0.contractUnit();
data0bigPointValue = data0.bigPointValue();
data0marginRatio = data0.marginRatio();
data0baseShares = data0.baseShares();
// 自定义合约
myPty.symbol=\"Spread000.SHFE\"; //合约代码
myPty.symbolName=\"自定义价差\"; //商品名称
myPty.bigCategory=Enum_CategoryFutures(); //商品大类
myPty.dealTimes=\"21:00-02:30;09:00-10:15;10:30-11:30;13:30-15:00\"; // 交易时段,格式为: 21:00-23:30;09:00-10:15;10:30-11:30;13:30-15:00; 21:00-23:00;09:00-10:15;10:30-11:30;13:30-15:00
myPty.decDigits=5; // 小数点位数
myPty.priceScale=data0priceScale; // 最小变动加价
myPty.minMove=data0minMove; // 最小变动
myPty.contractUnit=data0contractUnit; // 合约单位 期货中1张合约包含N吨铜,小麦等
myPty.bigPointValue=data0bigPointValue;
//myPty.utcOffset=8; // 交易所世界标准时间偏移
myPty.marginRatio=data0marginRatio; // 保证金比率
myPty.marginMode=4; // 保证金类型
// 4 - Future
// 5 - Stock
myPty.baseShares=data0baseShares; //最小委托量
myPty.currencyID=Enum_CORMB(); //币种
CreateProperty(myPty); //创建合约
myCodeId=SubscribeBar(myPty.symbol,data0freq,beginTime,0,Enum_Data_StrategyQuote());
}
//在所有的数据源准备完成后调用,应用在数据源的设置等操作
OnReady()
{
//先抛有时间轴的空数据,用于数据驱动或与其他数据源对齐
DoPushBar(myCodeId,0,1,NextTradingDateTime(beginTime));
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
For i=0 To GetArraySize(indexs)-1
{
If(indexs[i]!=myCodeId)
{
If(Data[myCodeId].date()+Data[myCodeId].time()==Data[0].Date()+Data[0].time() and Data[myCodeId].date()+Data[myCodeId].time()==Data[1].Date()+Data[1].time())
{
//修改当前Bar数据,立即生效,即可可以访问
DoPushBar(myCodeId,0,1,Max(Data[0].Date()+Data[0].time,Data[1].Date()+Data[1].time));
}
if((Data[myCodeId].date()+Data[myCodeId].time()<=Data[0].Date()+Data[0].time() && Data[0].BarStatus() != 2) and (Data[myCodeId].date()+Data[myCodeId].time()<=Data[1].Date()+Data[1].time() && Data[1].BarStatus() != 2))
{
//抛有数据,用于数据驱动或与其他数据源对齐
DoPushBar(myCodeId,0,1,Max(Data[0].NextBarDateTime(),Data[1].NextBarDateTime()));
}
}
}
}