En espérant que ca convient à ce qui était demandé.
Salutations.
![]() |
|
![]() |
|
Vendredi 10 Février 2012
Trader-Forex.fr en RSS
En espérant que ca convient à ce qui était demandé.
Salutations.
Cordialement,
Loup
--------------------------------------------------------------------------------------
Gestion des trades : EA Trade Management, par Tanaïs et Loup REBEL
----------------------- Indicateur de Money Management
Chandelier Multi TF : Graphique multi Chandeliers Multi Time Frame
re ...je viens de refaire des test avec l'ea close and reverse et bien j'ai trouve une chose : il faut l'arreter avec le bouton Expert Advisor du haut et la serie des trades continuent a se stoper puis a s'inverser meme l'ea coupe.....franchement c'est la premiere fois que je vois cela ...avant je cliquais sur le graph puis expert advisor puis retirer le temps que je fasse tous cela il y avait souvant une autre boucle engagee
donc voila pour que cela marche il faut engager la boucle puis couper l'ea , les trades se ferment puis se relancent en etant inverser
encore merci a tous.... je remets l'ea pour que vous visualisiez le code
J'ai regardé l'EA, il semble avoir grosso modo la même logique.
J'ai modifié un peu mon EA (boucle inversées, boucle de fermeture forcée).
Peut être que ca ira mieu.
Code:bool reverse=true; int start() { if (reverse==true) { int a = OrdersTotal()-1; //comptage des ordres int tabl[][2]; //définition du tableau ArrayResize(tabl, a); //dimentionnement du tableau int i; //définition compteur for(i=a;i>=0;i--) //boucle de selection d'ordre { OrderSelect(i,SELECT_BY_POS); //selection ordre tabl[i][0] = OrderType(); //stockage type ordre tabl[i][1] = OrderLots(); //stockage taille du lot } CloseOrders(); //appel de fonction* for(i=a;i>=0;i--) //boucle de création d'ordre { switch(tabl[i][0]) //condition sur le type d'ordre { //Si ordre BUY >>> ouverture ordre SELL case OP_BUY : OrderSend(Symbol(),OP_SELL,tabl[i][1],Bid,0,0,0,"My order",99999,0,Green); break; //Si ordre SELL >>> ouverture ordre BUY case OP_SELL: OrderSend(Symbol(),OP_BUY,tabl[i][1],Ask,0,0,0,"My order",99999,0,Green); break; } } reverse=false; //Retourner une seule fois } } int CloseOrders() //*Fonction qui ferme tout les ordres en cours { for(int i= OrdersTotal()-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); int type = OrderType(); bool result = false; while (result == false) { switch(type) { //Fermeture des positions d’achat case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; // Fermeture des positions de vente case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; //Fermeture des ordres en attente case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } } } return(0); } }
Je n'ai pas le temps le soir de jouer avec le compilateur.
je viens de tester ...l'ea a la complilation il y avait une erreur et 0 alert l'erreur venait de la derniere parenthese ...je l'ai donc enleve(peut etre faut il la remplacer par autre choseje sais pas ) il n'y a plus d'erreur mais l'ea ne marche pas il ferme toutes les positions mais ne les remplace pas par d'autres ,
Dernière modification par gillou33 ; 11/02/2010 à 11h03. Motif: fautes
Très bien alors quand c'est comme ca, il faut tester quelques valeures.
Nous allons tester la valeur de a (pour voir si le nombre de trades est bien stocké) et la taille du tableau (pour voir si le redimentionnement est OK).
Pour cela, juste apres la commande:
Ajouter:Code:ArrayResize(tabl, a);
Déjà je crois que j'ai fait une érreure, modifier:Code:Alert (a); Alert (ArrayRange(tabl, 1););
par:Code:ArrayResize(tabl, a);
En effet, si il y a 1 seul trade, le tableau a une taille de 0....Code:ArrayResize(tabl, a+1);
re...non rien n'y fait cela coupe le tout et puis plus rien !!!
J'ai rajouté une boucle de passage des ordres inverses. En effet, il ce peut qu'il y ait un tick entre le début du script et le passage d'ordre (dans ce cas il ne passe pas), donc je boucle tant que l'ordre n'a pas été ouvert.
De plus, j'ai ajouté des alertes:
- Detection d'un ordre (OK Detect)
- Fermeture d'un ordre (OK Close)
- Renversement OP_BUY>OP_SELL (OK OP_BUY 2 OP_SELL)
- Renversement OP_SELL>OP_BUY (OK OP_SELL 2 OP_BUY)
Ce que je conseille pour bien tester le tout:
- Ouvrir 3 ordres : 1 op_buy, 1 op_sell, 1 op_buy
- lancer l'EA
- voir les alertes
Normalement il devrait y avoir:
OK Detect
OK Detect
OK Detect
OK Close
OK Close
OK Close
OK OP_BUY 2 OP_SELL
OK OP_SELL 2 OP_BUY
OK OP_BUY 2 OP_SELL
Si il n'y a pas tout çà, alors on pourra savoir où il y a un soucis dans le code.
Code:bool reverse=true; int start() { if (reverse==true) { int a = OrdersTotal()-1; //comptage des ordres int tabl[][2]; //définition du tableau ArrayResize(tabl, a); //dimentionnement du tableau int i; //définition compteur for(i=a;i>=0;i--) //boucle de selection d'ordre { OrderSelect(i,SELECT_BY_POS); //selection ordre tabl[i][0] = OrderType(); //stockage type ordre tabl[i][1] = OrderLots(); //stockage taille du lot Alert("OK Detect"); } CloseOrders(); //appel de fonction* for(i=a;i>=0;i--) //boucle de création d'ordre { int ticket = -1; switch(tabl[i][0]) //condition sur le type d'ordre { //Si ordre BUY >>> ouverture ordre SELL case OP_BUY : while (ticket == -1) // tant que l’ordre n’est pas passé { Sleep(1000); // on attend une seconde RefreshRates(); //on rafraichit les valeurs du cours de la paire ticket = OrderSend(Symbol(),OP_SELL,tabl[i][1],Bid,0,0,0,"My order",99999,0,Green); } Alert("OK OP_BUY 2 OP_SELL"); break; //Si ordre SELL >>> ouverture ordre BUY case OP_SELL: while (ticket == -1) // tant que l’ordre n’est pas passé { Sleep(1000); // on attend une seconde RefreshRates(); //on rafraichit les valeurs du cours de la paire ticket = OrderSend(Symbol(),OP_BUY,tabl[i][1],Ask,0,0,0,"My order",99999,0,Green); } Alert("OK OP_SELL 2 OP_BUY"); break; } } reverse=false; //Retourner une seule fois } } int CloseOrders() //*Fonction qui ferme tout les ordres en cours { for(int i= OrdersTotal()-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); int type = OrderType(); bool result = false; while (result == false) { switch(type) { //Fermeture des positions d’achat case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; // Fermeture des positions de vente case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; //Fermeture des ordres en attente case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } } Alert("OK Close"); } return(0); }
Dernière modification par harry le ravi ; 11/02/2010 à 15h07.
Et voila, ca marche mieux quand on veut débugger avec un compilateur...
Il fonctionne au poil.Code:bool reverse=true; int init() { if (reverse==true) { int a = OrdersTotal()-1; //comptage des ordres int OType[]; //définition du tableau de Type double OLots[]; //définition du tableau de Lots ArrayResize(OType, a+1); //dimentionnement du tableau de Type ArrayResize(OLots, a+1); //dimentionnement du tableau de Lots int i; //définition compteur for(i=a;i>=0;i--) //boucle de selection d'ordre { OrderSelect(i,SELECT_BY_POS); //selection ordre OType[i] = OrderType(); //stockage type ordre OLots[i] = OrderLots(); //stockage taille du lot } CloseOrders(); //appel de fonction* for(i=a;i>=0;i--) //boucle de création d'ordre { int ticket = -1; switch(OType[i]) //condition sur le type d'ordre { //Si ordre BUY >>> ouverture ordre SELL case OP_BUY : while (ticket == -1) // tant que l’ordre n’est pas passé { Sleep(1000); // on attend une seconde RefreshRates(); //on rafraichit les valeurs du cours de la paire ticket = OrderSend(Symbol(),OP_SELL,OLots[i],Bid,0,0,0,"My order",99999,0,Green); } break; //Si ordre SELL >>> ouverture ordre BUY case OP_SELL: while (ticket == -1) // tant que l’ordre n’est pas passé { Sleep(1000); // on attend une seconde RefreshRates(); //on rafraichit les valeurs du cours de la paire ticket = OrderSend(Symbol(),OP_BUY,OLots[i],Ask,0,0,0,"My order",99999,0,Green); } break; } } reverse=false; //Retourner une seule fois } } int CloseOrders() //*Fonction qui ferme tout les ordres en cours { for(int i= OrdersTotal()-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); int type = OrderType(); bool result = false; while (result == false) { RefreshRates(); switch(type) { //Fermeture des positions d’achat case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; // Fermeture des positions de vente case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; //Fermeture des ordres en attente case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } } } return(0); }
Testé avec 3 ordres : Buy;Sell;Buy
Résultat : Sell;Buy;Sell
Taille du lot identique.
J'ai placé le code dans la fonction init, ce qui permet de ne pas attendre le prochain tick.
Par contre on ne peut pas ré-initialiser l'EA quand on clique sur le bouton "Expert Advisors", il faut retirer l'EA du graph puis le replacer....
Je vous souhaite une très bonne réception.
Dernière modification par harry le ravi ; 11/02/2010 à 22h27.