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

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

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

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

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

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

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

Yuriy Styranivskyy
117
Yuriy Styranivskyy  
Ihor Herasko:

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

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

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

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

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

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

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

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

Файлы:
Yuriy Styranivskyy
117
Yuriy Styranivskyy  
Ihor Herasko:

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

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

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

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

Супер!

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

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

Sergey Gritsay
7587
Sergey Gritsay  
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);
  }
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий