Il mio indicatore scompare ogni volta che passo a un nuovo grafico time-frame

 

Salve,

Inizio con un indicatore (La PRIMA PARTE). Funziona bene, quando si cambia time frame.

Poi aggiungo la Seconda Parte che è: Se Close[i]-Close[i+1] è inferiore alla mediana del valore della differenza delle ultime 100 barre, assegnerò il valore 0 a tutti i buffer.

Ora l'indicatore combinato funziona bene in 1 grafico ma quando cambio time frame, l'indicatore scompare. Devo riattaccarlo al grafico.

Penso che il problema sia causato da Array ma non so come risolverlo.

Qualcuno può aiutarmi con l'errore?

Grazie mille.

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

Forse un errore di array fuori portata e l'indicatore viene rimosso

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

Probabilmente stai ricevendo un messaggio nel log su un errore di inizializzazione globale
Controlla i tuoi log

 

Grazie per il tuo suggerimento.

Ho controllato il log, non c'è nessun errore o avviso.

Non sono sicuro che il (i+1) causi problemi, dato che da solo (o semplicemente cancellando la seconda parte), questo indicatore funziona bene.

SCFX

 

Ci sono errori Ho compilato il tuo codice e l'ho testato:

2014.05.22 22:39:43.936 Indicatore personalizzato Test Indicator 3 XAUUSD,M1: rimosso
2014.05.22 22:39:43.905 Indicatore di test 3 XAUUSD,M1: inizializzazione globale fallita
2014.05.22 22:39:43.905 Indicatore di test 3 XAUUSD,M5: uninit reason 3 //----------------------- cambiare grafico
2014.05.22 22:39:17.323array fuori range in 'Test Indicator 3.mq4' (117,32)
2014.05.22 22:39:15.591 Indicatore di test 3 XAUUSD,M5: inizializzato
2014.05.22 22:39:09.570 Indicatore personalizzato Test Indicator 3 XAUUSD,M5: caricato con successo

 
scfx:

Grazie per il tuo suggerimento.

Ho controllato il log, non c'è nessun errore o avviso.

Non sono sicuro che il (i+1) causi problemi, dato che da solo (o semplicemente cancellando la seconda parte), questo indicatore funziona bene.

SCFX


Allora è probabilmente questo

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

Stai cercando di ottenere il prezzo di chiusura di barre che non esistono

 

Dovreste aggiungere una linea quando l'indicatore viene avviato per primo: prev_calculated == 0,

qualcosa del genere:

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

nessun errore neanche sul mio computer ;-)

 

Ciao ffoorr,

La tua soluzione è davvero buona.

A dire la verità, ho assunto qualcuno per sistemarla ieri sera. Sì, l'ha fatto ma il codice è inefficiente, vedi sotto, perché ha aggiunto un altro for(i).

Ti sarei grato se potessi spiegare cosa significa quel prev_calculated ==0. Non lo capisco.

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

Ciao a tutti...


Ho un problema nell'installare l'indicatore tradizionale IBFX MACD e altri modelli nel mio MT4.

Nella versione precedente, avrei solo bisogno di copiare e incollare i miei file nella cartella "indicator" situata nella cartella "expert".

Quella attuale ha solo la cartella "MQL4" che consiste in una cartella "expert" e una cartella "indicator".

Ho provato ad incollare in entrambe le cartelle e a riavviare la mia piattaforma ma non funziona

non succede.

Qualcuno può per favore consigliarmi su questo problema o forse qualche altro modo per ottenere il tradizionale indicatore MACD con 2 linee EMA?

Grazie

Douglas
 
douglas beng devi smetterla di mettere la tua domanda nei topic di tutti gli altri quando non è correlata al loro topic. INIZIA IL TUO PROPRIO ARGOMENTO.
 
douglas_heng: Sto avendo problemi ad installare l'indicatore tradizionale IBFX MACD e altri modelli nel mio MT4.
Don't Don't multiple (6) posts. Non dirottare i post degli altri.
 
scfx:

Ciao ffoorr,

La tua soluzione è davvero buona.

A dire la verità, ho assunto qualcuno per sistemarla ieri sera. Sì, l'ha fatto ma il codice è inefficiente, vedi sotto, perché ha aggiunto un altro for(i).

Ti sarei grato se potessi spiegare cosa significa quel prev_calculated ==0. Non lo capisco.


bene scfx, non capisco la seconda parte del tuo indicatore, quindi non posso dirlo.

Quando un indicatore viene avviato per la prima volta, (messo su un grafico) previous_calculation è uguale a Zero per costruzione, quindi si può fissare il punto di partenza da cui l'indicatore inizierà a calcolare.

if( prev_calculated == 0) limit = 100;

oppure

se( prev_calculato < 50) limite = 500:

o dire

if( prev_calculated < 500) limit = 3000: (è lo stesso, l'inizio del grafico non viene utilizzato)

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

molto buona idea questo indi ......