Проблемы с перерисовкой индикатора

 

пожалуйста помогите!!

Простейший индикатор на минутках в реальном времени рисует одно, при обновлении картинка отличается.

Что делать не знаю:(  

#property copyright "pr"

#property link      "http://www.metaquotes.net"


#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Red

extern int nm                 = 24; 


//---- buffers

double Mass_low[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

//---- indicators

   SetIndexStyle(0,DRAW_LINE,EMPTY,1);

   SetIndexBuffer(0,Mass_low);

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function                       |

//+------------------------------------------------------------------+

int deinit()

  {

//----  

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()

  {

    int    counted_bars=IndicatorCounted(),

         limit;

     if (counted_bars > 0)

       {

        counted_bars--;

       }

     limit = Bars - counted_bars;

//----

    for(int i=0;i<limit;i++)

   {

   double el_0 = ep_L(i,nm);

   Mass_low[i] = el_0; 

   }


   return(0);

  }


   double ep_L(int num, int per)

     {

      double sum = 0;

      int i = num;

      while(i<num+per)

       {

        sum += (Low[i] - Close[i]);    

        i++;

       }      

      return((sum/Point)/i);        

     }


Торговая платформа MetaTrader 5 для организации брокерского обслуживания / MetaQuotes Software Corp.
  • www.metaquotes.net
Торговая платформа MetaTrader 5 предназначена для проведения торговых операций на различных финансовый рынках. Терминал обладает большой базой аналитических возможностей и поддерживает более 70 различных инструментов для выполнения технического анализа
 
#property copyright "pr"
#property link      "http://www.metaquotes.net"


#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

extern int nm                 = 24; 

//---- buffers
double Mass_low[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexStyle(0,DRAW_LINE,EMPTY,1);
   SetIndexBuffer(0,Mass_low);
//----
   return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
    int  counted_bars=IndicatorCounted(),
         limit;
    if (counted_bars > 0)
    {
       counted_bars--;
    }
    limit = Bars - counted_bars;
//----
    for(int i=0;i<limit;i++)
    {
       double el_0 = ep_L(i,nm);
       Mass_low[i] = el_0; 
    }
    return(0);
}

double ep_L(int num, int per)
{
   double sum = 0;
   int i = num;
   while(i<num+per)
   {
       sum += (Low[i] - Close[i]);    
       i++;
   }      
   return((sum/Point)/i);        
}
Надо рассчитывать  с прошлого в будущее, у вас - наоборот.
 
ALXIMIKS:
Надо рассчитывать  с прошлого в будущее, у вас - наоборот.
    for(int i=limit-1; i>=0; i--)
    {
       double el_0 = ep_L(i,nm);
       Mass_low[i] = el_0; 
    }

    return(0);

так?

Тоже не работает(( 

 

И в тестере и при переключении периодов картинка одинаковая.

#property copyright "pr"
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

input int nm=24;
//---- buffers
double Mass_low[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,EMPTY,1);
   SetIndexBuffer(0,Mass_low);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int  counted_bars=IndicatorCounted(),
   limit;
   if(counted_bars>0)
     {
      counted_bars--;
     }
   limit=Bars-counted_bars;
//----
   //for(int i=0;i<limit;i++)
   for(int i=limit;i>=0;i--)
     {
      double el_0 = ep_L(i,nm);
      Mass_low[i] = el_0;
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ep_L(int num,int per)
  {
   double sum=0;
   int i=num;
   while(i<num+per)
     {
      sum+=(Low[i]-Close[i]);
      i++;
     }
   return((sum/Point)/i);
  }
//+------------------------------------------------------------------+
 
barabashkakvn:

И в тестере и при переключении периодов картинка одинаковая.

вопрос на самом деле в том, почему в реальном времени он рисует одни данные, а при обновлении индикатора, перерисовывает его с другими значениями, сами графики похожи, но значения отличаются. Спасибо за помощь!
 
promid:
вопрос на самом деле в том, почему в реальном времени он рисует одни данные, а при обновлении индикатора, перерисовывает его с другими значениями, сами графики похожи, но значения отличаются. Спасибо за помощь!
Что в Вашем понятии "обновление индикатора"?
 
barabashkakvn:
Что в Вашем понятии "обновление индикатора"?

Перерисовка его по истории.

Или если вызвать настройки и нажать ок, он меняется. Т.е. индикатор перерисовывает исходя уже из исторических данных. 

Или после его работы в реальном времени, добавляем в это же окно тот же индикатор с теми же параметрами и он отличается, пока не обновить ранее работающий. Пример отличия на скриншоте приведен. 

 
promid:

Перерисовка его по истории.

Или если вызвать настройки и нажать ок, он меняется. Т.е. индикатор перерисовывает исходя уже из исторических данных. 

Или после его работы в реальном времени, добавляем в это же окно тот же индикатор с теми же параметрами и он отличается, пока не обновить ранее работающий. Пример отличия на скриншоте приведен. 

  1. Сравнил индикатор с графика и с тестера - индикаторы и их значения одинаковые.
  2. Присоединил к графику ещё один индикатор с теми-же настройками - оба индикатора идентичны.
 
barabashkakvn:
  1. Сравнил индикатор с графика и с тестера - индикаторы и их значения одинаковые.
  2. Присоединил к графику ещё один индикатор с теми-же настройками - оба индикатора идентичны.

https://youtu.be/7Pe5hh4Hsmc

Записал видео, может так понятнее будет. Но проблема осталась( 

 
promid:

https://youtu.be/7Pe5hh4Hsmc

Записал видео, может так понятнее будет. Но проблема осталась( 

Похоже проблема в последнем блоке вычислений - вместо деления на период "nm" было деление на весь промежуток баров.

#property copyright "pr"
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property strict

input int nm=4;
//---- buffers
double Mass_low[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,EMPTY,1);
   SetIndexBuffer(0,Mass_low);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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
                )
  {
   int i,limit;
   double el_0;
//--- первый расчёт или количество баров изменилось
   if(prev_calculated==0)
     {
      for(i=rates_total-1-nm;i>0;i--)
        {
         el_0=ep_L(low,close,i);
         Mass_low[i]=el_0;
        }
      return(rates_total);
     }
   else
      limit=rates_total-prev_calculated;
//--- main loop
   for(i=limit;i>0;i--)
     {
      el_0=ep_L(low,close,i);
      Mass_low[i]=el_0;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double ep_L(const double& L[],const double& C[],int num)
  {
   double sum=0;
   int n=num+nm;
   while(n>num)
     {
      sum+=(L[n]-C[n]);
      n--;
     }
   return((sum/Point)/nm);
  }
//+------------------------------------------------------------------+
 
barabashkakvn:

Похоже проблема в последнем блоке вычислений - вместо деления на период "nm" было деление на весь промежуток баров.

Огромное спасибо за помощь, все понял!
Причина обращения: