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

 
dimkh87:
Добрый день. Подскажите, есть ли возможность в МТ4 и МТ5 накладывать друг на друга графики одного инструмента с разными ТФ, а также индикаторы к этим ТФ? Например, в одном окне я хочу вывести 3 графика пары EUR/USD c ТФ день, 4 часа и час, а также наложить туда же скользящие с данных ТФ. Такое возможно? Буду рад любой помощи.

А с временной шкалой что делать? Или рисовать бары с меньших таймов шириной несколько баров?

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

Господа, подскажите взял ф-цию от Кима которая возвращает номер бара открытия последней позиции или -1.

вызвал эту функцию и написал условие 

в итоге открывается один ордер, но если на баре он выбивается по стопу и условие выше для входа в позу сохраняется всеравно на этом баре сделка открывается,через Print посмотрел что ф-ция возврящает -1, сначало подумал что так как нету ордеров вообще, но потом ордера появлялись и всеравно на одном и том же баре после стопа сделка открывается, помогите, что не так я сделал?

static datetime time_open = 0;
if(Open[2]>Close[2] && Open[1]>Close[1] && Close[1]<Low[2])
     {
      Comment("цена входа = ",DoubleToStr(Low[2],Digits));
      if( Open[0] != time_open )
         if(NumberOfBarOpenLastPos("",0,-1,-1)!=0)//вызвал здесь
            ticket=OrderSend(Symbol(),OP_SELLLIMIT,0.1,Low[2],2,0,0,magic,0);

      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         time_open = Open[0];
         TP=NormalizeDouble(OrderOpenPrice()-tp*Point,Digits);
         SL=NormalizeDouble(OrderOpenPrice()+sl*Point,Digits);
         modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
       }
      }
 
Konstantin Nikitin:
пишет ошибку указывая на if( iOpen[0] != time_open )   'iOpen' - undeclared identifier

 
Вадим Мотеюнас:
пишет ошибку указывая на if( iOpen[0] != time_open )   'iOpen' - undeclared identifier

У Кима все функции рабочие! Вы не правильно её применили.

 
Vitaly Muzichenko:

У Кима все функции рабочие! Вы не правильно её применили.

ни кто и не спорит, хотелось бы понять в как я неправильно ее применяю

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

ни кто и не спорит, хотелось бы понять в как я неправильно ее применяю

Принтуйте всё - это самое верное решение выявить ошибки и недочёты:

Print( NumberOfBarOpenLastPos("",0,-1,-1) );
 
Vitaly Muzichenko:

Принтуйте всё - это самое верное решение выявить ошибки и недочёты:

ну я говорил что -1 возвращает, т.е. последний бар на котором был открытый ордер функция не находит, я грешу на то что я не правильные параметры передаю

 
int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot;
   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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime();//что означает это строка?что текущее время раньше цены открытия ордера, это как?
                    }
                 }
              }
           }
        }
     }
 
Вадим Мотеюнас:

Строка обозначает, что проходим по всем позициям, и выбираем/запоминаем самую новую по времени, ну и с ней работаем. Это на случай того, если позиции идут не по-порядку, а вразброс.  

 

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

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()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнюю позицию
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, True));
  }

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

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

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