1、外汇任何的平仓和开仓动作,都必须校验一下,即会在主程序中再度校验,如果还有单子,则会继续调用子程序,完成平仓;做EA,只要涉及开仓平仓,必须校验,历史回测看不出来,模拟盘也看不出来,但是实盘就会出问题,因为交易平台,有时不那么听话;
2、EA的指令运行比平仓动作快的多,程序的运行,一个循环,哪怕100张单子,也是一下全部发出平仓指令,而第一张单子,都不太可能完成平仓,所以,这个子程序,可以实现不
丢单的平仓。
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
这句,这个i,当你执行完一个平单之后,i变成1
后面的执行就会有问题,有一些单就不会去平
如果有三个单order[0,1,2],在平了order[0]之后就剩两个单
变成order[0,1],orderstotal也变成2
下面只能平order[1]
程序如下:
//子程序:平买单
int close_buy()
{
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderType()==OP_BUY) // 平市价成交单
{
OrderClose(OrderTicket(),OrderLots(),Bid,30,Red);
}
if(OrderType()==OP_BUYLIMIT||OrderType()==OP_BUYSTOP) // 平挂单
{
OrderDelete(OrderTicket());
}
}
}
}
//子程序:平卖单
int close_sell()
{
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderType()==OP_SELL) // 平市价成交单
{
OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);
}
if(OrderType()==OP_SELLLIMIT||OrderType()==OP_SELLSTOP) // 平挂单
{
OrderDelete(OrderTicket());
}
}
}
}
另一种写法:
int CloseBuyOrders()
{
int result,total=OrdersTotal();
for (int cnt=total-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))//增加这句确认的
{
if(OrderMagicNumber()==魔术号码 && OrderSymbol()==Symbol())
{
switch(OrderType())
{
case OP_BUY:result=OrderClose(OrderTicket(),OrderLots(),Bid,划点,Red);
case OP_BUYLIMIT:
case OP_BUYSTOP:
result=OrderDelete(OrderTicket());
}
}
}
}
return(0);
}//|---------close sell orders
int CloseSellOrders()
{
int result,total=OrdersTotal();
for(int cnt=total-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==魔术号码 && OrderSymbol()==Symbol())
{
switch(OrderType())
{
case OP_SELL:result=OrderClose(OrderTicket(),OrderLots(),Ask,划点);
case OP_SELLLIMIT:
case OP_SELLSTOP:
result=OrderDelete(OrderTicket());
}
}
}
}
return(0);
}
微信公众号:天泓评测

发表评论