funzione sonno alternativo - pagina 2

 
paulepanke:

Fate attenzione con una tale affermazione. c'è sempre una ragione logica per eseguire sleep(). in Tester e anche negli indicatori.

Non ho detto che non c'è una ragione logica per usare sleep(), ce ne sono molte, ho detto che non c'è ragione di aspettarsi che sleep() funzioni nello Strategy Tester. Funziona in un indicatore che gira su un grafico dello Strategy Tester, non so, forse sì. . funziona in un EA in esecuzione nello Strategy Tester, per quanto ne so, no. Un EA in esecuzione nello Strategy Tester può essere messo in pausa?
 
RaptorUK:
Dai un'occhiata a cosa ti dà TimeSeconds(), poi pensa a cosa ti dà TimeCurrent() . . quale ti serve e perché?


Simon,

int TimeSeconds( datetime time)

Restituisce la quantità di secondi trascorsi dall'inizio del minuto per il tempo specificato.

datetime TimeCurrent( )
Restituisce l'ultimo tempo noto del server (tempo di arrivo dell'ultima citazione) come numero di secondi trascorsi dalle 00:00 del 1 gennaio 1970.


"Quale ti serve e perché?" - Simon

Io li userei entrambi di concerto, perché vanno di pari passo. - Nathan

TimeSeconds(datetime time) richiede una variabile posta all'interno delle sue parentesi graffe. TimeCurrent() è quindi posto all'interno di queste parentesi graffe, il che mi presenta una soluzione praticabile. Ho fatto questo b4 ma non capivo perché i valori di tempo restituiti sembravano saltare e mettere in pausa (a causa della mancanza di un tick/tick attivo).

Cosa ne dite di questo?


Grazie.

 
WHRoeder:

  1. Non vengono creati tick di alcun tipo fino a quando non torni indietro e lui crea il prossimo e chiama la tua start(). Se calcoli per 5 minuti e restituisci il volume (conteggio dei tick) alla prossima chiamata sarà +1. In un grafico live, se calcolate per 5 minuti, allora perderete 5 minuti di tick e sul M1 si saranno formate diverse nuove barre.

William,

Grazie per l'esposizione di questo argomento.

La mia interpretazione di "2." è che quando viene creato un tick, viene chiamata la funzione return. Poi la funzione Start() viene chiamata direttamente dopo aver chiamato la funzione return(0) che innesca l'esecuzione del programma ancora una volta. Questa interpretazione di questa parte del 2. è corretta?


"Se si calcola per 5 minuti", come posso essere sicuro che l'EA calcolerà per cinque minuti (anche se l'EA calcola per cinque minuti, non credo che questo garantisca la creazione di un tick. La probabilità di creazione di un tick è aumentata)?


Mi scuso, sto avendo difficoltà a leggere questo:

"Se calcoli per 5 minuti e restituisci il volume (conteggio dei tick) sulla prossima chiamata sarà +1. In un grafico live, se si calcola per 5 minuti, allora si perderanno 5 minuti di tick e sul M1 si saranno formate diverse nuove barre".


Molte grazie per la vostra risposta.

 
RaptorUK:
Non ho detto che non ci sono ragioni logiche per usare sleep(), ce ne sono molte, ho detto che non c'è ragione di aspettarsi che sleep() funzioni nello Strategy Tester. Funziona in un indicatore che gira su un grafico dello Strategy Tester, non lo so, forse sì. . funziona in un EA in esecuzione nello Strategy Tester, per quanto ne so, no. Un EA in esecuzione nello Strategy Tester può essere messo in pausa?

Simon,

"Un EA in esecuzione nello Strategy Tester può essere messo in pausa?

Potresti esprimere il tuo pensiero riguardo a questo metodo che useresti per "mettere in pausa" un EA nel tester?


Grazie.

 
  1. L'EA ritorna da start() al tester. Il tester crea il prossimo tick e chiama start(). Se l'EA non ritorna non c'è il prossimo tick. Non importa quanto tempo impiega start() a tornare. Il prossimo tick viene creato quando lo fa.
  2. Non è possibile mettere in pausa o dormire nell'EA nel tester. Puoi programmaticamente premere il pulsante pausa per mettere in pausa il tester dopo che l'EA ritorna da start.
 

William,

Quindi, un nuovo tick chiama la funzione start() in un EA, sì?

La mia domanda è questa: "Conosci qualche altro modo per chiamare la funzione start() oltre a quella di un nuovo tick? Possibilmente un'azione ripetitiva coerente per sostituire una chiamata a Start()?"

(Sto pensando, c'è un modo per tracciare coerentemente i secondi che non dipende dai tick)


"...Il prossimo tick viene creato quando lo fa".

Credo che quello che volevi scrivere fosse: "Alla creazione di un nuovo tick, viene poi eseguito Start()" ;)


Quindi, dici che un EA non può essere messo in pausa o dormire nel tester, sì?


Rivedrò il link che hai fornito, ma nel frattempo, puoi per favore spiegare questo metodo di "premere un pulsante di pausa per mettere in pausa il tester" dopo che un EA in fase di test ritorna dallo start?

Quando viene eseguito nel tester, questo metodo simulerebbe la performance dell'EA che viene messo in pausa per un segmento di tempo deciso in "tempo reale" su un conto live?


Capisco che il tester abbia delle limitazioni e che si debbano usare dei "work-around" per simulare le prestazioni in "tempo reale".


Molta gratitudine William.


Inoltre, ti dispiace se ti chiamo semplicemente Will? Mi risparmierebbe un secondo di tempo per ogni messaggio. Decidi tu.

Mi piace una caratteristica che il tuo EA possiede e questa è, "Volevo chiudere tutti gli ordini prima della fine della settimana (chiusura del mercato venerdì,) per evitare perdite se il mercato dovesse avere un gap oltre la fine della settimana, passando lo SL".

(Battendo le mani con gioia.) Hahaha! ;) Aggiungendo questa funzione al tuo EA, tagli le perdite inutili, ma questo è diverso da quello che cerco di fare attualmente. Attualmente sto cercando di tracciare i secondi di tempo in modo coerente senza il bisogno di tick per aggiornare i secondi. Desidero un mezzo diverso per aggiornare la funzione Start(), capito?


Grazie, grazie

 
WhooDoo22:

Attualmente sto cercando di tracciare i secondi di tempo in modo coerente senza il bisogno di tick per aggiornare i secondi. Desidero un mezzo diverso per aggiornare la funzione Start(), capito?

Ho il sospetto che quello che stai cercando di fare sia una soluzione imperfetta al tuo problema a causa della mancanza di comprensione. Perché hai bisogno di conoscere il secondo da un secondo all'altro se il prezzo non è cambiato per 30 secondi? quando il prezzo cambia si ottiene un tick.

Una precisazione su quanto detto daWHRoeder, tutti i tick sono creati prima che lo Strategy Tester inizi a chiamarli/eseguirli, sono salvati in un file .fxt in tester/history, il ST chiama un primo tick e questo a sua volta causa l'esecuzione di start(), il tick successivo non viene chiamato/utilizzato finché start() non ha finito l'esecuzione, è molto importante capire questo. Solo quando start() ha finito, il prossimo tick sarà usato in modo che l'EA possa chiamare di nuovo start(). Quando la ST viene eseguita alla massima velocità, è la velocità alla quale start() viene eseguito che governa la velocità della ST, quindi una funzione start() molto semplice permetterà alla ST di correre molto velocemente, una funzione start() complessa farà sì che la ST corra più lentamente.

In una situazione Live/Demo se la funzione start() è molto complessa e impiega molto tempo per essere eseguita, forse qualche decimo di secondo, è possibile che il prossimo tick possa arrivare prima che start() abbia completato, in questa situazione il tick sarà mancato e non causerà la chiamata di start(). . . . questo NON può accadere con la ST.

 
WhooDoo22:

Simon,

"Un EA in esecuzione nello Strategy Tester può essere messo in pausa?

Potresti esprimere il tuo pensiero su questo metodo che useresti per "mettere in pausa" un EA nel tester?

Certo, non è molto elegante quindi non suggerirei a nessuno di usarlo. Ho usato una GlobalVariable impostata e non impostata da uno script, quando l'EA nel ST vedeva che la GlobalVariable era impostata si sedeva in un ciclo controllando continuamente che la GlobalVariable fosse impostata, quando lo script aveva impostato la GlobalVariable l'EA usciva dal ciclo e la sua funzione start() poteva terminare.
 
WhooDoo22:

"Quale ti serve e perché? - Simone

Io userei entrambi gli e'm in concerto, perché vanno di pari passo. - Nathan

TimeSeconds(datetime time) richiede una variabile posta all'interno delle sue parentesi. TimeCurrent() è quindi posto all'interno di queste parentesi graffe, il che mi presenta una soluzione praticabile. Ho fatto questo b4 ma non capivo perché i valori di tempo restituiti sembravano saltare e mettere in pausa (a causa della mancanza di un tick/tick attivo).

Supponiamo che tu abbia 2 eventi e che questi eventi siano distanti 10 secondi, quale sarà la differenza tra i valori restituiti daTimeSeconds(datetime time) per questi 2 eventi?
 
RaptorUK:

Ho il sospetto che quello che stai cercando di fare sia una soluzione imperfetta al tuo problema a causa della mancanza di comprensione. Perché hai bisogno di sapere il secondo da un secondo all'altro se il prezzo non è cambiato per 30 secondi? Quando il prezzo cambia si ottiene un tick.

Una precisazione su quanto detto daWHRoeder, tutti i tick sono creati prima che lo Strategy Tester inizi a chiamarli/eseguirli, sono salvati in un file .fxt in tester/history, lo ST chiama un primo tick e questo a sua volta causa l'esecuzione di start(), il tick successivo non viene chiamato/utilizzato finché start() non ha finito di essere eseguito, è molto importante capire questo. Solo quando start() ha finito, il prossimo tick sarà usato in modo che l'EA possa chiamare di nuovo start(). Quando la ST viene eseguita alla massima velocità, è la velocità alla quale start() viene eseguito che governa la velocità della ST, quindi una funzione start() molto semplice permetterà alla ST di correre molto velocemente, una funzione start() complessa farà sì che la ST corra più lentamente.

In una situazione Live/Demo se la funzione start() è molto complessa e impiega molto tempo per essere eseguita, forse qualche decimo di secondo, è possibile che il prossimo tick possa arrivare prima che start() abbia completato, in questa situazione il tick sarà mancato e non causerà la chiamata di start(). . . . questo NON può accadere con l'ST.

Simon,

Ho il sospetto che quello che stai cercando di fare sia una soluzione imperfetta al tuo problema a causa della mancanza di comprensione. Perché hai bisogno di sapere il secondo da un secondo all'altro se il prezzo non è cambiato per 30 secondi? quando il prezzo cambia si ottiene un tick.

Ammetto di avere una mancanza di comprensione, ecco perché sto discutendo l'argomento nel forum MQL4. Desidero salvare il prezzo ogni volta che cambia (capisco come farlo). Inoltre, ho capito come salvare i prezzi ogni secondo in modo costante su un grafico LIVE/DEMO usando Sleep(). Obiettivo: Desidero tracciare costantemente i secondi (senza tracciare i secondi in base alla creazione di tick) fino a un massimo di un minuto o meno, quindi azzerare i secondi tracciati. Capisco perché desidero realizzare questo obiettivo. Il motivo è che ho bisogno di testare un EA nel tester e non posso usare Sleep() durante i test. Cosa fare, giusto? Raccogliere le opzioni.

Dettagli allora hm? ;)

Codifica un timer (utilizzabile in tester) in un EA. Questo timer conta su da 0-30 o giù da o 30-0. Mentre questo tempo conta su/giù, ho un vettore separato che segue l'azione del prezzo (un vettore di dimensioni molto grandi).

Le mie condizioni sono tali,

Se il prezzo viaggia x punti (entro 0-30 o 30-0 secondi), prendo una decisione.

Se il prezzo non viaggia x punti (entro 0-30 o 30-0 secondi), ArrayInitialize().


Cosa ne dite di questo Simon?


Grazie