J'ai créé un EA croisé à 2 EMA, j'ai besoin de conseils. - page 4

 
prupru:

J'ai un plus gros problème maintenant, mon courtier a tendance à exécuter partiellement les ordres.

Cher client,

Nous vous informons que votre transaction a été partiellement ouverte (2,32 lots sur 15,84) au prix de 587,318.

Si vous avez des questions supplémentaires sur ce sujet, n'hésitez pas à nous contacter.

Sincères salutations,

Courtier.

Voici ce que dit le support :

Veuillez noter que pendant les périodes de forte volatilité ou de faible liquidité, les ordres limités peuvent être partiellement exécutés. Cela signifie que la position sera immédiatement remplie entièrement ou partiellement si le prix est atteint. Dans votre cas, votre ordre a été exécuté partiellement, c'est pourquoi vous avez reçu une lettre de notification.

Je comprends comment fermer tous les ordres malgré qu'ils soient fermés partiellement, je dois juste faire Close all Orders while OrdersTotal() > 0, mais je ne sais pas encore quoi faire quand les ordres sont ouverts partiellement.

edit :

Je viens de réaliser que je dois vérifier les ordres Symbol et magicnumber, c'est un peu plus difficile.

edit : voici la fonction close all orders qui devrait fermer les ordres même avec une fermeture partielle


//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

 while (OrdersTotal()>notMyOrders)
 {
 notMyOrders = 0;
 for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
   if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) {notMyOrders++; continue;}
   if(OrderType()<= 1)CloseOrder();
         
   }
 }
return;
}  
réécrit
 
deVries:

réécrit


Ouah !

C'est un peu difficile pour moi, je l'ai lu 4 ou 5 fois avant de le comprendre. Merci !

et... que se passe-t-il si OrderSelect renvoie false ?

Combien de fois orderselect retourne-t-il false ? Est-ce même possible ?

 
prupru:


Ouah !

C'est un peu difficile pour moi, je l'ai lu 4 ou 5 fois avant de le comprendre. Merci !

et... que se passe-t-il si OrderSelect retourne false ?

Combien de fois orderselect retourne-t-il false ? Est-ce même possible ?


for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;

i= 0

revient de la boucle

i = -1

if(OrderSelect(-1,SELECT_BY_POS,MODE_TRADES)==false) break; // ==> fin de la vérification des transactions, nous interrompons la boucle

suivant CloseOrder()

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

Quelles erreurs courantes peuvent être renvoyées par GetLastError()?

si la fermeture échoue, il se peut que la suivante échoue aussi à cause d'une erreur comme tradecontext too busy ou une autre erreur...

Que pouvez-vous faire pour éviter que de telles situations ne se produisent ?

 
deVries:


Que pouvez-vous faire pour éviter que de telles situations ne se produisent ?

Je ne sais pas encore. Il faut que j'y réfléchisse.

Je suis coincé avec un autre problème en ce moment.

J'ai mis mon EA sur un VPS Windows 2003 et maintenant il renvoie l'erreur "terminated by timeout", mais je n'ai jamais vu une telle erreur sur mon PC personnel.

Et l'erreur apparaît non pas au moment où mes cycles de fermeture et d'ouverture d'ordre fonctionnent, mais lorsque l'expert jush vérifie le croisement et se met en veille.

Je veux dire que le programme vérifie l'ouverture d'une nouvelle barre, trailingstop = 0 donc pas d'appel à la fonction trailing stop, puis si une nouvelle barre est ouverte, il vérifie le croisement de l'EMA, il n'y a pas de croisement (les fois où j'ai eu des erreurs de timeout, les lignes de l'EMA étaient loin de se croiser), donc le programme retourne(0).

Il n'y a pas de cycles ! Comment peut-il être terminé par le timeout ?

 
prupru:

Je ne sais pas encore. Il faut que j'y réfléchisse.

Je suis confronté à un autre problème en ce moment.

J'ai mis mon EA sur un VPS Windows 2003 et maintenant il renvoie l'erreur "terminated by timeout", mais je n'ai jamais vu une telle erreur sur mon PC personnel.

Et l'erreur apparaît non pas au moment où mes cycles de fermeture et d'ouverture d'ordre fonctionnent, mais lorsque l'expert jush vérifie le croisement et se met en veille.

Je veux dire que le programme vérifie l'ouverture d'une nouvelle barre, trailingstop = 0 donc pas d'appel à la fonction trailing stop, puis si une nouvelle barre est ouverte, il vérifie le croisement de l'EMA, il n'y a pas de croisement (les fois où j'ai eu des erreurs de timeout, les lignes de l'EMA étaient loin de se croiser), donc le programme retourne(0).

Il n'y a pas de cycles ! Comment peut-il être terminé par le timeout ?


ce n'est pas un cycle ?

while(!IsTradeAllowed()) Sleep(10);
 
deVries:


ce n'est pas un cycle ?


Je veux dire que pendant le temps où l'EA a été terminé, les lignes EMA étaient loin de se croiser, donc une fonction NewOrder n'a pas été appelée, donc le cycle dont vous parlez (qui est à l'intérieur de la fonction NewOrder) n'a pas été exécuté.

Ajout de la condition IsStopped

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) ) 
 
peut-être que l'erreur de dépassement de temps apparaît parce que je suis à court de ressources processeur VPS. Je suis passé à un plan plus coûteux et je ne les vois pas jusqu'à ce que je lance quelque chose de lourd comme Windows Uodate.
Raison: