MT4 iMAOnArray и iBandsOnArray влияние количества элементов на расчёты - страница 3

 
Alexey Viktorov:

Нет, Владимир. Чуток не так.

В этом случае надо ArraySetAsSeries(массив, false); применять к массиву из трёхсот элементов среди которых считается iMAOnArray(). Но для этого лучше использовать CopyOpen() а не цикл заполнения массива.

Как я понимаю, в этом варианте лучше будет

Как была поставлена задача, так я и продемонстрировал. Получилось наглядно. А дальше уже сами :)
 
Alexey Viktorov:

Нет, Владимир. Чуток не так.

В этом случае надо ArraySetAsSeries(массив, false); применять к массиву из трёхсот элементов среди которых считается iMAOnArray(). Но для этого лучше использовать CopyOpen() а не цикл заполнения массива.

Как я понимаю, в этом варианте лучше будет

Так покажите "рабочий" вариант кода, исходный код оригинала тут есть, который вы всё пытаетесь урезать до 12 отображаемых элементов, вместо запрошенных мною трёхсот, и должны в итоге получиться 3 индикаторных буфера с указанными данными, чтобы в подвале отображались минимум 300 элементов, и далее при приходе нового бара соответственно шла отрисовка 301 и далее значения, но не забывайте, что при этом в случае использования 0 в качестве ограничения расчёта, даёт пересчёт значений только нового бара, и тип средней (сглаживания) для второго буфера не обязательно будет SMA, а может быть любым из 4 доступных.
 
Sergey Efimenko:

Собственно сабж. Если мне не нужно считать весь массив, а нужны только последние N элементов.

Не совсем понимаю логику расчёта этих функций при ограничении. Есть массив таймсерия (один из буферов индикатора), если оставить количество элементов равное 0 вопросов нет, всё считается и получается, но при уменьшении количества элементов участвующих в расчётах по тем же смещениям я получаю только первичные. Проще говоря есть массив 5000 элементов (баров на графике), для экономии времени мне нужно посчитать только последние 300, но при указании во втором параметре значения 300 я получаю первичные 5000-4700 элементов, но по смещению 300-0, и далее значения при вызове не меняются. Какой смысл использования этого параметра?

Хрен его знает. Забейте просто. Если надо ускорить расчеты, в своем цикле сократите количество обсчитываемых элементов. 

if(prev_calculated==0)limit=300; else ...; 

Одно из двух: или невозможно или нужна некая тайная комбинация таймсерий, не таймсерий, направлений расчета.

 
Dmitry Fedoseev:

Хрен его знает. Забейте просто. Если надо ускорить расчеты, в своем цикле сократите количество обсчитываемых элементов. 

Одно из двух: или невозможно или нужна некая тайная комбинация таймсерий, не таймсерий, направления расчета.

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

Парадокс ситуации в том, что если сделать аналогичный шаблон, набросив на любой индикатор (линию цены) среднюю или ленты боллинджера, таких тормозов первичного расчёта всех баров истории, как при использовании этих функций в коде, при перезапуске терминала или переключении ТФ не наблюдается, вот и непонятно, что же там так долго рассчитывается в этих функциях.

 
Dmitry Fedoseev:

Хрен его знает. Забейте просто. Если надо ускорить расчеты, в своем цикле сократите количество обсчитываемых элементов. 

Одно из двух: или невозможно или нужна некая тайная комбинация таймсерий, не таймсерий, направлений расчета.

Еще применял такую конструкцию

if (limit > 300)limit=300;

 Кстати "MovingAverages.mqh" в раза два быстрее посчитал чем, на на "iMAOnArray", даже по старой версии.

https://www.mql5.com/ru/forum/79988 

Использование MovingAverages.mqh в MQL4
Использование MovingAverages.mqh в MQL4
  • www.mql5.com
При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же.
 
Sergey Efimenko:

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

Парадокс ситуации в том, что если сделать аналогичный шаблон, набросив на любой индикатор (линию цены) среднюю и ленты боллинджера, таких тормозов первичного расчёта всех баров истории, как при использовании этих функций в коде, при перезапуске терминала или переключении ТФ не наблюдается, вот и непонятно, что же там так долго рассчитывается в этих функциях.

Торможение даже от использование iMAOnArray? Не должно такого быть. Как ты было время, было торможение от StdOnArray (или от BandsOnArray, непомню), разработчики долго не признавали наличие бага. Потом вдруг исправили и работало быстро. Кто знает, может вернулся баг. Если и от iMAOnArray() заметное торможение, то это баг. Кажется были про это разговоры пару месяцев назад... воз и ныне там, видимо.

 
Dmitry Fedoseev:

Торможение даже от использование iMAOnArray? Не должно такого быть. Как ты было время, было торможение от StdOnArray, разработчики долго не признавали наличие бага. Потом вдруг исправили и работало быстро. Кто знает, может вернулся баг. Если и от iMAOnArray() заметное торможение, то это баг. Кажется были про это разговоры пару месяцев назад... воз и ныне там, видимо.

Сложно судить "сильно тормозит" или допустимо, ведь всё зависит от длины графика (кол-ва баров), загвоздка в том, что для оптимизации нужно считать всего чуток, а ограничить длину расчёта по факту не получается.
 
Sergey Efimenko:
Сложно судить "сильно тормозит" или допустимо, ведь всё зависит от длины графика (кол-ва баров), загвоздка в том, что для оптимизации нужно считать всего чуток, а ограничить длину расчёта по факту не получается.
Сделайте расчет на MovingAverages.mqh и все очень быстро посчитается.
 
forexman77:
Сделайте расчет на MovingAverages.mqh и все очень быстро посчитается.
А эта библиотека считает правильно, если задать расчёт не всего массива, а только его последней части (текущих значений)? Кроме того это только половина задачи, а как быть с iBandsOnArray?
 
Sergey Efimenko:
Так покажите "рабочий" вариант кода, исходный код оригинала тут есть, который вы всё пытаетесь урезать до 12 отображаемых элементов, вместо запрошенных мною трёхсот, и должны в итоге получиться 3 индикаторных буфера с указанными данными, чтобы в подвале отображались минимум 300 элементов, и далее при приходе нового бара соответственно шла отрисовка 301 и далее значения, но не забывайте, что при этом в случае использования 0 в качестве ограничения расчёта, даёт пересчёт значений только нового бара, и тип средней (сглаживания) для второго буфера не обязательно будет SMA, а может быть любым из 4 доступных.

Держи.

//+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 clrYellow
#property indicator_color2 clrGreen
#property indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
{
   int i, limit;
   limit = rates_total-prev_calculated-1;
   double buffer[];

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
       ArrayCopy(buffer, Buffer, 0, i, 12);
      BufferMA[i] = iMAOnArray(buffer, 300, 12, 0, MODE_SMA, 0);
      BufferBMA[i] = iBandsOnArray(buffer, 300, 12, 2.0, 0, MODE_UPPER, 0);
      int x=0;
     }
   return(rates_total);
}
//+------------------------------------------------------------------+
Причина обращения: