Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 502

 
Vitaly Muzichenko:

Вот в функции есть перебор и выбор самой новой по времени, то есть - последней

Далее, у нас есть выбранная, и её подставляем в функцию iBarShift(sym, tf, oot, true);

Функция возвращаеи номер бара по времени. Всё.

Проверить к сожалению не могу, но когда неё пользовался, то работала отлично, как и все здесь опубликованные функции от И.Кима

а если у меня при открытии ордера присваивается тикет, а в функции порядовый номер выбирается это ничего?
 
Вадим Мотеюнас:
пишет ошибку указывая на if( iOpen[0] != time_open )   'iOpen' - undeclared identifie

Я малость что-то не то написал, малость в другую сторону мысли. Поменяйте iOpen[0] на Open[0]. Исправил. Хотя проще говоря. При открытии запоминается время открытия бара, и на этом баре уже ордера не берутся.

 

еще в описании функции написано что 

Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - NULL означает текущий рыночный инструмент.
  • tf - Таймфрейм. Значение по умолчанию - 0 означает текущий таймфрейм.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUYOP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
внешними параметрами? это сначало надо их обьявить перед самой первой спец. функцией?т.е то  что они есть в описании самой функции NumberOfBarOpenLastPos()  не достаточно?

 
Вадим Мотеюнас:

еще в описании функции написано что 

Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - NULL означает текущий рыночный инструмент.
  • tf - Таймфрейм. Значение по умолчанию - 0 означает текущий таймфрейм.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUYOP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
внешними параметрами? это сначало надо их обьявить перед самой первой спец. функцией?т.е то  что они есть в описании самой функции NumberOfBarOpenLastPos()  не достаточно?

Достаточно. Во внешние параметры вы можете вносить нужные значения: Маджик, какие позиции ищем, возможно нужно только по BUY, если нужно по  BUY(0) и SELL(1)  - тогда пишем "-1".

 
Konstantin Nikitin:

Я малость что-то не то написал, малость в другую сторону мысли. Поменяйте iOpen[0] на Open[0]. Исправил. Хотя проще говоря. При открытии запоминается время открытия бара, и на этом баре уже ордера не берутся

куча ордеров открывается,походу условие if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) перед открытием не ордера  соблюдается т.к NumberOfBarOpenLastPos возвращает -1

 
Вадим Мотеюнас:

куча ордеров открывается,походу условие if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) перед открытием не ордера  соблюдается т.к NumberOfBarOpenLastPos возвращает -1

Вы ищите ордера, тогда вам нужно использовать функцию в полном варианте, а именно с возможностью поиска по ордерам, а не только по позициям:

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

Достаточно. Во внешние параметры вы можете вносить нужные значения: Маджик, какие позиции ищем, возможно нужно только по BUY, если нужно по  BUY(0) и SELL(1)  - тогда пишем "-1".

при старте в тестере, нету естественно ,открытых ордеров может поэтому возвращается -1, и поэтому условие  if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) не выполняется?

 
Вадим Мотеюнас:

при старте в тестере, нету естественно ,открытых ордеров может поэтому возвращается -1, и поэтому условие  if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) не выполняется?

Сейчас проверю всё-таки.

 
Vitaly Muzichenko:

Вы ищите ордера, тогда вам нужно использовать функцию в полном варианте, а именно с возможностью поиска по ордерам, а не только по позициям:

всеравно -1 возвращает

 
Вадим Мотеюнас:

всеравно -1 возвращает

Работает отменно!

С двух позиций выбрал последнюю, а именно на 11 баре, что видно на скрине:


Проверочный код:

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
Причина обращения: