图表上有信号,但获取到的成交价为什么是0?

OnBar(ArrayRef<Integer> indexs) { If(MarketPosition==1 And BarsSinceEntry>=0) { ruanzhisun_duo=Max(ruanzhisun_duo,ruanzhisun_duo[1]); yingzhisun_duo=Max(yingzhisun_duo,yingzhisun_duo[1]);//止损只能上移 plt_duo.line("软止损-多",ruanzhisun_duo); plt_duo.line("硬止损-多",yingzhisun_duo); Commentary("成本价"+Text(chengbenjia)); If(ruanzhisun_duo>=chengbenjia)//软止损上移到成本价以上 { zhisunval=ruanzhisun_duo;//止损价=软止损 plt_duo.line("止损线",zhisunval);//画最终止损线 If(MarketPosition==0); //触发止盈,退出循环 Else If(L<=zhisunval) //触发软止损,平仓退出 { Sell(0, 0); } //没有止损也没有止盈,继续循环 } OnFill(FillRef ordFill)//记录开仓状态,只有开仓才记录止损位置,平仓不记录 { If(MarketPosition==1)//多头持仓下,记录多头止损价 { zhisunval=yingzhisun_duo; chengbenjia=ordFill.fillPrice;//获取成本价 } Else If(MarketPosition==-1) { zhisunval=yingzhisun_kong; chengbenjia=ordFill.fillPrice;//获取成本价 } } 为什么图表上有信号,但ordFill.fillPrice=0?怎么改才能获取到当时的成交价

感谢各位的回复,这会有个疑问,onfill域能不能在历史K线中驱动?如果不能的话,这样写自然无法获取成交价,我的目的是用来回测,只需要把成本价设置成开仓价就行

回复:我记得王老师说过Onbar是图表交易的领域其他的事件域都是A函数的领域如果是A函数 就没法用在历史k线上(但是王老师也说 不是所有的a函数都没法在历史k线上取到值 所以 我也不能确定)

跨公式开仓的公式指定源止损的公式订阅事件才能在止损的公式得到成交事件记录开仓价

回复:SubscribeEvent订阅开仓公式发布一个事件

你这个跨域的赋值都不能确定是否正确,显然你输出的这个变量是0可能性很多:比如你定义的不是全局变量比如你赋值压根时机不对,你怎么保证是赋值后再输出的?

回复:Params //此处添加参数 Numeric ATRLength(14); //ATR周期 Vars //此处添加变量 Numeric ATR;//ATR值 //止损相关参数 Series<Numeric> ruanzhisun_duo;//做多软止损 Series<Numeric> yingzhisun_duo;//做多硬止损 Series<Numeric> ruanzhisun_kong;//做空软止损 Series<Numeric> yingzhisun_kong;//做空硬止损 Numeric zhisunval;//最终止损价格 Global Numeric chengbenjia;//成本价 //画图相关 Plot plt_duo;//做多止损 Plot plt_kong;//做空止损 Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次 OnInit() { AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 plt_duo.setOption("软止损-多","color",Yellow); plt_duo.setOption("硬止损-多","color",Yellow); } OnReady() { setPlotOption("ATR", "begin-bar", ATRLength); } //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { //计算ATR上轨,作为止盈用 ATR=AvgTrueRange(ATRLength); //计算ATR及止损上轨和下轨位置,只在操作周期的图层用 ruanzhisun_duo=H-2*ATR; yingzhisun_duo=L-2*ATR; ruanzhisun_kong=L+2*ATR; yingzhisun_kong=H+2*ATR; Commentary("成本价"+Text(chengbenjia)); //开多单情况下,止损只能上移 If(MarketPosition==1 And BarsSinceEntry>0)//忽略开仓Bar { ruanzhisun_duo=Max(ruanzhisun_duo,ruanzhisun_duo[1]); yingzhisun_duo=Max(yingzhisun_duo,yingzhisun_duo[1]);//止损只能上移 plt_duo.line("软止损-多",ruanzhisun_duo); plt_duo.line("硬止损-多",yingzhisun_duo); Commentary("成本价"+Text(chengbenjia)); If(ruanzhisun_duo>=chengbenjia)//软止损上移到成本价以上 { zhisunval=ruanzhisun_duo;//止损价=软止损 plt_duo.line("止损线",zhisunval);//画最终止损线 If(MarketPosition==0); //触发止盈,退出循环 Else If(L<=zhisunval) //触发软止损,平仓退出 { Sell(0, 0); } //没有止损也没有止盈,继续循环 }Else//止损一直在成本价以下 { If(L <= zhisunval) //触发硬止损,平仓退出 { Sell(0, 0); } } } //开空单情况下,止损只能下移 Else If(MarketPosition==-1 And BarsSinceEntry>0)//忽略开仓Bar { ruanzhisun_kong=Min(ruanzhisun_kong,ruanzhisun_kong[1]); yingzhisun_kong=Min(yingzhisun_kong,yingzhisun_kong[1]);//止损只能下移 //PlotAuto("软止损—空",ruanzhisun_kong,0,RGB(0, 255, 255),-1,-1,Enum_1Pix); //PlotAuto("硬止损—空",yingzhisun_kong,0,RGB(0, 255, 255),-1,-1,Enum_2Pix); Commentary("这里画空单止损线"); If(ruanzhisun_kong<=chengbenjia)//软止损下移到成本价以下 { zhisunval=ruanzhisun_kong;//止损价=软止损 If(MarketPosition==0); //触发止盈,退出循环 Else If(H>=zhisunval) //触发软止损,平仓退出 { BuyToCover(0, 0); } }Else//止损一直在成本价以下 { If(H >= zhisunval) //触发硬止损,平仓退出 { BuyToCover(0, 0); } } } Else { Commentary("这里不画止损线"); plt_duo.setOption("软止损-多","line-break",true); plt_duo.setOption("硬止损-多","line-break",true); plt_duo.setOption("止损线","line-break",true); } } OnFill(FillRef ordFill)//记录开仓状态,只有开仓才记录止损位置,平仓不记录 { If(MarketPosition==1)//多头持仓下,记录多头止损价 { zhisunval=yingzhisun_duo; chengbenjia=ordFill.fillPrice;//获取成本价 } Else If(MarketPosition==-1) { zhisunval=yingzhisun_kong; chengbenjia=ordFill.fillPrice;//获取成本价 } Else { chengbenjia=1;//重置成本价 } } 本来设置的就是全局变量,OnBar里我又设置了BarsSinceEntry>0,确保输出是在赋值之后,还设置了空仓重置chengbenjia=1,但我发现持仓空仓状态下,chengbenjia显示都是0,这是完整代码,可以复制下试试

回复:我的策略是一个公式开仓和止盈,一个公式止损,这种是不得用跨公式的全局变量,只用Global不管用。

回复:错误:setPlotOption没有被声明

你chengbenjia 是什么类型的变量?有些变量的作用范围有限

回复:我的策略是一个公式开仓和止盈,一个公式止损,这种是不得用跨公式的全局变量,只用Global不管用。

回复:我对a函数不熟,所以不能定位你的问题,只能猜一下:既然都用到了Onfill ,那么对于Onfill域的多空的判断可以把marketposition换成 ordFill.side==Enum_Buy 或是Enum_Sell

回复:测试了一下 mk跨域是没问题的测试的时候有个想法你是不是没有添加头寸启动交易?非交易时间只能测试到onorder域 ord.price 这种函数 在历史K线上是没有信号的