Как сделать невидимую линию не влияющую на масштабирование индикатора - страница 2

 
tara:
Масштабирование экрана в каждом первом случае должно производиться исключительно по видимым объектам, любая иная ситуация - системная ошибка. Напишите об этой ошибке в сервисдеск. 

Тут могучий русский язык, реализованный в MQL. Объект может быть отображаемым, или нет. А вот уже отображаемый объект может быть видимым или невидимым. Топикстартер считает, что невидимый объект должен быть не отображаемым.

Масштабирование производится по отображаемым объектам. А видимый он, или невидимый, это на  усмотрение его создателя.

Число отображаемых буферов устанавливается свойством #property indicator_buffers. А невидимость задает стиль рисования DRAW_NONE. Стиль рисования не влияет на масштабирование.



 
Mislaid:

Тут могучий русский язык, реализованный в MQL. Объект может быть отображаемым, или нет. А вот уже отображаемый объект может быть видимым или невидимым. Топикстартер считает, что невидимый объект должен быть не отображаемым.

Масштабирование производится по отображаемым объектам. А видимый он, или невидимый, это на  усмотрение его создателя.

Число отображаемых буферов устанавливается свойством #property indicator_buffers. А невидимость задает стиль рисования DRAW_NONE. Он не влияет на масштабирование.



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

Есть одно исключение,- если я сделал на время некоторые объекты  DRAW_NONE,- тогда менять масштаб не надо, поэтому этот атрибут не должен влиять на масштабирование. 

Итог:  #property indicator_buffers устанавливает не число отображаемых, а общее число распределяемых под программу буферных массивов. Сколько из них отображать, определяет другая константа. Топикстартер утверждает, что использовал и ту и другую, но кода мы с Вами не видели :( 

ЗЫ А вообще, индикаторный буфер, как я понимаю, начинает свое полноценное существование по завершении работы функции init(), поэтому обсуждать влияние DRAW_NONE на масштабирование экрана - все равно, что обсуждать влияние лунного света на ржавение автомата. 

 
tara:

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

Есть одно исключение,- если я сделал на время некоторые объекты  DRAW_NONE,- тогда менять масштаб не надо, поэтому этот атрибут не должен влиять на масштабирование. 

Итог:  #property indicator_buffers устанавливает не число отображаемых, а общее число распределяемых под программу буферных массивов. Сколько из них отображать, определяет другая константа. Топикстартер утверждает, что использовал и ту и другую, но кода мы с Вами не видели :(

Вы читали справку. А она не соответствует текущему состоянию дел. #property indicator_buffers устанавливает число отображаемых, а только, IndicatorBuffers() может поставить итог числа распределяемых под программу буферных массивов.

Да, заявку, чтобы в СервисДеск это поправили, я отправил.

 
Mislaid:

Вы читали справку. А она не соответствует текущему состоянию дел. #property indicator_buffers устанавливает число отображаемых, а только, IndicatorBuffers() может поставить итог числа распределяемых под программу буферных массивов.

Да, заявку, чтобы в СервисДеск это поправили, я отправил.

Распределенных по факту. Почувствуйте разницу. 
 
evillive:

Билд 988, работает в этом смысле точно также, как и предыдущие, ничего нового в функционале DRAW_NONE не замечено. Точно так же невидимая линия влияет на масштаб видимых (в отдельном окне).

Лучше всего скрытые буферы, те ни на что не влияют, но доступны через iCustom(). 

Специально только что на коленке модифицировал индикатор

//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Averages Convergence/Divergence"
#property strict

#include <MovingAverages.mqh>

//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
//--- indicator parameters
input int InpFastEMA=12;   // Fast EMA Period
input int InpSlowEMA=26;   // Slow EMA Period
input int InpSignalSMA=9;  // Signal SMA Period
//--- indicator buffers
double    ExtMacdBuffer[];
double    ExtSignalBuffer[];
double    ExtAddBuffer[];
//--- right input parameters flag
bool      ExtParameters=false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_NONE);    // поменяйте на DRAW_LINE и посмотрите
   SetIndexDrawBegin(1,InpSignalSMA);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
   SetIndexBuffer(2,ExtAddBuffer);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")");
   SetIndexLabel(0,"MACD");
   SetIndexLabel(1,"Signal");
//--- check for input parameters
   if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)
     {
      Print("Wrong input parameters");
      ExtParameters=false;
      return(INIT_FAILED);
     }
   else
      ExtParameters=true;
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const datetime& time[],
                 const double& open[],
                 const double& high[],
                 const double& low[],
                 const double& close[],
                 const long& tick_volume[],
                 const long& volume[],
                 const int& spread[])
  {
   int i,limit;
//---
   if(rates_total<=InpSignalSMA || !ExtParameters)
      return(0);
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- macd counted in the 1-st buffer
   for(i=0; i<limit; i++)
     {
      ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
                    iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
      ExtAddBuffer[i]=ExtMacdBuffer[i]+_Point*100;
     }
//--- signal line counted in the 2-nd buffer
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+


Поменяйте DRAW_NONE на DRAW_LINE и увидите как масштаб изменится под третью линию (следующий рисунок). Поменяйте обратно - масштаб будет без учёта третьей линии (как на предыдущем рисунке)


 
stringo:

Специально только что на коленке модифицировал индикатор


Поменяйте DRAW_NONE на DRAW_LINE и увидите как масштаб изменится под третью линию (следующий рисунок). Поменяйте обратно - масштаб будет без учёта третьей линии (как на предыдущем рисунке)


Ну так а я о чём? Влияет на масштаб! Особенно когда значение невидимой линии на порядок больше видимых, в вашем примере просто разница небольшая, попробуйте разницу на несколько порядков и более, нагляднее будет.

Который год этого не исправляют уже, раз линия невидима, то она и на масштаб влиять не должна.

 
evillive:

Ну так а я о чём? Влияет на масштаб! Особенно когда значение невидимой линии на порядок больше видимых, в вашем примере просто разница небольшая, попробуйте разницу на несколько порядков и более, нагляднее будет.

Который год этого не исправляют уже, раз линия невидима, то она и на масштаб влиять не должна.

Так я Вам представил выше 2 скриншота! DRAW_NONE (1-й скриншот) на масштаб не влияет. Как раз то, что просили
 
stringo:
Так я Вам представил выше 2 скриншота! DRAW_NONE (1-й скриншот) на масштаб не влияет. Как раз то, что просили

Сделайте разницу на порядок-два и неприятно удивитесь )))

Вот, переделал первый попавшийся индикатор, сначала DRAW_LINE, потом DRAW_NONE и последний - скрытый буфер: (#property indicator_buffers 2,   IndicatorBuffers(4))

 

  

 

DRAW_NONE на масштаб влияет или нет?

Нет, не влияет. Я Вам доказал, что наличие у буфера стиля DRAW_NONE исключает этот буфер из учёта при расчёте минимума-максимума подокна.

Вы теперь говорите про какие-то скрытые буферы. А это уже другой вопрос!

К тому же, я Вам представил полный код индикатора, а Вы - нет. Вы даже одной строчки кода не показали

 
stringo:

DRAW_NONE на масштаб влияет или нет?

Нет, не влияет. Я Вам доказал, что наличие у буфера стиля DRAW_NONE исключает этот буфер из учёта при расчёте минимума-максимума подокна.

Вы теперь говорите про какие-то скрытые буферы. А это уже другой вопрос!

К тому же, я Вам представил полный код индикатора, а Вы - нет. Вы даже одной строчки кода не показали

Видимо мы по-разному понимаем суть проблемы. Я вижу это так: раз стиль буфера DRAW_NONE, то масштаб окна должен быть учтён без этого буфера. Это как на третьем скриншоте, там этот буфер скрыт, но рассчитывается и доступен через iCustom.

 НО! Масштаб окна, тем не менее, такой, как и со стилем DRAW_LINE, что искажает отображение видимых линий индикатора, это хорошо видно на первых двух картинках (там #property indicator_buffers 4, IndicatorBuffers(4); первая картинка DRAW_LINE и вторая - DRAW_NONE).

Да, ещё я стиль и тип отрисовки через #property задаю, а не через  SetIndexStyle(), может из-за этого и весь спор...

Вот вам код раз так доказывать что-то надо, ничего там особенного нет, просто надо стиль последнего буфера да количество буферов в #property indicator_buffers менять, чтобы эту разницу видеть.

 

Файлы:
Причина обращения: