Уважаемый @lsv107
Мне кажется вот тут
if(tmaUseCurrentBar) SetNewBar(symbol.Pair,symbol.newBarTMA); else symbol.newBarTMA=symbol.newBar;
немного нестройно. Если мы хотим добиться перерасчета на текущем баре, когда выбрано использование значения ТМА на текущем баре, то логично было бы просто сбрасывать флажок is_new_bar. А так мы, получается, пересчитываем его либо на новом баре, либо на новом баре текущего ТФ, что совсем лишнее.
Я бы предложил, например, вот так:
if(tmaUseCurrentBar) symbol.newBarTMA.is_new_bar = true; else SetNewBar(symbol.Pair,symbol.newBarTMA);
Так будет пересчитывать на тиках. Можно сделать, чтобы пересчитывало на барах текущего таймфрейма:
if(tmaUseCurrentBar) symbol.newBarTMA.is_new_bar = symbol.newBar.is_new_bar; else SetNewBar(symbol.Pair,symbol.newBarTMA);
Я могу что-то упускать, конечно.
Еще я бы оградил работу с визуальными объектами
if(IsTesting() && !IsVisualMode()) return;
Ибо оно довольно много процессорного времени и памяти отжирает - а если на это некому смотреть, то лучше пропускать.
Я внес эти изменения в прикрепленную версию, тестирование в невизуальном режиме ускорилось в десятки раз, результат идентичен на настройках по умолчанию.
Глядя на код дальше:
Сигнал на покупку и продажу по BTArrows вычисляется на разных ТФ: в покупку на текущем, а в продажу - на заданном в настройках. Поправил
Поскольку сигнал индикаторов учитывается только по закрытым барам, нет смысла вычислять их на тиках - там могут быть громоздкие и неоптимальные алгоритмы внутри.
Я вытащил оба индикатора в отдельные функции, огородил проверкой нового бара (постарался вписаться в вашу концепцию проверки) и кэширую последнее значение, на случай, если оно может пригодиться посреди бара - сейчас, или в будущем.
Также пересадил боллинджера на библиотечную реализацию в Indicators\Indicators.mqh - гораздо оптимальнее доступ к массиву.
Я попытался сделать то же самое для стохастика, но не нашел, где он вызывается в коде - видимо, вычищен, но параметры не убраны, или недореализован.
Из чистого эстетства перенес функцию расчета TMA внутрь структуры инструмента - она работает с членами структуры исключительно.
Если честно, я бОльшую часть кода внес бы внутрь инструмента, оставив бы только обработку торговых событий, циклы по инструментам и всяческие таймеры в глобальном скопе, но тут уже нашлепал себе по рукам и остановился.
Прогнал напоследок разок, убедился, что результаты на настройках по умолчанию по-прежнему идентичны исходным.
Автору огромное спасибо и просьба меня не пинать за безудержный забег по чужому коду.
