Так и должно быть?

 

Или что-то не понято?

 

Сверху МА 10, simple, close со сдвигом 10.

Снизу -  индикатор находит хэндл верхнего индикатора, копирует его буфер:

CopyBuffer(Handle,BufferIndex,0,rates_total,BufferBuffer); 
Для того, чтобы получить у нижнего индикатора такую же картинку как у верхнего, нужно скопировать со сдвигом не 10, не -10, а -20.
 
Думаю, что копирование должно выполняться 1 в 1 (параллельно), только хвост справа обрезаться (в лучшем бы случае).
 

imho значения копируются не с картинки в буфер, а таки из буфера в буфер и на это копирование сдвиг никак не должен влиять.


Для того, чтобы получить у нижнего индикатора такую же картинку как у верхнего, нужно скопировать со сдвигом не 10, не -10, а -20.

Эт как-то не правильно.

Что-то писал со сдвигом, подробностей не помню, давно дело было, но тоже какая-то беда была :)


с servicedesk уже ругались?)

 
Swan:

...

с servicedesk уже ругались?)

Пока нет.

Если в МТ4 iМА с параметром Shift (не тот, который последний), последним праметром передать 0, то получаем значение которое на баре 0 у сдвинутой у МА. За координаты приняты бары цены. И это правильно, потому-что интересуют значения на каком-то конкретном баре.  Заморочки с вычислениями в индикаторе, когда у буфера установлен сдвиг через SetIndexShift(), но это не страшно, потому, что располагаем параметром сдвига, на сколько сдвинули в SetIndexShift(), на столько же смещаемся при обращении к буферу. 

Здесь... Если попытаться скопировать значение с бара 0, вообще ничего не получим.

1. Нет аналогии с МТ4.

2. Странно выглядит то, чтобы получить значения соответствующие барам, надо выполнять копирование с удвоенным сдвигом.

3. Если надо действительно делать так, как написано в п.2, то это большая проблема, потому что с каждым индикатором надо разбираться, есть ли у него параметр сдвига, а просто хэнладми пользоваться становится нереальным. Прежде, чем включать индикатор в эксперта, его нужно досконально исследовать, нет ли у него параметра сдвига.

Скромно надеюсь, что это все-таки ошибка в терминале, где то перепутан "+" с "-" или "-" с "+", потому-что очень странный п.2. 

 

 
Integer:

...

Скромно надеюсь, что это все-таки ошибка в терминале, где то перепутан "+" с "-" или "-" с "+", потому-что очень странный п.2. 

Вышло экстренное обновление (build 772). Проблема осталась?
 
tol64:
Вышло экстренное обновление (build 772). Проблема осталась?
Пока осталась.
 
Integer:

Или что-то не понято?

Да, такое поведение заложено и меняться не будет. Сдвиг индикатора влияет только на отображение.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 
Integer:
Для того, чтобы получить у нижнего индикатора такую же картинку как у верхнего, нужно скопировать со сдвигом не 10, не -10, а -20.

Не совсем так:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MABuffer[];
//---
int            Handle;
int            shift=10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_SHIFT,shift);
   Handle=iMA(Symbol(),Period(),2,shift,MODE_SMA,PRICE_CLOSE);
   ChartIndicatorAdd(0,0,Handle);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArrayInitialize(MABuffer,EMPTY_VALUE);
   CopyBuffer(Handle,0,-shift,rates_total,MABuffer); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
antt:

Не совсем так:

В вашем примере сначала буферу ставится смещение: 

PlotIndexSetInteger(0,PLOT_SHIFT,shift);

Потом копирование выполняется со смещением:

CopyBuffer(Handle,0,-shift,rates_total,MABuffer);  

По одному значению shift, но два раза, итого смещение удвоенное.

Если буферу смещение не ставить, то необходимо выполнять копирование с удвоенным смещением. 

#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrYellow
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         MABuffer[];
//---
int            Handle;
int            shift=10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   //PlotIndexSetInteger(0,PLOT_SHIFT,shift);
   Handle=iMA(Symbol(),Period(),2,shift,MODE_SMA,PRICE_CLOSE);
   ChartIndicatorAdd(0,0,Handle);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArrayInitialize(MABuffer,EMPTY_VALUE);
   CopyBuffer(Handle,0,-shift*2,rates_total,MABuffer); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 

 



 
Renat:
Да, такое поведение заложено и меняться не будет. Сдвиг индикатора влияет только на отображение.
В работу функции CopyBuffer должен быть заложен учет смещения установленного буферу через PlotIndexSetInteger(0,PLOT_SHIFT,shift), или, хотя бы, должна быть возможность, кроме копирования значений буфера, получить значение его смещения.
 
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Label1Buffer[];
int h;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  
  h=iMA(NULL,0,10,10,MODE_SMA,PRICE_CLOSE);
  
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   
   CopyBuffer(h,0,0,rates_total,Label1Buffer); 
   return(rates_total);
  }

От такого кода имеем такую. картинку:

 

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

Если располагаем только хэндлом? 

В общем, эта фича (которая, оказывается не баг) значительно снижает функциональные возможности терминала.

 

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