Как получить 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.