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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Viktar Dzemikhau
3386
Viktar Dzemikhau  

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

Попросил знакомый написать ему сову. Я её слепил за 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() вообще хаотично, как-будто там условий нет никкх. Вроде бы и просто всё, но.. я подзапутался.

Файлы:
Viktar Dzemikhau
3386
Viktar Dzemikhau  

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

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

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

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

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

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

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

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


Artyom Trishkin
Модератор
56665
Artyom Trishkin  
Viktar Dzemikhau:

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

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

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

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

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

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

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

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

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

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

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

Alexey Viktorov
27910
Alexey Viktorov  
Viktar Dzemikhau:

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

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

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

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

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

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

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

Viktar Dzemikhau
3386
Viktar Dzemikhau  
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;
}

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


Viktar Dzemikhau
3386
Viktar Dzemikhau  
Alexey Viktorov:

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

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

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

Artyom Trishkin
Модератор
56665
Artyom Trishkin  
Viktar Dzemikhau:

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

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


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

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

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

Viktar Dzemikhau
3386
Viktar Dzemikhau  
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)
Artyom Trishkin
Модератор
56665
Artyom Trishkin  
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. Вы накидываете на график индикатор с какими параметрами?

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий