Problème avec le code EA 2 (gestionnaire SL)

 

Bonjour,

Merci encore pour votre aide pendant que j'apprends MQL.

Voici mon prochain problème.... Je suis TELLEMENT proche de celui-ci.... Je l'ai fait faire tout ce que je voulais... Cependant, il modifie les SLs à CHAQUE TOUR si le GAP est supérieur à ce critère, plutôt que de l'exécuter une seule fois...

C'est un code très simple, et un problème très simple que je suis incapable de résoudre à ce stade, et toute aide serait utile à mon apprentissage...

C'est juste le côté BUY pour le moment, cependant j'ai écrit des allocations pour l'IFGAP pour le côté OP_SELL pour plus tard.


La fonction de cet EA est de :

1. d'initier une transaction d'achat si elle n'existe pas.

2. au niveau du TP 1, déplacez le SL vers le haut.... au niveau du TP 2, déplacez le SL vers le haut encore.... au niveau du TP 3, déplacez le SL vers le haut encore une dernière fois. Nice et simple vraiment..


Le problème que je rencontre est le suivant

1. Il exécute mon OrderModify EVERYTICK si le GAP est dépassé... Je ne vois pas comment changer la logique, mais une fois que je l'aurai montré, je saurai pour l'avenir...


Merci d'avance.

Sincères salutations et joyeux pips à tous.


int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
    if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10;
    if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_2 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_2*PipValue*Point))) ||
            ((Gap_Level_2 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_2*PipValue*Point)))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_2*PipValue*Point, price + BuyTakeprofit_Level_2*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_3 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_3*PipValue*Point))) ||
            ((Gap_Level_3 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_3*PipValue*Point)))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_3*PipValue*Point, price + BuyTakeprofit_Level_3*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == InitialOrderType && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
    double SL = Ask - InitialBuyStoploss*PipValue*Point;
    if (BuyStoploss_Level_3 == 0) SL = 0;
    double TP = Ask + Initial_Takeprofit*PipValue*Point;
    if (Initial_Takeprofit == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, 0, 0, "My Expert", BUY_Magic, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, SL, TP, "My Expert", BUY_Magic, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (ClearAllObjects) ObjectsDeleteAll();
    
    
}

 
Funky:

Le problème de débutant que je rencontre est le suivant

1. Il exécute mon OrderModify EVERYTICK s'il dépasse GAP... Je n'arrive pas à penser comment changer la logique, mais une fois qu'on me l'aura montré, je saurai pour l'avenir...

Si vous ne voulez pas l'exécuter pour chaque tick, quand voulez-vous l'exécuter ? voulez-vous dire chaque tick mais seulement une fois ? pour cela, il suffit de vérifier si le SL et le TP ont déjà été ajustés....

Un autre commentaire. . . IfGap_Level_1() passe en revue tous les ordres ouverts à la recherche de ceux qui correspondent au symbole et au numéro magique, puis vérifie si l'ordre est en profit d'un certain montant, etc... Si c'est le cas, il appelle BuyOrderModifyLevel_1(), cette fonction passe en revue tous les ordres ouverts à la recherche de ceux qui correspondent au symbole et au numéro magique et qui sont des achats... Vous voyez une petite répétition ici ? Pourquoi ne pas simplement passer le numéro de ticket de IfGap_Level_1() à BuyOrderModifyLevel_1() ?

 
Funky:

Bonjour,

Merci encore pour votre aide pendant que j'apprends MQL.

Voici mon prochain problème.... Je suis TELLEMENT proche de celui-ci.... Je l'ai fait faire tout ce que je voulais... Cependant, il modifie les SLs à CHAQUE TOUR si le GAP est supérieur à ce critère, plutôt que de l'exécuter une seule fois...

C'est un code très simple, et un problème très simple que je suis incapable de résoudre à ce stade, et toute aide serait utile à mon apprentissage...

C'est juste le côté BUY pour le moment, cependant j'ai écrit des allocations pour l'IFGAP pour le côté OP_SELL pour plus tard.


La fonction de cet EA est de :

1. initier un trade d'achat si un n'existe pas.

2. au niveau TP 1, déplacer le SL vers le haut.... au niveau TP 2, déplacer le SL vers le haut encore.... au niveau TP 3, déplacer le SL vers le haut encore une dernière fois. C'est simple et agréable.


Le problème que je rencontre est le suivant :

1. Il exécute mon OrderModify EVERYTICK si le GAP est dépassé... Je ne vois pas comment changer la logique, mais une fois que je l'aurai montré, je saurai pour l'avenir...


Merci d'avance.

Sincères salutations et joyeux pips à tous.


Vous n'êtes pas un NOOB. A en juger par l'élégante capacité à pouvoir écrire et ensuite appeler des fonctions, comme vous l'avez fait. Vous devriez être en mesure de voir par vous-même, que vos appels de fonctions (profondeur de la logique, etc) peuvent être simplifiés peut-être à 1-2 fonctions.

Au lieu de :

OrderOpenPrice() 

dans votre condition :

if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||

avez-vous envisagé/essayé d'utiliser OrderStopLoss()?

 
RaptorUK:

Si vous ne voulez pas l'exécuter pour chaque tick, quand voulez-vous l'exécuter ? voulez-vous dire chaque tick mais une seule fois ? pour cela, il suffit de vérifier si le SL et le TP ont déjà été ajustés ....

Un autre commentaire. . . IfGap_Level_1() passe en revue tous les ordres ouverts à la recherche de ceux qui correspondent au symbole et au numéro magique, puis vérifie si l'ordre est en profit d'un certain montant, etc... si c'est le cas, il appelle BuyOrderModifyLevel_1(), cette fonction passe en revue tous les ordres ouverts à la recherche de ceux qui correspondent au symbole et au numéro magique et qui sont des achats... vous voyez une petite répétition ici ? pourquoi ne pas simplement passer le numéro de ticket de IfGap_Level_1() à BuyOrderModifyLevel_1() ?

Bonjour Raptor, merci encore pour votre temps. De la façon dont je l'ai dit, cela semble effectivement confus. Je suppose que j'ai du mal à assembler correctement tous ces composants. Pour l'instant, le principal problème que j'ai est qu'il modifie les ordres à chaque tick, mais je vois maintenant d'autres problèmes après vos commentaires. Avec la dernière partie de ce que vous avez dit, si je vous comprends bien, voulez-vous dire qu'il faut insérer le code BuyOrderModify à l'intérieur de IfGap_Level_1 dans un {} après avoir vérifié si le Gap a été atteint plutôt que dans son propre {} ? Comme dans l'exemple ci-dessous ?


void OverGap1_soModify()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
               {
                double price = Ask;
                if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice();
                 }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Et vous savez, j'ai l'impression d'être dejavue avec mon autre EA d'une certaine manière maintenant que la boîte prend forme (ici https://forum.mql4.com/42870 - similitude non intentionnelle, car c'est un EA différent avec un but différent, cependant cela pointe vers les mêmes domaines que je dois apprendre comme l'inclusion de deux fonctions ensemble, je promets que je n'essayais pas de remplir le forum avec de la redondance)...

Je peux donc demander si une variable IFNEWORDEREXIST = TRUE au même endroit résoudrait un autre problème. Je veux que la dernière transaction ouverte qui a été faite dans ModeTrades soit celle que je compare à IfGap_Level_X à tout moment (je suppose que cette partie est similaire à l'autre).


Une fois que j'aurai corrigé l'erreur de l'OrderModify qui se produit sur CHAQUETICK alors qu'il est coincé à l'intérieur de ce {} si la case ci-dessus n'est pas correcte, et que j'aurai traité le problème de la sélection du dernier ordre, je serai alors confronté au drame suivant : si IfGap_Level_3 est satisfait, IfGap_Level_2 et IfGap_Level_1 le sont aussi.

Je veux en quelque sorte que l'EA agisse comme un gestionnaire de SL, et (malgré l'ordre d'achat unique initial) je vais l'utiliser pour gérer plusieurs transactions. Le premier achat était juste pour que je puisse le backtester correctement. Je voudrais que ce code :

Si les pips de l'ordre atteignent le niveau IfGap_Level_1, je veux qu'il aille à BuyOrderModifyLevel_1, puis modifie les ordres existants, et oublie cette partie du code.

Si les pips de l'ordre atteignent IfGap_Level_2, je veux qu'ils aillent dans BuyOrderModifyLevel_2, puis modifient les ordres existants, et oublient cette partie du code.

Si les pips de l'ordre atteignent IfGap_Level_3, je veux qu'il aille à BuyOrderModifyLevel_3, puis modifie les ordres existants, et oublie cette partie du code.

J'espère que je ne suis pas trop loin, cela semblait simple au début.

J'espérais pouvoir insérer un "break ;" ou autre à la fin de chaque bloc et m'en sortir avec ce code...
diostar:

Vous n'êtes pas un NOOB. A en juger par l'élégante capacité à pouvoir écrire puis appeler des fonctions, comme vous l'avez fait. Vous devriez être en mesure de voir par vous-même, que vos appels de fonctions (profondeur de la logique, etc) peuvent être simplifiés peut-être à 1-2 fonctions.

Au lieu de :

dans votre état :

avez-vous envisagé/essayé d'utiliser OrderStopLoss()?

Ah merci diostar, vous êtes trop gentil avec vos commentaires. Je me débrouille bien pour écrire des scripts de base, mais je ne suis pas loin de ce niveau, et maintenant le fait d'assembler tout cela me donne mal à la tête. Merci pour les encouragements, les formules de forum et les autres choses ont un sens pour moi, pas tellement la grammaire/syntaxe du programme.

Je crois que vous avez peut-être raison de dire qu'en condensant le code en 1-2 fonctions, je ne sais pas comment...

Si j'avais l'expérience, j'aurais l'IFGAP et le MODIFY ORDER dans un seul bloc comme vous et Raptor le suggérez, mais je jouais la sécurité à ce stade... Je suppose que si j'étais un pro, j'aurais placé les TPs dans un tableau ou un commutateur, et défini old TP=oldTP+TPincrement_Level, et j'aurais pu avoir tout cela dans un seul bloc en environ 10 lignes de code... Finalement, je ferai cela dans le tout dernier If Gap & ModifyOrder {} de sorte que l'incrément du SL soit augmenté à des intervalles programmables, mais je veux laisser les premiers à régler manuellement en fonction des conditions du marché...

Je n'ai pas envisagé d'utiliser OrderStopLoss() dans la formule. Je suppose que comme je vais varier un peu les SLs pour les premiers mouvements, je veux vraiment qu'ils soient basés sur l'OrderOpenPrice et les Pips qu'il a augmenté depuis son ouverture. Je n'ai pas très bien expliqué l'EA, toutes mes excuses. Merci aussi pour votre temps, j'apprécie beaucoup.

 
Funky:

Bonjour Raptor, merci encore pour votre temps. De la façon dont je l'ai dit, cela semble effectivement confus. Je suppose que j'ai du mal à assembler correctement tous ces composants. Pour le moment, le principal problème que j'ai est qu'il modifie les ordres à chaque tick, mais je vois maintenant d'autres problèmes après vos commentaires. Avec la dernière partie de ce que vous avez dit, si je vous comprends bien, voulez-vous dire qu'il faut insérer le code BuyOrderModify à l'intérieur de IfGap_Level_1 dans un {} après avoir vérifié si le Gap a été atteint plutôt que dans son propre {} ? Comme dans l'exemple ci-dessous ?

Vous pourriez le faire mais ce n'est pas vraiment ce que je voulais dire....

Jetez un coup d'œil à cet exemple pour voir si cela a un sens...

          (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}

L'autre chose que j'ai mentionnée était de vérifier si l'ordre avait déjà été modifié en regardant quels étaient son SL et son TP, en d'autres termes, si vous avez déjà modifié l'ordre sur le dernier tick, ne le refaites pas sur ce tick... Est-ce ce que vous cherchiez à faire ?

 
RaptorUK:

Vous pourriez le faire, mais ce n'est pas vraiment ce que je voulais dire...

Jetez un coup d'œil à ceci, voyez si cela a un sens...

L'autre chose que j'ai mentionnée était de vérifier si l'ordre avait déjà été modifié en regardant quel était son SL & TP, en d'autres termes, si vous avez déjà modifié l'ordre sur le dernier tick, ne le refaites pas sur ce tick... est-ce que c'est ce que vous cherchiez à faire ?


C'est génial pour mon apprentissage... Je n'avais pas réalisé qu'on pouvait mettre (OrderTicket()) après le nom d'une fonction en premier lieu, cool. Cela attribue donc le numéro de ticket de ma dernière commande ouverte, cool. C'est une astuce très très pratique pour les choses que je fais en ce moment, merci.

(OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }

Et là, je vois que vous avez créé la variable Ticket. Je ne savais pas que l'on pouvait déclarer une variable dans cette partie du code. Est-ce que cela peut être fait parce qu'on lui a donné une valeur dans la dernière partie ci-dessus ? Je comprends comment cela peut fonctionner, alors, il utilise le numéro du ticket de commande de cette dernière transaction au lieu de mon OrderTicket() "non spécifique". C'est logique. Ce sera beaucoup plus précis que OrderSelect(i++.. etc pour moi.

void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}


Il est presque une heure du matin ici, donc je vais regarder de plus près demain, merci beaucoup pour votre temps..... J'ai l'impression que je vais devoir insérer cette logique dans le bloc "If_Gap_Levels{}" au lieu du bloc "BuyModify{}". Je ne l'ai pas expliqué très clairement, je m'en excuse. Je pense que cette astuce va m'aider à vérifier le GAP du dernier ticket, puis à MODIFIER TOUTES les commandes précédentes avec cette OP_BUY et BUY_Magic, etc.

L'autre chose que j'ai mentionnée était de vérifier si l'ordre avait déjà été modifié en regardant quel était son SL & TP, en d'autres termes, si vous avez déjà modifié l'ordre sur le dernier tick, ne le refaites pas sur ce tick... est-ce que c'est ce que vous cherchez à faire ?

Oui, c'est exactement là où je suis bloqué en fait... Je ne sais pas comment le spécifier... Dois-je créer une valeur bool de NeedsModifying = false, et ensuite la convertir en True lorsque le critère IfGap est rempli ? Je peux penser à la logique, mais pas à la syntaxe, cependant j'ai appris de vos conseils pour moi dans ma dernière EA pour même être capable de suggérer ma dernière phrase. Merci encore Raptor.

 
Funky:

C'est génial pour mon apprentissage... Je n'avais pas réalisé qu'on pouvait mettre (OrderTicket()) après le nom d'une fonction en premier lieu, cool. Donc cela attribue mon ticket qui répond au critère Gap à cette fonction BuyOrderModifyLevel_1 ? C'est une astuce très très pratique pour les choses que je fais en ce moment, merci.

Et là, je vois que vous avez créé la variable Ticket. Je ne savais pas que l'on pouvait déclarer une variable dans cette partie du code. Est-ce que cela peut être fait parce qu'on lui a donné une valeur dans la dernière partie ci-dessus ? Je comprends comment cela peut fonctionner, alors, il utilise le numéro du ticket de commande de cette dernière transaction au lieu de mon OrderTicket() "non spécifique". C'est logique. Ce sera beaucoup plus précis que OrderSelect(i++.. etc pour moi.

Cela fait partie de la définition de la fonction... tout comme n'importe quelle fonction standard, par exemple OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify est une fonction à laquelle vous passez des variables, un minimum de 5 variables, la 6ème est optionnelle. vous pouvez faire exactement la même chose avec vos propres fonctions... . .

Vous êtes les bienvenus. Nuit.

 
RaptorUK:

Cela fait partie de la définition de la fonction... tout comme n'importe quelle fonction standard, par exemple OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify est une fonction à laquelle vous passez des variables, un minimum de 5 variables, la 6ème étant facultative. Vous pouvez faire exactement la même chose avec vos propres fonctions... . .

Vous êtes les bienvenus. Bonne nuit.


Merci Raptor.... ah vous m'avez attrapé alors que je modifiais la dernière phrase dans ce post, car oui vous aviez raison avec ce que je cherchais...

Merci de m'avoir rappelé ce document .doc encore une fois... c'est drôle que j'ai lu ce document .doc particulier sur OrderMofidy tant de fois... Ce manuel avait l'air chinois pour moi, mais au fur et à mesure que je progresse, des astuces plus avancées ressortent. Je vais le relire maintenant, et je parie qu'il sera aussi clair que le jour cette fonctionnalité que vous avez mentionnée pour moi, mais merci de me l'avoir signalée pour que je sache où la chercher.

--copié du dessus, car j'avais édité la dernière partie sans le savoir pendant que vous écriviez....

L'autre chose que j'ai mentionné était de vérifier si l'ordre avait déjà été modifié en regardant quels étaient ses SL et TP, en d'autres termes, si vous avez déjà modifié l'ordre sur le dernier tick, ne le refaites pas sur ce tick ... Est-ce que c'est ce que vous cherchez à faire ?

Oui, c'est exactement là où je suis bloqué en fait... Je ne sais pas comment le spécifier... Dois-je créer une valeur bool de NeedsModifying = false, et ensuite la convertir en True lorsque le critère IfGap est rempli ? Je peux penser à la logique, mais pas à la syntaxe, cependant j'ai appris de vos conseils pour moi dans mon dernier EA pour même être capable de suggérer ma dernière phrase. Merci encore Raptor.

Bonne nuit de Downunder.

 
RaptorUK:

Cela fait partie de la définition de la fonction... tout comme n'importe quelle fonction standard, par exemple OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify est une fonction à laquelle vous passez des variables, un minimum de 5 variables, la 6ème étant facultative. Vous pouvez faire exactement la même chose avec vos propres fonctions... . .

Vous êtes les bienvenus. Nuit.


Salut Raptor,

J'ai poussé les choses un peu plus loin en utilisant les idées que tu m'as montrées. Je me suis rendu compte que ton code aurait réglé mon problème, mais une fois que les ordres atteignent mon deuxième niveau de TP, ce sera difficile à gérer...

Je n'avais pas réalisé que je pouvais laisser tomber le OrderSelect i++ et juste choisir mon propre ticket dans cette équation, donc j'ai essayé cela car cela résoudra tous mes problèmes avec les trades multiples... est-ce que cela fonctionnerait ?

Si quelqu'un peut me confirmer que ce code fonctionne, j'en serais ravi... merci encore pour votre aide ;)

void BuyPendingOrder_1()
{
    int expire = TimeCurrent() + 60 * 0;
    double price = NormalizeDouble(Ask, NDigits) + PriceOffset_1*PipValue*Point;
    double SL = price - BuyStoploss_1*PipValue*Point;
    if (BuyStoploss_1 == 0) SL = 0;
    double TP = price + BuyTakeprofit_1*PipValue*Point;
    if (BuyTakeprofit_1 == 0) TP = 0;
    if (0 == 0) expire = 0;
    int PendingOrderTicket_1 = OrderSend(Symbol(), OP_BUYSTOP, BuyLots_1, price, 4, SL, TP, "EA_Pending_Order1", BUY_Magic, expire, Blue);
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == -1)
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    
}

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1() 
{
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            
    }
    
}
 

Il y a un problème en faisant ce que vous suggérez....

Imaginez que votre EA soit en cours d'exécution . . . puis que votre MT4 soit interrompu pour une raison quelconque, panne de courant, crash du MT4, redémarrage du PC, etc . . . votre code ne peut pas reprendre là où il s'est arrêté parce qu'il n'a plus la bonne valeur pour PendingOrderTicket_1.

 
RaptorUK:

Il y a un problème à faire ce que vous suggérez....

Imaginez que votre EA soit en cours d'exécution... puis que votre MT4 soit interrompu pour une raison quelconque, panne de courant, crash du MT4, redémarrage du PC, etc... votre code ne peut pas reprendre là où il s'est arrêté parce qu'il n'a plus la valeur correcte pour PendingOrderTicket_1.


Bonjour Raptor, merci encore.

C'est le seul problème avec le code ci-dessus ? ?? Je pense que dans le pire des cas, le PendingOrderTicket_1 ne serait pas modifié, et se fermerait à son SL.

La façon dont j'ai utilisé la fonction OrderSelect est-elle correcte ?

 if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

Le gros problème que je pense avoir, c'est que lorsque l'OrderTicket_1 est au-dessus du premier Gap_Level1, il va encore modifier l'ordre à chaque fois que ce critère est rempli.

Est-ce le cas ? Si c'est le cas, le code ci-dessous peut-il résoudre le problème ?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
      {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             HasBeenExecuted = false;
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            {
            HasBeenExecuted = true;
            }
     }    
   
}


Ou devrais-je le faire avec le CheckGapLevel_1, afin qu'il ne soit vérifié qu'une seule fois ? Et si c'est le cas, est-ce que je l'ai fait correctement ci-dessous ????. Y a-t-il un endroit où je devrais mettre un "break" ?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            HasBeenExecuted = false;
            {
            HasBeenExecuted = true;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Merci encore ;)