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

 

Grazie per la sua spiegazione.

Ora lo vedo meglio.

SCFX

 

Ciao,

Mi gratto la testa con questo errore assurdo.

Ancora questo semplice indicatore di 4 righe di codice scompare quando cambio timeframe.

Pazzescamente, ho applicato i suggerimenti già postati qui ma ancora non ci sono riuscito.

Mi sento così male...

Per favore aiutatemi.

Molte grazie,

SCFX

//+------------------------------------------------------------------+
//|                                                        H_roc.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_minimum -3.5
//#property indicator_maximum 3.5
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "boring"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
//--- indicator buffers
double         boring[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,boring);
   
          
//---
   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=300;
//---
 
 for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) 
      boring[i]=Close[i];
    
}  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
scfx:

Ciao,

Mi gratto la testa con questo errore assurdo.

Ancora questo semplice indicatore di 4 righe di codice scompare quando cambio timeframe.

Pazzescamente, ho applicato i suggerimenti già postati qui ma ancora non ci sono riuscito.

Mi sento così male...

Per favore aiutatemi.

Molte grazie,

SCFX



2014.06.15 11:26:39.908 zero divide in 'test.mq4' (59,44)
 
angevoyageur:
2014.06.15 11:26:39.908 zero divide in 'test.mq4' (59,44)


Grazie per aver risposto.

Sul mio diario, non c'è questo avviso ma quando cambio TF, questo indicatore viene rimosso.

Non riesco ancora a risolvere il problema.

SCFX

2014.05.18 08:41:31.080Indicatore personalizzato H_889_boring GBPUSD,H1: rimosso
2014.05.18 08:41:25.441 Indicatore personalizzato H_889_boring GBPUSD,H4: caricato con successo

 
scfx:

Non riesco ancora a risolvere il problema.

SCFX

Questo perché non ti stai sforzando molto.

Non imparerai nulla se chiedi ad altre persone di farlo per te, l'unico modo è farlo da solo in modo da capirlo, l'unico modo per farlo da solo è esaminare ogni linea di codice, scomporla e capire esattamente cosa sta facendo e ci sono diversi modi per farlo.

for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) // what is this parentheses doing here ? How can you expect to write code that works if you are this sloppy about it ?
      boring[i]=Close[i];
    
}  

Queste sono tutte cose che potresti fare e che ti aiuterebbero a trovare la causa del problema

  • Hai detto che hai controllato la scheda del diario, hai guardato nella scheda degli esperti accanto ad essa?
  • Ti ho già detto la settimana scorsa che il tuo codice causava array out of range, l'hai cercato per scoprire cosa significa?
  • C'è un debugger in metaeditor, potresti provare ad imparare come usarlo per il debug del tuo codice,
  • potresti usare Print() così potresti controllare quali erano i valori delle tue variabili quando il codice era in esecuzione
  • .

Se avessi cliccato sulla scheda esperti ti direbbe che il tuo indicatore ha fatto zero divide su questa linea, cambiando timeframes non ha niente a che fare con questo.

if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50

Quindi questo deve significare che questo High[i]-Low[i] era zero per qualche motivo. Se guardate l'indicatore sul grafico potete vedere che l'indicatore ha disegnato alcuni dei suoi valori e poi si ferma ad una barra dove c'è solo un tick. Se c'è solo un tick high[i] == low[i] quindi questo causerebbe uno zero divide

Ora assicuratevi che high[i]-low[i] non venga usato se è zero.

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---
   for(int i=1;i<=limit  ;i++)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    
    if( MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50 ) 
    {boring[i]=Close[i];
   }}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ora vedrete che la scheda esperti vi dice che il codice non ha più diviso per zero ma genera un errore di array fuori range su questa linea.

if(high[i] - low[i] == 0)  

Quindi cosa succede se togliete tutti i calcoli e le condidzioni per testare il ciclo?

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit  ;i++)
   { 
    boring[i]=Close[i];
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ora la scheda degli esperti riporta di nuovo array out of range, questa volta su questa linea:

boring[i]=Close[i];

Quindi ora sapete che il vostro codice causa array out of range ogni volta che un array di prezzi viene usato nel ciclo. Quindi cercate di capire cosa c'è di sbagliato nel loop e perché Close[i], Low[i], High[i] sono fuori range. Puoi vedere che l'indicatore disegna fino alla fine del grafico, quindi l'errore deve essere alla fine, gli indici più alti dell'array.

   int limit=rates_total-prev_calculated; // what is the value of limit in this calculation when prev_calulated == 0 ?
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit;i++) // how does the value of limit compare with the highest available Close[] array index ?

Sembra che tu stia cercando di fare un indicatore senza prima imparare a codificare un ciclo che funzioni correttamente. Ci sono molti esempi di come farlo. Guarda il codice degli indicatori inclusi e sperimenta con loro finché non capisci esattamente come funzionano, poi prova a fare un indicatore per disegnare una semplice linea singola che funzioni correttamente prima di provare a fargli eseguire dei calcoli.
 

@ scfx

L'unica persona che può riparare sei tu. Oppure vai su https://www.mql5.com/en/job

e pubblica il lavoro lì.

 
SDC:
...

Per favore DSC, non c'è bisogno di essere così duro, anche se hai ragione.
 
angevoyageur:

Per favore DSC, non c'è bisogno di essere così duro, anche se hai ragione.

lol Ho riformulato un po' il mio post ;)

 

Scusa, ti ho fuorviato, mi scuso, l'indicatore può essere codificato così:

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

 for(int i=limit;  i>=0; i--)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    

// Please test it, check if it's OK;
// Put the indicator in a backtest EA, say MACDSample, to check it
 

Se il grafico ha meno di 3000 barre sarà ancorafuori portata.