Мой индикатор исчезает при переходе на новый график таймфрейма

 

Здравствуйте,

Я начинаю с индикатора (ПЕРВАЯ ЧАСТЬ). Он работает нормально, при смене таймфрейма.

Затем я добавляю вторую часть, которая заключается в следующем: Если Close[i]-Close[i+1] меньше медианы разницы последних 100 баров, я присваиваю значение 0 всем буферам.

Теперь комбинированный индикатор отлично работает на 1 графике, но когда я меняю таймфрейм, индикатор исчезает. Приходится заново прикреплять его к графику.

Я думаю, что проблема вызвана Array, но я не знаю, как ее решить.

Может ли кто-нибудь помочь мне с этой ошибкой?

Большое спасибо.

SCFX

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   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 limit=rates_total-prev_calculated;
      
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

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

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
         
//SECOND PART         
   for(int j=0;j<=sample_roc_quartile;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
      
      if(   (Close[i]-Close[i+1])<roc_s[50]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    }     
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Возможно, ошибка выхода массива за пределы диапазона, и индикатор удаляется

int limit=rates_total-prev_calculated;

for(int i=0; i<limit; i++)
iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))

Возможно, вы получаете сообщение в журнале о сбое глобальной инициализации.
Проверьте свои журналы

 

Спасибо за ваше предложение.

Я проверил журнал, там нет никаких ошибок или предупреждений.

Я не уверен, что (i+1) вызывает проблемы, так как в одиночку (или просто удалив вторую часть), этот индикатор работает нормально.

SCFX

 

Есть ошибки Я скомпилировал ваш код и протестировал его:

2014.05.22 22:39:43.936 Пользовательский индикатор Test Indicator 3 XAUUSD,M1: удален
2014.05.22 22:39:43.905 Test Indicator 3 XAUUSD,M1: global initialization failed
2014.05.22 22:39:43.905 Test Indicator 3 XAUUSD,M5: uninit reason 3 //----------------------- change chart
2014.05.22 22:39:17.323array out of range in 'Test Indicator 3.mq4' (117,32)
2014.05.22 22:39:15.591 Test Indicator 3 XAUUSD,M5: инициализирован
2014.05.22 22:39:09.570 Пользовательский индикатор Test Indicator 3 XAUUSD,M5: успешно загружен

 
scfx:

Спасибо за ваше предложение.

Я проверил журнал, там нет никаких ошибок или предупреждений.

Я не уверен, что (i+1) вызывает проблемы, так как в одиночку (или просто удалив вторую часть), этот индикатор работает нормально.

SCFX


Тогда, вероятно, дело в следующем

roc_s[j]=Close[i+j]-Close[i+j+1];

Вы пытаетесь получить цену закрытия баров, которых не существует

 

При первом запуске индикатора нужно добавить строку : prev_calculated == 0,

что-то вроде этого:

 int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;
      

на моем компьютере тоже нет ошибки ;-)

 

Здравствуйте, ffoorr,

Ваше решение действительно хорошее.

По правде говоря, вчера вечером я нанял человека, чтобы исправить это. Да, он сделал это, но код неэффективен, смотрите ниже, так как он добавил еще один for(i).

Я буду благодарен, если вы объясните, что означает это prev_calculated ==0. Я не понимаю.

//+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2  
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod=30;
input int dperiod=9;
input int slow=9;
input int sample_roc_quartile=100;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,buy);
   SetIndexArrow(0,241);
   
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,sell);
   SetIndexArrow(1,242);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexBuffer(2,stoploss);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexBuffer(3,takeprofit2); 
         
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexBuffer(4,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   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 limit=rates_total-prev_calculated;
          if(limit<=0)limit =2;
     
      double roc_s[];
      ArrayResize(roc_s,sample_roc_quartile+1);

//---

//------------------------------------------ 

for(int i=1; i<limit; i++)
{  

//FIRST PSART 

   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]-0.005; 
         takeprofit1[i]=Close[i]+0.005;
         takeprofit2[i]=Close[i]+0.01;
         }
      
   if(iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i)<iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i)   
   &&   iStochastic(NULL,0,kperiod,dperiod,slow,0,0,0,i+1)>iStochastic(NULL,0,kperiod,dperiod,slow,0,0,1,i+1))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]-0.0050;
         takeprofit2[i]=Close[i]-0.01;
         }   
} 

    
//SECOND PART   

//--------------------------------------- HERE IS THE WHAT HE DID
int mid = (sample_roc_quartile +1)/2;
  
for(int i=1; i<limit&&(i+1)<rates_total; i++)
{    

//---------------------------------------------


  for(int j=0;j<=sample_roc_quartile&&(i+j+1)<rates_total;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+1];
      ArraySort(roc_s);
   }   
      
      if( (Close[i]-Close[i+1])<roc_s[mid]  )
         {  buy[i]=0; 
            stoploss[i]=0; 
            takeprofit1[i]=0;
            takeprofit2[i]=0;
         }
    
 }    

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Привет всем...


У меня проблема с установкой традиционного индикатора IBFX MACD и других шаблонов в MT4.

В предыдущей версии мне нужно было только скопировать и вставить свои файлы в папку "indicator", расположенную в папке "expert".

В текущей версии есть только папка "MQL4", которая состоит из папок "expert" и "indicator".

Я пробовал вставить файлы в обе папки и перезапустить платформу, но это просто не работает.

ничего не происходит.

Может ли кто-нибудь проконсультировать меня по этому вопросу? Или, возможно, есть другие способы получить традиционный индикатор MACD с 2 линиями EMA?

Спасибо

Дуглас
 
дуглас бенг вам нужно перестать помещать свои вопросы в чужие темы, когда они не относятся к их теме. НАЧНИТЕ СВОЮ СОБСТВЕННУЮ ТЕМУ.
 
douglas_heng: У меня проблема с установкой традиционного индикатора IBFX MACD и других шаблонов в мой MT4.
Don't Don't multiple (6) posts. Не копируйте чужие сообщения.
 
scfx:

Здравствуйте, ffoorr,

Ваше решение действительно хорошее.

По правде говоря, вчера вечером я нанял человека, чтобы исправить это. Да, он сделал это, но код неэффективен, смотрите ниже, так как он добавил еще один for(i).

Я буду благодарен, если вы объясните, что означает это prev_calculated ==0. Я не понимаю.


ну scfx, я не понимаю вторую часть вашего индикатора, поэтому не могу сказать.

Когда индикатор запускается в первый раз, (наносится на график) previous_calculation равен Нулю по конструкции, поэтому можно зафиксировать начальную точку, с которой индикатор начнет расчет.

if( prev_calculated == 0) limit = 100;

или

if( prev_calculated < 50) limit = 500:

или скажем

if( prev_calculated < 500) limit = 3000: (все равно, начало графика не используется).

int limit = -100;
   if( prev_calculated == 0 ) limit = 3000;// will calculate 3000 Bars
    else                      limit = rates_total-prev_calculated;

at the first lauch of the indicator limit = 3000;

for(int i=1; i<3000; i++) // draw 3000 bars 

at the second lauch limit = 0; // ( because rates_total-prev_calculated = 0)  ;
for(int i=1; i<0; i++)    //   draw the last bars only, faster

очень хорошая идея это инди ......

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