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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MMM1972
41
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 ???????

Ihor Herasko
21760
Ihor Herasko  
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));
MMM1972
41
MMM1972  
Ihor Herasko:

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

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

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

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

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

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

Ihor Herasko
21760
Ihor Herasko  
MMM1972:


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


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

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

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

MMM1972
41
MMM1972  
Ihor Herasko:

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

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

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

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

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

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


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

Ihor Herasko
21760
Ihor Herasko  
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, тоже не всегда срабатывают и приходится костыли изобретать.

MMM1972
41
MMM1972  
Ihor Herasko:

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

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

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

Vitaly Muzichenko
14094
Vitaly Muzichenko  
MMM1972:

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

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

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

void OnTick() 
Maxim Kuznetsov
13610
Maxim Kuznetsov  
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);" 

MMM1972
41
MMM1972  

без воид-а -

'OnTick' - declaration without type   


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

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

Ihor Herasko
21760
Ihor Herasko  
MMM1972:

без воид-а -

'OnTick' - declaration without type   


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

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


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

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