Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ура! Проблема с отрисовкой сигнала решена, все сигналы отрисовались. Видимо, проблема была в том, что я расчитывал индикатор для каждого тика, помимо последнего бара, но из-за недостатка опыта делаю это некорректно. Оставил расчёт только по сформированному бару и всё получилось.
(Но вопрос по поводу отрисовки индикатора тестер-движком в конце тестирования остаётся и адресован он к разработчикам. Мне интересно, задумывалось это так или всё же есть bag-очик)
Candid и Rosh, большое спасибо за подсказку с визуализатором, теперь буду этим пользоваться. (а в доке про это ни слова).
Сначала предисловие. В очередной раз споткнувшись (интуитивно исходил из того, что бары считаются на момент предыдущего вызова функции) я решил для определённого типа индикаторов отказаться от неё совсем. Сейчас я проверяю такого типа конструкцию
Условие пересчёта истории на каждый "чих" (как выразился Slawa) специфично для этого типа индикаторов - используются и меняются значения индикатора из прошлого, пользоваться для привязки временем (то есть постоянно обращаться к iBarShift) мне кажется накладным, думаю дешевле пользоватся для привязки номером бара от начала графика (Bars-pos) и полностью пересчитывать индикатор при "нештатном" изменении Bars (например при докачке истории).
И вот я подумал - а ведь такого типа код (с вариантами для работы на каждом тике и, может быть, для пересчёта при докачке только новых баров) может быть просто зашит в функцию start. Это и есть предложение для рассмотрения. Тогда она должна иметь параметры, например start(bool EveryTick, int& FBar, int MinBars, ...) и необходима дополнительная стандартная функция Initialize, дополнительно к init. Почему дополнительно? Нет смысла заново делать много из того, что делается в init (устанавливать буферы, параметры отображения, устанавливать размеры пользовательских массивов если это делается один раз и пр.). С другой стороны в момент работы Initialize хотелось бы иметь установленными значения предопределённых переменных, типа Bars или Point. Вот собственно на данный момент и всё. Может быть в такой идеологии пользователям будет легче писать правильные индикаторы?
Аналогичный код у нас был в наших троечных пользовательских индикаторах.
Я понимаю, что изобретаю велосипед :). Код приведен для илюстрации "естественности" объединения IndicatorCounted() с функцией start() (ну и немножко в расчёте на то что мне укажут на грубые просчёты, если они там есть :). Вопрос в том, с каким интерфейсом легче писать правильные индикаторы: с существующим (IndicatorCounted) или гипотетическим (start(bool EveryTick, int& FBar, int MinBars, ...))
Профессионалам требуется как можно больший контроль с как можно меньшими опциями, чтобы он сам делал то, что ему требуется. Поэтому вряд ли функция с start() с навешанным тюнингом будет востребована.
С тюнингом проблемы нет, пусть start(NULL) выводит на прежнюю версию. О предпочтениях пользовательских масс судить не берусь.
P.S. Тем не менее не удивлюсь, если от IndicatorCounted морщатся все, и профессионалы и чайники :)
С тюнингом проблемы нет, пусть start(NULL) выводит на прежнюю версию. О предпочтениях пользовательских масс судить не берусь.
P.S. Тем не менее не удивлюсь, если от IndicatorCounted морщатся все, и профессионалы и чайники :)
Таки да
Как-то переусложнено.
по-моему слабый аргумент.
Как-то переусложнено.
по-моему слабый аргумент.
Предложите свой изящный и 100%-ный способ добиться экономного и стабильного расчета индикаторов.
Информация о количестве уже посчитанных баров используется во всех наших встроенных индикаторах. И считается стандартным для всех индикаторов способом. Функция IndicatorCounted просто отдаёт эту уже посчитанную информацию, чтобы индикаторописатели тоже могли вкусить от благ.
Не нравится - не пользуйтесь. Учитывайте самостоятельно.