Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1213

 

Salud! Aiuto :)

Una storia di tick viene copiata da un indicatore (mt5) per un'ulteriore elaborazione. Ho copiato l'algoritmo dal libro di riferimento, l'ho solo cambiato un po':

         int     attempts = 0;
         bool    success = false;
         MqlTick tick_array[];
         datetime startCopyTime = (copyTickTime < periodStartTime) ? periodStartTime : copyTickTime;
         datetime checkPoint;

         while(attempts < 3) {
            uint start = GetTickCount();
            checkPoint = TimeCurrent();
            int received = CopyTicks(_Symbol, tick_array, COPY_TICKS_ALL, startCopyTime, ticksSizeToCopy);
            if(received != -1) {
               PrintFormat("%s: received %d ticks in %d ms", _Symbol, received, GetTickCount() - start);
               if(GetLastError() == 0) {
                  success = true;
                  break;
               } else
                  PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                              _Symbol, received, GetTickCount() - start, _LastError);
            }
            attempts++;
         }
         if(!success) {
            PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", ticksSizeToCopy, _Symbol);
            return;
         }
         copyTickTime = checkPoint;

Ma ho ricevuto un avvertimento: la cronologia dei tick non è sincronizzata:

2020.07.12 10:07:12.092 Volumes (GBPUSD,H1)     GBPUSD: Ticks are not synchronized yet, 10103745 ticks received for 532 ms. Error=4403

E nel manuale c'è scritto:

ERR_HISTORY_TIMEOUT

4403

Timeout superato su richiesta di cronologia

L'intuito del capitano mi dice di sincronizzare i tic... è questo il punto che sto cercando di fare? Come fare? O è possibile lavorare senza troppi danni anche senza sincronizzazione, semplicemente rimuovendo il controllo di successo?

 
Yevhenii Levchenko:

Salud! Aiuto :)

Una storia di tick viene copiata da un indicatore (mt5) per un'ulteriore elaborazione.

Gli indicatori hanno accesso asincrono ai dati storici, mentre gli Expert Advisors e gli script hanno accesso sincrono, o almeno questo è il modo in cui gli sviluppatori dei programmi MQL chiamano il comportamento quando lavorano con i dati

in linguaggio umano, quando si accede ai dati della storia nell'indicatore, è necessario uscire dal ciclo di calcolo con un errore, e dopo un po' è necessario riapplicare alla storia

E non ha senso chiamare la cronologia nell'indicatore più volte in un ciclo - questo metodo funziona solo in Expert Advisors e script

 
Igor Makanu:

Negli indicatori accesso asincrono ai dati storici, in Expert Advisors e script - accesso sincrono, o almeno questo è come gli sviluppatori chiamano il comportamento dei programmi MQL quando lavorano con i dati

in linguaggio umano, quando si accede ai dati della storia nell'indicatore, è necessario uscire dal ciclo di calcolo con un errore, e dopo un po' è necessario riapplicare alla storia

e non ha senso chiamare la cronologia più volte nell'indicatore - questo metodo funziona solo negli Expert Advisors e negli script

Grazie!

Il sincrono è legato al multithreading? "Le zecche non sono ancora sincronizzate" - risulta più come un avvertimento?

 
ANDREY:

Sciocchezze... Non sei bravo in logica, non sei bravo in matematica ..... e allo stesso tempo hai moderato a lungo e con successo un forum il cui tema è permeato sia dalla logica che dalla matematica.

Dove ho detto che non sono bravo in logica?

 
ANDREY:

Penso che la conoscenza posseduta da un gruppo di specialisti non era la conoscenza di Ford stesso e non lo divenne mai. Inoltre - non aveva bisogno di questa conoscenza, perché la chiamava inutile. E se questi esperti cercassero di trasmettere le loro conoscenze a Ford, egli non sarebbe in grado di assimilarle e usarle per scopi pratici. È necessario avere più di un'idea generale dell'argomento, che è associato alla nuova conoscenza, per poterla assorbire. Nell'esempio di cui sopra, gli esperti non hanno fornito conoscenze alla Ford, ma agli avvocati.

E nel tuo cervello, come mi sembra, hai una quantità sufficiente di conoscenze sistematizzate in matematica e logica e questo kit ti permette di formulare rapidamente e correttamente una domanda di ricerca di informazioni nuove e mancanti e di interpretarle rapidamente e correttamente. Sono sicuro che nel tuo cervello non può essere nessuna informazione del genere, poiché ogni giorno per molte ore trascorse su questo forum e passato attraverso il suo cervello un sacco di informazioni associate specificamente con la matematica e la logica. È come imparare una lingua straniera per immersione. Si impara automaticamente, spontaneamente e forse anche contro la volontà dell'allievo.

Se 100 accademici cominciano a spiegarmi le regole di calcolo delle equazioni integrali, non imparerò a farlo finché non mi riempiranno la testa con tutti i libri di testo di matematica e algebra, che ho dovuto studiare a scuola prima che l'insegnante cominciasse a spiegare le equazioni integrali.

Se non si capisce cos'è una variabile e a cosa serve, è difficile capire anche solo sapere cos'è una variabile, per non parlare di altri concetti che non sono nemmeno molto complicati.

Ford non ha detto che gli sarebbe stata insegnata la cosa giusta nella sua area di interesse. Ha detto che era circondato da così tanti specialisti in diversi campi che poteva ottenere risposte alle domande di cui aveva bisogno in qualsiasi momento. Perché un manager deve sapere quello che 200 specialisti possono sapere, ognuno di loro darà la risposta giusta nella sua area? È impossibile sapere tutto in linea di principio. Ma per ottenere rapidamente le risposte ai problemi di cui avete bisogno con l'aiuto di specialisti - questo è ciò di cui parlava Ford, questo è ciò che ho detto sui libri di riferimento e sull'uso delle informazioni giuste. E questo è in qualche area ristretta che questa risorsa fornisce sotto forma di CodeBase e un forum.

 
Yevhenii Levchenko:

Grazie!

La sincronizzazione è legata al multithreading? "Le zecche non sono ancora sincronizzate" risulta essere più un avvertimento?

no

Gli sviluppatori implicano che sincrono significa un qualche tipo di elaborazione garantita dei dati storici quando si chiamano le funzioni di cronologia, ma non garantisce che i dati siano necessariamente restituiti quando vengono effettuate le query

... ecco il linguaggio non umano ))))


asincrono è una query e i dati o un errore. dopo un errore si verifica, la sincronizzazione inizia, ma il tempo di fine della sincronizzazione (o costruzione TF) è sconosciuto e a causa delle alte prestazioni di MT5 si ottiene un errore ogni volta invece di dati sincronizzati

ZS: in MT5 tutto è complicato lì.... c'è un server, c'è un terminale e infine il nostro programma MQL. Quando si richiede la storia si deve sincronizzare il server - terminale e poi il terminale - programma MQL, qualcuno potrebbe non avere timeframes pronti o dati tick

 
Igor Makanu:

no

Gli sviluppatori implicano che la sincronizzazione è una sorta di elaborazione garantita dei dati storici quando si chiamano le funzioni di cronologia, ma non garantisce necessariamente il ritorno dei dati quando vengono interrogati...

... ecco il linguaggio non umano ))))


asincrono è una query e i dati o un errore. dopo un errore si verifica, la sincronizzazione inizia, ma il tempo di fine della sincronizzazione (o costruzione TF) è sconosciuto e a causa delle alte prestazioni di MT5 si ottiene un errore ogni volta invece di dati sincronizzati

ZS: in MT5 tutto è complicato lì.... c'è un server, c'è un terminale e infine il nostro programma MQL. Quando si richiede la storia si dovrebbe sincronizzare il server - terminale e poi il terminale - programma MQL, qualcuno potrebbe non avere timeframes pronti o dati tick

La risposta più semplice è qualcosa del genere:

Per aspettare la sincronizzazione nell'indicatore, dovreste semplicemente uscire da OnCalculate() con return 0 dopo aver ricevuto un errore;

In questo caso il primo accesso ai dati storici avvia il processo di sincronizzazione dei dati e resta solo da controllare il suo completamento. Se c'è un errore nella ricezione dei dati, allora restituisce zero - poiché zero indica la quantità di dati già calcolati nella chiamata precedente (prev_calculated), e alla chiamata attuale e al caricamento riuscito dei dati storici OnCalculate() sarà calcolato su tutta la profondità della storia (poiché restituendo 0 abbiamo indicato nella chiamata precedente che nulla è stato calcolato).

 
a.lxrn:

Buon pomeriggio a tutti, potete per favore aiutarmi a risolvere questo problema, il problema è nella logica, mi sono rotto il cervello oggi e sono arrivato al punto in cui sono in un casino.

Ho scritto un esempio di codice elementare, c'è un segnale se la chiusura della candela è più del vagone, viene aperto un ordine.

Il segnale rimarrà e rimarrà vero per molto tempo, sono sicuro che sapete cosa voglio dire,

Sono sicuro che capisci cosa voglio dire. In realtà, come dovrei fare un segnale per comprare aprire un ordine e basta, fino a quando la situazione cambia e il prezzo di chiusura è inferiore al prezzo dell'onda.

Posso usare le bandiere, ma non salveranno l'ordine quando si chiude e si apre o ritarda di 15 minuti. È ancora più bello quando le condizioni di apertura e chiusura degli ordini sono vere allo stesso tempo. Ad ogni tick un ordine)))) Le bandiere sono se il segnale per aprire l'ordine è vero e la bandiera che l'ordine è aperto è falsa, allora apriamo l'ordine. E se il flag che l'ordine è aperto è vero, l'ordine non si aprirà). Un ritardo è più facile e più efficiente. Dopo la chiusura dell'ordine, impostiamo un ritardo.

 
Igor Makanu:

asincrono è una query e dati o un errore, e dopo un errore la sincronizzazione inizia, ma il tempo della fine della sincronizzazione (o costruzione TF) è sconosciuto e a causa delle alte prestazioni di MT5 si ottiene un errore ogni volta che si chiama di nuovo invece di dati sincronizzati

ZS: in MT5 tutto è complicato lì.... Avete un server, un terminale e infine il nostro programma MQL. Quando si richiede la storia è necessario sincronizzare il server - terminale e poi il terminale - programma MQL, qualcuno potrebbe avere timeframes non pronti o dati tick


Approssimativamente ha ottenuto ... Grazie :)

Artyom Trishkin:

Era più facile rispondere approssimativamente così:

Per aspettare la sincronizzazione in un indicatore, dovete uscire da OnCalculate() con ritorno 0 dopo aver ricevuto un errore;

In questo caso il primo accesso ai dati storici avvia il processo di sincronizzazione dei dati e non resta che verificare il suo completamento. Se c'è un errore nella ricezione dei dati, allora restituisce zero - poiché zero indica la quantità di dati già calcolati nella chiamata precedente (prev_calculated), e alla chiamata attuale e al caricamento riuscito dei dati storici OnCalculate() sarà calcolato su tutta la profondità della storia (poiché restituendo 0 abbiamo così indicato alla chiamata precedente che nulla è stato calcolato).

Più semplice non significa più chiaro :)

Sono passato agli strumenti di serie e ha stampato solo una volta che erano fuori sincrono. Le query successive non hanno mostrato nient'altro di simile.

Puoi dirmi perché il tester non mostra i volumi?
 
Yevhenii Levchenko:

Approssimativamente capito... Grazie :)

Più semplice non significa più chiaro :)

Sono passato agli strumenti di serie e ha stampato solo una volta che erano fuori sincrono. Le query successive non hanno mostrato nient'altro di simile.

Puoi dirmi perché il tester non mostra i volumi?

Per mantenere i dati storici nello stato "caldo" attuale, è necessario accedere a questi dati una volta ogni due minuti usando una qualsiasi delle funzioni CopyXXX, iXXX, per esempio CopyTime(), iTime(), ecc.

Non so quali volumi non si ottengono nel tester. Ci sono volumi reali e di zecca. Senza codice è impossibile rispondere in sostanza.

Motivazione: