Определение High и Low дня

 

Всем доброго дня!

На MT4 использую функцию функцию:

double  iHigh(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

есть условие в скрипте:

if((iHigh(NULL,NULL,1)==iHigh(NULL,PERIOD_D1,0)) ||  (iHigh(NULL,NULL,0)==iHigh(NULL,PERIOD_D1,0)))

 Это условие сравнивает High баров в позициях 0 и 1, на том периоде на котором открыт график, с High текущего дня

Дело в том, что это условие иногда не срабатывает (может быть это связано с точностью цифр которое возвращает iHigh?)

PS: м.б. есть другая функция? 

 
Highlander9:

Всем доброго дня!

На MT4 использую функцию функцию:

double  iHigh(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

есть условие в скрипте:

if((iHigh(NULL,NULL,1)==iHigh(NULL,PERIOD_D1,0)) ||  (iHigh(NULL,NULL,0)==iHigh(NULL,PERIOD_D1,0)))

 Это условие сравнивает High баров в позициях 0 и 1, на том периоде на котором открыт график, с High текущего дня

Дело в том, что это условие иногда не срабатывает (может быть это связано с точностью цифр которое возвращает iHigh?)

PS: м.б. есть другая функция? 

Попробуйте заменить везде вот так

NormalizeDouble(iHigh(NULL,NULL,1), _Digits)

 ***

 
Highlander9:

Всем доброго дня!

На MT4 использую функцию функцию:

double  iHigh(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

есть условие в скрипте:

if((iHigh(NULL,NULL,1)==iHigh(NULL,PERIOD_D1,0)) ||  (iHigh(NULL,NULL,0)==iHigh(NULL,PERIOD_D1,0)))

 Это условие сравнивает High баров в позициях 0 и 1, на том периоде на котором открыт график, с High текущего дня

Дело в том, что это условие иногда не срабатывает (может быть это связано с точностью цифр которое возвращает iHigh?)

PS: м.б. есть другая функция? 

Так сравнивать числа с плавающей точкой в общем случае неверно (на знак == в условном операторе). Более правильный способ:
double err   = Point/2;
double DHigh = iHigh(NULL,PERIOD_D1,0);
if( ( MathAbs(iHigh(NULL,NULL,1)-DHigh)<err ) || ( MathAbs(iHigh(NULL,NULL,0)-DHigh)<err ) )
В смысл алгоритма не вникал - просто показал правильный способ сравнения чисел с плавающей точкой в Вашем случае.
 
#include <Price_Compare.mqh> // https://www.mql5.com/ru/code/16177

void OnStart()
{
// if((iHigh(NULL,NULL,1)==iHigh(NULL,PERIOD_D1,0)) ||  (iHigh(NULL,NULL,0)==iHigh(NULL,PERIOD_D1,0)))        // было
  if((CP(iHigh(NULL,NULL,1))==iHigh(NULL,PERIOD_D1,0)) ||  (CP(iHigh(NULL,NULL,0))==iHigh(NULL,PERIOD_D1,0))) // стало
  // .......

}
Price_Compare
Price_Compare
  • голосов: 9
  • 2016.08.25
  • fxsaber
  • www.mql5.com
Изящное и шустрое сравнение double-значений "цены".
 
Highlander9:

Всем доброго дня!

На MT4 использую функцию функцию:

double  iHigh(
   string           symbol,          // символ
   int              timeframe,       // период
   int              shift            // сдвиг
   );

есть условие в скрипте:

if((iHigh(NULL,NULL,1)==iHigh(NULL,PERIOD_D1,0)) ||  (iHigh(NULL,NULL,0)==iHigh(NULL,PERIOD_D1,0)))

 Это условие сравнивает High баров в позициях 0 и 1, на том периоде на котором открыт график, с High текущего дня

Дело в том, что это условие иногда не срабатывает (может быть это связано с точностью цифр которое возвращает iHigh?)

PS: м.б. есть другая функция? 

Используй CopyHigh()

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

Хотя абсолютно не понятно как не срабатывает.

Какой смысл в первой половине условия? Ведь если вторая половина условия проверялась на каждом тике, во время жизни нулевого бара, то когда этот бар станет первым, его high уже не изменится. А если образуется новый high дня то он обязательно будет равен high текущего периода.

CopyHigh - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyHigh - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
CopyHigh - Доступ к таймсериям и индикаторам - Справочник MQL4
 
double CurrHi_0=NormalizeDouble(iHigh(NULL,NULL,0),4);
double CurrHi_1=NormalizeDouble(iHigh(NULL,NULL,1),4);
double D1Hi_0=NormalizeDouble(iHigh(NULL,PERIOD_D1,0),4);
double D1Hi_1=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),4);

if((CurrHi_1==D1Hi_1) ||  (CurrHi_0==D1Hi_0))
Попробуйте условие сформулировать так.
 

Спасибо Большое!

Буду тестить. 

 
Highlander9:

Спасибо Большое!

Буду тестить. 

если устроит выполнение условия в пределах 10-ти пунктов 4-х знака, то замените 4-рки на 3-ки.
Причина обращения: