Problemi con Time()

 
Ciao Comunità MQL4!

Questo è il mio primo post. Per prima cosa, vi prego di non dire che non sono uno sviluppatore di MQL. Sono un trader, che usa uno strumento per aiutarmi a costruire EAs. Questo strumento permette l'uso di alcune strutture MQL, ma non esegue funzioni MQL esplicite. Prende semplicemente il codice MQL, valuta se la condizione basata su MQL è vera/falso, e poi esegue una funzione personalizzata come OpenBuy, OpenSell, CloseBuy, CloseSell, DeletePendingBuy, DeletePendingSell, ecc. Ma non esegue esplicitamente il codice MQL. Ad esempio, è possibile utilizzare la funzione Print o Comment per far apparire qualcosa sulla finestra del grafico di MT4 (solo un esempio).

Quindi, conosco un po' di MQL, che è appena sufficiente per permettermi di utilizzare lo strumento di sviluppo EA che uso per costruire i miei EA. Finora, ho costruito 10 EA utilizzando lo strumento e ho abbandonato 7 di loro a causa della non profittabilità, che è circa il 30% meglio del mio rapporto di prototipi di successo che ero solito ottenere con la costruzione di sistemi di trading in Excel. In genere mi aspetto che 7-8 idee su 10 non saranno così redditizie come previsto, lasciando 2-3 progetti abbastanza redditizi per iniziare il processo di ottimizzazione. Ok, basta parlare di me e di come mi muovo.

Ecco il mio problema e spero di essere venuto nel posto giusto per un aiuto!

Sto eseguendo questo codice [b]per chiudere i trade:[/b]

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Nota: Il problema è che tutte le compravendite rimangono aperte dal lunedì al giovedì, fino alle 23:57. Inoltre, tutte le compravendite rimangono aperte il venerdì fino alle 21:57.


Sto anche eseguendo questo codice attraverso un blocco MQL [b]per aprire le compravendite:[/b]

TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05

Nota: L'unica compravendita che si apre tra 00:00 e 00:05, è la primissima compravendita del back-test, quando si clicca sul pulsante Tester Start. Quella compravendita si apre esattamente alle 00:00. Tuttavia, nessuno degli altri trade si apre tra le 00:00 e le 00:05, più avanti nella settimana.

In sintesi:

- Una compravendita si apre dopo aver cliccato sul pulsante Tester Start alle 00:00.
- Nessuna compravendita viene poi chiusa alle 23:57 (M-Gio), o alle 21:57 (Ven).
- Nessuna compravendita viene mai aperta successivamente tra le 00:00 e le 00:05.

Tutti gli orari mostrati sopra hanno un ampio flusso di tick disponibile. Quindi, non ci sono lacune nei dati utilizzati da Tester.

Qualsiasi aiuto sarebbe apprezzato. Perché queste compravendite non riescono a chiudersi all'ora codificata? Perché non vengono eseguite compravendite quando c'è sempre un segnale di compravendita disponibile tra le 00:00 e le 00:05, dal lunedì al venerdì?

Grazie!
cfx
 

Quali istruzioni di stampa di debug hai aggiunto al tuo codice per scoprire cosa viene o non viene eseguito? per esempio, è l'OrderClose() che fallisce o è il codice che porta all'OrderClose()? prendi nota dei valori di ritorno e stampi eventuali errori rilevanti?

Cosa sono i valori di ritorno delle funzioni? Come si usano?

Day() funziona correttamente nello Strategy Tester? Hai testato che funziona? Puoi usare TimeDayOfWeek() invece.

 

>Sto eseguendo questo codice [b]per chiudere le transazioni:[/b]

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

>Nota: Il problema è che tutte le compravendite rimangono aperte dal lunedì al giovedì, fino alle 23:57. Inoltre, tutte le compravendite rimangono aperte il venerdì fino alle 21:57.

Questo è un errore molto comune tra i principianti: cercare di inserire l'intera espressione logica in una riga. È impossibile fare il debug.

Il trucco è rompere il test in piccoli pezzi e controllare ogni bit (con dichiarazioni di stampa o altro).

Riesci a farlo chiudere dopo le 23:57 di qualsiasi giorno? Non c'è bisogno di preoccuparsi dei giorni della settimana con questo test. Una volta che avete ottenuto un test che funziona correttamente, potete diventare più avventurosi. Ma usate diverse linee, dove possibile, per permettere le dichiarazioni di stampa in mezzo per il debug. Quando funziona, rimuovete le istruzioni di stampa ma lasciate il codice su linee separate. Il codice è effettivamente più efficiente quando è scritto su molte linee (viene eseguito più velocemente).

 
  1.  Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    Quale di questi intendeva?
    Day() == 1 || Day() == 2 || Day() == 3 || ( Day() == 4 && TimeHour(TimeCurrent()) >=23) && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    ( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    Sempre parentesi completamente o semplificare e autodocumentarsi
    #define HR2157 79020 // 21 * 3600 + 57 * 60
    #define HR2357 86220
    datetime now = TimeCurrent();
    int      tod = now % 86400;
    bool     isFriday = TimeDayOfWeek(now) == 5;
    if (isFriday) int todClose = HR215700;
    else              todClose = HR235700
    if (now >= todClose) ...
    

  2. https://www.mql5.com/en/forum/127483 riportato DayOfWeek() restituisce sempre 5 nel tester, quindi uso solo le versioni Timexxx().
 
WHRoeder:
  1. Quale di questi intendeva?
L'OP ovviamente intende OR tutti i giorni della settimana tranne il venerdì. Chiaramente sta cercando di forzare una chiusura prima della fine del giorno di negoziazione, ma con il venerdì più corto. Non ha capito che il test di usare l'OR dei quattro giorni è superfluo, dato che possiamo sempre chiudere se l'ora è dopo le 23:57. Il venerdì non ha bisogno di essere escluso!
 
RaptorUK:

Quali istruzioni di debug hai aggiunto al tuo codice per scoprire cosa viene o non viene eseguito? Per esempio, è l'OrderClose() che fallisce o è il codice che porta all'OrderClose()? Prendi nota dei valori di ritorno e stampi gli errori rilevanti?

Cosa sono i valori di ritorno delle funzioni? Come si usano?

Day() funziona correttamente nello Strategy Tester ? hai testato che funziona ? puoi usare invece TimeDayOfWeek().


Non ho usato dichiarazioni di stampa per questo scopo. Ho fatto un errore di battitura nel mio post originale. Lo strumento che sto usando [b]non può[/b] (originariamente ho scritto "può") utilizzare funzioni MQL come Print, o Comment. Quindi, mi scuso per il refuso, che ha influito sulla vostra risposta.

Tuttavia, posso facilmente guardare il Tester Journal e vedere che l'EA non sta preparando alcun trade quando dovrebbe (alle 00:00), e non sta istanziando la chiusura di alcun trade quando dovrebbe (lun - giov alle 23:59, o ven alle 21:57). Essenzialmente, posso vedere il caricamento dell'EA al run-time del Tester, le informazioni obbligatorie sul Conto Demo, e infine, posso vedere che tutti i Time Frames per gli indicatori usati dall'EA vengono caricati correttamente e senza errori. Di solito non ottengo errori di nessun tipo con i miei EA, in nessun modo. E, di routine, provo sempre gli EA Multi-Time Frame.

Sembra che io abbia un problema solo con la funzione Time().

Poiché l'unica posizione che viene aperta è il primo trade che l'EA vede DOPO aver cliccato sul pulsante Tester Start, non posso dire se Day() funziona o meno dall'output che viene da Print, o da Comment. Tuttavia, come test casuale, ho rimosso la linea [b]TimeMinute(TimeCurrent()) <= 05[/b] dal segmento di codice che controlla l'apertura delle posizioni alle 00:00, lun - ven. Quando l'ho fatto, il seguente codice ha iniziato a funzionare come previsto:

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Questo mi dice che in effetti Day() funziona per deduzione. Infatti, l'intero segmento di codice che chiude le posizioni, funziona. Ma, per qualche ragione, non quando [b]TimeMinute(TimeCurrent()) <= 05[/b] è usato nel segmento di codice che controlla l'apertura delle posizioni. Questa ironia non ha senso per me - non riesco a capire perché questo dovrebbe essere il caso.

Grazie!

cfx

 
dabbler:

>Sto eseguendo questo codice [b]per chiudere le compravendite:[/b]

>Nota: Il problema è che tutte le compravendite rimangono aperte dal lunedì al giovedì, fino alle 23:57. Inoltre, tutte le compravendite rimangono aperte il venerdì fino alle 21:57.

Questo è un errore molto comune tra i principianti: cercare di inserire l'intera espressione logica in una riga. È impossibile fare il debug.

Il trucco è rompere il test in piccoli pezzi e controllare ogni bit (con dichiarazioni di stampa o altro).

Riuscite a farlo chiudere dopo le 23:57 di qualsiasi giorno? Non c'è bisogno di preoccuparsi dei giorni della settimana con questo test. Una volta che hai ottenuto un test che funziona correttamente, puoi diventare più avventuroso. Ma usate diverse linee, dove possibile, per permettere le dichiarazioni di stampa in mezzo per il debug. Quando funziona, rimuovete le istruzioni di stampa ma lasciate il codice su linee separate. Il codice è effettivamente più efficiente quando è scritto su molte righe (viene eseguito più velocemente).


Grazie a tutti per le risposte, comunque!


Il Close Control funziona. Quando ho rimosso il [b]TimeMinute(TimeCurrent()) <= 05[/b] dal controllo Open, funziona davvero. La primissima posizione che è stata eseguita DOPO aver cliccato sul pulsante Tester Start, viene effettivamente chiusa alle 23:57 (lun-gio). Il problema diventa allora il fatto che nessuna nuova posizione viene mai aperta alle 00:00, come il Controllo di apertura richiede per progettazione ([b]TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05[/b]. Anche quando rimuovo la funzione [b]TimeMinute(TimeCurrent() <=5[/b] come semplice controllo di sanità mentale.

Ho pensato che rendere il codice il più compatto possibile sarebbe stata la migliore alternativa, ma proverò a espandere ogni funzione, segmento, componente, ecc. per vedere se questo aiuta.


Grazie!

cfx

 
WHRoeder:
  1. quale di questi intendevi?
    Sempre parentesi completamente o semplificare e documentare se stessi
  2. https://www.mql5.com/en/forum/127483 riportato DayOfWeek() restituisce sempre 5 nel tester, quindi uso solo le versioni Timexxx().

Volevo dire:

( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57


Sembra che manchi una parentesi in questo segmento di codice. Se puoi correggerlo per me, te ne sarei grato. Lo strumento che uso mi fa sapere quando manca una parentesi, ma non mi dice dove.


Grazie!

 
dabbler:
L'OP ovviamente intende OR tutti i giorni della settimana tranne il venerdì. Chiaramente sta cercando di forzare una chiusura prima della fine della giornata di trading, ma con il venerdì più corto. Non si è reso conto che il test di usare l'OR dei quattro giorni è ridondante poiché possiamo sempre chiudere se l'ora è dopo le 23:57. Il venerdì non ha bisogno di essere escluso!

Devo isolare il venerdì, altrimenti non ci sarà alcuna distinzione tra gli orari di chiusura del lunedì - giovedì e quelli del venerdì. Entrambi gli orari di chiusura si distinguono per il giorno della settimana in cui si verificano e non solo per l'ora del giorno in cui si verificano.

Quindi, ho bisogno di chiudere lunedì - giovedì rispettivamente alle 23:57 e venerdì alle 21:57. Se includo la chiusura di venerdì con lunedì-giovedì, allora tutti i trade saranno chiusi alla prima ora vista dall'EA, che sarà 21:57, ben due ore prima degli orari di chiusura richiesti da lunedì a giovedì.

Per favore, chiarisca la sua affermazione. Grazie!

cfx

 

LOL!


Sto iniziando a pensare che la maggior parte delle funzioni basate sul "Tempo" in MT4 sono seriamente difettose.


Voglio dire, se resetto tutta la mia logica di controllo della posizione a qualcosa di banale come: TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, e non sono in grado di chiudere un solo trade (l'EA semplicemente ignora il codice!), allora direi che MT4 ha alcuni problemi che devono essere corretti riguardo a questo tipo di funzioni.


Ho anche eseguito una serie di test utilizzando quanto segue: DayOfWeek() != 0 && DayOfWeek() !=, e non un solo trade si apriva da lunedì a venerdì! In effetti, non si apriva neanche un solo trade. Ma, cosa pensate sia successo all'EA quando ho rimosso completamente tutte le funzioni basate sul tempo? Naturalmente, funziona come progettato senza errori. Non sono uno sviluppatore di MQL, ma sono molto bravo a sviluppare costrutti logici e so individuare un problema sistemico quando lo percepisco. Percepisco che MetaQuotes ha un problema con le sue funzioni Time(), punto. Non posso essere così sprovveduto su qualcosa di così facile da codificare e ho visto altre persone che fanno codice in MQL, avere difficoltà con le funzioni basate sul tempo in MT4.

Non so esattamente quale sia il problema, ma quando rimuovo TimeMinute(TimeCurrent()) <= 05, dalla logica di controllo dell'apertura (quel pezzo di codice che controlla l'apertura di tutte le compravendite), e ottengo che SOLO la prima compravendita si chiuda all'ora corretta, ma tutte le altre compravendite guidate dalla stessa logica di controllo dell'apertura vengono sommariamente ignorate dall'EA, allora so che qualcosa è sistematicamente sbagliato nella funzione stessa.

Il codice non può essere più semplice! Sto istruendo l'EA ad aprire il maledetto trade tra le 00:00 e le 00:05. Non è una cosa difficile da codificare. Un bambino di sei anni potrebbe codificarlo. Eccolo ancora una volta: [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Ecco. L'ho appena codificato. Poi lascio il codice nello strumento che sto usando e lo strumento mi dice che la sintassi del codice è corretta! Ok, e adesso? Bene, compilo il dannato file .ex4 per la MILLIONESIMA volta ed eseguo il Tester M4. Ok, e adesso? Beh, il primissimo trade viene lanciato alle 00:00. Fantastico, vero? NOOOOOO! Perché? Perché alle 23:59 di lunedì, la dannata posizione è ancora aperta. E poi? Bene, alle 00:00 della sessione di trading successiva (la prossima barra D1), il buon vecchio [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] tirerà avanti dove il Controllo di chiusura ha fallito, giusto? Sbagliato! Perché? Perché, dalle 00:00 alle 00:05, nessun maledetto trade viene mai aperto dall'EA!!!

Ho passato due (2) giorni su questo semplice codice e nessuno è stato in grado di dirmi perché non funziona - nemmeno gli esperti di MQL! Questo mi dice che MetaQuotes ha un problema.

Ok, ora ho finito di sfogarmi. Sono stati due giorni di frustrazione repressa e dovevo sfogarla.

Non ho MAI avuto problemi con i miei EA e sono stato in grado di mettere insieme alcuni progetti abbastanza sofisticati utilizzando tutti i time frame tranne W1 e MN. Tutti i miei EA utilizzano iCustom design che ho costruito e studiato da zero.

All'improvviso, dopo aver funzionato come un motore V8 ben oliato e ben sintonizzato, inizio ad usare le funzioni Time() e si scatena l'inferno? C'è qualcosa che non va. Sto usando queste funzioni basate sul tempo nel modo più semplice possibile, e ancora non funzionano? 48 ore su una cosa del genere sono state per me un'enorme quantità di tempo da perdere. Frustrato e arrabbiato, cercherò di vivere senza "Tempo", se è possibile.

Dovrò imparare a sviluppare la logica commerciale intorno alle funzioni Time().

Irreale.

 

CFx 2012.05.31 03:41

LOL!


Sto iniziando a pensare che la maggior parte delle funzioni basate sul "Tempo" in MT4 sono seriamente difettose.


Voglio dire, se resetto tutta la mia logica di controllo della posizione a qualcosa di banale come TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, e non sono in grado di chiudere un solo trade (l'EA semplicemente ignora il codice!), allora direi che MT4 ha alcuni problemi che devono essere corretti riguardo a questo tipo di funzioni.


Ho anche eseguito una serie di test utilizzando quanto segue: DayOfWeek() != 0 && DayOfWeek() !=, e non un solo trade si apriva da lunedì a venerdì! In effetti, non si apriva neanche un solo trade. Ma, cosa pensate sia successo all'EA quando ho rimosso completamente tutte le funzioni basate sul tempo? Naturalmente, funziona come progettato senza errori. Non sono uno sviluppatore di MQL, ma sono molto bravo a sviluppare costrutti logici e so individuare un problema sistemico quando lo percepisco. Percepisco che MetaQuotes ha un problema con le sue funzioni Time(), punto. Non posso essere così sprovveduto su qualcosa di così facile da codificare e ho visto altre persone che fanno codice in MQL, avere difficoltà con le funzioni basate sul tempo in MT4.

Non so esattamente quale sia il problema, ma quando rimuovo TimeMinute(TimeCurrent()) <= 05, dalla logica di Controllo Apertura (quel pezzo di codice che controlla l'apertura di tutti i trade), e ottengo che SOLO il primo trade si chiuda al momento giusto, ma tutti gli altri trade guidati dalla stessa logica di Controllo Apertura vengono sommariamente ignorati dall'EA successivamente, allora so che qualcosa è sistematicamente sbagliato nella funzione stessa.

Il codice non può essere più semplice! Sto istruendo l'EA ad aprire il maledetto trade tra le 00:00 e le 00:05. Non è una cosa difficile da codificare. Un bambino di sei anni potrebbe codificarlo. Eccolo ancora una volta: [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Ecco. L'ho appena codificato. Poi lascio il codice nello strumento che sto usando e lo strumento mi dice che la sintassi del codice è corretta! Ok, e adesso? Bene, compilo il dannato file .ex4 per la MILLIONESIMA volta ed eseguo il Tester M4. Ok, e adesso? Beh, il primissimo trade viene lanciato alle 00:00. Fantastico, vero? NOOOOOO! Perché? Perché alle 23:59 di lunedì, la dannata posizione è ancora aperta. E poi? Bene, alle 00:00 della sessione di trading successiva (la prossima barra D1), il buon vecchio [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] tirerà avanti dove il Controllo di chiusura ha fallito, giusto? Sbagliato! Perché? Perché, dalle 00:00 alle 00:05, nessun maledetto trade viene mai aperto dall'EA!!!

Ho passato due (2) giorni su questo semplice codice e nessuno è stato in grado di dirmi perché non funziona - nemmeno gli esperti di MQL! Questo mi dice che MetaQuotes ha un problema.

Ok, ora ho finito di sfogarmi. Sono stati due giorni di frustrazione repressa e dovevo sfogarla.

Non ho MAI avuto problemi con i miei EA e sono stato in grado di mettere insieme alcuni progetti abbastanza sofisticati utilizzando tutti i time frame tranne W1 e MN. Tutti i miei EA utilizzano iCustom design che ho costruito e studiato da zero.

All'improvviso, dopo aver funzionato come un motore V8 ben oliato e ben sintonizzato, inizio ad usare le funzioni Time() e si scatena l'inferno? C'è qualcosa che non va. Sto usando queste funzioni basate sul tempo nel modo più semplice possibile, e ancora non funzionano? 48 ore su una cosa del genere sono state per me un'enorme quantità di tempo da perdere. Frustrato e arrabbiato, cercherò di vivere senza "Tempo", se è possibile.

Dovrò imparare a sviluppare la logica commerciale intorno alle funzioni Time().

Irreale.

LOL. Sei tu che sei irreale. Questo tuo codice ...

if (TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05)

... non tornerà mai vero.

Sei tu che devi sviluppare ulteriormente il "tuo" costrutto logico.

E costruire questo ...

if (TimeHour(TimeCurrent()) >= 00 && TimeHour(TimeCurrent()) <= 05)