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

 

Ciao DSC,

Ho capito. Molte grazie.

se c'è 100 bar, i tassi totali partono da 0 a 99.

All'inizio, pre_cal =0 --> limite=100 bar - 0 =100.

for(int=1 a limite=100; I++)

alla fine, I=100(valore dell'indice) e non c'è questa barra 100.

Pertanto, per rendere il massimo I=99, ho messo limite -1;

Mi chiedo se c'è un modo migliore.

Inoltre, ciò che mi confonde è che in molti altri indicatori, uso lo stesso approccio e non c'è questo problema di fuori range.

Inoltre, grazie per la scheda Expert.

SCFX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

Inoltre, ciò che mi rende confuso è che in molti altri indicatori, uso lo stesso approccio e non c'è questo problema di out of range.



prima che B600 fuori portata non fosse un errore critico
 
scfx:.

Quindi, per rendere il max I=99, ho messo limite -1;

Mi chiedo se c'è un modo migliore.

Il tuo codice ora disegnerà la storia del grafico dalla barra 1 in su senza errori, ma non disegnerà per nessuna nuova barra. Ci sono molti modi per codificarlo a seconda di ciò che vuoi che faccia. Guardate gli indicatori inclusi in metaeditor per vedere come lo fanno i codificatori di MQ. Quando potrete leggere il loro codice e capire il motivo di ogni linea non avrete problemi a creare indicatori.

 

Ho capito ora DSC.

Personalmente parlando, è difficile da immaginare quando leggo il documento. Ancora non sono sicuro del perché prev_calculated= Total_rates -1.

Così faccio un esempio numerico qui. Spero che possa aiutare qualcuno nuovo come me.

Normalmente vediamo:

Limite= tariffe_totale- prev_calcolato; //(no-1)

O

for(i=1;i<limit;i++) o for(i=1;i<=limit;i++)

L'importante è assicurarsi che LIMIT >=1. Nella mia situazione, LIMIT=0 e quindi, l'indicatore non viene RIFESCIATO quando arriva un nuovo tick.

Perché, vediamo. (Penso che la causa sia il prev_calcolato, almeno nel mio caso)

Supponendo che io attacchi l'indicatore quando ci sono 100 barre sul grafico. Ecco i valori delle variabili:

Prima tabella dei valori
Variabile
Total_rates 100
Indice della barra 0-99
prev_calculato 0
Limite 100
Loop i valore 1-99

Tutto va bene. Il valore apparirà la prima volta dalla barra 1 all'inizio del grafico.Quante barre sono già state calcolate? È un punto critico per il mio errore e non sono chiaro al 100%.

Quando inizia una nuova barra, sul grafico ora ci sono 101 barre. L'indicatore non viene aggiornato sulla barra già chiusa, che ora è la barra 1.

Seconda tabella di valori
Variabile
Total_rates 101
Indice della barra 0-100
prev_calculated 99 OR 100 (vedi sotto)
Limite2 OR 1
Loop i valore 1to1 OR 1 to 0

In base alla 1a tabella, l'indicatore calcola 99 barre (dato che va in loop da 1 a 99).
Tuttavia, dal documento si legge: "MA se non è la prima chiamata di start(), verrà restituito il valore uguale a Bars-1".) Quindi restituirà 101-1=100.
Questa barra diversa causa problemi. Se il sistema restituisce 100 come prev_calculato.
Vedete che, se prev_calculated=99, il ciclo funzionerà.
Tuttavia, sembra che prev_calculated = 100 e quindi il ciclo non funzionerà come limite =0 o -1 dipende.
Qualcuno può aiutarmi a vedere la logica dietro il prev_calculated= Bars-1 in questo caso?

Quindi la soluzione è abbastanza chiara: Fare for(i=1; ___ questo qui deve essere maggiore di 1 per (<) o maggiore o uguale a 1 per (<=)___; i++). Nel mio ultimo codice, è uguale a 0.

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

Spero che sia d'aiuto.

SCFX

 

prev_calculated == rates_total

scfx:

Ora ho capito SDC.

Personalmente, è difficile da immaginare quando leggo il documento. Ancora non sono sicuro del perché prev_calculated = Total_rates -1.

SCFX

Create un nuovo indicatore, mettete questo codice nella funzione start, attaccatelo ad un grafico a 1 minuto e guardate gli avvisi quando arrivano i tick.

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

Vedrete che rates_total è l'attuale quantità di barre.

prev_calculated è la quantità di barre che c'erano al tick precedente.

 
SDC:

prev_calculated == tassi_totale

Create un nuovo indicatore e mettete questo codice nella funzione start, collegatelo a un grafico a 1 minuto e guardate gli avvisi quando arrivano i tick.

Vedrete che rates_total è l'attuale quantità di barre.

prev_calculated è la quantità di barre che c'erano al tick precedente.


Wow, che strano.

Nel link postato prima, si dice che se :MA se non è la prima chiamata di start(), viene restituito il valore uguale a Bars-1.

Come mai restituisce Bars (Rate_totals).

 

Sì, lo so che lo dicono, ma non è del tutto accurato.

Quello che succede in realtà è questo.

rates_total == quantità totale di barre quando il tick corrente è arrivato. prev_calculated == quantità totale di barre quando il tick precedente è arrivato.

Barre nel grafico Stato dell'indicatore rates-total prev-calcolato rates_total-prev_calculated
1000 prima esecuzione quando caricato 1000 0 1000
1000 tick successivo 1000 1000 0
1000 prossimo tick 1000 1000 0
1001 1° tick della nuova barra 1001 1000 1
1001 prossimo tick 1001 1001 0
1001 tick successivo 1001 1001 0

Quindi avete 3 stati principali di prev-calcolato vs rates_total. Indicatore caricato, tick di metà barra, primo tick della nuova barra.

prev_calculato == 0 alla prima esecuzione perché non c'è stato nessun tick precedente dal caricamento dell'indicatore.

Inoltre se il grafico viene cambiato o viene aggiunta la cronologia, prev_calculated si azzera di nuovo.

Il valore di ritorno da OnCalculate non è usato, ma è meglio usare il ritorno di default (rates_total) nel caso in cui lo sistemino.

 
Barre nel grafico Indicatore Stato tassi-totale prev-calcolato tassi_totale-prev_calcolato
1000 prima esecuzione quando caricato 1000 0 1000
E la barra 1000 non esiste.

So cosa dicono i nuovi documenti. Se lo fai a modo loro devi testare prev_calculated per non-zero e regolare rates_total - prev_calculated giù di uno. Questo è tornare a decrementare la confusione di indicator_counted.
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
Vedi Mostra il progresso dell'indicatore - MQL4 forum
 

Non ha senso fare return( rates_total - 1 ) il valore di prev_calculated è quello come se fosse return(rates_total) indipendentemente da quello che gli avete detto di restituire.

 
SDC: Non ha senso fare return( rates_total - 1 ) il valore di prev_calculated è quello come se fosse return(rates_total) indipendentemente da quello che gli hai detto di restituire.
hai segnalato il problema al servizio di assistenza?
Motivazione: