求助贴 麻烦老师帮忙看看

1.我用(longCurrentContracts /shortCurrentContracts,价格)平仓,发出来的平仓数与持仓数不对应。比如我开仓数是100,按照我的交易指令应该平仓是100,而实际却发出了101,导致可平仓位置不足,平仓没成功。问了客服老师,客服说是因为我计算手数时候用了A函数。但是我计算手数是根据账户的动态权益是判断的,如果不用A函数的话怎么实现呢?麻烦老师帮忙看看,到底是什么问题。 SS=(A_CurrentEquity()*risk)/(c[1]*MarginRatio()*ContractUnit()); SS= IntPart(SS);

老师,我还是不是很明白,您能帮我看一下我的代码问题吗? 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); } }}

你这个思路不是很奇怪吗,开仓才需要根据权益计算手数,如果是平仓的后不是应该获取持仓数据直接由几手平几手吗? 比如你账户持仓有100,注意这个是账户持仓,不是图表持仓,不是currentcontracts。 那么你可以用getposition函数获取当前的持仓函数结构体,然后根据当前可平持仓来发平仓单。 但是如果你要用持仓数据来发单,必须要注意用好状态变量来防止重复发平仓单。 建议没有较为丰富的开发经验,不要使用a_开头的函数

回复:好的谢谢,老师。我回去好好想想