目前系统出现三个问题:
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手。是什么问题呢?
如果平多仓盈利肯定是可平仓不足,如果是平多仓亏损那就肯定是没平完,这是代码逻辑的问题