Aidez-moi à fermer l'ordre à l'extrémité du bar !

 

J'ai besoin d'aide pour formuler un code qui fermera l'ordre exactement à la fin de la barre. C'est pour un scalper EA spécial, donc il faut une précision extrême. Laissez-moi illustrer ce que je veux dire :



Ici vous pouvez voir par exemple un graphique M15 EUR/USD.Maintenant imaginez si j'avais un indicateur qui me prenait dans un trade long juste à l'ouverture de la bougie marquée X, donc elle est montée puis une bougie baissière a suivi, avec un bas très bas, mais cela n'a pas d'importance, ce qui importe c'est que sur la base de mes calculs, la sortie optimale ici serait le point de clôture de la barre marquée 1.La partie délicate est que je ne sais pas comment fermer l'ordre au prix de clôture de la barre nr 1, et ici j'ai besoin d'aide !

La meilleure solution à laquelle j'ai pensé pour le moment est la suivante (dans le cas de cette transaction d'achat imaginaire) :


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

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

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

}}

Ce code ferme la transaction d'achat exactement à l'Open[0], mais pas à la Close[1].Vous voyez, parce que si vous regardez sur l'image et vérifiez la barre marquée 2, vous pouvez voir que la barre 2 ne s'est pas ouverte au même prix que la précédente, elle s'est ouverte à un prix légèrement différent.Et parfois un énorme écart se produit comme ici :



Donc l'expérience nous dit que :

Close[1] != Open[0]

Dans de très rares situations, c'est le cas. C'est pourquoi j'ai besoin que l'ordre soit fermé juste à la clôture[1].

La seule solution possible que j'ai trouvée est de compter le temps, par exemple sur le graphique M1 et M15, de compter le nombre de secondes, soit 60 pour M1, soit 900 pour M15, dans les deux cas, et de fermer l'ordre à la 59e ou 599e seconde. Le problème est que les ticks sont de 6 secondes, je suppose (corrigez-moi si je me trompe) et que vous ne pouvez pas les atteindre précisément, car à cause de ce problème de temps et de glissement supplémentaire, vous pourriez fermer la transaction bien après la clôture de la barre.

Récapitulons donc ma question : est-il possible de compter le temps comme je l'ai décrit ci-dessus ? Si oui, comment éviter le problème du slippage et du décalage des tics ?

Ou si vous trouvez d'autres solutions pour clôturer l'ordre à la clôture [1] et non à l'ouverture [0], je suis ouvert à toute proposition de votre part.

 
Proximus:

J'ai besoin d'aide pour formuler un code qui fermera l'ordre exactement à la fin de la barre.

Il n'y a pas de situation où vous pouvez dire que le dernier tick est un tick avant le dernier tick de la barre actuelle.
 

Modulus, vérifiez quand il n'y a pas de reste. bonne chance

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

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

Modulus, vérifiez quand il n'y a pas de reste. bonne chance

Cela ne marchera pas... ce sera soit avant la fin de la barre, soit après... jamais à la fin de la barre. Comme deVries l'a dit, il n'est pas possible de détecter la fin de la barre actuelle, mais nous pouvons détecter le début de la prochaine barre....
 
RaptorUK:
Cela ne fonctionnera pas... ce sera soit avant la fin de la barre, soit après... jamais à la fin de la barre. Comme l'a dit deVries, il n'est pas possible de détecter la fin de la barre actuelle, mais nous pouvons détecter le début de la suivante....


Si cela pouvait être chaque fois avant la clôture, mais aussi près que possible de la clôture, alors j'accepterais aussi cette solution, mais si c'est seulement 1 fois après la clôture, alors ce n'est pas mieux que la solution à laquelle j'ai pensé et donc pas acceptable.Mais pourquoi exactement la clôture se fait-elle après le tick actuel ?


Et qu'en est-il de l'autre solution, qui prend la 1 seconde avant la fermeture de la barre ?

Comme ceci dans le cas de M1

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

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

Dans ce cas comment résoudre le problème du tick s'il y en a un ?

 
Proximus:

Si cela pouvait être chaque fois avant la clôture, mais aussi près que possible de la clôture, alors j'accepterais aussi cette solution, mais si c'est seulement 1 fois après la clôture, alors ce n'est pas mieux que la solution à laquelle j'ai pensé et donc pas acceptable. Mais pourquoi exactement la clôture se fait-elle après le tick actuel ?


Et qu'en est-il de l'autre solution, qui prend la 1 seconde avant la fermeture de la barre ?

Comme ceci dans le cas de M1

Dans ce cas, comment résoudre le problème du tick s'il y en a un ?




Si ce n'est pas le cas, cela vous fait attendre une minute de plus et dans ce cas, s'il y a une....
 
Proximus:

Si cela pouvait être chaque fois avant la clôture, mais aussi proche que possible de la clôture, alors j'accepterais aussi cette solution, mais si c'est seulement une fois après la clôture, alors ce n'est pas mieux que la solution à laquelle j'ai pensé et donc pas acceptable.Mais pourquoi exactement ferme-t-il après le tick actuel ?

Les choses ne se produisent dans un EA (et un indicateur) que lorsqu'il y a un tick, vous n'avez aucun moyen de savoir quand est le dernier tick d'une barre jusqu'à ce que vous ayez le premier tick de la barre suivante ... même si le tick est à 59 minutes et 59 secondes après l'heure pour une barre H1, il pourrait toujours y avoir un autre tick pendant cette seconde ...

Proximus:

Et qu'en est-il de l'autre solution, qui consiste à prendre le tick 1 seconde avant la clôture de la barre ?

Comme ceci dans le cas de M1

Dans ce cas, comment résoudre le problème du tick s'il y en a un ?

. ... et vous ne pouvez pas attendre la dernière seconde de la barre car il peut ne pas y avoir de ticks pendant les 5 dernières secondes de la barre et dans ce cas vous ne "verrez" jamais la dernière seconde de la barre.

 
RaptorUK:

Les choses ne se produisent dans un EA (et un indicateur) que lorsqu'il y a un tick, vous n'avez aucun moyen de savoir quand est le dernier tick d'une barre jusqu'à ce que vous ayez le premier tick de la barre suivante... même si le tick est à 59 minutes et 59 secondes après l'heure pour une barre H1, il peut toujours y avoir un autre tick pendant cette seconde....

. . et vous ne pouvez pas attendre la dernière seconde de la barre parce qu'il peut ne pas y avoir de tick pendant les 5 dernières secondes de la barre et dans ce cas vous ne "verrez" jamais la dernière seconde de la barre.

Je dois donc comprendre que si les taux de change interbancaires ne changent pas pendant une période donnée, le courtier n'appelle pas les nouvelles données de prix ?

Je pensais qu'un tick dans MT4 signifiait qu'il rafraîchissait toujours le prix après une période X de secondes, quel que soit le prix ou le volume, et que si le taux de rafraîchissement était de 3 secondes, vous sauriez que sur le M1 vous deviez fermer cette transaction à 57 secondes ou avant.


Dans cette situation, ne pourrais-je pas utiliser le bouton :

RefreshRates();   

Pour appeler le dernier tick à 58 secondes et sortir à 59 ?

 
Proximus:

Je dois donc comprendre que si les taux de change interbancaires ne changent pas pendant une période donnée, le courtier n'appelle pas les nouvelles données de prix ?

Je pensais qu'un tick dans MT4 signifiait qu'il rafraîchissait toujours le prix après une période X de secondes, quel que soit le prix ou le volume, alors disons que le taux de rafraîchissement serait de 3 secondes, alors vous sauriez que sur le M1 vous devez fermer cette transaction à 57 secondes ou avant.

Si les prix du Broker ne changent pas, Bid et Ask, il n'y a pas de nouveau tick ... vers minuit GMT sur certaines des paires les moins échangées , il peut n'y avoir aucun tick pendant une minute ou plus... un nouveau tick n'est pas généré après un temps prédéfini, il se produit lorsqu'il y a un changement de prix, Bid ou Ask (et peut-être dans d'autres circonstances, un changement dans d'autres paramètres du symbole) ...

Proximus:

Dans cette situation, ne pourrais-je pas utiliser la fonction :

Pour appeler le dernier tick à 58 secondes et sortir à 59 ?

Comment RefreshRates() sera-t-il appelé s'il n'y a pas de tick ?
 

Merci pour la clarification du fonctionnement des ticks dans MT4.

RaptorUK:

Si les prix du courtier ne changent pas, Bid et Ask, il n'y a pas de nouveau tick ... vers minuit GMT sur certaines des paires les moins échangées , il peut n'y avoir aucun tick pendant une minute ou plus... un nouveau tick n'est pas généré après un temps prédéfini, il se produit lorsqu'il y a un changement de prix, Bid ou Ask (et peut-être dans d'autres circonstances, un changement dans d'autres paramètres du symbole) ...

Comment RefreshRates() sera-t-il appelé s'il n'y a pas de tick ?

Je pensais que la fonction RefreshRates() forcerait le courtier à appeler un nouvel ensemble de flux depuis son fournisseur de liquidité, mais je suppose que ce n'est pas le cas.


Quoi qu'il en soit, si quelqu'un peut trouver une meilleure solution à mon problème que celle-ci, alors s'il vous plaît partagez-la avec moi, c'est très important! Merci d'avance !

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

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

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

}}
 
Proximus:

Merci pour la clarification du fonctionnement des ticks dans MT4.

RaptorUK:

Si les prix du courtier ne changent pas, Bid et Ask, il n'y a pas de nouveau tick ... autour de minuit GMT sur certaines des paires les moins échangées , il peut n'y avoir aucun tick pendant une minute ou plus... un nouveau tick n'est pas généré après un temps prédéfini, il se produit lorsqu'il y a un changement de prix, Bid ou Ask (et peut-être dans d'autres circonstances, changement dans d'autres paramètres du symbole) ...

Comment RefreshRates() sera-t-il appelé s'il n'y a pas de tick ?

Je pensais que la fonction RefreshRates() forcerait le courtier à appeler un nouvel ensemble de flux depuis son fournisseur de liquidité, mais je suppose que ce n'est pas le cas.


Quoi qu'il en soit, si quelqu'un peut trouver une meilleure solution à mon problème que celle-ci, alors s'il vous plaît, partagez-la avec moi, c'est très important ! Merci d'avance !


Le mieux que vous puissiez faire est d'utiliser le tick suivant le dernier tick de la barre, en d'autres termes le premier tick de la barre suivante.
Raison: