Собственно это и есть вопрос: как оптимизировать код, чтобы эксперт работал быстрее?
Причина медленной работы довольно простая - использование вложенных циклов, причем на каждом тике
for(a=0;a<1000;a++){ for(b=0;b<1000;b++){ for(с=0;с<1000;с++){ }}}
В данном случае код индикатора простой
int i,counted_bars=IndicatorCounted(); //---- if(Bars<=MomPeriod) return(0); //---- initial zero if(counted_bars<1) for(i=1;i<=MomPeriod;i++) MomBuffer[Bars-i]=0.0; //---- i=Bars-MomPeriod-1; if(counted_bars>=MomPeriod) i=Bars-counted_bars-1; while(i>=0) { MomBuffer[i]=Close[i]*100/Close[i+MomPeriod]; i--; } return(0); }и соответственно подправив, его можно вставить прямо в ваш индикатор или советник, дабы избавится от лишней вложенности циклов
За вложенные циклы спасибо. Тут действительно надо подумать, чтобы в эксперте они не исполнялись на каждом тике.
Но что касается индикатора - вы выложили код обычного моментума от metaquotes. У меня же RSI на моментум.
Вопрос такого плана: насколько написание кода вручную, а не вызов ф-ций iMomentum, iRSIOnArray поможет ускорить
процесс? не к этим ли кодам обращаются вышеупомянутые ф-ции? Хотя я конечно напишу и сравню. Да и при расчёте RSI от вложенных не уйти.
В то же время могу сказать, что например эксперт, который вызывает Stochastic Momentum Index (тоже собственного "производства")
работает гораздо (не то слово) быстрее, хотя в самом индикаторе неоднократно используется iMAOnArray, что по сути те же вложенные циклы.
Т.е. в может проблема не только во вложенных циклах?
Ну и по эксперту. Можно ограничить расчёт индикаторов только на первом тике нового бара, что в принципе сделано,
можно также ограничить расчёт и по торговому времени (если "наше" время - считаем, нет - идём дальше). Больше вроде
ничего в голову не приходит. Может есть ещё какие-то способы?
И ещё вопрос: если не вызывать индикатор через iCustom, а поместить его непосредственно в эксперт, насколько это будет эффективней?
(В принципе пока подобного не делал, но благо есть статьи на сайте, попробую и это)
При написании собственных индикаторов, я стараюсь использовать подобный принцип:
1) Однократное обращение к историческим данным, за исключением необходимых для расчета текущего значения
2) Не делать обращения к другим индикаторам из кода своего индикатора, а объеденять индикаторы в один
3) По возможности использовать минимальное количество вложений.
В принципе вы на верном пути и сами почти ответили на свои вопросы.
При написании собственных индикаторов, я стараюсь использовать подобный принцип:
1) Однократное обращение к историческим данным, за исключением необходимых для расчета текущего значения
2) Не делать обращения к другим индикаторам из кода своего индикатора, а объеденять индикаторы в один
3) По возможности использовать минимальное количество вложений.
В принципе вы на верном пути и сами почти ответили на свои вопросы.
Большое спасибо за ответы. Буду над этим работать
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Собственно это и есть вопрос: как оптимизировать код, чтобы эксперт работал быстрее?
При написании экспертов, я использую пару шаблонов, созданных на основе опубликованных на этом сайте экспертов, а именно либо на базе вот этого кода: https://www.mql5.com/en/code/7116 либо этого https://www.mql5.com/ru/code. Практически всегда вызываю пользовательские индикаторы, и тут начинается - с одними эксперты работают достаточно быстро, с другими же гораздо медленнее. Т.е. я так полагаю, что проблема связанна именно с кодом индикаторов - по идее он не является оптимальным и его следует корректировать. Но вот тут как раз я и не могу понять, что ещё можно сделать. Например, будем использовать индикатор LBR_RSI, вот основная часть кода:
Проще казалось бы некуда, но если использовать в эксперте вызов этого индикатора с использованием разных фреймов и поставить оптимизацию, можно не то что пойти покурить или кофе попить... Замечу, что машина используется довольно мощная: 2 ядра по 3 ГГц, 4(!) гига оперативки и т.д. Сейчас например прогоняю оптимизацию по ценам открытия, всего 105 вариаций и 6(!) часов времени... Явно же что-то не то.
Моя версия: проблема в коде, причём заметил, что в основном подобное возникает с теми индикаторами, которые пишу сам. При необходимости могу выложить ещё пару индикаторов, чтобы было с чем сравнить (понять где же ошибка)
Подскажите, пожалуйста, что где и как можно сделать, дабы ускорить процесс.
Заранее спасибо.
ЗЫ. В приложенном код эксперта