Problème de commandes multiples - page 2

 

Salut Raptor ;

Alors que dans Tester tous les ordres sont fermés lorsque le TrailingStop se ferme, dans Démo seul l'ordre fermé par le TrailingStop se ferme, tout ordre ouvert reste ouvert.

En utilisant le code suivant en plus de celui de votre conseil, la logique est la suivante ;

"Trouver quelle est la condition du dernier ordre, si c'était une fermeture, alors exécuter le code pour commencer à fermer tous les ordres ouverts restants."

Avez-vous une idée de la raison pour laquelle cela se produit ?

Meilleures salutations

Luis

int OrdType, GLError;
   double OrderClosed;
   RefreshRates();
   
    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--) 
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)
        && OrderMagicNumber()== MagicNumber
        && OrderSymbol()== Symbol())
        {//29
        OrderClosed = OrderCloseTime();
        if(OrderClosed!=0)
           {//30                                  
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
      if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber()== MagicNumber 
         && OrderSymbol()== Symbol())                                       
         {//31
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
           {//32
           if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
               GLError = GetLastError();
           }//32                                         
          }//31
       }//30
     }//29 
    
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
  return(0);
  }//0 
 
luisneves:

Salut Raptor ;

Alors que dans Tester tous les ordres sont fermés lorsque le TrailingStop se ferme, dans Démo seul l'ordre fermé par le TrailingStop se ferme, tout ordre ouvert reste ouvert.

En utilisant le code suivant en plus de celui de votre conseil, la logique est la suivante ;

"Trouver quelle est la condition du dernier ordre, si c'était une fermeture, alors exécuter le code pour commencer à fermer tous les ordres ouverts restants."

Avez-vous une idée de la raison pour laquelle cela se produit ?

Vous ne pouvez pas faire cela...

    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--)    // OrdersTotal is the total of open orders
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)        //  this is looping through the closed orders

... cela n'a aucun sens d'utiliser le nombre d'ordres ouverts comme condition de départ de la boucle pour passer en revue les ordres fermés. Peut-être vouliez-vous utiliserOrderssHistoryTotal()? mais l'OrderCloseTime() d'un ordre fermé ne sera jamais == 0.

 
luisneves:

.....

J'utilise BuyTicket et SellTicket dans le code pour éviter l'ouverture de plusieurs ordres, mais il semble que ce ne soit pas la bonne méthode...

.....

Un problème survient lorsqu'une condition d'ouverture d'un troisième ordre survient et ainsi de suite. Ici, pourtant les conditions d'ouverture sont là et le code a bien fonctionné avec la deuxième ouverture, pourquoi le code ne fonctionne-t-il pas ici ?

Je comprends que vous avez légèrement changé le sujet initial et peut-être que la première question est discutée jusqu'à la fin (c'est ok pour moi).
Si vous voulez toujours suivre la question initiale, vous devez l'expliquer un peu plus, parce que je ne comprends pas vraiment ce que vous cherchez.

Le premier snippet que j'ai ajusté empêche le code d'ouvrir plusieurs commandes. Vous sembliez ne pas en être satisfait, donc vous l'avez supprimé (ou simplement pas ajouté), mais en faisant la même chose en utilisant BuyTicket et SellTicket.
Vous parlez alors d'une troisième commande... Cherchez-vous quelque chose comme ceci ?

Achat->Vente->Achat->Vente->Achat
mais empêche
Achat->Achat->Vente->Achat->Achat

En d'autres termes, si le dernier ordre ouvert est un ordre d'achat, le prochain doit être un ordre de vente et vice versa ?

Ou quel est le nombre maximum d'ordres que votre EA devrait ouvrir ? Est-ce que c'est 2, une vente et si la condition pour un ordre opposé est remplie, un achat, mais plus une vente s'il rebondit à nouveau après le déclenchement de l'achat ?
Si c'est le cas, quel était le problème avec le compteur OpenOpposite que j'ai ajouté à votre code initial ?

éditer :

La troisième option que je peux imaginer est que vous voulez ouvrir un autre ordre opposé si le premier ordre opposé a été arrêté ?
Donc, comme ceci :

Achat->Vente->si la vente a été arrêtée->Vente->si la vente a été arrêtée->Vente

 
kronin:

Je comprends que vous avez légèrement changé le sujet initial et peut-être que le premier problème est discuté jusqu'à la fin (cela me convient).
Si tu veux toujours suivre la question initiale, tu dois l'expliquer un peu plus, parce que je ne comprends pas vraiment ce que tu cherches.

Le premier snippet que j'ai ajusté empêche le code d'ouvrir plusieurs commandes. Vous sembliez ne pas en être satisfait, donc vous l'avez supprimé (ou simplement pas ajouté), mais en faisant la même chose en utilisant BuyTicket et SellTicket.
Vous parlez alors d'une troisième commande... Cherchez-vous quelque chose comme ceci ?

Achat->Vente->Achat->Vente->Achat
mais empêche
Achat->Achat->Vente->Achat->Achat

En d'autres termes, si le dernier ordre ouvert est un ordre d'achat, le prochain doit être un ordre de vente et vice versa ?

Ou quel est le nombre maximum d'ordres que votre EA devrait ouvrir ? Est-ce que c'est 2, une vente et si la condition pour un ordre opposé est remplie, un achat, mais plus une vente s'il rebondit à nouveau après le déclenchement de l'achat ?
Si c'est le cas, quel était le problème avec le compteur OpenOpposite que j'ai ajouté à votre code initial ?

éditer :

La troisième option que je peux imaginer est que vous voulez ouvrir un autre ordre opposé si le premier ordre opposé a été arrêté ?
Donc, comme ceci :

Achat->Vente->si la vente a été arrêtée->Vente->si la vente a été arrêtée->Vente


Bonjour Kronin,

Merci d'avance pour votre temps pour me soutenir dans cette question.

La stratégie observe cette logique ;

Disons que le premier ordre d'ouverture est un achat et qu'il cherche à fermer au moyen du TrailingStop, mais si l'offre rebondit de quelques pips sous leprix d'ouverture de l'ordre(distance de retour), une vente s'ouvrira et cherchera à fermer au moyen du TrailingStop et de nouveau si l'offre rebondit de quelques pips au-dessus du prix d'ouverture de l'ordre, un achat s'ouvrira. Ce processus de ping-pong se terminera lorsque le dernier ordre ouvert fermera au moyen du TrailingStop ou atteindra le nombre maximum d'ordres, qui est de 7 (on peut l'ajuster de manière externe).

Le problème avec les ouvertures multiples se produit lorsque le prix monte et descend en traversant l'OrderOpenPrice. Ainsi, si nous avons un achat, l'ordre suivant peut être une vente et ainsi de suite.

En ce qui concerne votre aide précédente, je n'ai peut-être pas bien expliqué quel était mon problème. Toute aide fournie a pour moi la plus grande valeur.

Meilleures salutations

Luis

 

Luis, j'ai passé pas mal de temps sur ton code, mais honnêtement je ne suis pas vraiment sûr qu'il fasse ce que tu veux.

Voyez la pièce jointe. Finalisez/changez-la, testez-la, comprenez-la.... et dites-moi au moins qu'elle fonctionne de manière proche, similaire ou complète, de ce que vous recherchez. Je ne suis pas encore tout à fait sûr de la stratégie.
S'il vous plaît, n'ajoutez pas encore de nouvelles fonctions (ne ré-adjoutez pas la martingale). Le code est assez gros et vous avez encore beaucoup de travail devant vous, pour le faire fonctionner de manière fiable.
Je dois dire que le code n'est pas beaucoup plus clair. Je n'ai pas voulu changer vos parties courantes (même si vous avez besoin d'un meilleur traitement des erreurs). J'ai commenté des parties et déplacé des parties, mais tout est encore là...


Amusez-vous bien...

 
kronin:

Luis, j'ai passé pas mal de temps sur votre code, mais honnêtement, je ne suis pas vraiment sûr qu'il fasse ce que vous voulez.

Voir ci-joint. Finaliser/Modifier, tester, comprendre.... et me dire au moins qu'il fonctionne proche, similaire ou complète autre chose, à ce que vous recherchez. Je ne suis pas encore tout à fait sûr de la stratégie.
S'il vous plaît, n'ajoutez pas encore de nouvelles fonctions (ne ré-adjoutez pas la martingale). Le code est assez gros et vous avez encore beaucoup de travail devant vous, pour le faire fonctionner de manière fiable.
Je dois dire que le code n'est pas beaucoup plus clair. Je n'ai pas voulu changer vos parties courantes (même si vous avez besoin d'un meilleur traitement des erreurs). J'ai commenté et déplacé certaines parties, mais tout est encore là...


Amusez-vous bien...


Salut Kronin,

Avant tout, je tiens à vous remercier pour le temps passé à résoudre mes problèmes.

Bien que je pense que vous avez fait de votre mieux pour comprendre la stratégie certaines choses ne sont pas tout à fait répondre (en raison bien sûr de mon manque de compréhension dans ce domaine).

J'ai fait quelques modifications en suivant vos conseils, mais je ne suis pas sûr de les avoir faites correctement.

Deux problèmes ;

1 - L'idée est qu'une fois que la transaction a été fermée au moyen du TrailingStop, tous les ordres ouverts restants doivent être fermés. Les ordres ne doivent pas être fermés sur le TakeProfit (ce TakeProfit est juste là parce que je veux être sûr qu'il est placé dans la Freeze Zone). J'ai donc pensé à le faire en utilisant la clôture du dernier ordre pour exécuter la fonction CloseAll (des choses stupides sont apparues pour essayer de le faire...). Vous utilisez le Last Closed Ticket pour exécuter la fermeture des ordres ouverts, mais je ne comprends pas si cela se produit lorsque le trade se ferme au moyen du TrailingStop...

2 - Le "ping pong" ne fonctionne pas, du moins dans Tester.

En pièce jointe se trouve le fichier où les modifications ont été faites, pour autant que je les ai comprises.

Merci d'avance pour votre patience et le temps passé. (plus dans le message privé)

Meilleures salutations

Luis

 

Ok, j'ai changé l'algorithme pour fermer tous les ordres sur le SL au lieu du TP. (Le changement a été '<' remplacé par '>' - vous devriez trouver où)

Le ping pong fonctionne pour moi et je ne l'ai laissé fonctionner dans le testeur qu'en mode visuel. Mais j'ai ajusté vos paramètres d'entrée pour que tous les ordres ne s'ouvrent pas à peu près en même temps. Vous devez peut-être vérifier les paramètres par défaut.

Il commence avec l'ordre initial (j'ai changé l'instruction print()) et ensuite fait des ordres opposés.

EURUSD,M1 : open #1 acheter 0.01 EURUSD à 1.43310 ok
EURUSD,M1 : ordre d'achat initial placé # 1
EURUSD,M1 : modify #1 buy 0.01 EURUSD at 1.43310 sl : 1.42810 tp : 1.43510 ok
EURUSD,M1 : ouvrir #2 vendre 0.01 EURUSD à 1.43200 ok
EURUSD,M1 : Ordre de vente opposé placé # 2
EURUSD,M1 : modifier #2 vendre 0.01 EURUSD à 1.43200 sl : 1.43700 tp : 1.43000 ok
EURUSD,M1 : ouvrir #3 acheter 0.01 EURUSD à 1.43300 ok
EURUSD,M1 : Ordre d'achat opposé placé # 3
EURUSD,M1 : modify #3 buy 0.01 EURUSD at 1.43300 sl : 1.42800 tp : 1.43500 ok

J'ai ajouté un retour à l'OpenOppositeOrder() lorsque j'ai ouvert un ordre. Avec les paramètres, il était possible d'ouvrir un ordre d'achat et dans le même tick un ordre de vente. Cette approche de MaxOrder n'est pas fiable.
Peut-être qu'une meilleure approche est de le diviser en 2 fonctions ou de donner à la fonction un paramètre pour qu'elle ne soit exécutée que pour les ordres de vente ou d'achat.

Le code que vous avez téléchargé n'a pas fonctionné ! Toutes les transactions ont échoué à cause de 'invalid LotSize'.....

 

Salut Kronin,

Merci pour le temps passé à me soutenir.

En ce qui concerne le problème "le code que vous avez téléchargé n'a pas fonctionné ! Toutes les transactions ont échoué en raison d'une 'LotSize invalide'..... "Cela s'est produit après avoir déplacé le code MM à la fin du fichier. J'ai fait l'appel de la fonction en utilisant MM() ; au début du code, il semble que ce type d'action ne fonctionne pas, mais le dernier code que vous avez envoyé fonctionne et la fonction MM() est toujours au même endroit et fonctionne, donc ici je suis perdu.....

A propos de l'ouverture de l'ordre au même tick ;

Lorsque l'EA entre dans le graphique, il doit se diriger vers le prix qui est plus (ou moins) élevé que le prix à ce moment-là, ce qui signifie que lorsque le prix monte (ou descend), l'OpenDistance et l'ordre d'achat (ou de vente) ont lieu. A partir de là, l'ouverture suivante peut se produire lorsque le prix rebondit (si le dernier ordre est un achat) à partir de l'OrderOpenPrice moins ReturnDistance.même logique dans le cas où la vente est le dernier ordre. Peut-être qu'une limite doit être mise en place pour éviter toute ouverture d'ordre en dehors de cette logique.

Meilleures salutations

Luis

 
//mine
LotSize = (RiskAmount / StopLoss) / TickValue;              //Phil: LotSize is defined in global scope

//yours
double LotSize = (RiskAmount / StopLoss) / TickValue;


Vous avez défini LotSize dans la portée globale et l'avez initialisé avec 0. Dans la fonction void MM(), vous calculez un LotSize uniquement valable dans cette fonction. J'ai seulement supprimé l'initialisation, de sorte que la variable dans la portée globale est mise à jour.

Pourriez-vous commenter pour chacune de ces valeurs, la valeur en Pips, s'il vous plaît ?

extern double StopLoss       =  50;
extern double TakeProfit     =  20;
extern double TrailingStop   =   2;
extern int    MinimumProfit  =   3;
extern int    Slippage       =   3;
extern double OpenDistance   =   2;
extern double ReturnDist     =   1;
extern double MinStop        =   1;

Quel est le spread pour le symbole sur lequel vous voulez exécuter l'EA ?

Mais j'ai ajusté vos paramètres d'entrée pour que tous les ordres ne s'ouvrent pas à peu près en même temps.Vous devez peut-être vérifier les paramètres par défaut.

Essayez de faire la même chose et laissez-le fonctionner dans le testeur en mode visuel.

 
kronin:


Vous avez défini LotSize dans la portée globale et l'avez initialisé avec 0. Dans la fonction void MM(), vous calculez un LotSize uniquement valable dans cette fonction. J'ai seulement supprimé l'initialisation, de sorte que la variable dans la portée globale est mise à jour.

Pourriez-vous commenter pour chacune de ces valeurs, la valeur en Pips, s'il vous plaît ?

Quel est le spread pour le symbole sur lequel vous voulez exécuter l'EA ?

Mais j'ai ajusté vos paramètres d'entrée pour que tous les ordres ne s'ouvrent pas à peu près en même temps.Vous devez peut-être vérifier les paramètres par défaut.

Essayez de faire la même chose et laissez-le fonctionner dans le testeur en mode visuel.


Bonjour Kronin,

Oui, j'ai beaucoup à apprendre....Maintenant je comprends que lorsqu'il y a un besoin d'accéder à une valeur de l'extérieur d'une fonction qui doit être à Global.

Les valeurs qui sont sur l'externe sont multipliées par 10 parce que l'EA doit aussi fonctionner sur des brokers à 5 chiffres. J'utilise ce bloc de code pour obtenir cela automatiquement, mais je reçois un conseil de WHRoeder qui n'est pas compatible avec les métaux.

int init ()// Adjust for 4 or 5 digits.
   {
   if (Digits == 2 || Digits == 4) <------- not compatible with metals
      {
      pt = Point;
      RealSlippage = Slippage;
      }    
   if (Digits == 3 || Digits == 5) 
      {
      pt = Point * 10;
      RealSlippage = Slippage * 10;
      }

L'écart de la paire pourrait être variable. C'est pourquoi j'utilise un code pour sortir du niveau d'arrêt.

En ce qui concerne ce problème "Mais j'ai ajusté vos paramètres d'entrée pour que tous les ordres ne s'ouvrent pas à peu près en même temps. Vous devez peut-être vérifier les paramètres par défaut."

Pour autant que je puisse voir (désolé si ce n'est pas le cas...), OpenDistance maintenir comme 2 pips et ReturnDistance est maintenant avec 2 aussi. Ce que je vois en ce moment, c'est que l'ordre s'ouvre mais pas avec une différence de 2 pips. Cela fonctionne avec un testeur sur la plateforme d'un courtier ECN (IC Markets). Cela peut-il avoir une importance ?

En fait, les ordres ne s'ouvrent pas en même temps, mais il semble que la distance d'ouverture et la distance de retour ne sont pas prises en compte pour obtenir la bonne distance pour ouvrir les ordres.

Vous avez dans le code que ;

OTLastTick=OTCurrentTick;                      //shift OrderTotal
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal
  if(OTCurrentTick>0)Trail();                    //Trail
  if(OTLastTick>=2                               //if OrderTotal has changed
     &&OTCurrentTick<OTLastTick
     &&OTCurrentTick>0){CloseAllOnSL();return;}  //Check order closed on SL level
  if(OTCurrentTick>=MaxOrders)return;            //Dont open more orders. Trail and return.
                                                 //Actually we have nothing more to do.
                                                 //Only call opposite if the initial order of the serie is open
  if(OTCurrentTick>0)OpenOppositeOrder(); //<--------------------- include this line to call function (not sure if this the right method to do it...)
  MM();                //<--------------------- include this line to call function (not sure if this the right method to do it...)
                        
  if(OTCurrentTick==0){//init serie
     BuyAllowed=true;
     SellAllowed=true; 

J'ai inclus la ligne en gras pour appeler la fonction OpenOppositeOrder et ici je ne suis pas sûr que ce soit correct. De l'autre côté, je ne vois pas où est la comparaison du tick actuel avec le dernier tick qui s'est produit 2 pips avant (OpenDistance).

Désolé si je commence à vous ennuyer avec mes problèmes.

Meilleures salutations

Luis