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

 
Andrey Sokolov:

Не подскажете ли, что обозначают в записи 

int i,limit=prev_calculated==0 ? rates_total-1 : rates_total-prev_calculated; 

"=="  ,   "?"  ,  ": "   

Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
  • www.mql5.com
В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен , то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void...
 
Просто ужас! Если в экспертах еще могу проследить логику, что-то подправить, что-то дописать... то в код индикаторов вообще не врубаюсь(
 
prom18:

Спасибо, Igor. Только я не правильно сформулировал что нужно. Индикатор из учебника расчитывается и отрисовывается на заданное количество баров (в данном случае 50) и в separate window. Нужно не от цены открытия, а от первого бара дня чтобы рисовал МА-шку. Но все равно, спасибо.

почитайте SetIndexDrawBegin() - это ограничение отрисовки индикаторного буфера, никогда не пользовался

или в моем примере можно так сделать:

input int BarCount = 50;
....

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
   static double dayopen=0.0;
   static int lastday=0;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      dayopen=0.0;
      lastday=0;
     }
   else limit=rates_total-prev_calculated;
   limit = fmin(BarCount,limit);
   for(i=limit; i>=0; i--)
     {
      if(TimeDay(time[i])!=lastday)
        {
         dayopen=open[i];
         lastday= TimeDay(time[i]);
        }
      Label1Buffer[i]=dayopen;
     }
   return(rates_total);
  }

т.е. ограничим расчет индикаторных буферов настройкой BarCount 

 
Andrey Sokolov:

Не подскажете ли, что обозначают в записи 

int i,limit=prev_calculated==0 ? rates_total-1 : rates_total-prev_calculated; 

"=="  ,   "?"  ,  ": "   

https://docs.mql4.com/ru/basis/operators/ternary


я переписал мой пример, в первом варианте не корректно работало бы при переключении ТФ, нужно сбрасывать  dayopen и  lastday, они описаны с модификатором static

Условный оператор ?: - Операторы - Основы языка - Справочник MQL4
Условный оператор ?: - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
В качестве первого операнда – "выражение1" – может быть использовано любое выражение, результатом которого является значение типа bool. Если результат равен , то выполняется третий операнд – "выражениеЗ". Второй и третий операнды, то есть "выражение2" и "выражениеЗ", должны возвращать значения одного типа и не должны иметь тип void...
 
Artyom Trishkin:

Верните ещё и index в параметре функции, переданном по ссылке

Вернул:

double GetPatt5barsDN()
      {
       double low3 = 0;
       int index = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) && 
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) && 
            (Close[i+4] < Open[i+4]))
            
            low3 = Low[i+2];
            index = i+2;
          }
          
     return(low3);
     return(index);
      }


А дальше что нужно делать?

 
Sfinks35:

Вернул:

double GetPatt5barsDN()
      {
       double low3 = 0;
       int index = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) && 
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) && 
            (Close[i+4] < Open[i+4]))
            
            low3 = Low[i+2];
            index = i+2;
          }
          
     return(low3);
     return(index);
      }


А дальше что нужно делать?

Так не возвращают


Как то так

int GetPatt5barsDN()
      {
       double low3 = 0;
       int index = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) &&  
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) &&  
            (Close[i+4] < Open[i+4]))
             
            low3 = Low[i+2];
            index = i+2;
          } 
           
          return(index);
      }


Дальше

double min = Low[GetPatt5barsDN()];
 
Sfinks35:

Вернул:

double GetPatt5barsDN()
      {
       double low3 = 0;
       int index = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) && 
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) && 
            (Close[i+4] < Open[i+4]))
            
            low3 = Low[i+2];
            index = i+2;
          }
          
     return(low3);
     return(index);
      }


А дальше что нужно делать?

А где возврат индекса через параметр по ссылке?

И вставляйте пожалуйста правильно код:


 
Есть ли функция в MQL4 которая может опознавать котировки относительно типа счёта имеется в виду 5-ти знак или 4-ёх знак, какими способами можно определить сколько нолей имеет актив после запятой например EURJPY имеет 2 ноля после запятой, EURUSD имеет 4 ноля после запятой?
 
Seric29:
Есть ли функция в MQL4 которая может опознавать котировки относительно типа счёта имеется в виду 5-ти знак или 4-ёх знак, какими способами можно определить сколько нолей имеет актив после запятой например EURJPY имеет 2 ноля после запятой, EURUSD имеет 4 ноля после запятой?

https://docs.mql4.com/ru/predefined/digitsvar

Digits - Предопределенные переменные - Справочник MQL4
Digits - Предопределенные переменные - Справочник MQL4
  • docs.mql4.com
Digits - Предопределенные переменные - Справочник MQL4
 
Artyom Trishkin:

А где возврат индекса через параметр по ссылке?

И вставляйте пожалуйста правильно код:


Добрый день!
Вроде бы сделал теперь верно:
double GetPatt5barsDN(int &index)
      {
       double low3 = 0;
       for(int i=1; i<20; i++)
          {
            if
            ((Close[i] > Open[i]) &&  
            (Close[i+1] > Open[i+1]) &&
            (Close[i+2] > Open[i+2]) && //На этой свече нужен Low[i+2]
            (Close[i+3] < Open[i+3]) &&  
            (Close[i+4] < Open[i+4]))
             
            low3 = Low[i+2];
            index = i+2;
          }           
     return(low3);
     }

Но при компилляции выдает одно предупреждение: possible loss of data due to type conversion по строке:
index = GetPatt5barsDN(index);

double low3 = 0;
   int index = 0;
   low3 = GetPatt5barsDN(index);
   index = GetPatt5barsDN(index);
   Print("low3= ", low3);
   Print("index= ", index);

В заголовке функции (и в самой функции) ошибок нет при компилляции.

Причина обращения: