求助|老师能帮我看一下我的代码问题吗

目前系统出现三个问题:

1.平仓单发单手数与持仓的手数不一致,导致可平仓位不足,不能正常平仓

2.实际委托价格与指令价格好像不一致,我的委托价格(多仓)指令是 前一根bar的最高价和开盘价比较,取最高值  +3跳,但实际发出来的价格很乱

3.止损单发不出来

Params

  Numeric ma1(5);

    Numeric ma2(15);

    Numeric ma3(30);

    Numeric  risk(0.05);

Vars

    

series<Numeric> JX1;

series<Numeric> JX2;

series<Numeric> dJX1;

series<Numeric> dJX2;

Numeric SS;

series<Numeric> zsx;

series<Numeric> YK;

series<Numeric> myEntryPrice;

series<Numeric> myExitPrice;

 

series<Numeric> ZHJE;//保证金外的账户权益

Numeric MinPoint; //最小变动

 

Defs

//此处添加公式函数

 

Events

//此处实现事件函数

 

//初始化事件函数,策略运行期间,首先运行且只有一次

OnInit()

{ma1>0&&ma2>0&&MA3>0;

 SetCommissionRate(BitOr(Enum_Rate_FreeOfExitToday,Enum_Rate_ByFillAmount),5);

 SetSlippage(Enum_Rate_PointPerHand,2);  

     AddDataFlag(Enum_Data_AutoSwapPosition());    //设置自动换仓

}

//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组

OnBar(ArrayRef<Integer> indexs)

{Range[0:DataSourceSize() - 1]

        MinPoint = MinMove*PriceScale*3;

            SS=(A_CurrentEquity()*risk)/(c[1]*MarginRatio()*ContractUnit());

            SS= IntPart(SS);

             YK=PositionProfit();

            ZHJE=A_CurrentEquity()-(A_CurrentEquity()*risk);//除保证金外的账户权益

            zsx=-(zhje*0.015);//  

             JX1=AverageFC(c[1],ma1);

             djx1=AverageFC(c[2],ma1);

             PlotNumeric("MA1",JX1);

             PlotNumeric("dMA1",dJX1);

             JX2=AverageFC(c[1],ma2);

             djx2=AverageFC(c[2],ma2);

             PlotNumeric("MA2",JX2);

             PlotNumeric("dMA2",dJX2);

             JX3=AverageFC(Close[1],ma3);

             PlotNumeric("MA3",JX3);

             myExitPrice = IIF(L[1] < Open, L[1],o-MinPoint);

             myEntryPrice = IIF(H[1] > Open, H[1],o+MinPoint);

    If(crossover(dJX1,dJX2))

   {

  

   buy(ss,myEntryPrice);

   PlotString("m1","开多",L);

     }

     

    if(CrossUnder(JX1,JX2)&&BarsSinceEntry >= 1)

    {

   Sell(longCurrentContracts(),myExitPrice);

   PlotString("m2","平多",L);

    }

    If(CrossUnder(dJX1,dJX2))

    Sellshort(ss,myExitPrice);

     PlotString("m2","开空",L);}

    If(Crossover(JX1,JX2) And BarsSinceEntry >= 1)

    BuyToCover(shortCurrentContracts(),myExitPrice);

    PlotString("m2","平空",L);}

//止损设置

  If(MarketPosition == 1 And BarsSinceEntry >= 2)

  {If(zsx>YK)

{

Sell(longCurrentContracts(),L-MinPoint);

    PlotString("zs1","多仓止损",L);

 

}

}

If(MarketPosition == -1 And BarsSinceEntry >= 2)

{

If(zsx>YK)

{

BuyToCover(shortCurrentContracts(),H+MinPoint);

         PlotString("zs2","空仓止损",L);

 

}

}}

求助老师写个公式
我想添加一个不同周期过滤功能,求助!
求助回测下单不按照代码下单
请老师赐教,写策略时,设置条件过多,回测数据变负,对其中的部分代码理解不深,求助,感恩感谢
新手程序问题求助
求助帮改个
信号闪烁求助
信号闪烁求助
求助gettbprofilestring报错
编程求助

2.3.问题都明白了。1.还是有问题

比如今天的单子,本来持仓有96手,平仓的时候,只平了95手。是什么问题呢?

你这个是一个很低级的错误

你用的a函数获取账户权益,然后用buy sell 命令 那肯定是会信号闪烁的。

比如,一根bar刚开盘,这个时候触发信号,这个时候权益100万,按30%开仓,市值30万对应手数。

开仓以后,这个权益就会根据持仓合约的市值波动,假如账户持仓涨了10%,那就是市值33万,账户权益就是103万,这个时候运行计算手数的代码,30%就是30.9万,也就是多了0.9万的手数。而一开始只开了30万,后来却变成了30.9万,这就造成前后信号对不上了。

之后再出现平仓的时候,手数肯定是按照价格涨了以后的30.9万计算,于是就会平30.9万市值的手数,可是账户里只有30万市值的手数,这就造成可平仓不足了。

如果你要用a函数,那么所有图表的数据都需要自己记录,否则就会造成这种问题。

建议再好好学习一下公式运行机制,思考一下模型到底在实盘中的运行轨迹是什么样子。

好的,谢谢老师,老师的例子讲得比较清晰,我明白了

1.平仓单发单手数与持仓的手数不一致,导致可平仓位不足,不能正常平仓

答:持仓手数是和开仓信号手数一致吗?启动交易以后有把当前持仓仓位进行同步吗?

2.实际委托价格与指令价格好像不一致,我的委托价格(多仓)指令是 前一根bar的最高价和开盘价比较,取最高值  +3跳,但实际发出来的价格很乱

如果开了委托偏移跳数,那就是按照映射目标的盘口价格加跳数报单,和信号价格无关了。

想用信号价格就关掉委托偏移

3.止损单发不出来

止损单发不出来用诊断语句输出止损条件运行是否正常。

2.3.问题都明白了。1.还是有问题

比如今天的单子,本来持仓有96手,平仓的时候,只平了95手。是什么问题呢?

如果平多仓盈利肯定是可平仓不足,如果是平多仓亏损那就肯定是没平完,这是代码逻辑的问题