- Реальные и сгенерированные тики - Алгоритмический трейдинг, торговые роботы
- Alligator - Индикаторы Билла Вильямса - Использование технических индикаторов - Графики котировок, технический и фундаментальный анализ
- Alligator - Индикаторы Билла Вильямса - Индикаторы - Чарты - MetaTrader 5 для Android
У меня были такие же вопросы когда я начал изучать MQL4. Нужно понять
сначала что свечи (или бары) на графике и в массивах данных отсчитываются
от самого последней свечи справа, идекс которой 0, до самой первой
свечи слева, индекс которой Bars-1. Другими словами, свеча появившаяся
последней это нулевая свеча. Встроенная переменная Bars показывает
сколько свечей(баров) всего на графике или в массиве цен. Встроенная
переменная IndicatorCounted показывает сколько свечей не изменилось
в массиве цен (или на графике) когда индикатор был запущен. Например,
при запуске индикатора имеем 100 свечей на графике (Bars=100, IndicatorCounted=0).
Индикатор расчитывает свои значения для всех 100 свечей и IndicatorCounted
становится 100, то есть IndicatorCounted по существу показывает сколько
свечей индикатор уже просчитал. Время проходит и появляется
новая свеча на графике. Если индикатор всё ещё сидит на графике,
то вместо того чтобы перерасчитывать значения для 100 старых
свечей и одной новой, он будет расчитывать своё значение только
для новой свечи т.к. старые значения не должны изменится. После
этого IndicatorCounted становится 101, и всё повторяется снова для новой
102-й свечи. Такая организация индикатора помогает очень быстро
расчитывать значения новых свечей. Но чтобы она работала, все
циклы по расчёту индикатора должны начинаться на нулевой свече
и заканчиваться на свече с индексом Bars-IndicatorCounted-1. Можно конечно
всё упростить и забыть про IndicatorCounted т.к. в большинстве случаев
скорость рисования индикатора существенно не ухудшится. Но
если ваш индикатор требует очень много вычислений, то использование
IndicatorCounted очень поможет скорости перерисовки.
Кстати, если отркоете МетаЕдитор, подведёте курсор под команду
кода и нажмёте F1, то внизу появится окно описывающюю команду
(help). Эта помощь также доступна здесь
https://docs.mql4.com/ru/
Успехов вам в осваивании MQL4. Между прочим, отношения я к MetaQuotes
никакого не имею. Я просто пытаюсь отплатить за доброе дело
(когда мне форумчане помогали понять MQL4) добрым делом.
Замечание: самый последний бар не считается посчитанным, и в большинстве случаев необходимо пересчитывать только его. Однако бывают пограничные случаи, когда вызов пользовательского индикатора производится из эксперта на первом тике нового бара. Возможна ситуация, что последний тик предыдущего бара не обработан (по той причине, что в момент прихода этого последнего тика обрабатывался предпоследний тик), и пользовательский индикатор не был вызван и поэтому не был рассчитан. Чтобы избежать в такой ситуации ошибок расчета индикатора, функция IndicatorCounted() возвращает реально посчитанное количество баров минус один. Пример: int start() { int limit; int counted_bars=IndicatorCounted(); //---- последний посчитанный бар будет пересчитан if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- основной цикл for(int i=0; i<limit; i++) { //---- ma_shift присваивается 0, потому что SetIndexShift, вызываемый выше ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); } //---- return(0); } |
int Bars Количество баров на текущем графике.См. также iBars(). Пример: int counter=1; for(int i=1; i<=Bars; i++) { Print(Close[i-1]); } |
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования