老师可以帮忙看一下吗,我仿照demo的非独立自定义合约代码想要生成一个自定义套利合约,出现了Bar错位的问题

就是我仿照非独立自定义合约的代码写的,有一点不同是我是先在工作区的策略单元加载了两个合约,然后想输出一个新的独立合约

出现的问题就是在第一次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()));

}

}

}

}

如何通过代码添加自定义合约
求教老师,自定义合约
套利合约代码不存在,普通合约可以下单,是通道问题吗?
如何建立自定义套利合约,或者TB如何进行套利交易
如何构建自定义的套利组合
自定义合约还能导入数据用吗?
自定义合约功能的妙用
自定义合约
自定义合约设置
自定义指数的发单问题