J'ai utilisé Open au lieu de Time car une fois que l'Open d'une barre se produit, il est fixé pour toujours et ne changera jamais. Il ne s'agit pas de deux barres consécutives - il s'agit de la même barre et on demande si l'ouverture de la barre actuelle au cours de laquelle le tick vient d'avoir lieu est la même que la valeur d'ouverture stockée dans ThisBarOpen. En outre, j'aurais pensé qu'Open serait plus simple que Time, car il s'agit d'une simple consultation de données, alors que Time doit faire référence à quelque chose d'autre et éventuellement effectuer une sorte de calcul.
Re Counter-- ; je n'ai pas changé cela parce qu'un autre EA ne serait pas capable de fermer un ordre parce que le code vérifie d'abord que le MagicNumber et Symbol() sont les mêmes.
Je comprends bien le point de vue sur une coupure de courant qui effacerait le contenu de BuyTicket mais cela ne s'est pas produit pendant mes tests et mon code fonctionne toujours très lentement. Je ne vois donc pas non plus comment cela pourrait être la cause.
Ma principale question pour le moment est de savoir pourquoi il a fallu autant de temps pour supprimer les EA des fenêtres du terminal qui avaient des positions ouvertes et pas du tout de temps pour les supprimer du terminal qui n'avait pas de positions ouvertes. Une coïncidence peut-être - mais les quatre fenêtres ?
La dernière fois j'ai eu le même problème et en fait c'est la façon dont vous codez l'ea. Il est peut-être temps que votre ea soit à nouveau écrite à partir de zéro. v2 par exemple.
Je ne sais pas si c'est vraiment pertinent pour votre problème mais vous limitez votre trading à 1 achat, 1 vente par EA alors pourquoi faire tout cela ?
if(SellTicket!=0)
{if(SmallMA>MediumMA)
{for(Counter=0;Counter<=OrdersTotal()-1;Counter++)
{SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
{Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
if(Closed) SellTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");
}
Counter--;
}}}}
Si vous en faites un int statique, vous pouvez clôturer votre ordre explicitement par ce numéro de ticket sans avoir à parcourir le pool d'ordres pour le trouver.
En ce qui concerne Counter-- ; je ne l'ai pas changé parce qu'un autre EA ne pourrait pas fermer un ordre car le code vérifie d'abord que le MagicNumber et Symbol() sont identiques.
Ma principale question pour le moment est de savoir pourquoi il a fallu tant de temps pour supprimer les EA des fenêtres du terminal qui avaient des positions ouvertes et pas du tout de temps pour les supprimer du terminal qui n'avait pas de positions ouvertes. Coïncidence peut-être - mais les quatre fenêtres ?
Comprenez-vous comment fonctionnent les boucles ?
if(BuyTicket!=0)
{
if(SmallMA<MediumMA)
{
for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
{
SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
{
// while(IsTradeContextBusy()) Sleep(10);
Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
if(Closed) BuyTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");
}
Counter--;
}
}
}
Disons que vous avez 3 ordres ouverts
Au premier passage, le compteur==0, donc l'ordre avec l'index 0 sera sélectionné.
A la fin de la boucle, vous diminuez le compteur de 1, donc compteur== -1.
Avant que la boucle ne s'exécute à nouveau, le compteur est augmenté de 1 dans le cadre de la fonction for. Donc le compteur ==0
Ainsi, lors de la prochaine exécution de la boucle, le compteur = 0 à nouveau ! et ainsi de suite.
Vous êtes coincé dans une boucle sans fin qui ne fait que vérifier l'indice d'ordre 0.
Le seul moyen pour que cela s'arrête est qu'il n'y ait pas d'ordres ouverts car alors OrdersTotal - 1 sera -1 et 0 n'est pas <= -1.
Merci beaucoup GumRaj - vous avez résolu mon problème ! Il fonctionne bien maintenant. C'est la première fois que j'écris du code dans MQL4, c'est donc un processus d'apprentissage pour moi. J'étais confus quant au fonctionnement de la boucle for.
Sneck55: GumRaj - vous avez résolu mon problème ! Il fonctionne bien maintenant.
Et comment l'avez-vous résolu ? Si vous ne faites pas de décompte, vous avez toujours un problème (#3) - il suffit de le cacher jusqu'à ce que vous ayez plusieurs ordres ou plusieurs EAs.
Il doit décrémenter s'il ferme un ordre pour correspondre à ce qui se passe dans le pool, mais pas s'il ne ferme pas d'ordre. S'il décrémente sans fermer un ordre, il entre dans une boucle sans fin.
Vous avez toujours le compteur...
Voir le commentaire de GumRai https://www.mql5.com/en/forum/151167/page2#954622
Merci pour vos messages.
J'ai utilisé Open au lieu de Time car une fois que l'Open d'une barre se produit, il est fixé pour toujours et ne changera jamais. Il ne s'agit pas de deux barres consécutives - il s'agit de la même barre et on demande si l'ouverture de la barre actuelle au cours de laquelle le tick vient d'avoir lieu est la même que la valeur d'ouverture stockée dans ThisBarOpen. En outre, j'aurais pensé qu'Open serait plus simple que Time, car il s'agit d'une simple consultation de données, alors que Time doit faire référence à quelque chose d'autre et éventuellement effectuer une sorte de calcul.
Re Counter-- ; je n'ai pas changé cela parce qu'un autre EA ne serait pas capable de fermer un ordre parce que le code vérifie d'abord que le MagicNumber et Symbol() sont les mêmes.
Je comprends bien le point de vue sur une coupure de courant qui effacerait le contenu de BuyTicket mais cela ne s'est pas produit pendant mes tests et mon code fonctionne toujours très lentement. Je ne vois donc pas non plus comment cela pourrait être la cause.
Ma principale question pour le moment est de savoir pourquoi il a fallu autant de temps pour supprimer les EA des fenêtres du terminal qui avaient des positions ouvertes et pas du tout de temps pour les supprimer du terminal qui n'avait pas de positions ouvertes. Une coïncidence peut-être - mais les quatre fenêtres ?
Je ne sais pas si c'est vraiment pertinent pour votre problème mais vous limitez votre trading à 1 achat, 1 vente par EA alors pourquoi faire tout cela ?
Vous avez déjà votre numéro de ticket ici :
Si vous en faites un int statique, vous pouvez clôturer votre ordre explicitement par ce numéro de ticket sans avoir à parcourir le pool d'ordres pour le trouver.
Merci pour vos messages.
En ce qui concerne Counter-- ; je ne l'ai pas changé parce qu'un autre EA ne pourrait pas fermer un ordre car le code vérifie d'abord que le MagicNumber et Symbol() sont identiques.
Ma principale question pour le moment est de savoir pourquoi il a fallu tant de temps pour supprimer les EA des fenêtres du terminal qui avaient des positions ouvertes et pas du tout de temps pour les supprimer du terminal qui n'avait pas de positions ouvertes. Coïncidence peut-être - mais les quatre fenêtres ?
Comprenez-vous comment fonctionnent les boucles ?
Disons que vous avez 3 ordres ouverts
Au premier passage, le compteur==0, donc l'ordre avec l'index 0 sera sélectionné.
A la fin de la boucle, vous diminuez le compteur de 1, donc compteur== -1.
Avant que la boucle ne s'exécute à nouveau, le compteur est augmenté de 1 dans le cadre de la fonction for. Donc le compteur ==0
Ainsi, lors de la prochaine exécution de la boucle, le compteur = 0 à nouveau ! et ainsi de suite.
Vous êtes coincé dans une boucle sans fin qui ne fait que vérifier l'indice d'ordre 0.
Le seul moyen pour que cela s'arrête est qu'il n'y ait pas d'ordres ouverts car alors OrdersTotal - 1 sera -1 et 0 n'est pas <= -1.