Кстати, вот инпут-параметры параболика:
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, и посмотрите значения индикатора на каждом баре (и на "изломе")
Я раньше не обращал внимание, что в этом окне можно, кроме как цент баров смотреть значения индикаторов. Интересно..
Я взял первый попавшийся перелом:
Смотрю в журнале данные индюка по индекса от 0 до 2, что и нужно. Вижу:
3 - 1.3432 2 - 1.3444 индекс фактического видимого излома 1 - 1.3444 0 - 1.3444
Но на графике то очевидно, что цена не одинакова.. Как тогда он кривая рисуется вопрос..
Я не ожидал что напишу подобный вопрос потому что это, по сути, элементарная вещь, но всё же..
Попросил знакомый написать ему сову. Я её слепил за 20 минут. Остался один ндюк подцепить. А вот с ним продолбался нескоько часов. А на выходе что-то не то..
Индюк прикрепляю к посту.
По сути индюк рисует обычную кривую. А значит у него есть возвращаемое значение по которому строится кривая. Так и есть, я посмотрел в исходник и увидел это. Буфер 1 в индюке.
Мне нужно словить излом этого индюка, который называется почему-то Parabolic_r2. Вот функция, которая ловит излом этого индюка т.е. излом кривой, которую отрисовывает индюк:
В этой функции принты, т.к. я отладить пытаюсь код.
Вот используемая здесь функция getParabolic:
Функция ND() это нормализация по количеству знаков торгового инструмента на котором используется индикатор:
Так вот не отлавливаются изломы вообще. Почему вопрос.. Ведь я сравниваю нормализованные до одинакового колиества знаков после запятой значения вещественного типа т.е. double. Соответственно, сравнение будет корректным. Другое дело, что принтуются данные из isParabolicBroken() вообще хаотично, как-будто там условий нет никкх. Вроде бы и просто всё, но.. я подзапутался.
1. Вы сравниваете два нормализованных числа. Результат будет не нормализованным. Нужно сравнивать нормализованную разницу двух чисел с неким минимальным числом, например, с нулём. Тогда и результат будет нормализованным.
2. Очень похоже, что кривая индикатора рисуется со смещением. Исходник индикатора не глядел.
Я раньше не обращал внимание, что в этом окне можно, кроме как цент баров смотреть значения индикаторов. Интересно..
Я взял первый попавшийся перелом:
Смотрю в журнале данные индюка по индекса от 0 до 2, что и нужно. Вижу:
Но на графике то очевидно, что цена не одинакова.. Как тогда он кривая рисуется вопрос..
Но в окне рыочных данных (по нажатию ctl + D) цена индюка в 4-х знаке. А в самом индюке нет ограничения до 4-х знака. Странно..
Просто поменяй критерии определения излома. На баре i - выше цены, а на баре i+1 было ниже цены. Это и есть излом.
Точнее надо смотреть по каким ценам линия идёт. По рисунку видно что на изломе выше цены, а перед изломом возможно равно low бара. На первый взгляд можно сравнивать с ценой открытия бара.
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; }
Всё-равно абы где изломы находятся, так где их нет и быть не может..
Просто поменяй критерии определения излома. На баре i - выше цены, а на баре i+1 было ниже цены. Это и есть излом.
Точнее надо смотреть по каким ценам линия идёт. По рисунку видно что на изломе выше цены, а перед изломом возможно равно low бара. На первый взгляд можно сравнивать с ценой открытия бара.
Так если сравнить таким способом, то пока излом не произошёл всегда будет один выше другого или наоборот. Это же не точно..
Я так всегда сравниваю всё. Никакх косяков не было замечено. Переписал вот так ради эксперимента:
Всё-равно абы где изломы находятся, так где их нет и быть не может..
1. Значит вы всегда получаете не нормализованный результат сравнения.
2. Глянул индикатор, приложенный сюда вами - обычный индикатор, все изломы его линии прекрасно видны в окне данных - никаких чудес и мистики.
3. Исходя из п2, можно сделать вывод - вы что-то не то делаете. В журнале-то что? Может не так индикатор вызываете из советника?
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)
Я же в первом посте привёл код вызова. Продублирую заменил интпут-переменные их значениями:
Таким образом, мы получаем значания индикатора на нужном нам баре с индексом shift. Вроде бы всё как обычно. Меня это и смущает.
А вот функция, на основании которой открывается сделака, приизломе. Других условий сейчас нет. Всё заментировано вообще.
Особо интересно, что принты появляются лишь тогда, когда появляется излом. Это теоритически. А практически принтуются значения буфера индикатора одни, а на самом деле, в окне данных (ctrl + D) я вижу другие данные.
Как это получается я вообще не догнал до сих-пор. Давно такого не было. Обычно, такие вопросы не возникают т.к. в буфере храняться актуальные значения. А здесь логика индикатора странная какая-то. Что-то здесь не то.
В вашем коде:
return ND(iCustom(m_Sym.getName(), PERIOD_CURRENT, "toTest/Parabolic_r2", 0.02, 0.02, 0, shift));
В индикаторе же значения по умолчанию: 0.02 и 0.2. Вы накидываете на график индикатор с какими параметрами?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я не ожидал что напишу подобный вопрос потому что это, по сути, элементарная вещь, но всё же..
Попросил знакомый написать ему сову. Я её слепил за 20 минут. Остался один ндюк подцепить. А вот с ним продолбался нескоько часов. А на выходе что-то не то..
Индюк прикрепляю к посту.
По сути индюк рисует обычную кривую. А значит у него есть возвращаемое значение по которому строится кривая. Так и есть, я посмотрел в исходник и увидел это. Буфер 1 в индюке.
Мне нужно словить излом этого индюка, который называется почему-то Parabolic_r2. Вот функция, которая ловит излом этого индюка т.е. излом кривой, которую отрисовывает индюк:
В этой функции принты, т.к. я отладить пытаюсь код.
Вот используемая здесь функция getParabolic:
Функция ND() это нормализация по количеству знаков торгового инструмента на котором используется индикатор:
Так вот не отлавливаются изломы вообще. Почему вопрос.. Ведь я сравниваю нормализованные до одинакового колиества знаков после запятой значения вещественного типа т.е. double. Соответственно, сравнение будет корректным. Другое дело, что принтуются данные из isParabolicBroken() вообще хаотично, как-будто там условий нет никкх. Вроде бы и просто всё, но.. я подзапутался.