Помогите исправить ошибку в самопальном индикаторе

 
Написал адаптивную скользящую среднюю по Кауффману. Рисует правильно. В окне данных отображаются правильные значения.
Выводил через Print() индикаторные буферы. Всё соответствует истине.
Вот код:

//+------------------------------------------------------------------+
//|                                                     AMAstdev.mq4 |
//|                                 Copyright © 2006, D&S Kiriyenko. |
//|                 http://groups.google.com/group/expert-developing |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, D&S Kiriyenko."
#property link      "http://groups.google.com/group/expert-developing"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightGreen
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 2
#property indicator_color3 Blue
#property indicator_width3 2
 
//+------------------------------------------------------------------+
//| макроопределения                                                 |
//+------------------------------------------------------------------+
 
//---- строковые константы
#define INDICATOR_SHORT_NAME "AMAstdev"
#define MAIN "AMA line"
#define UP   "UpTrend point"
#define DOWN "DownTrend point"
 
//+------------------------------------------------------------------+
//| внешние переменные                                               |
//+------------------------------------------------------------------+
 
//---- периоды
extern int       periodAMA = 9;   //период расчёта к-та эффективности
extern double    nfast     = 2;   //период EMA для эффективного рынка
extern double    nslow     = 30;  //период EMA для неэффективного рынка
 
//---- расчёт сглаживающей константы
extern double    Pow       = 2.0; //степень эффективности 
 
//---- влияние стандартного отклонения
extern double    dK        = 1.0; //коэффициент для фильтра
 
//+------------------------------------------------------------------+
//| глобальные переменные                                            |
//+------------------------------------------------------------------+
 
//---- буферы
double kAMAbuffer[];
double kAMAupsig[];
double kAMAdownsig[];
 
//---- оптимизация кода индикатора
int    cbars = 0, prevbars = 0, prevtime = 0;
 
//---- сглаживающие коэффициенты
double slowSC, fastSC;
 
//---- приращения индикатора
double ddAMA[];
 
//+------------------------------------------------------------------+
//| Вставка значения в массив приращений                             |
//+------------------------------------------------------------------+
bool InsertDif(double a)
  {
//---- проверка, заполнен ли массив
   for (int i = 0; i < periodAMA; i++) //для всех элементов массива
      if (ddAMA[i] == 0) //если элемент равен нулю
        {
         ddAMA[i] = a; //сохраняем значение в этот элемент
         return (true); //и удачно завершаемся
        }
//---- массив уже заполнен, нужно вставлять элемент с конца
   for (i = 0; i < periodAMA-1;i++) //все элементы массива, кроме последнего
      ddAMA[i] = ddAMA[i+1]; //сдвигаем влево на одну позицию
   ddAMA[periodAMA-1] = a; //и записываем значение в самую правую позицию
   return (true); //после чего удачно завершаемся
  }
 
//+------------------------------------------------------------------+
//| Инициализация                                                    |
//+------------------------------------------------------------------+
int init()
  {
//---- индикаторы
//---- главная линия
   SetIndexBuffer(0,kAMAbuffer);
   SetIndexStyle(0,DRAW_LINE,0,2);
   SetIndexLabel(0,MAIN);
//---- подтверждение восходящего тренда
   SetIndexBuffer(1,kAMAupsig);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,159);
   SetIndexLabel(1,UP);
//---- подтверждение нисходящего тренда
   SetIndexBuffer(2,kAMAdownsig);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,159);
   SetIndexLabel(2,DOWN);
//---- настройки индикатора
   IndicatorDigits(4);
   string name = StringConcatenate(INDICATOR_SHORT_NAME,
                                   " (",periodAMA,"/",nfast,"/",nslow,")");
   IndicatorShortName(name);
//---- расчёт к-тов    
   slowSC = (2.0 /(nslow+1)); //медленный к-т сглаживания
   fastSC = (2.0 /(nfast+1)); //быстрый к-т сглаживания
//---- подготовка массива
   ArrayResize(ddAMA,periodAMA);
   ArrayInitialize(ddAMA,0.);
//---- готово
   return(0);
  }
 
//+------------------------------------------------------------------+
//| Деинициализация                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
 
//+------------------------------------------------------------------+
//| Итерационная функция                                             |
//+------------------------------------------------------------------+
int start()
  {
//---- оптимизация производительности   
   if (prevbars == Bars) return(0); //если индикатор уже посчитан, выходим 
   cbars = IndicatorCounted(); //к-во посчитанных баров
   if (Bars <= (periodAMA+2)) return(0); // если баров на графике
   if (cbars < 0) return(-1); //выходим при некорректном значении переменных
   if (cbars > 0) cbars--; //последний посчитанный бар будет пересчитан
//---- подготовка переменных
   int pos = Bars-cbars-periodAMA-2; //счётчик в начало периода
   double AMA0; //предыдущее AMA
   if (cbars == 0) AMA0 = Close[pos+1]; //предыдущее AMA не расчитывалось
//---- расчёт индикатора
   while (pos>=0)
     {
   //---- расчёт сигнала
      double signal = MathAbs(Close[pos]-Close[pos+periodAMA]); //трендовая составляющая
   //---- расчёт шума
      double noise = 0.000000001;
      for (int i = 0;i<periodAMA;i++)
        {
         noise = noise + MathAbs(Close[pos+i]-Close[pos+i+1]); //шумовая составляющая
        }
   //---- расчёт коэффициента сглаживания
      double ER = signal/noise; //коэффициент эффективности
      double SSC = ER*(fastSC-slowSC) + slowSC; //коэффициент сглаживания
   //---- расчёт главной линии
      double AMA = AMA0 + (MathPow(SSC,Pow)*(Close[pos]-AMA0)); //расчёт
      kAMAbuffer[pos]=AMA; //вывод
   //---- расчёт фильтрации тренда
      double ddK = (AMA - AMA0)/Point; //разность
      InsertDif(ddK); //накапливаем приращение
      if (pos < Bars - 2*(periodAMA+2)) //если баров накопилось достаточно
        {
      //---- расчёт среднего арифметического
         double SMAdif = 0; //вначале равно нулю
         for (i = 0; i < periodAMA; i++)
           {
            SMAdif += ddAMA[i]; //последовательно суммируем
           }
         SMAdif /= periodAMA; //и делим на количество
      //---- расчёт стандартного отклонения
         double StDev = 0; //вначале равно нулю
         for (i = 0; i < periodAMA; i++)
           {
            StDev += MathPow(ddAMA[i]-SMAdif,2); //суммируем квадраты отклонений
           }
         StDev = MathSqrt(StDev)/periodAMA; //извлекаем корень и делим на количество
      //---- расчёт фильтра
         double Filter = dK*StDev;
      //---- обработка значений
         if (ddK > Filter) kAMAupsig[pos] = AMA; //есть восходящий тренд
            else kAMAupsig[pos] = 0; //нет восходящего тренда
         if (ddK < -Filter) kAMAdownsig[pos] = AMA; //есть нисходящий тренд
            else kAMAdownsig[pos] = 0; // нет нисходящего тренда
        }
   //---- переход к концу цикла
      AMA0 = AMA; //сохраняем предыдущее значение AMA
      pos--; //переходим к сдедующему бару
     }
//---- завершение работы
   prevbars=Bars; //сохраняем количество баров
   return(0); //готово
  }
При чтении кода из эксперта через функцию iCustom() наблюдаю странность - содержимое всех трёх индикаторных буферов по мнению iCustom() равно 2147483647 (максимум для типа int). Мало того, при обращении к нескольким следующим буферам (которых не существует), получаю сплошной ряд нулей. И только после определённого номера (не помню, какого), чтение следующего индикаторного буфера возвращает ошибку "Нет такого буфера".
Читаю так:
double AMA = iCustom(NULL,0,"AMAstdev",0,1); //с параметрами по умолчанию
double upsig = iCustom(NULL,0,"AMAstdev",9,2,30,2.0,1.0); //с заданными параметрами

Приходится писать отдельную функцию, которая считает этот индикатор, а это очень неудобно и вообще - мои предыдущие самопальные индикаторы, а также скачанные поделки других писателей :) прекрасно читаются обычным способом.

В чём дело я уже слабо себе представляю.
Помогите!
Файлы:
amastdev.mq4  8 kb
 

Ошибка в числе передаваемых параметров (очень распространенная у новичков):

double upsig = iCustom(NULL,0,"AMAstdev",9,2,30,2.0,1.0 , int mode, int shift); //с заданными параметрами

См. справку по iCustom(...) и поиск по форуму с ключом "АМА" (лат. регистр) - там есть примеры получше.

 

Ошибка в числе передаваемых параметров (очень распространенная у новичков):

double upsig = iCustom(NULL,0,"AMAstdev",9,2,30,2.0,1.0 , int mode, int shift); //с заданными параметрами


Это опечатка. Читал я именно с параметрами mode и shift. Всё равно возвращает 2147... и так далее.

поиск по форуму с ключом "АМА" (лат. регистр) - там есть примеры получше.

Пример там всё тот же - только без расчёта стандартного отклонения, просто сигналом считается отклонение линии на заданное количество пунктов.
Зато обнаружил как минимум ещё одного человека, у которого те же проблемы - причём с кодом, взятым прямо отсюда.

Функция iAMA, предложенная KimIV мне не помогла (руки кривые?). Потому как написать индикатор на ней что-то не получилось, а хочется, чтобы и индикатор, и эксперт получали гарантировано одно и то же.

Всё же, как получить правильные значения из программы?
 
Вот в этом месте

         if (ddK > Filter) kAMAupsig[pos] = AMA; //есть восходящий тренд
            else kAMAupsig[pos] = 0; //нет восходящего тренда
         if (ddK < -Filter) kAMAdownsig[pos] = AMA; //есть нисходящий тренд
            else kAMAdownsig[pos] = 0; // нет нисходящего тренда

нет записи нулевых значений, почитайте https://www.mql5.com/ru/forum/50458
 
Rosh:
Вот в этом месте

         if (ddK > Filter) kAMAupsig[pos] = AMA; //есть восходящий тренд
            else kAMAupsig[pos] = 0; //нет восходящего тренда
         if (ddK < -Filter) kAMAdownsig[pos] = AMA; //есть нисходящий тренд
            else kAMAdownsig[pos] = 0; // нет нисходящего тренда

нет записи нулевых значений, почитайте https://www.mql5.com/ru/forum/50458

Спасибо, Rosh. Я вставил строки вида
SetIndexEmptyValue(0,0.0);
в Init функцию для каждого индикаторного буфера. Теперь, я таки получаю нулевые значения. Всегда и везде. Включая нулевой буфер индикатора, т.е., тот, который содержит значения самой линии (которая не может быть равна нулю). Таким образом, проблема не только в этом. Правильные значения - это не только "не 2147... ". Это те значения, которые показывает индикатор в окне графика и в окне данных. Скажите, проблема в коде или между клавиатурой и креслом?
 
Щас
 
Попробуйте этот вариант


//+------------------------------------------------------------------+
//|                                            AMAstdevKiriyenko.mq4 |
//|                                                        Kiriyenko |
//|                                    'Помогите исправить ошибку в самопальном индикаторе' |
//+------------------------------------------------------------------+
#property copyright "Kiriyenko"
#property link      "'Помогите исправить ошибку в самопальном индикаторе'"
 
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightGreen
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 2
#property indicator_color3 Blue
#property indicator_width3 2
 
//+------------------------------------------------------------------+
//| макроопределения                                                 |
//+------------------------------------------------------------------+
 
//---- строковые константы
#define INDICATOR_SHORT_NAME "AMAstdev"
#define MAIN "AMA line"
#define UP   "UpTrend point"
#define DOWN "DownTrend point"
 
//+------------------------------------------------------------------+
//| внешние переменные                                               |
//+------------------------------------------------------------------+
 
//---- периоды
extern int       periodAMA = 9;   //период расчёта к-та эффективности
extern double    nfast     = 2;   //период EMA для эффективного рынка
extern double    nslow     = 30;  //период EMA для неэффективного рынка
 
//---- расчёт сглаживающей константы
extern double    Pow       = 2.0; //степень эффективности 
 
//---- влияние стандартного отклонения
extern double    dK        = 1.0; //коэффициент для фильтра
 
//+------------------------------------------------------------------+
//| глобальные переменные                                            |
//+------------------------------------------------------------------+
 
//---- буферы
double kAMAbuffer[];
double kAMAupsig[];
double kAMAdownsig[];
 
//---- оптимизация кода индикатора
int    cbars = 0, prevbars = 0, prevtime = 0;
 
//---- сглаживающие коэффициенты
double slowSC, fastSC;
 
//---- приращения индикатора
double ddAMA[];
 
//+------------------------------------------------------------------+
//| Вставка значения в массив приращений                             |
//+------------------------------------------------------------------+
bool InsertDif(double a)
  {
//---- проверка, заполнен ли массив
   for (int i = 0; i < periodAMA; i++) //для всех элементов массива
      if (ddAMA[i] == 0) //если элемент равен нулю
        {
         ddAMA[i] = a; //сохраняем значение в этот элемент
         return (true); //и удачно завершаемся
        }
//---- массив уже заполнен, нужно вставлять элемент с конца
   for (i = 0; i < periodAMA-1;i++) //все элементы массива, кроме последнего
      ddAMA[i] = ddAMA[i+1]; //сдвигаем влево на одну позицию
   ddAMA[periodAMA-1] = a; //и записываем значение в самую правую позицию
   return (true); //после чего удачно завершаемся
  }
 
//+------------------------------------------------------------------+
//| Инициализация                                                    |
//+------------------------------------------------------------------+
int init()
  {
//---- индикаторы
//---- главная линия
   SetIndexBuffer(0,kAMAbuffer);
   SetIndexStyle(0,DRAW_LINE,0,2);
   SetIndexLabel(0,MAIN);
//---- подтверждение восходящего тренда
   SetIndexBuffer(1,kAMAupsig);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,159);
   SetIndexLabel(1,UP);
//---- подтверждение нисходящего тренда
   SetIndexBuffer(2,kAMAdownsig);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,159);
   SetIndexLabel(2,DOWN);
//---- настройки индикатора
   IndicatorDigits(4);
   string name = StringConcatenate(INDICATOR_SHORT_NAME,
                                   " (",periodAMA,"/",nfast,"/",nslow,")");
   IndicatorShortName(name);
//---- расчёт к-тов    
   slowSC = (2.0 /(nslow+1)); //медленный к-т сглаживания
   fastSC = (2.0 /(nfast+1)); //быстрый к-т сглаживания
//---- подготовка массива
   ArrayResize(ddAMA,periodAMA);
   ArrayInitialize(ddAMA,0.);
//---- готово
   return(0);
  }
 
//+------------------------------------------------------------------+
//| Деинициализация                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
 
//+------------------------------------------------------------------+
//| Итерационная функция                                             |
//+------------------------------------------------------------------+
int start()
  {
//---- оптимизация производительности   
   double var1,var2;
 
   if (prevbars == Bars) return(0); //если индикатор уже посчитан, выходим 
   cbars = IndicatorCounted(); //к-во посчитанных баров
   if (Bars <= (periodAMA+2)) return(0); // если баров на графике
   if (cbars < 0) return(-1); //выходим при некорректном значении переменных
   if (cbars > 0) cbars--; //последний посчитанный бар будет пересчитан
//---- подготовка переменных
   int pos = Bars-cbars-periodAMA-2; //счётчик в начало периода
   double AMA0; //предыдущее AMA
   if (cbars == 0) AMA0 = Close[pos+1]; //предыдущее AMA не расчитывалось
//---- расчёт индикатора
   while (pos>=0)
     {
   //---- расчёт сигнала
      double signal = MathAbs(Close[pos]-Close[pos+periodAMA]); //трендовая составляющая
   //---- расчёт шума
      double noise = 0.000000001;
      for (int i = 0;i<periodAMA;i++)
        {
         noise = noise + MathAbs(Close[pos+i]-Close[pos+i+1]); //шумовая составляющая
        }
   //---- расчёт коэффициента сглаживания
      double ER = signal/noise; //коэффициент эффективности
      double SSC = ER*(fastSC-slowSC) + slowSC; //коэффициент сглаживания
   //---- расчёт главной линии
      double AMA = AMA0 + (MathPow(SSC,Pow)*(Close[pos]-AMA0)); //расчёт
      kAMAbuffer[pos]=AMA; //вывод
   //---- расчёт фильтрации тренда
      double ddK = (AMA - AMA0)/Point; //разность
      InsertDif(ddK); //накапливаем приращение
      if (pos < Bars - 2*(periodAMA+2)) //если баров накопилось достаточно
        {
      //---- расчёт среднего арифметического
         double SMAdif = 0; //вначале равно нулю
         for (i = 0; i < periodAMA; i++)
           {
            SMAdif += ddAMA[i]; //последовательно суммируем
           }
         SMAdif /= periodAMA; //и делим на количество
      //---- расчёт стандартного отклонения
         double StDev = 0; //вначале равно нулю
         for (i = 0; i < periodAMA; i++)
           {
            StDev += MathPow(ddAMA[i]-SMAdif,2); //суммируем квадраты отклонений
           }
         StDev = MathSqrt(StDev)/periodAMA; //извлекаем корень и делим на количество
      //---- расчёт фильтра
         double Filter = dK*StDev;
      //---- обработка значений
         var1=0;
         var2=0;
         if (ddK > Filter) var1=AMA; //есть восходящий тренд
         if (ddK < -Filter) var2=AMA; //есть нисходящий тренд
         kAMAupsig[pos] = var1; //нет восходящего тренда
         kAMAdownsig[pos] = var2; // нет нисходящего тренда
            
        }
   //---- переход к концу цикла
      AMA0 = AMA; //сохраняем предыдущее значение AMA
      pos--; //переходим к сдедующему бару
     }
//---- завершение работы
   prevbars=Bars; //сохраняем количество баров
   return(0); //готово
  }
 
Большое спасибо, Rosh, за участие. Ничего не поменялось. Я же говорю, нулю (или миллиардам) равны как upsig и downsig, так и главная линия, которая считается так:
   //---- расчёт главной линии
      double AMA = AMA0 + (MathPow(SSC,Pow)*(Close[pos]-AMA0)); //расчёт
      kAMAbuffer[pos]=AMA; //вывод

Здесь переменная во-первых, в любом случае проинициализирована, во-вторых, не может быть равна нулю ни при каких обстоятельствах.

Высланный в последнем посте код тоже выводит эти самые два миллиарда. Причём, для главной линии тоже. Я понимаю, что SetIndexEmptyValue позволит получать нули. Но требуются не нули.

Забавно, что если печатать содержимое индикаторных буферов из кода индикатора:
Print(kAMAbuffer[pos]);
выводятся нормальные значения.
А через iCustom() - ни-ни. Причём, я пробовал просто заносить в буфер произвольные значения:
kAMAbuffer[pos] = 12.3;
- нифига! В индикаторе всё правильно, а iCustom продолжает дёргать нулевые значения.

И так делают все версии этого индикатора, в том числе, с этого сервера взятые :?

С уважением.
 
Не знаю, что у Вас там не получается, вот такой проверочный скрипт

//+------------------------------------------------------------------+
//|                                                 CheckAMAStep.mq4 |
//|                                                             Rosh |
//|                                    'Помогите исправить ошибку в самопальном индикаторе' |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      "'Помогите исправить ошибку в самопальном индикаторе'"
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
  double main,up,down;
//----
   for (int shift=100;shift>-0;shift--)
      {
      main=iCustom(Symbol(),0,"AMAstdevKiriyenko",9,2,30,2.0,1.0,0,shift);
      up=iCustom(Symbol(),0,"AMAstdevKiriyenko",9,2,30,2.0,1.0,1,shift);
      down=iCustom(Symbol(),0,"AMAstdevKiriyenko",9,2,30,2.0,1.0,2,shift);
      Print("i=","  main=",main,"  up=",up,"   down=",down);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+

выдает на 4х часовке Фунте

2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: removed
2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: removed
2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: deinitialized
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9078 up=1. 9078 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9075 up=1. 9075 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9067 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9067 up=1. 9067 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9064 up=1. 9064 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9057 up=1. 9057 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9044 up=1. 9044 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9043 up=1. 9043 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=1. 9038
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9038 up=1. 9038 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9034 up=1. 9034 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.903 up=1. 903 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9027 up=1. 9027 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9018 up=1. 9018 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9007 up=1. 9007 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.899 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8988 up=1. 8988 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8986 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8986 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8985 up=0 down=1. 8985
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8992 up=0 down=1. 8992
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9002 up=0 down=1. 9002
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9019 up=0 down=1. 9019
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9028 up=0 down=1. 9028
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9036 up=0 down=1. 9036
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9042 up=0 down=1. 9042
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9045 up=0 down=1. 9045
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9047 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9047 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9046 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9046 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9045 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9045 up=1. 9045 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9042 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9041 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9041 up=1. 9041 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9039 up=1. 9039 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9028 up=1. 9028 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9018 up=1. 9018 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.9009 up=1. 9009 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8997 up=1. 8997 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8994 up=1. 8994 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.899 up=1. 899 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8983 up=1. 8983 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8975 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8974 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8974 up=1. 8974 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8973 up=1. 8973 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8972 up=1. 8972 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8969 up=1. 8969 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8963 up=1. 8963 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.895 up=1. 895 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8942 up=1. 8942 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8936 up=1. 8936 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8929 up=1. 8929 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8919 up=1. 8919 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8907 up=1. 8907 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8885 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8886 up=1. 8886 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8872 up=1. 8872 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8853 up=1. 8853 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8839 up=1. 8839 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8804 up=1. 8804 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8781 up=1. 8781 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8755 up=1. 8755 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8751 up=1. 8751 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8742 up=1. 8742 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8735 up=1. 8735 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8733 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8732 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8731 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.873 up=0 down=1. 873
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8735 up=0 down=1. 8735
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8751 up=0 down=1. 8751
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8768 up=0 down=1. 8768
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8781 up=0 down=1. 8781
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8786 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8789 up=0 down=1. 8789
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8798 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8801 up=0 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.88 up=1. 88 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8798 up=1. 8798 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8787 up=1. 8787 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8772 up=1. 8772 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8749 up=1. 8749 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8729 up=1. 8729 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8716 up=1. 8716 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8704 up=1. 8704 down=0
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: i= main=1.8695 up=1. 8695 down=0
2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: initialized
2006.11.13 13:35:27 AMAstdevKiriyenko GBPUSD,H4: loaded successfully
2006.11.13 13:35:27 CheckAMAStep GBPUSD,H4: loaded successfully
2006.11.13 13:35:12 Compiling 'CheckAMAStep'
 
Rosh, спасибо, открыл глаза.
Фишка была в том, что индикатор, наложенный на график, отрисовывался весь, но при поступлении новых баров он этого не делал. Поэтому, при прогоне на истории, он тоже нормально возвращал значение для нулевого бара и все предыдущие, но уже на следующем баре нулевое значение доступно не было.

Исправил я так: почти полностью прибил "оптимизацию" кода - удалил всё, связанное с
cbars = IndicatorCounted();
и дальнейшим использованием переменной cbars. В связи с этим ввёл переменную NumBars - на скольких барах вообще строить индикатор.

В связи с этим, вопрос: где был косяк в оригинальном коде? У меня из-за отсутствия индикатора просто работа стоит (стояла), поэтому я ошибку из академического интереса искать не стал, просто исправил таким образом. Но академический интерес остался. Как надо было правильно использовать IndicatorCounted в приведённом индикаторе? Кому интересно и не лень, подскажите.
 
dmitriy:
Rosh, спасибо, открыл глаза.
Фишка была в том, что индикатор, наложенный на график, отрисовывался весь, но при поступлении новых баров он этого не делал. Поэтому, при прогоне на истории, он тоже нормально возвращал значение для нулевого бара и все предыдущие, но уже на следующем баре нулевое значение доступно не было.

Исправил я так: почти полностью прибил "оптимизацию" кода - удалил всё, связанное с
cbars = IndicatorCounted();
и дальнейшим использованием переменной cbars. В связи с этим ввёл переменную NumBars - на скольких барах вообще строить индикатор.

В связи с этим, вопрос: где был косяк в оригинальном коде? У меня из-за отсутствия индикатора просто работа стоит (стояла), поэтому я ошибку из академического интереса искать не стал, просто исправил таким образом. Но академический интерес остался. Как надо было правильно использовать IndicatorCounted в приведённом индикаторе? Кому интересно и не лень, подскажите.
Насколько я вижу, Вы забыли "подавить" нулем значение, возвращаемое по умолчанию как нерисуемое.
SetIndexEmptyValue(Номер_буффера,0.0);
Иначе как нерисуемое взвращается EMPTY_VALUE, которое отлично от нуля.
В той ветке, на которую Rosh ссылался это только краем прошло.

Успехов.
Причина обращения: