Закрытие всех сделок на покупку

 

Пользуюсь функцией:

void allbuyclose()
   {
   for(int x=0;x<=OrdersTotal();x++)
     {
     if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
      {
      if (OrderSymbol()==Symbol())
         {
         if (OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,3);
         }
      }
   }

Почему она закрывает не все открытые покупки????

Подскажите пожалуйста как закрыть все открытые покупки.

 
_Temoha_:

Почему она закрывает не все открытые покупки????

Подскажите пожалуйста как закрыть все открытые покупки.


Два момента, первый - если вовсе всех, уберите проверку на символ.

Второй момент, перебор ордеров лучши сделать так (поправил еще раз:)):

int total = OrdersTotal();  
for(int x=total-1;x>=0;x++)
 {
  ...........
 }
 
Temoha. Просто у тебя цикл от нуля идет, ты его закрыл. Появился новый нулевой, бывший первый. Или закрывай делай цикл for(int x=total-1;x>0;x--) или посмотри у KimIV, у него в библиотеке это сделано.
 
Благодарю, помогло
 
void allbuyclose()
int total=OrdersTotal();
   {
   for(int x=total-1; x>0; x--)
     {
     if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
      {
 
         if (OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,3);
         
      }
   }
 
Гораздо правильнее сделать так:
for (int x=0; x<OrdersTotal(); x++)
  if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
    if (OrderSymbol()==Symbol() && OrderType()==OP_BUY)
    { 
      if (OrderClose(OrderTicket(),OrderLots(),Bid,3)==true) x--;
      RefreshRates();       
     }
Т.е. не забывать ставить RefreshRates() для обновления, тогда OrdersTotal() всегда будет давать правильное значение, а также получать свежую цену Bid.

Однако вообще такой подход не совсем удачный, т.к. за то время пока ты будешь закрывать ордера по очереди, цена может меняться, причём не в лучшую сторону. И все ордера могут быть закрыты по разной цене.
Поэтому в таком случае лучше сначала захеджировать их одной противоположной позицией с объёмом равным их суммарному объёму ...если конечно ваш ДЦ позволяет открывать встречные позиции, и к тому же с маржей 50%... А уж после этого можно уже, не напрягаясь о цене, закрывать их попарно функцией OrderCloseBy(OrderTicket(), HedgingTicket), где HedgingTicket - это собственно тикет открытого встречного ордера.

Я вообще обычно и пользуюсь таким методом закрытия позиции. Он хорош ещё и тем, что в данном случае дилер как правило не знает о том, что открывая новую позу ты тем самым хеджируешь старую, т.е. по сути закрываешь её. Он думает что ты просто открываешь новую. Это я к тому, что частенько может получаться такая ситуация, когда тебе не дают нормально закрыться с профитом и постоянно реквотят, т.к. видят что ты хочешь закрыть профит. А при отсылке OrderSend дилер вряд ли будет просматривать твои предыдущие открытые ордера чтобы понять твои намерения...
Причина обращения: