MetaTrader4一个重大的BUG,盼MetaQuotes公司早日修改

 

MetaTrader4一个重大的BUG,盼MetaQuotes公司早日修改

例如用下面一段代码

开了 以下几个定单

Ticket Open Time Type Size Item Price S / L T / P Close Time Price Commission Taxes Swap Profit

7417090 2009.01.30 01:54 sell 1.00 eurgbp 0.9069 0.9089 0.9064 2009.01.30 05:24 0.9067 0.00 0.00 0.00 28.44

7417093 2009.01.30 01:54 sell 0.40 eurgbp 0.9073 0.9093 0.9068 2009.01.30 01:56 0.9068 0.00 0.00 0.00 28.43

7417098 2009.01.30 01:54 sell 0.10 eurgbp 0.9078 0.9098 0.9073 2009.01.30 01:55 0.9073 0.00 0.00 0.00 7.11


其中7417093 和7417098 这两张单,是价格达到止盈价,服务器(demo.metaquotes.net)自动平仓止盈的。 但是OrdersTotal() OrderCloseTime()等一系列Order函数,并没有将服务器自动止盈平仓掉的定单,标记为已经平仓,记载平仓时间。仍然标记它为未平仓定单。结果导致在使用OrdeClose()函数进行平仓时,"智能交易"信息栏,不断显示"#7417098定单不存在,无法平仓",进入死循环


========================================================================

开仓代码:

if (signal==1)
{
Ticket = -1;
while (Ticket<0)
Ticket = OrderSend(Symbol(),OP_BUY,GetLots(),Ask,Slippage,(Ask-(Limit*Point)),(Ask+(TP1*Point)),"Beeter",MAGIC,0,Red);
}
if (signal==2)
{
Ticket = -1;
while (Ticket<0)
Ticket = OrderSend(Symbol(),OP_SELL,GetLots(),Bid,Slippage,(Bid+(Limit*Point)),(Bid-(TP1*Point)),"Beeter",MAGIC,0,Yellow);

}



平仓代码:

for (cnt = OrdersTotal()-1 ; cnt >= 0; cnt--)
if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==TRUE)
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
{
ticketc=0;
if(OrderCloseTime()>0) ticketc=1;
if(OrderType()==OP_BUY && ((Bid-OrderOpenPrice())/Point) > TP2)
while (ticketc == 0)
ticketc = OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,white);
if(OrderType()==OP_SELL && ((OrderOpenPrice()-Ask)/Point) > TP2)
while (ticketc == 0)
ticketc = OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,white);

}


 

貌似是你逻辑的问题。

首先如果

1、if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==TRUE)

成立则

2、if(OrderCloseTime()>0) ticketc=1;

是永远不能成立的。

另外如果在执行

3、while (ticketc == 0)

的前一毫秒订单被止赢,则陷入死循环

因为OrderClose()失败返回fales即ticketc=0;

请仔细研究下OrderSelect函数和OrderCloseTime函数。

还有不要用while用if,如果平仓不成功,下一个tick再平一次就可以了。不要想在一个tick里面一定平仓成功。

要考虑程序的运行时间和服务器的响应时间。