А зачем каждый раз инициализировать все индикаторы?
Не проще в ините просто один раз создать хэндлы, а потом в калкулейт опрашивать их, ну и в деинит соответственно сделать релиз?
А зачем каждый раз инициализировать все индикаторы?
Не проще в ините просто один раз создать хэндлы, а потом в калкулейт опрашивать их, ну и в деинит соответственно сделать релиз?
Все будет еще и красивее, если использовать структуры/классы.
А зачем каждый раз инициализировать все индикаторы?
Не проще в ините просто один раз создать хэндлы, а потом в калкулейт опрашивать их, ну и в деинит соответственно сделать релиз?
Все будет еще и красивее, если использовать структуры/классы.
В OnInit я не знаю возможно ли передать параметр таймфрейма, или для каждого ТФ создавать по 3 хэндла МА???
Нужно создать массив хэндлов. То есть цикл в ините будет примерно такой же, только без КопиБуфер.
В теле индикатора только обращаетесь к уже инициализированным хэндлам.
Релиз на каждой итерации тоже бред.
Это должно ускорить работу индикатора, сейчас он уж очень неэффективно использует ресурсы.
Еще одно - создавать объекты тоже не нужно каждый раз. Короче, суть такая:
ИНИТ: инициализируем хэндлы и создаем заготовки объектов (просто размещаем их на графике с нейтральными свойствами) .
КАЛКУЛЕЙТ: запрашиваем КопиБуфер и изменяем свойства объектов, если нужно.
ДЕИНИТ: удаляем объекты и освобождаем индикаторы.
- www.mql5.com
На скорую руку...
Часть кода переносим в структуру. Массив TF заменяем на массив структур.
struct STF { ENUM_TIMEFRAMES m_tf; int m_h[3]; bool Init() { MqlParam params[]; ArrayResize(params,4); //--- set ma_period params[0].type =TYPE_INT; params[0].integer_value=40; //--- set ma_shift params[1].type =TYPE_INT; params[1].integer_value=0; //--- set ma_method params[2].type =TYPE_INT; params[2].integer_value=MODE_SMA; //--- set applied_price params[3].type =TYPE_INT; params[3].integer_value=PRICE_CLOSE; //--- create MA m_h[0]=IndicatorCreate(NULL,m_tf,IND_MA,4,params); params[0].integer_value=100; m_h[1]=IndicatorCreate(NULL,m_tf,IND_MA,4,params); params[0].integer_value=200; m_h[2]=IndicatorCreate(NULL,m_tf,IND_MA,4,params); return((m_h[0]!=INVALID_HANDLE && m_h[1]!=INVALID_HANDLE && m_h[2]!=INVALID_HANDLE)?true:false); } double MA(int index) { if(m_h[index]!=INVALID_HANDLE || BarsCalculated(m_h[index])>=1) { double data[1]; if(CopyBuffer(m_h[index],0,0,1,data)==1) return(data[0]); } return(EMPTY_VALUE); } };
В этом случае в онинит прописываем цикл инициализации (создание хэндлов).
В ОнКалькулейт пропадает блок получения хэндлов и копирования из буферов - все делается дерганием значений от структур.
Далее:
- можно поутаскивать в структуру остальные массивы
- замените IndicatorCreate на iMA (вы же только МАшки используете). И вам нагляднее будет и избавитесь от необходимости использования структуры MqlParam.
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования