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.
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 <=
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.
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.
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.
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.
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?
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
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
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).
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.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?
Spero che sia d'aiuto.
SCFX
prev_calculated == rates_total
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.
Vedrete che rates_total è l'attuale quantità di barre.
prev_calculated è la quantità di barre che c'erano al tick precedente.
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.
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.
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.
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.