Вопрос №2

Посмотрите мой код:
for(int i=0;i<OrdersTotal();i++)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    OrderClose(…);
Почему при его выполнении закрываются не все ордера, а через один?

Дело в том, что при закрытии ордера Форекс в Metatrader 4 или удалении отложенного ордера Buy Stop или Sell Stop — позиция оставшихся смещается. 

Представим, что у нас есть 3 ордера Forex. Их позиции изначально: 0, 1, 2. При закрытии ордера в позиции 0 следующие ордера будут иметь позиции 0,1. Цикл же этого не учитывает и при следующем проходе будет попытка закрыть ордер в позиции 1. Поэтому более правильным вариантом на MQL будет следующий:
for(int i=OrdersTotal()-1;i>=0;i−−)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    OrderClose(…);

Похожие статьи:

2 комментария

  1. Здравствуйте. Очень нужна помощь. Столкнулась с невозможностью закрытия/переворота позиции, если она составлена несколькими ордерами. Даже приведенный Вами скрипт в моем советнике закрывает только один ордер, а второй остается открытым. Идея была в том, что при определенных условиях выставляются два рыночных ордера (напр., бай). Если возникают противоположные условия, эти два закрываются и открываются также два ордера, но уже в селл.

    total=OrdersTotal();
    //——————————————-Закрытие позиций——————————————
    for(int cnt=OrdersTotal()-1;cnt>=0;cnt—)
    {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if(OrderType()<=OP_SELL &&
    OrderSymbol()==Symbol())
    {
    if(OrderType()==OP_BUY)
    {
    if (Close[1]Up)
    {
    OrderClose(OrderTicket(),OrderLots(),Bid,50,Violet);

    OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,»»,MAGICMA,0,Red);
    OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,»»,MAGICMA,0,Red);
    return(0);
    }
    if (Close[1]Dn)
    {
    OrderClose(OrderTicket(),OrderLots(),Bid,50,Violet);

    OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,»»,MAGICMA,0,Red);
    OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,»»,MAGICMA,0,Red);
    return(0);
    }
    }
    if(OrderType()==OP_SELL)
    {
    if (Close[1]>Dn && Close[2]Up && Close[2]<Up)
    {
    OrderClose(OrderTicket(),OrderLots(),Ask,50,Violet);

    OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,"",MAGICMA,0,Blue);
    OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,"",MAGICMA,0,Blue);
    return(0);
    }

    }
    }

    }
    //————————————————Конец закрытия позиции————————————
    if(total==0) // если нет позиций
    {
    // открытие длинной позиции
    if(Close[2]Dn )
    {
    OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,»»,MAGICMA,0,Blue);
    OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,»»,MAGICMA,0,Blue);
    return(0);
    }

    // открытие короткой позиции
    if(Close[2]>Up && Close[1]<Up )
    {
    OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",MAGICMA,0,Red);
    OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",MAGICMA,0,Red);
    return(0);
    }
    }
    return(0);
    }

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *