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

 
Ihor Herasko:

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

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

понаплодили разномастицы блин...

скрипт, вышло так

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

void start()
{
   if (!IsTFReady(PERIOD_D1))
      return;
............

}

у компилятора жалоб нет, но 4066 все равно лезет

похоже все-таки ручками придется взбадривать D1

 
MMM1972:

у компилятора жалоб нет, но 4066 все равно лезет

Как определили, что ошибка возникает?

Да, кстати, сегодня как раз с этой функцией (IsTFReady) разбирался. Оказалось, что iTime(), если прошла без ошибок, не сбрасывает _LastError в ноль. Раньше сбрасывала. Поэтому стоит подкорректировать функцию:

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

похоже все-таки ручками придется взбадривать D1

Это вообще не вариант. )) Для чего тогда программы-то пишем?
 
Ihor Herasko:

Как определили, что ошибка возникает?

Да, кстати, сегодня как раз с этой функцией (IsTFReady) разбирался. Оказалось, что iTime(), если прошла без ошибок, не сбрасывает _LastError в ноль. Раньше сбрасывала. Поэтому стоит подкорректировать функцию:

Это вообще не вариант. )) Для чего тогда программы-то пишем?

>>Как определили, что ошибка возникает?

у меня вместо исполнительных команд пока алерты с хай/лоу искомой свечки


IsTFReady поменял - похоже перестал ошибку выкидывать, но запускается теперь скрипт со второго раза

первый раз запрашивает начальные условия

extern int MaxRisk=2;,

.....

но не исполняется

со второго раза выполняется без 4066

 
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 ???????

Мне больше нравятся новые (для языка mql4) функции. В частности

int  CopyLow(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   int              count,           // сколько копируем
   double           low_array[]      // массив для копирования минимальных цен
   );

В качестве start_time используем

int  CopyTime(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   int              start_pos,       // откуда начнем 
   int              count,           // сколько копируем
   datetime         time_array[]     // массив для копирования времени открытия
   );

и прибавляем к времени открытия дня

int  PeriodSeconds(
   ENUM_TIMEFRAMES  period=PERIOD_CURRENT      // период графика
   );

С указанием периода Н4.

 

Спасибо, "накостылял" чего-то, завтра посмотрим

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

вопрос конечно с запуском с любого таймфрейма остался..так ради общего образования и полной красоты скрипта

 
MMM1972:

Спасибо, "накостылял" чего-то, завтра посмотрим

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

вопрос конечно с запуском с любого таймфрейма остался..так ради общего образования и полной красоты скрипта

Посмотри комментарий графика после запуска этого скрипта на любой период графика

#property strict

/********************Script program start function*******************/
void OnStart()
{
 MqlRates mqlRates[1];
 datetime arrTime[1];
 CopyTime(_Symbol, PERIOD_D1, 0, 1, arrTime);
 CopyRates(_Symbol, PERIOD_H4, arrTime[0]+PeriodSeconds(PERIOD_H4), 1, mqlRates);

   Comment("Время первой Н4 свечи ", mqlRates[0].time, "\n"
         , "High первой Н4 свечи ", mqlRates[0].high, "\n"
         , "Low первой Н4 свечи ", mqlRates[0].low, "\n"
         );
}/*******************************************************************/

Остаётся открытым вопрос о работе скрипта до открытия нужной, первой Н4 свечи. Но это решается простыми условиями if() в зависимости от желаемого действия в этом случае.

 
Alexey Viktorov:

Посмотри комментарий графика после запуска этого скрипта на любой период графика

Остаётся открытым вопрос о работе скрипта до открытия нужной, первой Н4 свечи. Но это решается простыми условиями if() в зависимости от желаемого действия в этом случае.

вроде запускается без ошибок, но Н4-свечу берет не ту

время 2017-10-07 04:00

нужня первая свеча, т.е.   2017-10-07 00:00


>>Остаётся открытым вопрос о работе скрипта до открытия нужной, первой Н4 свечи.....

скрип будет запускаться заведомо позже закрытия этой свечи

торговать в 00-00 по терминалу  в Новосибирске (это 4 часа ночи) проблематично :)

 
MMM1972:

вроде запускается без ошибок, но Н4-свечу берет не ту

время 2017-10-07 04:00

нужня первая свеча, т.е.   2017-10-07 00:00


>>Остаётся открытым вопрос о работе скрипта до открытия нужной, первой Н4 свечи.....

скрип будет запускаться заведомо позже закрытия этой свечи

торговать в 00-00 по терминалу  в Новосибирске (это 4 часа ночи) проблематично :)

Ааа... А для меня эта свеча нулевая... Тогда просто удалить из строки PeriodSeconds

CopyRates(_Symbol, PERIOD_H4, arrTime[0]+PeriodSeconds(PERIOD_H4), 1, mqlRates);

Удали что выделено красным и будет то что надо.

А если так, то вопрос

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Alexey Viktorov, 2017.07.09 14:20


Остаётся открытым вопрос о работе скрипта до открытия нужной, первой Н4 свечи. Но это решается простыми условиями if() в зависимости от желаемого действия в этом случае.

отпадает сам собой.
 

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

дальнейший кусок скрипта взят из другого скрипта который просто расчитывал лот и открывал прямой ордер.

работает как часы, в ошибке 4066 ни разу замечен не был.

только вместо прямого BUY ордера в новом скрипте  поставлен отложенный -

OrderSend(Symbol(),OP_BUYSTOP,Lot,HighLine,10,LowLine,HighProfit,"  ",0,0,CLR_NONE);

параметр Lot из старого скрипта,

остальное -

double LowLine= (iLow(0,PERIOD_H4,shift)-200*Point);           // Нижняя линия = минимум -200ps
double HighLine=(iHigh(0,PERIOD_H4,shift)+200*Point);          // Верхняя линия = максимум + 200pps
double Channel=HighLine-LowLine;                               // Считаем канал
double LowProfit=(LowLine-Channel*3);                          // Нижняя точка профита
double HighProfit=(HighLine+Channel*3);                        // Верхняя точка профита
для первого варианта

double LowLine=  mqlRates[0].low-200*Point;                 // Нижняя линия = минимум -200ps
double HighLine= mqlRates[0].high+200*Point;                // Верхняя линия = максимум + 200pps
double Channel=HighLine-LowLine;                                 // Считаем канал
double LowProfit=(LowLine-Channel*3);                        // Нижняя точка профита
double HighProfit=(HighLine+Channel*3);                      // Верхняя точка профита

для второго


если запускать скрипт с таймфрейма D1 - то ее нет

в принципе можно считать закрытой тему, если не интересно копаться дальше 

скрипт отрабатывает то, что должен, вне зависимости от ошибки :)

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