Как получить iLow и iHigh первой !! 4часовой !! свечи

 

Подскажите бестолковому...

Как реализовать задачу получения iLow и  iHigh  первой на дню !! 4часовой !! свечи на текущей паре


вроде как так должно быть -

datetime some_time= iTime(NULL, PERIOD_D1, 0);
int      shift=iBarShift(NULL,PERIOD_H4,some_time);

double LowLine= (iLow(0,PERIOD_H4,shift)-200*Point);            // Нижняя линия = минимум -200ps
double HighLine=(iHigh(0,PERIOD_H4,shift)-200*Point);           // Верхняя линия = максимум + 200pps


Первая должна возвратить ДАТУ-ВРЕМЯ начала сегодняшнего дня

Вторая - взять НОМЕР первого 4часового бара по этой дате

Но datetime возвращает не дату-время, а тоже номер бара....

как  из iTime вернуть дату в формате 2017-*сегодня*-00:00 ???????

 
MMM1972:

как  из iTime вернуть дату в формате 2017-*сегодня*-00:00 ???????

Так ведь все Вы правильно делаете. Если нужно время открытия найденного бара H4, то всего лишь:

iTime(Symbol(), PERIOD_H4, shift);

В данном случае оно будет совпадать со временем some_time. Если же нужно получить в текстовом виде, то:

TimeToString(iTime(Symbol(), PERIOD_H4, shift));

или напрямую:

Print(iTime(Symbol(), PERIOD_H4, shift));
 
Ihor Herasko:

Так ведь все Вы правильно делаете. Если нужно время открытия найденного бара H4, то всего лишь:

В данном случае оно будет совпадать со временем some_time. Если же нужно получить в текстовом виде, то:

или напрямую:

отбой похоже, все действительно правильно

я таймфрейм переключил, и не по той свече сверяюсь :)))))))))))

только почемуто ошибку 4066 возвращает, хотя данные верные дает в алерты

 
MMM1972:


только почемуто ошибку 4066 возвращает, хотя данные верные дает в алерты


Перед тем как обращаться к таймфрейму, отличному от текущего, делаю так:

bool IsTFReady(ENUM_TIMEFRAMES eTF)
{
    iTime(Symbol(), eTF, 1);
    return GetLastError() == ERR_NO_ERROR;
}

OnTick()
{
   if (!IsTFReady(PERIOD...))
      return;
....
}

 
Ihor Herasko:

Перед тем как обращаться к таймфрейму, отличному от текущего, делаю так:

типа подергать другой таймфрейм на предмет его готовности?

а можете полность дать это кусок кода для проверки таймфрейма D1  из-под таймфрейма H4 ?

(стоим на рабочем Н4, пингуем D1)

я увы...невеликий программист...в институте...лет 20 назад ...программировал последний раз :))))

восстанавливаю забытые связи в  мозгу между BEGIN и END :)))))


Можно конечно перейти на D1, потом обратно, и запускать скрипт :) тогда без 4066 обходится

 
MMM1972:

типа подергать другой таймфрейм на предмет его готовности?

а можете полность дать это кусок кода для проверки таймфрейма D1 ?


ОК, допишу три литеры )))

bool IsTFReady(ENUM_TIMEFRAMES eTF)
{
    iTime(Symbol(), eTF, 1);
    return GetLastError() == ERR_NO_ERROR;
}

OnTick()
{
   if (!IsTFReady(PERIOD_D1))
      return;
....
}

Просто в МТ4, в отличие от МТ5, нет прямых способов для определения готовности данных другого ТФ. Вот и используется косвенный способ. Хотя, правды ради, те средства, которые есть в МТ5, тоже не всегда срабатывают и приходится костыли изобретать.

 
Ihor Herasko:

ОК, допишу три литеры )))

Просто в МТ4, в отличие от МТ5, нет прямых способов для определения готовности данных другого ТФ. Вот и используется косвенный способ. Хотя, правды ради, те средства, которые есть в МТ5, тоже не всегда срабатывают и приходится костыли изобретать.

ругается компилятор на OnTick

 
MMM1972:

ругается компилятор на OnTick

Капец, да/нет?

Так тоже ругается?

void OnTick() 
 
MMM1972:

Подскажите бестолковому...

Как реализовать задачу получения iLow и  iHigh  первой на дню !! 4часовой !! свечи на текущей паре


вроде как так должно быть -

datetime some_time= iTime(NULL, PERIOD_D1, 0);
int      shift=iBarShift(NULL,PERIOD_H4,some_time);

double LowLine= (iLow(0,PERIOD_H4,shift)-200*Point);            // Нижняя линия = минимум -200ps
double HighLine=(iHigh(0,PERIOD_H4,shift)-200*Point);           // Верхняя линия = максимум + 200pps


Первая должна возвратить ДАТУ-ВРЕМЯ начала сегодняшнего дня

Вторая - взять НОМЕР первого 4часового бара по этой дате

Но datetime возвращает не дату-время, а тоже номер бара....

как  из iTime вернуть дату в формате 2017-*сегодня*-00:00 ???????

с одной стороны вроде работает, но учтите что так в понедельник some_time попадает на полночь суббота-вскр.

как вариант чтобы получить время начала текущего календарного дня, можно "datetime now=TimeCurrent(); some_time=now-TimeHour(now)*60*60-TimeMinute(now)*60-TimeSeconds(now);"  а совсем корректно получить структуру MqlDateTime и крутить с ней: "MqlDateTime dt; datetime now=TimeCurrent(dt); dt.hour=dt.min=dt.sec=0; some_time=StructToTime(dt);" 

 

без воид-а -

'OnTick' - declaration without type   


с воидом еще хуже, все красно, особенно ругается на многоточие в конце :))) на каждую точку

void start() у меня правда есть далее по тексту

 
MMM1972:

без воид-а -

'OnTick' - declaration without type   


с воидом еще хуже, все красно, особенно ругается на многоточие в конце :))) на каждую точку

Вместо многоточия нужно вставить свой код))) 


void start() у меня правда есть далее по тексту

Это взаимоисключающие функции. В коде используется либо start (старый формат), либо OnTick (новый формат). Конечно, если мы про код советника говорим. Если это индикатор, то вместо OnTick используется OnCalculate. Если же скрипт, то OnStart.
Причина обращения: