图表上有信号,但获取到的成交价为什么是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?怎么改才能获取到当时的成交价

图表模式下使用Buy下单时图表上的信号与绑定账号下单不符,且出现成交价=0的情况
图表上有信号,但是策略交易上没有信号
A_BuyAvgPriceO无法获取到数据,得到的是0
k线上有发单信号,但策略单元种没有
A_BuyPosition取到的实盘账号明明有多仓,但显示为0
图表没有信号,但实盘却发单了
图表有信号但实盘不报单
为什么有持仓但MarketPosition却为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线上是没有信号的