Вопрос к разработчикам: в связи с чем возникает данное явление?

 

Суть в следующем - есть обычный индикатор МА, только отображается он в подокне. Вот его код:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

extern int period=10;
double ma[];

int init()
  {
   SetIndexBuffer(0,ma);
   SetIndexStyle(0,DRAW_LINE);
   return(0);
  }

int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars;

   for (int i=limit; i>=0; i--)
      {
      ma[i]=iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
      }
   return(0);
  }

Теперь добавляем две скользящие в окно графика, и две скользящие с теми же параметрами размещаем в подокне. В итоге кривые МА размещённые в окне, будут отличаться от кривых МА размещённых в подокне. Вот скрин:

Различие в конфинурации кривых - видно с первого взгляда. Причём заметьте, в данном случае речь не идёт о расчёте МА от значений другого МА. Написал скрипт, который выводит значения двух МА из окна графика и двух МА в подокне в Эксель. Значения абсолютно одинаковы (в принципе по другому и быть не могло), а вот кривые разные.

Вот и возник вопрос: в связи с чем возникает такое несоответствие значений и изображения?

 
автомасштаб в подокне действует а в основном окне натуральный масштаб
 

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

 

Индикаторы, выводящиеся в основном окне, привязаны к ценовой шкале графика. Поэтому выводятся в одинаковом масштабе.

Индикаторы в отдельном подокне, каждый сам за себя. Единой ценовой шкалы нет, поэтому каждый индикатор рассчитывает свой масштаб самостоятельно, исходя из своих видимых минимума и максимума. Зафиксируйте у обоих индикаторов одинаковые минимумы и одинаковые максимумы и Вы увидите нормальную картинку, так как масштабы совпадут

 

Вывод - нужно или зафиксировать масштаб - но лучше построить два буфера

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue


extern int period1=10;
extern int period2=20;
double ma1[];
double ma2[];

int init()
  {
   SetIndexBuffer(0,ma1); SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(1,ma2); SetIndexStyle(1,DRAW_LINE);
   return(0);
  }

int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars;

   for (int i=limit; i>=0; i--)
      {
      ma1[i]=iMA(NULL,0,period1,0,MODE_EMA,PRICE_CLOSE,i);
      ma2[i]=iMA(NULL,0,period2,0,MODE_EMA,PRICE_CLOSE,i);
      }
   return(0);
  }
 

Большое спасибо всем за ответы. Попробовал построить два буфера - теперь кривые абсолютно идентичны.

И на эту тему последний вопрос:

Механизм автомасштабирования работает для каждой скользящей независимо и старается так подобрать вертикальный масштаб, чтобы на всем видимом пользователю участке минимальное и максимальное значение индикатора занимало N процентов подокна.

Т.е. таким образом пересечения скользящих в подокне (в прикреплённом мною в первом посте скриншоте) - это, так сказать, особенности масштабирования, и искать какие-либо закономерности в таком варианте отображения МА попросту не имеет смысл, поскольку в каждом конкретном случае всё будет зависеть от размаха значений скользящих и того, как на это отреагирует механизм автомасштабирования. я правильно понимаю?
 
ага. тем более, когда ты будешь двигать график - линии будут прыгать друг относительно друга и точки пересечения тоже менятся.
 
sergeev писал(а) >>
ага. тем более, когда ты будешь двигать график - линии будут прыгать друг относительно друга и точки пересечения тоже менятся.

Понял, спасибо. Да, действительно - линии прыгают (как это раньше не обратил внимания - сам не понимаю).

Причина обращения: