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?
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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.