Отрисовка индикатора по n-барам

 

Делаю индикатор для тестера, чтобы он рисовал по последним 50 барам, для увеличения скорости оптимизации.

На MQL4 делал проще с ограничением расчета. В цикле, если limit>Period+50, то limit= Period+50. В пятерке пока не знаю, как так сделать.

Сделал так, но на большом периоде значения расходятся с оригиналом:

#include <MovingAverages.mqh>
//+------------------------------------------------------------------+
//|                                                   testMoving.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
input int Period_=10;
double         m[];
int    BEGIN;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
SetIndexBuffer(0,m,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[])
  {
//---
BEGIN=rates_total-(Period_+50);
ExponentialMAOnBuffer(rates_total,prev_calculated,BEGIN,Period_,close,m); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 Если правильно понимаю функцию "ExponentialMAOnBuffer", то третий параметр "BEGIN" это откуда рисовать линию.

 
Период EМА 10, значит нужно баров 100-150, а используется 60.
 
Dmitry Fedoseev:
Период EМА 10, значит нужно баров 100-150, а используется 60.
Получилось. Только, сколько для каждого периода добавлять баров? Для EMA вроде нужно, так же, как для SMA количество баров, то есть на первом значении+Period_.
 
forexman77:
Получилось. Только, сколько для каждого периода добавлять баров? Для EMA вроде нужно, так же, как для SMA количество баров, то есть на первом значении+Period_.
Что получилось-то? 
 
Алексей Тарабанов:
Что получилось-то? 


На шестом знаке после ноля на копейки в начале и до середины расхождения есть небольшие.

#include <MovingAverages.mqh>
//+------------------------------------------------------------------+
//|                                                   testMoving.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
input int Period_=10;
double         m[];
int    BEGIN;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
SetIndexBuffer(0,m,INDICATOR_DATA); 
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
//---
   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[])
  {
//---
BEGIN=rates_total-(Period_+250);
ExponentialMAOnBuffer(rates_total,prev_calculated,BEGIN,Period_,close,m); 
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
forexman77:


На шестом знаке после ноля на копейки в начале и до середины расхождения есть небольшие.

Ну, не верю я Вам, извините... 
 
Алексей Тарабанов:
Ну, не верю я Вам, извините... 
Проверить 10 секунд нужно. Поставьте из терминала скользящую EMA с периодом 120 и мою. Все увидите.
 
forexman77:
Проверить 10 секунд нужно. Поставьте из терминала скользящую EMA с периодом 120 и мою. Все увидите.
 
forexman77:
Получилось. Только, сколько для каждого периода добавлять баров? Для EMA вроде нужно, так же, как для SMA количество баров, то есть на первом значении+Period_.
Для EMA надо в 10-20 раз больше чем период. На малых период достаточно в 10 раз больше, а на больших до 20-и раз больше, кто знает может на очень больших еще больше надо.
 
Dmitry Fedoseev:
Для EMA надо в 10-20 раз больше чем период. На малых период достаточно в 10 раз больше, а на больших до 20-и раз больше, кто знает может на очень больших еще больше надо.
Спасибо!