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_开头的函数
好的谢谢,老师。我回去好好想想