Группировка ордеров в МТ4

 
Здравствуйте! Подскажите, пожалуйста, можно ли в МТ4 как то сгруппировать открытые ордера? Хотелось бы отсортировать по символу. И второй вопрос, можно ли закрывать ордера группами?
 

B_O_S_S:
Здравствуйте! Подскажите, пожалуйста, можно ли в МТ4 как то сгруппировать открытые ордера? Хотелось бы отсортировать по символу.

Если речь о вкладке "Торговля" окна "Терминал", то да, это просто. Нужно кликнуть по заголовку столбца "Символ" и выбрать направление сортировки.

Если речь об MQL4/5, то нужно перебрать все имеющиеся ордера и сохранить их в разные массивы в зависимости от имени символа.

И второй вопрос, можно ли закрывать ордера группами?

Без специально написанного советника/скрипта - нет. Хотя есть исключения. Например, если группа ордеров открыта в одном направлении и по одному символу. Тогда это можно сделать одним махом (но не одним торговым приказом).

 
Ihor Herasko:

Если речь о вкладке "Торговля" окна "Терминал", то да, это просто. Нужно кликнуть по заголовку столбца "Символ" и выбрать направление сортировки.

Если речь об MQL4/5, то нужно перебрать все имеющиеся ордера и сохранить их в разные массивы в зависимости от имени символа.

Без специально написанного советника/скрипта - нет. Хотя есть исключения. Например, если группа ордеров открыта в одном направлении и по одному символу. Тогда это можно сделать одним махом (но не одним торговым приказом).

А можете рассказать подробнее как "одним махом" закрыть группу ордеров открытых в одном направлении. Или где можно найти необходимый скрипт, если есть такой готовый?
 
B_O_S_S:
А можете рассказать подробнее как "одним махом" закрыть группу ордеров открытых в одном направлении. Или где можно найти необходимый скрипт, если есть такой готовый?

Если брокер поддерживает встречное закрытие ордеров, то схема такая:

  1. Открыть противоположный ордер в обратном направлении с объемом, равным сумме объемов группы ордеров. 
  2. Неспеша произвести операции встречного закрытия, т. к. прибыль/убыток по этим ордерам жестко зафиксирован. Поторопиться нужно только в том случае, если все это происходит близко к полуночи, чтобы не попасть на начисление свопа.

Кстати, нашел скрипт, который писал в 2010-ом году. Он выполняет быстрый переворот текущей позиции (немного не то, что Вы спрашиваете, но все же). Например, если есть по символу два ордера sell объемами 0.01 и 0.02, то скрипт откроет ордер buy объемом 0.06, а затем встречно закроет два sell и половину buy.  В итоге получим buy объемом 0.03. 

Немного освежил скрипт, но не менял названия функций. Поэтому он выглядит немного старовато. Тем не менее, он работает. 

Файлы:
FastReverse.mq4  34 kb
 
Ihor Herasko:

Если брокер поддерживает встречное закрытие ордеров, то схема такая:

  1. Открыть противоположный ордер в обратном направлении с объемом, равным сумме объемов группы ордеров. 
  2. Неспеша произвести операции встречного закрытия, т. к. прибыль/убыток по этим ордерам жестко зафиксирован. Поторопиться нужно только в том случае, если все это происходит близко к полуночи, чтобы не попасть на начисление свопа.

Кстати, нашел скрипт, который писал в 2010-ом году. Он выполняет быстрый переворот текущей позиции (немного не то, что Вы спрашиваете, но все же). Например, если есть по символу два ордера sell объемами 0.01 и 0.02, то скрипт откроет ордер buy объемом 0.06, а затем встречно закроет два sell и половину buy.  В итоге получим buy объемом 0.03. 

Немного освежил скрипт, но не менял названия функций. Поэтому он выглядит немного старовато. Тем не менее, он работает. 

Супер!

Большое спасибо!

Буду разбираться.

 
B_O_S_S:

Супер!

Большое спасибо!

Буду разбираться.

если интересно, функция закрывает по заданным параметрам группу ордеров

void OrderCloseType(string symbol,int type,int magic)
  {
   double price_close=0.0;

   int total=OrdersTotal();
   for(int i=total-1; i>=0; i--)
     {
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      double bid=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),digits);
      double ask=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_ASK),digits);
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderMagicNumber()!=magic)continue;
      if(OrderSymbol()!=symbol)continue;
      if(OrderType()!=type)continue;
      price_close=(type==ORDER_TYPE_BUY)?bid:ask;
      if(NormalizeDouble(NormalizePrice(symbol,price_close),digits)!=price_close)continue;
      ResetLastError();
      bool res=OrderClose(OrderTicket(),OrderLots(),price_close,10000);
      if(!res)
        {
         m_print_rezult=StringConcatenate("error close position #",OrderTicket()," ",StrToType(OrderType())," ",DoubleToString(OrderLots(),2)," ",symbol,": ",GetLastError());
         Print(m_print_rezult);
        }
      else
        {
         m_print_rezult=StringConcatenate("close position #",OrderTicket()," ",StrToType(OrderType())," ",DoubleToString(OrderLots(),2)," ",symbol);
         Print(m_print_rezult);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double NormalizePrice(string symbol,double value)
  {
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   if(ts==0)return(value);
   return(NormalizeDouble(value/ts,0)*ts);
  }
string StrToType(int type)
  {
   if(type==OP_BUY)return("BUY");
   if(type==OP_SELL)return("SELL");
   return((string)type);
  }
Причина обращения: