老师可以帮忙看一下吗,我仿照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())); } } } }