Вопросы новичка по индикатору ccelerator / decelerator.

 
всем привет! пытаюсь разобраться в метатрейдере 4, на данный момент разбираю как работают индикаторы остановился конечно сразу же на первом из них - accelerator / decelerator - помогите пожалуиста, подскажите как именно на пальцах понять что с чем сравнивается, то есть int (limit, counted_bars=IndicatorCounted, prev,current), то есть в некоторую единицу времени например мы имеем на графике 100 свечей - чему будет равен counted bars и просто bars ??? //+------------------------------------------------------------------+ //| accelerator/decelerator oscillator | //+------------------------------------------------------------------+ int start() { int limit; int counted_bars=IndicatorCounted(); double prev,current; //----check for possible errors if(counted_bars0) counted_bars--; limit=Bars-counted_bars; заранее благодарен !!!
 

У меня были такие же вопросы когда я начал изучать 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) добрым делом.

 
to gpwr большое спасибо за разъяснение у меня такая просьба ко всем опытным пользователям (программистам) mql 4 - не могли бы Вы дать пару уроков по данному языку, на уровне разъяснения стандартных индикаторов на страничке тех анализ (26 индикаторов) domino-fx@mail. ru
 

Путь новичка к профессионализму всегда традиционен. Никто объяснением "на пальцах" из вас профи не сделает!
1. Читаем https://docs.mql4.com/ru/ (ВСЁ ПОДРЯД! Пускай с первого прочтения вы не поймёте больше половины! Почитаете ещё раз позже)
2. Читаем http://www.alpari-idc.ru/ru/experts/articles/
3. После этого на 99% Ваших вопросов вы найдёте ответ самостоятельно.
4. Оставшийся 1% вопросов зададите на этом форуме. Обязательно помогут, поскольку вопросы будут интересны остальным.
5. После всего этого вы поймёте, что трудности освоения программирования - это ВСЁ ТАКАЯ ЧУШЬ по сравнению с поиском самой торговой стратегии, с помощью которой вы будете зарабатывать деньги на Форексе!



int IndicatorCounted(
)
Функция возвращает количество баров, не измененных после последнего вызова индикатора. Большинство подсчитанных баров не нуждается в пересчете. Функция используется для оптимизации вычислений.

Замечание: самый последний бар не считается посчитанным, и в большинстве случаев необходимо пересчитывать только его. Однако бывают пограничные случаи, когда вызов пользовательского индикатора производится из эксперта на первом тике нового бара. Возможна ситуация, что последний тик предыдущего бара не обработан (по той причине, что в момент прихода этого последнего тика обрабатывался предпоследний тик), и пользовательский индикатор не был вызван и поэтому не был рассчитан. Чтобы избежать в такой ситуации ошибок расчета индикатора, функция 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]);
    }