Изучаем и пишем вместе на MQL5 - страница 9

 
gdtt:

в советнике используется

берется значение с 0-го бара, значения индикаторных буферов  для него изменяются на каждом тике до закрытия свечи.

 

Все верно, это я экпериментировал, но в сущности это не решает главную проблему.-- Как из эксперта заставить индикатор пересчитать индикаторный буфер не только на запрашиваемом баре, но и несколько баров назад

Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 

Возможно решение найдено! Одно из...

Для этого, правда,  надо делать специальную версию индикатора.

 

Господа,

пишу некий индикатор: ...
int handle;
double indicatorBuffer[];
...
int OnInit()
{
... handleMA = iMA(_Symbol, _Period, periodMA, shiftMA, MODE_SMA, AppPrice);
...
}

int OnCalculate (const int rates_total,         // размер массива price[]  
                        const int prev_calculated, // обработано баров на предыдущем вызове
                        const int begin,               // откуда начинаются значимые данные  
                        const double& price[])     // массив для расчета  
{
... что-то делаю

Вопрос в том – как дать знать в handleMA = iMA(_Symbol, _Period, periodMA, shiftMA, MODE_SMA, AppPrice), что есть AppPrice?
                       или как извлечь Apply to: из закладки Parameters для использования в коде? 

Заранее спасибо…  

 
FlyAgaric:

Господа,


Вопрос в том – как дать знать в handleMA = iMA(_Symbol, _Period, periodMA, shiftMA, MODE_SMA, AppPrice), что есть AppPrice?
                       или как извлечь Apply to: из закладки Parameters для использования в коде? 

Заранее спасибо…  

Смотрите OnCalculate():

Выбор необходимой таймсерии или индикатора в качестве массива price[] производится пользователем при запуске индикатора на закладке "Parameters". Для этого необходимо указать нужный элемент в выпадающем списке поля "Apply to".

Для получения значений пользовательского индикатора из других mql5-программ используется функция iCustom(), возвращающая хэндл индикатора для последующих операций. При этом также можно указать необходимый массив  price[] или хэндл другого индикатора. Этот параметр должен передаваться последним в списке  входных переменных пользовательского индикатора.
 
Rosh:

Смотрите OnCalculate():


Rosh спасибо, но мой вопрос именно в этом и состоит. Что я должен указать в операторе
   handleMA = iMA(_Symbol, _Period, periodMA, shiftMA, MODE_SMA, AppPrice);
в качестве AppPrice?

Я очень внимательно читаю доступный help. Возможно жара подействовала, но ...

 
FlyAgaric:

Rosh спасибо, но мой вопрос именно в этом и состоит. Что я должен указать в операторе
   handleMA = iMA(_Symbol, _Period, periodMA, shiftMA, MODE_SMA, AppPrice);
в качестве AppPrice?

Я очень внимательно читаю доступный help. Возможно жара подействовала, но ...

Укажите хэндл индикатора, если нужно рассчитать на данных другого индикатора. Или тип цен, на которых будет считаться индикатор.
 
FlyAgaric:

Rosh спасибо, но мой вопрос именно в этом и состоит. Что я должен указать в операторе
   handleMA = iMA(_Symbol, _Period, periodMA, shiftMA, MODE_SMA, AppPrice);
в качестве AppPrice?

Я очень внимательно читаю доступный help. Возможно жара подействовала, но ...

Жара. В качестве AppPrice надо указать ENUM_APPLIED_PRICE)
input ENUM_APPLIED_PRICE AppPrice=PRICE_CLOSE;
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
 
Swan:
Жара. В качестве AppPrice надо указать ENUM_APPLIED_PRICE)

Swan, спасибо за внимание. Но если использовать
input ENUM_APPLIED_PRICE AppPrice=PRICE_CLOSE; и первую форму 

int OnCalculate (const int rates_total, // размер массива price[]
                       const int prev_calculated, // обработано баров на предыдущем вызове
                       const int begin, // откуда начинаются значимые данные  
                       const double& price[]) // массив для расчета  
то при компиляции получаем предупреждение: Two OnCalculate functions are defined. Price data function will be used NameIndicator.mq5 (стр кол)
и массив price[] остаётся никак не привязан к AppPrice, если только не совпадает с Apply to: в третьей закладке "Parameters".

Вопрос, по сути, можно ли использовать встроенные однобуферные индикаторы типа iMA() и первую форму int OnCalculate(), если массив price[] как-то
используется в расчётах.

 
Rosh:
Укажите хэндл индикатора, если нужно рассчитать на данных другого индикатора. Или тип цен, на которых будет считаться индикатор.

У нас (скорее у меня) какое-то недопонимание.

Вопрос, по сути, можно ли использовать встроенные однобуферные индикаторы типа iMA() и первую форму int OnCalculate(), если массив price[] как-то
используется в расчётах.

 
FlyAgaric:

У нас (скорее у меня) какое-то недопонимание.

Вопрос, по сути, можно ли использовать встроенные однобуферные индикаторы типа iMA() и первую форму int OnCalculate(), если массив price[] как-то
используется в расчётах.

Ваш параметр  AppPrice никак не связан с функцией OnCalculate().

int OnInit()
{
... handleMA = iMA(_Symbol, _Period, periodMA, shiftMA, MODE_SMA, AppPrice);
...
}

Вы можете либо задать ему значение одной из ценовых констант (1 вариант), либо хендл какого-то другого индикатора (2 вариант). А далее Вы можете:

1 вариант.

В функции OnCalculate() второго вида

int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[]         // Spread
   );

запрашивать все нужные данные и строить расчет

2 вариант.

Использовать OnCalculate() любого вида как того требует код, а для получения значений индикатора использовать CopyBuffer().

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