Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 375

 
Tapochun:

1. Определяете время открытия дневной свечи;

2. Определяете количество баров num на нужном Вам ТФ (если хотите проверять экстремум дня каждые 15 минут - М15 баров);

3. Получаете данные high за num баров;

3. В цикле сравниваете все значения high баров с переменной dayHigh за нужную дневную свечу (изначально dayHigh = 0);

4. Если high > dayHigh - запоминаете новое значение в переменную dayHigh;

Это понятно, спасибо. Но пока это сложно для меня... а точней пункт 2, это надо сделать для каждого ТФ расчет и загнать в диапазоны для поиска количества свечей?

А нельзя просто узнать дату текущего ТФ и перебрать все значения за дату, без определения количества прошедших свечей?

 
-Aleks-:

Это понятно, спасибо. Но пока это сложно для меня... а точней пункт 2, это надо сделать для каждого ТФ расчет и загнать в диапазоны для поиска количества свечей?

А нельзя просто узнать дату текущего ТФ и перебрать все значения за дату, без определения количества прошедших свечей?

Количество баров внутри дня определить просто. Например для 15 минутного графика. Количество минут в одних сутках делите на 15 (1440 /15 =96 баров или по другому PERIOD_D1/PERIOD_M15 = 96)
 
Vitalii Ananev:
Количество баров внутри дня определить просто. Например для 15 минутного графика. Количество минут в одних сутках делите на 15 (1440 /15 =96 баров или по другому PERIOD_D1/PERIOD_M15 = 96)
Не стоит так делать! Никогда нельзя принимать как факт, что количество баров в каждый конкретный день по ТФ будет одинаково!
 
Vitalii Ananev:
Количество баров внутри дня определить просто. Например для 15 минутного графика. Количество минут в одних сутках делите на 15 (1440 /15 =96 баров или по другому PERIOD_D1/PERIOD_M15 = 96)

Да это понятно, математически то, а вот как функциями - в этом то вопрос! Допустим через Time я получу текущее время, а дальше как

Мне вот видится сделать счетчик для каждого ТФ, при новом баре , который будет обнулятся при наступлении новых суток, и обнулять максимум за сутки, а до этого делать сравнение каждого бара, но как это запрограммировать?

 
Tapochun:
Не стоит так делать! Никогда нельзя принимать как факт, что количество баров в каждый конкретный день по ТФ будет одинаково!

Да, например в пятницу может быть закрытие раньше...

Значит надо определить день, и брать массив для поиска максимума за день без учета количества свечь, как это сделать?

 
-Aleks-:

Да это понятно, математически то, а вот как функциями - в этом то вопрос! Допустим через Time я получу текущее время, а дальше как

Мне вот видится сделать счетчик для каждого ТФ, при новом баре , который будет обнулятся при наступлении новых суток, и обнулять максимум за сутки, а до этого делать сравнение каждого бара, но как это запрограммировать?

Примерно так можно найти первый бар соответствующий началу суток.

 datetime BeginDay = iTime(Symbol(), PERIOD_D1, iBarShift(Symbol(), PERIOD_D1, Time[NumberBar]));  

 int StartBar = iBarShift(Symbol(), 0, BeginDay);
 
Vitalii Ananev:

Примерно так можно найти первый бар соответствующий началу суток.

К примеру получится такой алгоритм.

Нашли первый бар - на тот момент времени когда он сформировался High этого бара будет максимумом дня. Далее берем следующий бар и проверяем уже его максимум если он выше предыдущего , значит это новый максимум дня. И так далее до последнего бара дня.

 
#property script_show_inputs
#property strict
//+------------------------------------------------------------------+
//| Входные параметры                                                |
//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES inpUserTimeframe=PERIOD_M15;   // Пользовательский ТФ
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// Определяем время открытия текущего дня
   datetime open_D1=iTime(_Symbol,PERIOD_D1,0);

// Определяем номер первого сформированного бара по пользовательскому ТФ за текущий день
   int last_utf = iBarShift( _Symbol, inpUserTimeframe, open_D1, true );
   if( last_utf == -1 )
     {
      Alert(EnumToString(inpUserTimeframe)+" ОШИБКА #",GetLastError(),": номер бара не определен! "+TimeToStr(open_D1));
      return;
     }

// Определяем максимум дня
   double dayHigh=0;
   double high;
   int highNum=0;

   for(int i=1; i<=last_utf; i++) // Цикл по сформированным свечам за текущий день
     {
      high = iHigh( _Symbol, inpUserTimeframe, i );   // Максимум на i свече
      if( high > dayHigh )                            // Если максимум дня превышен
        {
         dayHigh = high;                              // Запоминаем новый максимум
         highNum = i;                                 // Запоминаем номер свечи
        }
     }

   Alert(EnumToString(inpUserTimeframe)+": максимум дня = ",DoubleToString(dayHigh,_Digits)," обнаружен на свече #",highNum);
  }
Файлы:
toAleks.mq4  3 kb
 
Tapochun , Vitalii Ananev  - Спасибо! Сейчас попробую применить полученные знания.
 
Tapochun:
А можно не скрипт, а индикатор посмотреть? Просто у меня пока сложности со всеми этими массивами времени... подучился бы на примере.