貌似是你逻辑的问题。
首先如果
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里面一定平仓成功。
要考虑程序的运行时间和服务器的响应时间。
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);
}