Icustom и тестер стратегий впадает в рекурсию что я делаю не так?

 

Добрый день.

Как известно Icustom возвращает хендл пользовательского индикатора.

Для IMA необходимо получить Хэндл чтобы отработать усреднение.

  g_IndicatorHandle = iCustom(NULL,0,"BAF.ex5",futuer,koeffitent,modeima,imapiod,PRICE_CLOSE);
   if(g_IndicatorHandle == INVALID_HANDLE)
     {
      Print("Не получился канл индикатора ");
      return(INIT_FAILED);
     }
 imahandle= iMA(_Symbol,PERIOD_CURRENT,imapiod,0,modeima,g_IndicatorHandle);
   if(imahandle == INVALID_HANDLE)
     {
      Print("Не получился канал индикатора IMA");
      return(INIT_FAILED);
     }

Но в тестере стратегий при вызове iCustom происходит рекурсия бесконечная ( до заполнения стека вызов ) Oninit.
Как я не пытался определить что это другая копия что бы сделать выход не получается. StackOverflow.

В терминале такого не происходит. 

Что я  делаю не так и где можно забить костыль?

 
Aleksandr Dziuba:

Добрый день.

Как известно Icustom возвращает хендл пользовательского индикатора.

Для IMA необходимо получить Хэндл чтобы отработать усреднение.

Но в тестере стратегий при вызове iCustom происходит рекурсия бесконечная ( до заполнения стека вызов ) Oninit.
Как я не пытался определить что это другая копия что бы сделать выход не получается. StackOverflow.

В терминале такого не происходит. 

Что я  делаю не так и где можно забить костыль?

Если вызов индикатора происходит из самого себя, то да, получаем рекурсию. Выход из рекурсии - дело непростое, тут нет универсальных решений, нужно просмотреть весь код. На вскидку: нужно передавать вызванному индикатору флаг, указывающий на то, что этот индикатор уже является ведомым. А потому этот индикатор уже не должен приводить к созданию следующей копии. Это самое простое, и не факт, что правильное в данной ситуации, решение.

Почему в терминале нет переполнения стека? Да просто потому, что там тики приходят не так часто, как в тестере. Если подождать в терминале достаточное количество времени (сравнимое по количеству тиков в тестере), то также получите переполнение.

 
Aleksandr Dziuba:

Добрый день.

Как известно Icustom возвращает хендл пользовательского индикатора.

Для IMA необходимо получить Хэндл чтобы отработать усреднение.

Но в тестере стратегий при вызове iCustom происходит рекурсия бесконечная ( до заполнения стека вызов ) Oninit.
Как я не пытался определить что это другая копия что бы сделать выход не получается. StackOverflow.

В терминале такого не происходит. 

Что я  делаю не так и где можно забить костыль?

усредняйте самодеятельно :-) то есть самостоятельно

кроме шуток - фича индикаторов "считать по хендлу другого" устарела..исторически осталась только в iMa и вы не можете сделать подобное сами.

---

практически, на сейчас вот: если приведённый вами фрагмент не в OnInit, то IndicatorRelease необходим 

 
Maxim Kuznetsov #:

усредняйте самодеятельно :-) то есть самостоятельно

кроме шуток - фича индикаторов "считать по хендлу другого" устарела..исторически осталась только в iMa и вы не можете сделать подобное сами.

---

практически, на сейчас вот: если приведённый вами фрагмент не в OnInit, то IndicatorRelease необходим 

Всем спасибо. Плюнул на это дело с рекурсиями хотя провозился целый день почти.
Был выход. Но он сложный. 
Вставил код скользяшки и забыл про проблему. Причесал и код готов.


Правда толи день такой был вчера то ли что-то не понятное. Не клеилось в общем. 
Формула простого усреднения на известном результате тоже выбила из колеи на пол часа.

Новое значение = (Предыдущее значение - Последний элемент + Новый элемент) / Количество элементов

Правильная формула
Новое значение = (Предыдущее значение * Количество элементов - Последний элемент + Новый элемент) / Количество элементов

Но с рекурсией все равно интересно. И не понятно зачем такие сложности. Я получил хэндл через окно. Но неужели нельзя было написать простую функцию IndicatorGetMyHandle.

 
Aleksandr Dziuba:

Добрый день.

Как известно Icustom возвращает хендл пользовательского индикатора.

Для IMA необходимо получить Хэндл чтобы отработать усреднение.

Но в тестере стратегий при вызове iCustom происходит рекурсия бесконечная ( до заполнения стека вызов ) Oninit.
Как я не пытался определить что это другая копия что бы сделать выход не получается. StackOverflow.

В терминале такого не происходит. 

Что я  делаю не так и где можно забить костыль?

Посмотрите этот пример:

 
Aleksandr Dziuba #:

Всем спасибо. Плюнул на это дело с рекурсиями хотя провозился целый день почти.
Был выход. Но он сложный. 
Вставил код скользяшки и забыл про проблему. Причесал и код готов.


Правда толи день такой был вчера то ли что-то не понятное. Не клеилось в общем. 
Формула простого усреднения на известном результате тоже выбила из колеи на пол часа.

Новое значение = (Предыдущее значение - Последний элемент + Новый элемент) / Количество элементов

Правильная формула
Новое значение = (Предыдущее значение * Количество элементов - Последний элемент + Новый элемент) / Количество элементов

Но с рекурсией все равно интересно. И не понятно зачем такие сложности. Я получил хэндл через окно. Но неужели нельзя было написать простую функцию IndicatorGetMyHandle.

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

 
Maxim Kuznetsov #:

кроме шуток - фича индикаторов "считать по хендлу другого" устарела..исторически осталась только в iMa и вы не можете сделать подобное сами.

И давно это случилось? Разве iCustom() и IndicatorCreate() не позволяют посчитать индикатор на данных из другого индикатора по его хендлу? 🤔