Подскажте в чём я не прав?

 

Я не ожидал что напишу подобный вопрос потому что это, по сути, элементарная вещь, но всё же..

Попросил знакомый написать ему сову. Я её слепил за 20 минут. Остался один ндюк подцепить. А вот с ним продолбался нескоько часов. А на выходе что-то не то..

Индюк прикрепляю к посту.

По сути индюк рисует обычную кривую. А значит у него есть возвращаемое значение по которому строится кривая. Так и есть, я посмотрел в исходник и увидел это. Буфер 1 в индюке.

Мне нужно словить излом этого индюка, который называется почему-то Parabolic_r2. Вот функция, которая ловит излом этого индюка т.е. излом кривой, которую отрисовывает индюк:

bool Signal :: isParabolicBroken(ENUM_TREND_DIRECTION trend) {
//---
        Print(__FUNCTION__, " => getParabolic(2) = ", getParabolic(2), "; getParabolic(1) = ", getParabolic(1), "; getParabolic(0) = ", getParabolic(0));
  if (trend == TREND_UPWARDS) {
    if (getParabolic(0) > getParabolic(1)) {
      if (getParabolic(1) < getParabolic(2)) {
//        Print(__FUNCTION__, " => getParabolic(2) = ", getParabolic(2), "; getParabolic(1) = ", getParabolic(1), "; getParabolic(0) = ", getParabolic(0));
        Print(__FUNCTION__, " => getParabolic(0) > getParabolic(1)");
        Print(__FUNCTION__, " => getParabolic(1) < getParabolic(2)");
        return true;
      }
    }
  }
  if (trend == TREND_DOWNWARDS) {
    if (getParabolic(0) < getParabolic(1)) {
      if (getParabolic(1) > getParabolic(2)) {
//        Print(__FUNCTION__, " => getParabolic(2) = ", getParabolic(2), "; getParabolic(1) = ", getParabolic(1), "; getParabolic(0) = ", getParabolic(0));
        Print(__FUNCTION__, " => getParabolic(0) < getParabolic(1)");
        Print(__FUNCTION__, " => getParabolic(1) > getParabolic(2)");
        return true;
      }
    }
  }
//---
  return false;
}

В этой функции принты, т.к. я отладить пытаюсь код.

Вот используемая здесь функция getParabolic:

//==================================================================================================================================================================================================
// Возвращает значения индикатора Parabolic на заданном индексе. ===================================================================================================================================
double Signal :: getParabolic(int shift) {
  return ND(iCustom(m_Sym.getName(), i_parabolic_tf, "toTest/Parabolic_r2", i_parabolic_step, i_parabolic_AFmax, 0, shift));
}

Функция ND() это нормализация по количеству знаков торгового инструмента на котором используется индикатор:

double ND(const double valueToNormalize) export {    // Значение для нормализации
//---
  return NormalizeDouble(valueToNormalize, (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS));
}

Так вот не отлавливаются изломы вообще. Почему вопрос.. Ведь я сравниваю нормализованные до одинакового колиества знаков после запятой значения вещественного типа т.е. double. Соответственно, сравнение будет корректным. Другое дело, что принтуются данные из isParabolicBroken() вообще хаотично, как-будто там условий нет никкх. Вроде бы и просто всё, но.. я подзапутался.

Файлы:
 

Кстати, вот инпут-параметры параболика:

input ENUM_TIMEFRAMES     i_parabolic_tf = PERIOD_CURRENT;            // ТФ на основании баров которого отрисовывается parabolic
input double              i_parabolic_step = 0.02;                    // 
input double              i_parabolic_AFmax = 0.02;                   // 
 
бросьте индикатор на график, нажмите ctr+D, и посмотрите значения индикатора на каждом баре (и на "изломе")
 
Taras Slobodyanik:
бросьте индикатор на график, нажмите ctr+D, и посмотрите значения индикатора на каждом баре (и на "изломе")

Я раньше не обращал внимание, что в этом окне можно, кроме как цент баров смотреть значения индикаторов. Интересно..

Я взял первый попавшийся перелом:

Излом параболика вниз

Смотрю в журнале данные индюка по индекса от 0 до 2, что и нужно. Вижу:

3 - 1.3432
2 - 1.3444 индекс фактического видимого излома
1 - 1.3444
0 - 1.3444

Но на графике то очевидно, что цена  не одинакова.. Как тогда он кривая рисуется вопрос..


 
Viktar Dzemikhau:

Я не ожидал что напишу подобный вопрос потому что это, по сути, элементарная вещь, но всё же..

Попросил знакомый написать ему сову. Я её слепил за 20 минут. Остался один ндюк подцепить. А вот с ним продолбался нескоько часов. А на выходе что-то не то..

Индюк прикрепляю к посту.

По сути индюк рисует обычную кривую. А значит у него есть возвращаемое значение по которому строится кривая. Так и есть, я посмотрел в исходник и увидел это. Буфер 1 в индюке.

Мне нужно словить излом этого индюка, который называется почему-то Parabolic_r2. Вот функция, которая ловит излом этого индюка т.е. излом кривой, которую отрисовывает индюк:

В этой функции принты, т.к. я отладить пытаюсь код.

Вот используемая здесь функция getParabolic:

Функция ND() это нормализация по количеству знаков торгового инструмента на котором используется индикатор:

Так вот не отлавливаются изломы вообще. Почему вопрос.. Ведь я сравниваю нормализованные до одинакового колиества знаков после запятой значения вещественного типа т.е. double. Соответственно, сравнение будет корректным. Другое дело, что принтуются данные из isParabolicBroken() вообще хаотично, как-будто там условий нет никкх. Вроде бы и просто всё, но.. я подзапутался.

1. Вы сравниваете два нормализованных числа. Результат будет не нормализованным. Нужно сравнивать нормализованную разницу двух чисел с неким минимальным числом, например, с нулём. Тогда и результат будет нормализованным.

2. Очень похоже, что кривая индикатора рисуется со смещением. Исходник индикатора не глядел.

 
Viktar Dzemikhau:

Я раньше не обращал внимание, что в этом окне можно, кроме как цент баров смотреть значения индикаторов. Интересно..

Я взял первый попавшийся перелом:

Смотрю в журнале данные индюка по индекса от 0 до 2, что и нужно. Вижу:

Но на графике то очевидно, что цена  не одинакова.. Как тогда он кривая рисуется вопрос..

Но в окне рыочных данных (по нажатию ctl + D) цена индюка в 4-х знаке. А в самом индюке нет ограничения до 4-х знака. Странно..

Просто поменяй критерии определения излома. На баре i - выше цены, а на баре i+1 было ниже цены. Это и есть излом.

Точнее надо смотреть по каким ценам линия идёт. По рисунку видно что на изломе выше цены, а перед изломом возможно равно low бара. На первый взгляд можно сравнивать с ценой открытия бара.

 
Artyom Trishkin:

1. Вы сравниваете два нормализованных числа. Результат будет не нормализованным. Нужно сравнивать нормализованную разницу двух чисел с неким минимальным числом, например, с нулём. Тогда и результат будет нормализованным.

2. Очень похоже, что кривая индикатора рисуется со смещением. Исходник индикатора не глядел.

Я так всегда сравниваю всё. Никакх косяков не было замечено. Переписал вот так ради эксперимента:

//==================================================================================================================================================================================================
// Возвращает факт излома parabolic'а. =============================================================================================================================================================
bool Signal :: isParabolicBroken(ENUM_TREND_DIRECTION trend) {
//---
  if (trend == TREND_UPWARDS) {
    if ((getParabolic(0) - getParabolic(1)) > 0) {
      if ((getParabolic(2) - getParabolic(1)) > 0) {
        Print(__FUNCTION__, " => getParabolic(2) = ", getParabolic(2), "; getParabolic(1) = ", getParabolic(1), "; getParabolic(0) = ", getParabolic(0));
        Print(__FUNCTION__, " => getParabolic(0) > getParabolic(1)");
        Print(__FUNCTION__, " => getParabolic(1) < getParabolic(2)");
        return true;
      }
    }
  }
  if (trend == TREND_DOWNWARDS) {
    if ((getParabolic(1) - getParabolic(0)) > 0) {
      if ((getParabolic(1) > getParabolic(2)) > 0) {
        Print(__FUNCTION__, " => getParabolic(2) = ", getParabolic(2), "; getParabolic(1) = ", getParabolic(1), "; getParabolic(0) = ", getParabolic(0));
        Print(__FUNCTION__, " => getParabolic(0) < getParabolic(1)");
        Print(__FUNCTION__, " => getParabolic(1) > getParabolic(2)");
        return true;
      }
    }
  }
//---
  return false;
}

Всё-равно абы где изломы находятся, так где их нет и быть не может..


 
Alexey Viktorov:

Просто поменяй критерии определения излома. На баре i - выше цены, а на баре i+1 было ниже цены. Это и есть излом.

Точнее надо смотреть по каким ценам линия идёт. По рисунку видно что на изломе выше цены, а перед изломом возможно равно low бара. На первый взгляд можно сравнивать с ценой открытия бара.

Так если сравнить таким способом, то пока излом не произошёл всегда будет один выше другого или наоборот. Это же не точно..

 
Viktar Dzemikhau:

Я так всегда сравниваю всё. Никакх косяков не было замечено. Переписал вот так ради эксперимента:

Всё-равно абы где изломы находятся, так где их нет и быть не может..


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

2. Глянул индикатор, приложенный сюда вами - обычный индикатор, все изломы его линии прекрасно видны в окне данных - никаких чудес и мистики.

3. Исходя из п2, можно сделать вывод - вы что-то не то делаете. В журнале-то что? Может не так индикатор вызываете из советника?

 
Artyom Trishkin:

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

2. Глянул индикатор, приложенный сюда вами - обычный индикатор, все изломы его линии прекрасно видны в окне данных - никаких чудес и мистики.

3. Исходя из п2, можно сделать вывод - вы что-то не то делаете. В журнале-то что? Может не так индикатор вызываете из советника?

Я же в первом посте привёл код вызова. Продублирую заменил интпут-переменные их значениями:

//==================================================================================================================================================================================================
// Возвращает значения индикатора Parabolic на заданном индексе. ===================================================================================================================================
double Signal :: getParabolic(int shift) {
  return ND(iCustom(m_Sym.getName(), PERIOD_CURRENT, "toTest/Parabolic_r2", 0.02, 0.02, 0, shift));
}

Таким образом, мы получаем значания индикатора на нужном нам баре с индексом shift. Вроде бы всё как обычно. Меня это и смущает.

А вот функция, на основании которой открывается сделака, приизломе. Других условий сейчас нет. Всё заментировано вообще.

//==================================================================================================================================================================================================
// Возвращает факт излома parabolic'а. =============================================================================================================================================================
bool Signal :: isParabolicBroken(ENUM_TREND_DIRECTION trend) {
//---
  if (trend == TREND_UPWARDS) {
    if ((getParabolic(0) - getParabolic(1)) > 0) {
      if ((getParabolic(2) - getParabolic(1)) > 0) {
        Print(__FUNCTION__, " => getParabolic(2) = ", getParabolic(2), "; getParabolic(1) = ", getParabolic(1), "; getParabolic(0) = ", getParabolic(0));
        Print(__FUNCTION__, " => getParabolic(0) > getParabolic(1)");
        Print(__FUNCTION__, " => getParabolic(1) < getParabolic(2)");
        return true;
      }
    }
  }
  if (trend == TREND_DOWNWARDS) {
    if ((getParabolic(1) - getParabolic(0)) > 0) {
      if ((getParabolic(1) > getParabolic(2)) > 0) {
        Print(__FUNCTION__, " => getParabolic(2) = ", getParabolic(2), "; getParabolic(1) = ", getParabolic(1), "; getParabolic(0) = ", getParabolic(0));
        Print(__FUNCTION__, " => getParabolic(0) < getParabolic(1)");
        Print(__FUNCTION__, " => getParabolic(1) > getParabolic(2)");
        return true;
      }
    }
  }
//---
  return false;
}

Особо интересно, что принты появляются лишь тогда, когда появляется излом. Это теоритически. А практически принтуются значения буфера индикатора одни, а на самом деле, в окне данных (ctrl + D) я вижу другие данные.

Как это получается я вообще не догнал до сих-пор. Давно такого не было. Обычно, такие вопросы не возникают т.к. в буфере храняться актуальные значения. А здесь логика индикатора странная какая-то. Что-то здесь не то.

В журнале вот что при открытии сделки типа на изломе:

2018.09.03 16:42:01.331 2017.05.11 13:30:00  parabolicDima EURUSD,M15: open #1 sell 0.10 EURUSD at 1.08695 sl: 1.09495 tp: 1.04495 ok
2018.09.03 16:42:01.331 2017.05.11 13:30:00  parabolicDima EURUSD,M15: Signal::isParabolicBroken => getParabolic(1) > getParabolic(2)
2018.09.03 16:42:01.331 2017.05.11 13:30:00  parabolicDima EURUSD,M15: Signal::isParabolicBroken => getParabolic(0) < getParabolic(1)
2018.09.03 16:42:01.331 2017.05.11 13:30:00  parabolicDima EURUSD,M15: Signal::isParabolicBroken => getParabolic(2) = 1.08694; getParabolic(1) = 1.08867; getParabolic(0) = 1.08864

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

getParabolic(0) > getParabolic(1)
 
Viktar Dzemikhau:

Я же в первом посте привёл код вызова. Продублирую заменил интпут-переменные их значениями:

Таким образом, мы получаем значания индикатора на нужном нам баре с индексом shift. Вроде бы всё как обычно. Меня это и смущает.

А вот функция, на основании которой открывается сделака, приизломе. Других условий сейчас нет. Всё заментировано вообще.

Особо интересно, что принты появляются лишь тогда, когда появляется излом. Это теоритически. А практически принтуются значения буфера индикатора одни, а на самом деле, в окне данных (ctrl + D) я вижу другие данные.

Как это получается я вообще не догнал до сих-пор. Давно такого не было. Обычно, такие вопросы не возникают т.к. в буфере храняться актуальные значения. А здесь логика индикатора странная какая-то. Что-то здесь не то.

В вашем коде:

return ND(iCustom(m_Sym.getName(), PERIOD_CURRENT, "toTest/Parabolic_r2", 0.02, 0.02, 0, shift));

В индикаторе же значения по умолчанию: 0.02 и 0.2. Вы накидываете на график индикатор с какими параметрами?