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

目前系统出现三个问题: 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); } }}

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手。是什么问题呢?

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