Aiutatemi a chiudere l'ordine alla fine del bar!

 

Ho bisogno di aiuto per formulare un codice che chiuda l'ordine esattamente alla fine della barra:



Ora immaginate se avessi un qualsiasi indicatore che mi portasse in un trade lungo proprio all'apertura della candela contrassegnata da X, in modo che questa salisse e poi seguisse una candela ribassista, con un minimo molto basso, ma questo non importa, ciò che conta è che in base ai miei calcoli, l'uscita ottimale qui sarebbe il punto di chiusura della barra contrassegnata da 1. La parte difficile è che non so come chiudere l'ordine al prezzo di chiusura della barra 1, e qui ho bisogno di aiuto!

La migliore soluzione che mi è venuta in mente per ora è questa (nel caso di questa immaginaria operazione BUY):


/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}

Questo codice chiude l'ordine di acquisto esattamente alla Open[0], ma non alla Close[1], perché se guardate l'immagine e controllate la barra contrassegnata con 2, potete vedere che la barra 2 non si è aperta a quel prezzo come la precedente chiusa, si è aperta ad un prezzo leggermente diverso, e a volte succede un gap enorme come qui:



Quindi l'esperienza dice che:

Close[1] != Open[0]

In situazioni molto rare è così, ecco perché ho bisogno che l'ordine sia chiuso proprio a Close[1].

L'unica soluzione fattibile che ho pensato è quella di contare il tempo, per esempio questo è il grafico M1 e M15, contare il numero di secondi o 60 per M1 o 900 per M15 in entrambi i casi e chiudere l'ordine ai secondi 59 o 599. Il problema con questo è che i tick sono 6 secondi credo (correggetemi se sbaglio) e non si può colpire precisamente perché a causa di questo problema di tempo e il problema aggiuntivo di slippage si potrebbe chiudere il trade molto dopo la chiusura della barra.

Quindi ricapitoliamo la mia domanda: è possibile contare il tempo proprio come ho descritto sopra, se sì, come eludere il problema dello slippage e del tick lagging?

O se si arriva con altre soluzioni come chiudere l'ordine proprio a Close[1] e non a Open[0] allora sono aperto a questo. per favore aiutatemi con questo, questo è un problema molto importante del mio EA!

 
Proximus:

Ho bisogno di aiuto per formulare un codice che chiuda l'ordine esattamente alla fine della barra.

non c'è una situazione in cui si possa dire che l'ultimo tick di questo momento è un tick prima dell'ultimo tick della barra corrente
 

Modulo, controlla quando non c'è un resto. buona fortuna

if( !MathMod( TimeCurrent(), PERIOD_M5 * 60 ) ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );
 
trevone:

Modulo, controlla quando non c'è un resto. buona fortuna

Non funzionerà . . . sarà o prima della fine della barra o dopo di essa . . . mai alla fine della barra. Come ha detto deVries, non è possibile rilevare la fine della barra corrente, ma possiamo rilevare l'inizio della prossima . . .
 
RaptorUK:
Questo non funzionerà . . . sarà o prima della fine della barra o dopo di essa . . . mai alla fine della barra. Come ha detto deVries, non è possibile rilevare la fine della barra corrente, ma possiamo rilevare l'inizio della prossima . . .


Se potesse essere sempre prima della chiusura, ma il più vicino possibile alla chiusura, allora accetterei anche questa soluzione, ma se è solo 1 volta dopo la chiusura allora non è meglio di quella a cui ho pensato io e quindi non è accettabile.Ma perché esattamente si chiude dopo il tick corrente?


E l'altra soluzione, quella che prende il 1 secondo prima della chiusura della barra?

Come questo nel caso di M1

if( Time[0]>=OrderOpenTime()+59  ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );

In questo caso come risolvere il problema del tick, se c'è?

 
Proximus:

Se potesse essere sempre prima della chiusura, ma il più vicino possibile alla chiusura, allora accetterei anche questa soluzione, ma se è solo 1 volta dopo la chiusura allora non è meglio di quella a cui ho pensato io e quindi non è accettabile.Ma perché esattamente si chiude dopo il tick corrente?


E l'altra soluzione, quella che prende il 1 secondo prima della chiusura della barra?

Come questo nel caso di M1

In questo caso come risolvere il problema del tick se c' è?




se non è così allora questo ti fa aspettare un minuto in più e anche in quel caso se c'è qualche....
 
Proximus:

Se potesse essere sempre prima della chiusura, ma il più vicino possibile alla chiusura, allora accetterei anche questa soluzione, ma se è solo 1 volta dopo la chiusura allora non è meglio di quella a cui ho pensato e quindi non è accettabile.Ma perché esattamente si chiude dopo il tick corrente?

Le cose accadono in un EA (e nell'indicatore) solo quando c'è un tick, non hai modo di sapere quando è l'ultimo tick di una barra finché non hai il primo tick sulla barra successiva... anche se il tick è a 59 minuti e 59 secondi dopo l'ora per una barra H1, potrebbe esserci ancora un altro tick durante quel secondo...

Proximus:

E che dire dell'altra soluzione, quella di prendere il 1 secondo prima della chiusura della barra?

Come questo nel caso di M1

In questo caso come si risolve il problema del tick se c'è?

. . . e non si può aspettare l'ultimo secondo della barra perché potrebbero non esserci tick per gli ultimi 5 secondi della barra quindi in quel caso non si "vedrà" mai l'ultimo secondo della barra.

 
RaptorUK:

Le cose accadono solo in un EA (e nell'indicatore) quando c'è un tick, non hai modo di sapere quando è l'ultimo tick di una barra finché non hai il primo tick sulla barra successiva... anche se il tick è a 59 minuti e 59 secondi dopo l'ora per una barra H1, ci potrebbe ancora essere un altro tick durante quel secondo...

. . . e non puoi aspettare l'ultimo secondo della barra perché potrebbero non esserci tick per gli ultimi 5 secondi della barra quindi in quel caso non "vedrai" mai l'ultimo secondo della barra.

Quindi dovrei capire che se il tasso di cambio interbancario non cambia in un dato periodo di tempo, il broker non richiama i nuovi dati di prezzo?

Pensavo che un tick in MT4 significasse che aggiorna sempre il prezzo dopo X periodi di secondi indipendentemente dal prezzo o dal volume, quindi diciamo che la frequenza di aggiornamento sarebbe di 3 secondi, allora sapresti che sull'M1 dovevi chiudere quel trade proprio a 57 secondi o prima.


Data questa situazione, non potrei usare il:

RefreshRates();   

Chiamare l'ultimo tick a 58 secondi e uscire a 59?

 
Proximus:

Quindi dovrei capire che se il tasso di cambio interbancario non cambia in un dato periodo di tempo, il broker non richiama i nuovi dati del prezzo?

Pensavo che un tick in MT4 significasse che aggiorna sempre il prezzo dopo X periodi di secondi, non importa quale sia il prezzo o il volume, quindi diciamo che la frequenza di aggiornamento sarebbe di 3 secondi, allora sapresti che sull'M1 devi chiudere quel trade proprio a 57 secondi o prima.

Se i prezzi del Broker non cambiano, Bid e Ask, non c'è un nuovo tick . . . intorno a mezzanotte GMT su alcune delle coppie meno scambiate possono non esserci tick per un minuto o più. . . un nuovo tick non viene generato dopo un tempo prestabilito, avviene quando c'è un cambiamento di prezzo, Bid o Ask ( e forse in alcune altre circostanze, cambiamento in altri parametri del simbolo ) . . .

Proximus:

Data questa situazione, non potrei usare il:

Richiamare l'ultimo tick a 58 secondi e uscire a 59?

Come viene chiamata RefreshRates() se non c'è nessun tick?
 

Grazie per il chiarimento su come funzionano i tick in MT4.

RaptorUK:

Se i prezzi del broker non cambiano, Bid e Ask, non c'è un nuovo tick . . . intorno a mezzanotte GMT su alcune delle coppie meno scambiate possono non esserci tick per un minuto o più. . . un nuovo tick non viene generato dopo un tempo prestabilito, avviene quando c'è un cambiamento di prezzo, Bid o Ask ( e forse in alcune altre circostanze, cambiamento in altri parametri del simbolo ) . . .

Come viene chiamata la funzione RefreshRates() se non ci sono tick?

Pensavo che il RefreshRates() forzasse il broker a richiamare un nuovo set di feed dal suo fornitore di liquidità, ma credo che non sia così.


Comunque, se qualcuno può trovare una soluzione migliore di questa al mio problema, allora per favore condividetela con me, è molto importante!

/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}
 
Proximus:

Grazie per il chiarimento su come funzionano i tick in MT4.

RaptorUK:

Se i prezzi del Broker non cambiano, Bid e Ask, non c'è un nuovo tick . . . intorno alla mezzanotte GMT su alcune delle coppie meno scambiate ci possono essere tick per un minuto o più. . . un nuovo tick non viene generato dopo un tempo prestabilito, avviene quando c'è un cambiamento di prezzo, Bid o Ask ( e forse in alcune altre circostanze, cambiamento in altri parametri del simbolo ) . . .

Come viene chiamata RefreshRates() se non ci sono tick?

Beh, pensavo che il RefreshRates() costringesse il broker a richiamare un nuovo set di feed dal suo fornitore di liquidità, ma immagino che non sia così.


Comunque, se qualcuno può trovare una soluzione migliore di questa al mio problema, allora per favore condividila con me, è molto importante!


Il meglio che puoi fare è usare il prossimo tick dopo l'ultimo tick della barra, in altre parole il primo tick della barra successiva.
Motivazione: