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

 

Ce lien me dépasse largement à ce stade, mais je vois comment je pourrais créer un fichier de bibliothèque sympa pour résoudre mes problèmes... https://www. mql5.com/en/articles/1390. Je suis un peu nerveux de construire des tableaux de tickets et j'espère que je peux contourner cela pour l'instant... puisque lorsque je modifie, c'est seulement tout ce Pair et Magic etc...

J'ai tout fait correctement avant d'arriver à la section Modifier. Il sélectionne correctement par ticket, puis passe au bloc Modifier... cette partie est parfaite.

Mais je n'arrive pas à voir si les choses restent bloquées dans cette section de modification ou si j'ai des problèmes parce qu'il "doit passer par ces sections pour saisir la prochaine commande".

J'avais espéré pouvoir l'envoyer dans le bloc de modification et faire en sorte qu'il modifie tous les ordres de ce nombre et symbole magique. C'est pourquoi j'ai essayé un petit interrupteur vrai ou faux.

S'il faut passer par ces sections à chaque cochage 'pour sélectionner la prochaine commande', je risque d'avoir des problèmes.

Peut-être que je pourrais juste nommer manuellement les tickets qui doivent être modifiés, mais je ne pense pas que ce soit le problème, puisqu'il les obtient correctement, il fait juste un cycle à chaque tick, et je suis un noob pour savoir pourquoi...

Est-ce que ce serait une autre option ?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

Est-ce qu'un continue ;, return(), ou break ; serait utile quelque part ?

 

Ah, j'ai vu une erreur dans un de mes exemples précédents...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

Je pense que ça devrait l'être :

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

Cela devrait isoler le problème dans cette section... il est 5h du matin, je dois encore tester... (j'ai perdu une heure, maudite heure d'été, haha)

Si je le laisse passer dans cette section dans un sens, il envoie des modifications d'ordres à chaque tick avec le dernier ordre... et si je le laisse passer dans l'autre sens, il fait défiler les ordres correctement, mais il modifie toujours le cache des ordres à chaque tick...

Je peux faire défiler les ordres à l'envers 5,4,3,2,1 ou à l'endroit 1,2,3,4,5, mais je ne vois pas comment le laisser passer pour modifier tous les ordres sans les spammer.

Je me demande 1) si je dois le laisser passer une fois pour modifier tous les ordres qui passent..., ou 2) s'il doit passer à chaque fois qu'il doit sélectionner un nouvel ordre ?

Je suis encore en train d'apprendre, c'est tout... Si personne ne peut m'orienter dans la bonne direction, je vais essayer cette ligne ci-dessus, avec une rupture et la fin et voir si cela se termine.... il doit être quelque chose de simple...

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

Vous n'avez PAS fait d'erreur. Le premier est BON pour partir...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


J'ai peut-être eu un prb assez similaire auparavant, si je lis tout cela correctement. J'essayais de créer mon propre "modifier les ordres stop/limite par le niveau minimum MODE_STOP, si l'offre/la demande s'éloigne de x Pips...".

Votre cas est-il similaire ?

 
diostar:

Vous n'avez PAS fait d'erreur. Le premier est BON pour partir...


J'ai peut-être eu un prb assez similaire auparavant, si je lis tout cela correctement. J'essayais de créer mon propre "modifier les ordres stop/limite par le niveau minimum MODE_STOP, si l'offre/la demande s'éloigne de x Pips...".

Votre cas est-il similaire ?



Merci Diostar, j'essaie de faire une sorte de tas d'ordres en attente, puis quand il arrive au prochain ordre en attente réussi, de faire apparaître les anciens arrêts.

Je vais réessayer avec le ! alors... il y a tellement de combinaisons à essayer... et je vois, j'aurais dû utiliser "false" pour la valeur booléenne au lieu de FALSE... ouais, ça a compilé et ça fonctionne toujours bien, mais même problème. Je vais peut-être retrouver ce projet et essayer avec "false"... Dans l'exemple 2, il n'a pas voulu faire défiler les ordres, et a modifié chaque tick, donc je vais réessayer avec cette variable modifiée.

J'arrive à le faire passer au bloc de modification et à faire tourner les ordres vers l'avant ou l'arrière, mais il modifie chaque tick, et si je mets un filtre vrai ou faux après la modification, il ne modifie que le premier ordre dans le cache.....

pour moi, cela suggère que l'EA a besoin d'aller dans ce bloc à chaque tick pour obtenir l'ordre suivant (je n'étais pas sûr que lorsqu'il arrive dans ce bloc, je pouvais juste le sceller ici, et le faire tourner dans les ordres une fois)...

Cela me pose un problème, car toutes les questions vraies ou fausses ne le laissent pas passer...

Je pense que si j'apprenais à faire un cache des ordres et à les sélectionner, j'aurais toujours le même problème... J'ai eu toutes les combinaisons possibles, mais pas toutes en même temps. J'ai obtenu qu'il modifie une fois et passe ensuite à autre chose, mais il n'a obtenu que la première commande et s'est arrêté... donc je me demande si je dois utiliser cela avec un commutateur avec chaque bon de commande réellement spécifié... Je n'étais pas sûr que mon bool OrderTicket() pour rapporter mon message d'erreur, ait aussi perturbé la déclaration d'un Pending_OrderTicket_XX... Cela doit être quelque chose de simple...

comment avez-vous résolu ce problème dans le vôtre ?

 
void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


Indépendamment de la façon dont je déclare les variables globales...

bool IfGap_SELLLevel_00AlreadyExe;

...il semble modifier une fois, MAIS seulement un des ordres, je suppose le dernier ordre avec la façon dont je fais défiler les ordres.

J'ai enlevé le ticket ret00 avant la commande au cas où aussi...

Au moins, ce n'est pas à chaque tick, je pourrais utiliser cet exemple S'il continuait à faire défiler mes ordres lorsque les conditions de la première forumule sont vraies (mais pas à chaque tick, le 'spamming modifie' après le défilement ok, comme le fait ma tentative la plus réussie...).

Cette tentative n'a pas fonctionné non plus :

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

Je montre plus clairement ce que j'essaie de faire de toute façon, j'aimerais que ce qui précède fonctionne, j'aurais été fait si c'était le cas...

J'espère que je suis sur la bonne voie de toute façon ... Je ne comprends toujours pas pourquoi mon exemple 1 plus tôt était faux, cette chose stupide fait exactement ce que je veux, mais à chaque tick... Je n'arrive même pas à le faire fonctionner quand je programme les ordres, donc je suis encore totalement perdu...

Des conseils ?


EDIT : Je suis vraiment épuisé, mais je viens de penser à ceci, cependant je vais devoir essayer plus tard car je n'ai plus de temps...

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              for (int i=OrdersTotal()-1; i >= 0; i--)
              if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                     if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
                      { 
                       double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

Avez-vous affaire à un point fractionnaire ?

 
diostar:

Avez-vous affaire à un point fractionnaire ?


Je pense que j'ai doublé la valeur du SL et du TP si c'est ce que vous voulez dire, de sorte qu'on lui attribue le prix pour fixer le SL et le TP. J'espère que je ne me suis pas trompé en faisant cela.

J'ai juste besoin que MT4 atteigne ce bloc, puis l'oublie..... J'ai le sentiment que l'expression va être trop compliquée pour MT4, mais je vais continuer à essayer...

 
Funky:


Je pense que j'ai doublé la valeur du SL et du TP, si c'est ce que vous voulez dire, pour qu'on lui attribue le prix pour fixer le SL et le TP. J'espère que je ne me suis pas trompé en faisant cela.

J'ai juste besoin que MT4 arrive à ce bloc, puis l'oublie..... J'ai le sentiment que l'expression va être trop compliquée pour MT4, mais je vais continuer à essayer...

Non ce que je veux dire, c'est que vous traitez 4/5 chiffres - 0.0001, ou 0.00001 Point ?
 
diostar:
Non, ce que je veux dire, c'est que vous traitez 4/5 chiffres - 0.0001, ou 0.00001 Point ?


Ah 5 chiffres... J'ai utilisé ça plus tôt...

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



Et je pensais tout à l'heure, je pourrais essayer de transformer cette détection de chiffres comme mon premier insert de bibliothèque, hehe, mais une étape à la fois, je dois apprendre à ramper d'abord, hehe.

Je ne reçois pas de message d'erreur 130 prix à fermer ou autre..... J'aimerais que ce soit quelque chose de simple comme ça...

La dernière page, j'avais l'exemple 1 qui fonctionnait, et beaucoup d'autres exemples similaires, j'aimerais juste pouvoir le laisser modifier une fois par tick...

Au lieu d'essayer de récupérer tous mes ordres de VENTE précédents en une seule fois, je me demande si je ne devrais pas simplement créer une nouvelle boîte pour chacun d'eux... ouais, je suis vraiment perdu comment faire un cycle à travers tous mes anciens VENTES dans n'importe laquelle de mes tentatives, et les modifier une fois.


&& (OrderStopLoss() < Stoploss_Level_00)

au lieu de

!IfGap_SELLLevel_00AlreadyExe

Vous savez que vous avez suggéré quelque chose plus tôt Diostart qui m'a fait réfléchir...

Je me demande si une idée de !IfGap_SELLLevel_00AlreadyExe ne fonctionnera pas (si elle ne va pas saisir tous les ordres et les modifier dans le même passage avant de verrouiller ce bloc), je me demande si j'utilise ton idée avant, et si je mets une question comme celle-ci dedans... Je reviendrai si ça marche.

Si je suis sur la mauvaise voie, faites-le moi savoir, merci ;)

 
Funky:


Ah 5 chiffres... J'ai utilisé ça plus tôt...



Et je pensais tout à l'heure, je pourrais essayer de tourner ce Digits de détection comme mon premier insert de bibliothèque, hehe, mais une étape à la fois, je dois apprendre à ramper d'abord, hehe. <-- sage décision. Tu es en train de ramper. Avec les bibliothèques, tu finiras par marcher.

Je ne reçois aucun message d'erreur 130 prix à fermer ou quoi que ce soit.... J'aimerais que ce soit quelque chose de simple comme ça...

La dernière page, j'avais l'exemple 1 qui fonctionnait, et beaucoup d'autres exemples similaires, j'aimerais juste pouvoir le laisser modifier une fois par tick... <--- voir ci-dessous.

Au lieu d'essayer de récupérer tous mes ordres de VENTE précédents en une seule fois, je me demande si je ne devrais pas simplement créer une nouvelle boîte pour chacun d'entre eux... ouais, je suis vraiment perdu comment faire un cycle à travers tous mes anciens VENTES dans n'importe laquelle de mes tentatives, et les modifier une fois.<--- voir ci-dessous


Il y a des chances que cela puisse vous aider, je l'espère.

Au départ, mes symboles étaient à 4 chiffres, tous les stops suiveurs, les ordres d'arrêt/limite modifier, tout s'est passé comme prévu. Puis mon courtier a décidé de passer en fractionnel. J'ai fait les changements nécessaires et j'ai vu mes pips aller comme -3.4, -4.5, 0.1, 4.6, 7.3, etc, etc. Je pensais que c'était correct, mais en fait non : Supposons que je définisse ma limite = 7, et disons que les nouveaux tick 1, tick 2, tick 3 se produisent séquentiellement :

1) 7.3>limite, puis l'ordre est modifié... le courtier remplit 1 slippage en moins...

2) 7.5>limite, puis l'ordre est modifié.... le courtier remplit 0 slippage...

3) 7.1>limite, puis l'ordre est modifié...le courtier remplit 2 slippage off...

Donc en tout, mes ordres sont modifiés 3 fois pour les 3 ticks. Ayant réalisé cela, j'ai décidé d'utiliser MathRound() pour arrondir ces ordres à l'entier le plus proche, donc 1,2,3 devient

1) mathround(7.3) =7 >limite, PAS VRAI, pas modifié

2) mathround(7.5)=8 >limite, VRAI, l'ordre est modifié

3) mathround(7.1)=7>limite, PAS VRAI, pas modifié

En fait, je travaille toujours sur la façon d'améliorer ce qui précède ... jusqu'à présent, ils fonctionnent bien, mais je pense qu'il doit y avoir de meilleures façons, que la mienne.