Мултивалютный индикатор для тестера

 

Здравствуйте! Решил сделать мультивалютный индикатор для тестера на базе S-Roc. Для начала решил сделать с одной линией, чтобы на графике EURUSD наблюдать линию с графика EURGBP. Если параметр ROC_Period установить 40, то через 40 баров после начала теста линия индикатора сходится с нулевым уровнем и больше не меняется. Если установить 10 то прилипнет к нулю через 10 баров.

S-Roc это оригинал, S-Roc2 моя переделка. Если кто поможет разобраться буду благодарен. Или если можно дайте ссылку на мультивалютный индикатор работающий в тестере, чтобы посмотреть код. Я ни одного не нашел. Первая красная линия это начало теста, а вторая момент схождения с нулевой. Схождение произошло через 40 баров.

 

 
Файлы
Файлы:
s-roc.mq4  2 kb
s-roc2.mq4  2 kb
 
//+------------------------------------------------------------------+
//|                                                        S-RoC.mq4 |
//|                                    Copyright (C) 2009 DragoTrade |
//|                        Licensed under GNU General Public License |
//+------------------------------------------------------------------+
#property copyright "DragoTrade" 

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//---- input parameters
extern int MA_Period=13;
extern int ROC_Period=21;
//---- buffers
double b[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,b);
   IndicatorShortName("S-RoC("+MA_Period+", "+ROC_Period+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int i=Bars-(ROC_Period+MA_Period)-1;

   double t,curr,prev;
   
   while(i>=0)
   {
      curr=iMA(NULL,0,MA_Period,0,MODE_EMA,PRICE_CLOSE,i);
      prev=iMA(NULL,0,MA_Period,0,MODE_EMA,PRICE_CLOSE,i+ROC_Period);
      if(prev!=0)
      {
         t=(curr-prev)/prev;
      }
      b[i]=t;
      i--;
      
   }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//|                                                       S-RoC2.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//---- input parameters
extern int MA_Period=40;
extern int ROC_Period=40;
extern string Symbols="EURUSD"; 
//---- buffers
double b[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,b);
   IndicatorShortName("S-RoC2("+MA_Period+", "+ROC_Period+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
    int i=Bars-(ROC_Period+MA_Period)-1;
   double t,curr,prev;
   while(i>=0)
   {
     curr=iMA(Symbols,0,MA_Period,0,MODE_EMA,PRICE_CLOSE,iBarShift(Symbols,0,Time[i],FALSE));
   prev=iMA(Symbols,0,MA_Period,0,MODE_EMA,PRICE_CLOSE,iBarShift(Symbols,0,Time[i+ROC_Period],FALSE ));
      if(prev!=0)
      {
         t=(curr-prev)/prev;
      }
      b[i]=t;
      i--;
     }
//----
   
//----
   return(0);
  }
//+-----------------------------------------------------------------+
 
david2:
Вы используете счетчик баров Bars текущего символа, попробуйте использовать iBars;
 
hlaiman:
Вы используете счетчик баров Bars текущего символа, попробуйте использоватьiBars;

Сделал ничего не изменилось, и индикатор начал сильно тормозить.

//+------------------------------------------------------------------+
//|                                                       S-RoC3.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//---- input parameters
extern int MA_Period=40;
extern int ROC_Period=40;
extern string symbol="EURUSD";
extern int timeframe=PERIOD_M1;

//---- buffers
double b[];
 

 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,b);
   IndicatorShortName("S-RoC3("+MA_Period+", "+ROC_Period+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+

int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+

int start()


{
    
   int i= iBars(symbol,timeframe)-(ROC_Period+MA_Period);
   
   double t,curr,prev;
   while(i>0)
   {
   curr=iMA(symbol,timeframe,MA_Period,0,MODE_EMA,PRICE_CLOSE,iBarShift(symbol,timeframe,Time[i],FALSE));
   prev=iMA(symbol,timeframe,MA_Period,0,MODE_EMA,PRICE_CLOSE,iBarShift(symbol,timeframe,Time[i+ROC_Period],FALSE ));
      if(prev!=0)
      {
         t=(curr-prev)/prev;
      }
      b[i]=t;
      i--;
      
   }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Есть еще 1 особенность. Уже после того как индикатор выдает 0, останавливаю тестирование и просто открываю и закрываю окно свойств . После этого линия перерисовывается и принимает правильную форму. То есть сбрасывается буфер индикатора. Как сбрасывать буфер на каждом баре?
 
david2:
Есть еще 1 особенность. Уже после того как индикатор выдает 0, останавливаю тестирование и просто открываю и закрываю окно свойств . После этого линия перерисовывается и принимает правильную форму. То есть сбрасывается буфер индикатора. Как сбрасывать буфер на каждом баре?
   while(i>0)
   {
if(i<=1) b[i]=EMPTY_VALUE;