Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 985

 

do { ... codice di riempimento del buffer

}

while(questi due valori non corrispondono)

in breve, ottenere i valori nel ciclo fino a quando non corrispondono, solo allora eseguire il seguente codice
 
Maxim Dmitrievsky:

do { ... codice di riempimento del buffer

}

mentre(questi due valori non sono uguali)

In breve, prendi i valori nel ciclo, finché non sono uguali, solo allora esegui il seguente codice

Il punto è che finché un indicatore non funziona, i dati (flusso) non vengono passati all'altro, cioè, il ciclo nell'indicatore senzaOnCalculate di questo indicatore non servirà. E non appena OnCalculate è finito, i dati vengono passati all'Expert Advisor, ed è sbagliato.

O forse non capisco la tua idea.
 
Aleksey Vyazmikin:

Quindi, il punto è che fino a quando un indicatore funziona, i dati (flusso) non vengono trasferiti a un altro, cioè il ciclo nell'indicatore senza la terminazione di OnCalculate di questo indicatore non aiuterà.

ricevi i valori dai buffer di altri indicatori uno per uno, se il loro numero non è lo stesso, li ricevi di nuovo finché non è lo stesso, dimenticati dei flussi. Ma in generale, nessuno lo fa in questo modo - è molto lento

 
Aleksey Vyazmikin:

Quindi, il punto è che finché un indicatore funziona, i dati (flusso) non vengono passati a un altro, cioè il ciclo nell'indicatore senza OnCalculate di questo indicatore non servirà. Ma non appena OnCalculate è finito, i dati vengono passati all'Expert Advisor, e sono errati.

O non capisco la tua idea.

è necessario che la condizione sia vera, allora solo i buffer saranno riempiti, come ho capito (il numero di barre nei buffer di altri indicatori sarà lo stesso)

soddisfare forzatamente tutte le condizioni prima di riempire i buffer dell'indicatore corrente

o ridarlo al programmatore sbagliato - perché dovremmo risolvere i suoi problemi nel campo sbagliato?

 
Maxim Dmitrievsky:

si ottengono i valori dai buffer di altri indicatori uno per uno, se il loro numero non è lo stesso, li si ottiene di nuovo fino a quando è lo stesso, dimenticare i flussi. ma in generale, nessuno lo fa, è una perversione di indicatori da indicatori, molto lento

Maxim Dmitrievsky:

è necessario che la condizione sia soddisfatta, allora solo i buffer saranno riempiti, come ho capito (il numero di barre nei buffer di altri indicatori sarà lo stesso)

Esecuzione forzata di tutte le condizioni prima che i buffer dell'indicatore corrente siano riempiti

o restituirlo al programmatore con una brutta mano, perché dovremmo risolvere i suoi problemi nel posto sbagliato?

Se il calcolo non è pronto da altri indicatori, i valori saranno zero, quindi non ha senso forzare il riempimento qui, si possono riempire i dati passati, ma con lo stesso effetto, si possono richiedere i dati non per la barra corrente dall'indicatore, ma per quella passata, e poi il codice non dovrebbe essere cambiato affatto.

Perché la situazione nel tester e nel conto reale è diversa, la simulazione di Sleep funziona in modo molto strano, e il ricalcolo dell'indicatore per 15 secondi di slittamento avviene solo una volta, mentre deve avvenire ad ogni tick, o a richiesta, e non avviene in 15 secondi, ma in 13, secondo il log.

Inoltre, il problema della sincronizzazione è rilevante, e sarebbe bene aggiungere per tali situazioni la possibilità di informare l'indicatore sulla necessità di passare il flusso di dati ad altri indicatori, senza i quali è impossibile eseguire ulteriori calcoli - questa sarebbe una soluzione - il comando di passare il flusso ad un altro indicatore senza il completamento del calcolo.

Rispettivamente, l'Expert Advisor dovrebbe aspettare i dati dall'indicatore e saltare i tick fino a quando il calcolo completo è fatto; ora, quando si cerca di usare l 'istruzione "while", il risultato del calcolo si blocca / va in stallo (cioè non succede niente, il tester sta lì), e anche questo non è corretto.

Ho, naturalmente, informato lo sviluppatore, ma non l'ho sentito da più di un mese - il costo del freelance.

 

la situazione nel tester e nel conto reale è diversa, la simulazione Sleep funziona in modo molto strano, e il ricalcolo dell'indicatore per 15 secondi di slittamento si verifica solo una volta, mentre dovrebbe verificarsi ad ogni tick, o su richiesta, ma si verifica non in 15 secondi, ma in 13, secondo il log.

Inoltre, il problema della sincronizzazione è rilevante, e sarebbe bene aggiungere per tali situazioni la possibilità di informare l'indicatore sulla necessità di passare il flusso di dati ad altri indicatori, senza i quali è impossibile eseguire ulteriori calcoli - questa sarebbe una soluzione - il comando di passare il flusso ad un altro indicatore senza il completamento del calcolo.

Rispettivamente, l'Expert Advisor dovrebbe aspettare i dati dall'indicatore e saltare i tick fino alla fine del calcolo completo, ma ora, quando si cerca di usare l'istruzione "while" per aspettare i risultati corretti del calcolo, si blocca / va in stallo (cioè non succede niente, il tester rimane lì), e anche questo non è corretto.

 

CaroArtyom Trishkin!

Spero vivamente che, dato che avete stabilito che le domande di cui sopra sono per principianti, conosciate già la risposta e possiate aiutarmi!

Sto aspettando una risposta da un professionista.

 
Aleksey Vyazmikin:

CaroArtyom Trishkin!

Spero vivamente che, dato che avete stabilito che le domande di cui sopra sono per principianti, conosciate già la risposta e possiate aiutarmi!

Sto aspettando una risposta da un professionista.

L'unico consiglio che posso dare è questo: l'indicatore dovrebbe uscire da OnCalculate() se non ha ricevuto il numero di barre richiesto per il calcolo: if(rates_total<number of_bars required) return 0;

L'Expert Advisor dovrebbe controllare i dati ricevuti dall'indicatore, e se non sono uguali al valore vuoto dell'indicatore, solo allora eseguire i calcoli con i dati ricevuti.

  1. Nell'indicatore, prima, i buffer sono inizializzati con un valore vuoto (che cos'è - può essere impostato nell'indicatore)
  2. Nell'indicatore (i buffer sono già riempiti con un valore vuoto), controllate il numero di barre disponibili (descritto sopra)
  3. Se il controllo della disponibilità delle barre è superato, il ciclo di calcolo dell'indicatore viene eseguito riempiendo i buffer con i valori necessari.
    ... ... ...
  4. Nell'Expert Advisor, controlla quante barre sono calcolate dall'indicatore (c'è una funzione standard BarsCalculated())
  5. Ottenere dati dall'indicatore
  6. A seconda di ciò che otteniamo - dipende dalla logica del vostro TS
    1. Se l'indicatore è una linea, allora il suo valore vuoto indica che non è stato ancora calcolato - non lo prendiamo per i calcoli
    2. Se l'indicatore - frecce, poi c'è un'altra logica (perché il valore vuoto è anche i suoi dati di lavoro), per esempio, se questo è un frattale, poi controlliamo la barra numero 3, e dai valori ottenuti spingere indietro.
  7. Bene, includete la vostra logica e non date la colpa di tutto al terminale Bugs.
  8. Prima di tutto controllo Bugs con me stesso.
  9. E tu?
 
Artyom Trishkin:

Posso solo consigliare: l'indicatore dovrebbe uscire da OnCalculate() se non ha ottenuto il giusto numero di barre per il calcolo: if(rates_total<number_of_bars required) return 0;

Grazie per il suggerimento, nessun problema con l'uscita, ma non risolve la situazione, ho fatto come un calcolo fallito per ora

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

E in qualche modo riempie i buffer e ottiene dati da altri indicatori e i dati non vengono passati all'EA fino a quando una condizione è soddisfatta. Non ho ancora controllato la correttezza dei dati, ma sembra corretto. O forse mi sbaglio e qualcosa è sicuramente sbagliato?

Artyom Trishkin:

L'Expert Advisor dovrebbe controllare i dati ricevuti dall'indicatore e se non sono uguali al valore dell'indicatore vuoto, solo allora eseguire i calcoli con i dati ricevuti.

L'Expert Advisor esegue i calcoli uno all'arrivo di una nuova barra, e rispettivamente, il tentativo di aspettare il valore corretto dall'indicatore porta ad un arresto del tester.

Artyom Trishkin:
  1. Nei buffer dell'indicatore sono prima inizializzati con un valore vuoto (che cos'è - può essere impostato nell'indicatore)
  2. Nell'indicatore (i buffer sono già riempiti con un valore vuoto) controllate il numero di barre disponibili (descritto sopra)
  3. Se il controllo della disponibilità delle barre è superato, il ciclo di calcolo dell'indicatore viene eseguito riempiendo i buffer con i valori necessari
    ... ... ...
  4. Nell'Expert Advisor, controlla quante barre sono calcolate dall'indicatore (c'è una funzione standard BarsCalculated())
  5. Ottenere dati dall'indicatore
  6. A seconda di ciò che otteniamo - dipende dalla logica del vostro TS
    1. Se l'indicatore è una linea, allora il suo valore vuoto indica che non è stato ancora calcolato - non lo prendiamo per i calcoli
    2. Se l'indicatore - frecce, poi c'è un'altra logica (perché il valore vuoto è anche i suoi dati di lavoro), per esempio, se questo è un frattale, poi controlliamo la barra numero 3, e dai valori ottenuti spingere indietro.
  7. Bene, includete la vostra logica e non date la colpa di tutto al terminale Bugs.
  8. Prima di tutto controllo i bug con me stesso.
  9. E tu?

1. è vero.

2. E così succede. Questo calcolo sarà corretto sul prossimo tick, ma voglio ricevere il calcolo corretto sul primo tick, perché Expert Advisor non aspetta nel ciclo altri tick o l'aspettativa non è commensurabile con la mia pazienza, cioè non è realistica - c'è un errore.

3.

4. Naturalmente.

5. Sì, lo facciamo, ma l'indicatore ha bisogno di ricevere dati da altri indicatori e questo è il problema!

6. 1-2. non è corretto mettere deliberatamente dati falsi nel buffer dell'indicatore, questo complicherà solo il rilevamento dell'errore dell'algoritmo nel codice dell'Expert Advisor.

7. Sto descrivendo tutto logicamente, ma non ho scritto l'indicatore, quindi è difficile per me capire qual è il motivo, ho descritto la manifestazione ragionevole dell'indicatore, cioè l'impossibilità di eseguire un calcolo senza ricevere valori bufferizzati da altri indicatori, a causa del monopolio del flusso di dati (gli indicatori sono calcolati in modo sequenziale).

8. Ho già notato qui e prima che non sono l'autore, ho speso molto tempo - quasi un giorno - per identificare le ragioni.

9. E sto cercando una soluzione al problema, inoltre, se qualcuno ha affrontato questo, può rapidamente aiutarmi. Ripeto, in quel thread ho iniziato a scrivere a causa di sonno, e poi è venuto fuori le altre caratteristiche del tester, che credo anche l'errore.

Grazie per la risposta.

 
Aleksey Vyazmikin:

Grazie per il suggerimento, nessun problema con l'output, ma non risolve la situazione, ho fatto come un calcolo fallito finora

E in qualche modo riempie i buffer e ottiene dati da altri indicatori, i dati non vengono passati all'EA finché la condizione non è soddisfatta. Non ho ancora controllato la correttezza dei dati, ma sembra corretto. O forse mi sbaglio e qualcosa è sicuramente sbagliato?

L'Expert Advisor esegue il calcolo da solo quando arriva una nuova barra e quindi, quando si cerca di aspettare il valore corretto dall'indicatore, porta ad un arresto del tester.

1. lo fa.

E così è. 2. Questo calcolo sarà corretto sul prossimo tick, ma ho bisogno di ottenere un calcolo corretto sul primo tick, perché il mio Expert Advisor non aspetta nel ciclo altri tick o l'aspettativa non è commensurabile con la mia pazienza, cioè non è realistica - c'è un errore.

3.

4. Naturalmente.

5. Sì, lo facciamo, ma l'indicatore ha bisogno di ricevere dati da altri indicatori e questo è il problema!

6. 1-2. non è corretto mettere deliberatamente dati falsi nel buffer dell'indicatore, questo complicherà solo il rilevamento dell'errore dell'algoritmo nel codice dell'Expert Advisor.

7. Sto descrivendo tutto logicamente, ma non ho scritto l'indicatore, quindi è difficile per me capire qual è il motivo, ho descritto la manifestazione ragionevole dell'indicatore, cioè l'impossibilità di eseguire un calcolo senza ricevere valori bufferizzati da altri indicatori, a causa del monopolio del flusso di dati (gli indicatori sono calcolati in modo sequenziale).

8. Ho già notato qui e prima che non sono l'autore, ho speso molto tempo - quasi un giorno - per identificare le ragioni.

9. E sto cercando una soluzione al problema, inoltre, se qualcuno ha affrontato questo, può rapidamente aiutarmi. Ripeto, in quel thread ho iniziato a scrivere a causa di sonno, e poi è venuto fuori le altre caratteristiche del tester, che credo anche l'errore.

Grazie per la risposta.

In OnInit() chiamate la serie temporale del simbolo: iTime(Symbol,Timeframe,1);

All'inizio, in OnTick(), chiedete la barra richiesta della serie temporale richiesta usando la corrispondente iFunc(), o se( iTime(Symbol,Timeframe,10)==0) ritornate;

In questo caso, l'Expert Advisor non rileverà una nuova barra e aspetterà il prossimo tick.

In OnInit() abbiamo richiesto i dati della serie temporale, attivando così la paginazione dei dati.

In OnTick() controlliamo se la storia minima richiesta è disponibile per l'EA e se non è ancora disponibile, aspettiamo il prossimo tick.

E fino a quando tutti i dati richiesti dall'Expert Advisor non saranno ricevuti, esso aspetterà il prossimo tick.

Non appena tutti i dati necessari sono stati pompati e ottenuti, l'Expert Advisor inizierà a lavorare con la nuova barra e la storia richiesta.

Per mantenere aggiornati i dati seriali, è indispensabile accedervi almeno una volta ogni due minuti. Fate un secondo timer per circa un minuto e mezzo (90 secondi) e in esso fate semplicemente riferimento a qualsiasi serie temporale del simbolo desiderato, per esempio iTime(Symbol,Timeframe,1); Senza controllare i dati ricevuti - semplicemente "muovete" la storia. Quindi tutti i dati sul simbolo saranno sempre aggiornati.

Motivazione: