Meu indicador desaparece sempre que eu mudo para um novo gráfico de tempo

 

Olá,

Começo com um indicador (A PRIMEIRA PARTE). Funciona bem, quando se muda o cronograma.

Depois acrescento a Segunda Parte que é: Se Close[i]-Close[i+1] for menor que a mediana do valor da última diferença de 100 bar, atribuirei o valor 0 a todo o buffer.

Agora o indicador combinado funciona bem em 1 gráfico, mas quando eu mudo de intervalo de tempo, esse indicador desaparece. Eu tenho que recolocá-lo no gráfico.

Acho que o problema é causado pelo Array, mas não sei como resolvê-lo.

Alguém pode me ajudar com o erro?

Muito obrigado.

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);
  }
//+------------------------------------------------------------------+
 

Possivelmente um erro fora do alcance e o indicador está sendo removido

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))

Você está possivelmente recebendo uma mensagem no registro sobre uma falha de inicialização global
Verifique seus logs

 

Obrigado por sua sugestão.

Eu verifico o log, não há nenhum erro ou aviso de aviso.

Não tenho certeza se o (i+1) causa problemas, uma vez que, estando sozinho (ou simplesmente apagando a segunda parte), este indicador funciona bem.

SCFX

 

Há erros que eu compilei seu código e o testei:

2014.05.22 22:39:43.936 Indicador personalizado Indicador de teste 3 XAUUSD,M1: removido
2014.05.22 22:39:43.905 Indicador de teste 3 XAUUSD,M1: a inicialização global falhou
2014.05.22 22 22:39:43.905 Indicador de teste 3 XAUUSD,M5: razão uninit 3 //----------------------- gráfico de mudança
2014.05.22 22:39:17.323matriz fora do alcance no 'Indicador de teste 3.mq4' (117,32)
2014.05.22 22:39:15.591 Indicador de teste 3 XAUUSD,M5: Inicializado
2014.05.22 22:39:09.570 Indicador personalizado Indicador de teste 3 XAUUSD,M5: carregado com sucesso

 
scfx:

Obrigado por sua sugestão.

Eu verifico o log, não há nenhum erro ou aviso de aviso.

Não tenho certeza se o (i+1) causa problemas, uma vez que, estando sozinho (ou simplesmente apagando a segunda parte), este indicador funciona bem.

SCFX


Então é provavelmente este

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

Você está tentando chegar perto do preço dos bares que não existem

 

Você deve adicionar uma linha quando o indicador for iniciado primeiro : pré_calculado == 0,

algo parecido com isso :

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

nenhum erro no meu computador também ;-)

 

Oi ffoorr,

Sua solução é realmente boa.

Para dizer a verdade, eu contrato alguém para consertá-la ontem à noite. Sim, ele o fez, mas o código é ineficiente, veja abaixo, pois ele acrescenta mais um para(i).

Agradeço se você pudesse explicar o que significa com aquele pré-cálculo ==0. Não entendo.

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+
 

Olá a todos...


Estou tendo problemas para instalar o indicador tradicional IBFX MACD e outros modelos no meu MT4.

Na versão anterior, eu só precisaria copiar e colar meus arquivos na pasta "indicador" localizada na pasta "expert".

O atual possui apenas a pasta "MQL4" que consiste de uma pasta "expert" e "indicator" sapateada.

Tentei colar em ambas as pastas e reiniciar minha plataforma, mas ela simplesmente não funciona.

observação acontece.

Alguém lá fora pode me aconselhar sobre este assunto? ou talvez qualquer outra forma de eu obter o indicador MACD tradicional com 2 linhas EMA?

Obrigado

Douglas
 
douglas beng você precisa parar de colocar sua pergunta sobre todos os tópicos da elses quando ela não estiver relacionada ao seu tópico. COMECE SEU PRÓPRIO TÓPICO.
 
douglas_heng: Estou tendo problemas para instalar o indicador tradicional IBFX MACD e outros modelos no meu MT4.
Não faça múltiplas (6) mensagens. Não se apropriar de outros postes.
 
scfx:

Oi ffoorr,

Sua solução é realmente boa.

Para dizer a verdade, eu contrato alguém para consertá-la ontem à noite. Sim, ele o fez, mas o código é ineficiente, veja abaixo, pois ele acrescenta mais um para(i).

Agradeço se você pudesse explicar o que significa com aquele pré-cálculo ==0. Não entendo.


bem scfx, não entendo a segunda parte do seu indicador, então não posso dizer.

Quando um indicador é iniciado na primeira vez, (colocado em um gráfico) o cálculo prévio é igual a Zero por construção, de modo que se pode fixar o ponto de partida a partir do qual o indicador começará a calcular .

if( pré_calculado == 0) limite = 100;

ou

if( prev_calculado < 50) limite = 500:

ou digamos

if( prev_calculado < 500) limite = 3000: (mesmo assim, o início do gráfico não é usado)

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

muito boa idéia esta indi ......