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

 
Funky:

Salut Raptor, merci encore.

1. 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.

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

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.

3. Est-ce le cas ? Si c'est le cas, le code ci-dessous le résoudrait-il ?

Merci encore ;)

1. C'est juste quelque chose qui m'a sauté aux yeux et qui va casser votre code.


2. Votre OrderSelect est erroné ( https://docs.mql4.com/trading/OrderSelect ) si vous voulez sélectionner en utilisant le numéro de ticket, vous devez utiliser SELECT_BY_TICKET et non SELECT_BY_POS.

3. Je ne pense pas, ce que vous avez fait, je pense, signifiera que cette fonction ne sera appelée qu'une seule fois... que se passera-t-il quand vous aurez l'ordre suivant à modifier ? que se passera-t-il si vous avez deux ordres ouverts en même temps ?

Je ne connais pas à 100% ce que vous faites, je n'ai pas le temps de regarder votre code en détail pour le faire... mais j'ai une question.

Ne pouvez-vous pas regarder l'OrderOpenPrice(), l'OrderStopLoss() et l'OrderTakeProfit() d'un ordre et déterminer s'il a déjà été modifié au niveau 1, 2 ou 3 ?

 
RaptorUK:

1. C'est juste quelque chose qui m'a sauté aux yeux et qui va casser votre code.


2. Votre OrderSelect est erroné ( https://docs.mql4.com/trading/OrderSelect ) si vous voulez sélectionner en utilisant le numéro de billet, vous devez utiliser SELECT_BY_TICKET et non SELECT_BY_POS.

3. Je ne pense pas, ce que vous avez fait, je pense, signifiera que cette fonction ne sera appelée qu'une seule fois... que se passera-t-il quand vous aurez l'ordre suivant à modifier ? que se passera-t-il si vous avez deux ordres ouverts en même temps ?

Je ne connais pas à 100% ce que vous faites, je n'ai pas le temps de regarder votre code en détail pour le faire... mais j'ai une question.

Ne pouvez-vous pas regarder l'OrderOpenPrice(), l'OrderStopLoss() et l'OrderTakeProfit() d'un ordre et déterminer s'il a déjà été modifié au niveau 1, 2 ou 3 ?

Merci Raptor, votre perspicacité m'a été très utile...

Je comprends tout à fait les contraintes de temps aussi, votre temps et vos conseils ont été très appréciés..... Je n'ai pas essayé de demander à quelqu'un de l'écrire pour moi, donc je ne suis pas allé dans les détails... ce qui pose le problème que sans beaucoup de détails, il est difficile d'offrir de l'aide, donc mes excuses...... Dans ce cas, c'est plutôt le code qui me préoccupait pendant l'apprentissage et vos conseils m'ont été très utiles.

1. J'ai fait des pieds et des mains pour l'assembler et le tester, donc je pourrais résoudre le problème de coupure de courant plus tard, quand j'aurai plus d'expérience.

2. Je vais changer pour SELECT_BY_TICKET, plutôt que POS, merci beaucoup.

3. Je veux que ce GAP_Level1 ne soit appelé qu'une seule fois, donc peut-être que j'ai raison sur ce point avec la façon dont j'ai assemblé tout cela..... Pour répondre à votre question, j'essaie de regarder le dernier ticket d'ordre en attente, pour voir s'il dépasse ma marque de TradeUp. Lorsque cela se produit, j'aimerais qu'il fasse remonter tous mes ordres précédents (cette fois en les sélectionnant par numéro magique pour les obtenir tous)... A ce stade, j'ai un autre ordre en attente ouvert, et quand il arrivera au Gap_Level2, j'aurai un bloc BuyModify_Level2, avec le même code..... Plausible ??

J'espère que ma logique est correcte, je me suis vraiment assis avec du papier, comme vous l'avez suggéré cette fois-ci, pour faire le point... ;)

 
Funky:


3. Je veux que ce GAP_Level1 ne soit appelé qu'une seule fois, donc peut-être que j'ai raison sur ce point avec la façon dont j'ai enchaîné tout cela..... Pour répondre à votre question, j'essaie de regarder le dernier ticket de l'ordre en attente, pour voir s'il dépasse ma marque de TradeUp. Lorsque cela se produit, je voudrais qu'il fasse remonter tous mes ordres précédents (cette fois-ci en les sélectionnant par numéro magique pour les obtenir tous)... A ce stade, j'ai un autre ordre en attente ouvert, et quand il arrivera au Gap_Level2, j'aurai un bloc BuyModify_Level2, avec le même code..... Plausible ??


Comment (ou où dans votre code) allez-vous définir HasBeenExecuted = false ; afin que IfGap_Level_1() soit exécuté pour le deuxième ensemble de transactions ?
 
RaptorUK:
Comment (ou où dans votre code) allez-vous définir HasBeenExecuted = false ; afin que IfGap_Level_1() soit exécuté pour le 2ème ensemble de transactions ?

Bonne question mon pote.

J'allais mettre cette variable en bool au début des variables internes sous celles que j'exporte. J'allais faire un GAP_Level_1, GAP_Level_2, GAP_Level_3, GAP_Level_4, GAP_Level_5, etc. Ainsi, une fois qu'il a atteint le niveau GAP_Level_1, il peut oublier ce premier niveau d'écart.

Votre remarque m'a fait réfléchir, j'apprécie beaucoup. Je vois maintenant un problème.

J'ai réalisé que lorsqu'un trade atteint un SL, et recommence, je veux que le premier trade recherche à nouveau Gap_Level_1 et effectue une rotation. Et bon sang, cela va poser un problème, puisque j'allais lier PendingOrder_1 avec GAP_Level_1, PendingOrder_Level_2 avec GAP_Level2.

Je pense que je peux encore y arriver, mais je n'y aurais pas pensé si vous n'aviez pas mentionné ......

Je peux penser à trois solutions de contournement... La première convient un peu mieux à mon cerveau, haha ;)

1. Si j'opte pour IF LAST TRADE IS LOSS, alors je SUPPRIME TOUS LES ORDRES EN ATTENTE, et je les relance si une transaction atteint un SL. Ainsi, si l'ordre en attente 1 atteint le Gap Level_1, cela empêchera l'ordre en attente 5 d'être le prochain trade ouvert qui atteint le GAP_Level5. Après qu'un SL soit atteint, tous mes trades ouverts seront fermés car ils partagent tous le même SL, donc fermer mes ordres en attente et redémarrer la logique pourrait être correct.

2. L'autre option à laquelle je pense (grâce à votre conseil pour mon autre problème de code il y a quelques semaines), est d'insérer une variable booléenne après la première transaction appelée NEWTRADE, puis d'avoir un bloc IFNEWTRADE==1, puis de passer à GAP_Level1. Cela me fait penser, je suppose que je pourrais faire IFNEWTRADE1 dans le bloc Pending Order 1, et IFNEWTRADE2 dans le bloc Pending Order 2 et ainsi de suite... puis IFNEWTRADE2==1 aller à GAP_Level2.

EDIT (après un café) : 3. je viens de penser, que se passerait-il si je triais les ordres par temps (maintenant je sais que l'on peut trier des ordres multiples de plusieurs façons), et si j'assignais une variable intermédiaire appelée ORD_SELECT_NUMBER basée sur le TEMPS. Ensuite, après que ORD_SELECT_NUMBER == 1, je passe à GAP_Level1, puis je regarde le prochain ORD_SELECT_NUMBER en utilisant cette commande ORDER_SELECT_NUMBER ++.

Je suis capable d'écrire des EA à ordre unique basés sur des signaux, etc., c'est juste cette histoire d'ordres multiples qui me tue... Mon EA fonctionne en fait tel quel, et obtient de bons résultats, il est juste fou à utiliser, car il modifie sur CHAQUETICK, et utilise juste mon plus petit Gap_Level à l'heure actuelle évidemment puisque je suis depuis travailler sur la façon de relier tout cela ensemble ci-dessus ...

Wow, mais merci encore Raptor, en plus de CODING KNOWLEDGE je vois combien une bonne LOGIQUE est importante aussi, merci de me faire réfléchir.

 
Funky:

Wow, mais merci encore Raptor, en plus des CONNAISSANCES DE CODAGE je vois combien une bonne LOGIQUE est importante aussi, merci de me faire réfléchir.

Tu as mal compris... tous les logiciels, quel que soit le langage dans lequel ils sont codés, C++, Perl, Pascal, Fortran, Assembleur, etc... ne servent qu'à résoudre des problèmes. Si la logique derrière votre solution est défectueuse, peu importe que vous soyez un bon codeur... la solution vient d'abord, le code vient ensuite.
 
RaptorUK:
Tout logiciel, quel que soit le langage dans lequel il est codé (C++, Perl, Pascal, Fortran, Assembleur, etc.), ne sert qu'à résoudre des problèmes. Si la logique derrière votre solution est défectueuse, peu importe que vous soyez un bon codeur... la solution vient d'abord, le code vient ensuite.

Je comprends ce que vous voulez dire... Un constructeur sans plan de construction n'ira pas loin, même s'il est le meilleur constructeur du monde. Le plan initial est presque plus important, je te comprends.

Vous avez été d'une grande aide pour moi Raptor, et je voulais vous dire merci encore.

J'ai choisi l'option paresseuse 1 ci-dessus.

Cela a été des heures et des heures de programmation, mon EA est autour de 85k (donc seulement posté un fragment), donc je suis encore à rapporter comment je suis allé après ce dinosaure est complète. J'ai un peu de chance en ce moment, les ordres sont sélectionnés correctement. J'étudie au fur et à mesure, car c'est loin des EA à ordre unique que j'ai l'habitude d'écrire. J'ai sauté dans le grand bain avec ce projet et j'apprends à nager. Je vous tiendrai au courant de mes progrès.

Merci encore Raptor :)

 
Funky:

Je comprends ce que vous voulez dire... Un constructeur sans plan de construction n'ira pas loin, même s'il est le meilleur constructeur du monde. Le plan initial est presque plus important, je te comprends.

Vous avez été d'une grande aide pour moi Raptor, et je voulais vous dire merci encore.

J'ai choisi l'option paresseuse 1 ci-dessus.

Cela a été des heures et des heures de programmation, mon EA est autour de 85k (donc seulement posté un fragment), donc je suis encore à rapporter comment je suis allé après ce dinosaure est complète. J'ai un peu de chance en ce moment, les ordres sont sélectionnés correctement. J'étudie au fur et à mesure, car c'est loin des EA à ordre unique que j'ai l'habitude d'écrire. J'ai sauté dans le grand bain avec ce projet et j'apprends à nager. Je vous tiendrai au courant de mes progrès.

Merci encore à Raptor :)

Une fois que vous vous voyez étendre vos ressources de code, et qu'il y a des fonctions qui peuvent être rendues communes pour toute utilisation future de l'EA, envisagez d'utiliser la bibliothèque/include, etc.

Parce qu'une fois qu'il devient un tyrannosaure, vos codes se perdent dans leur propre parc jurassique, surtout lorsque vous en avez à nouveau besoin pour une utilisation future.

 
diostar:

Une fois que vous vous voyez étendre vos ressources de code, et qu'il y a des fonctions qui peuvent être rendues communes pour toute utilisation future de l'EA, envisagez d'utiliser la bibliothèque/include, etc.

Parce qu'une fois qu'il devient un tyrannosaure, vos codes se perdent dans leur propre parc jurassique, surtout lorsque vous en avez à nouveau besoin pour une utilisation future.



Haha mon pote, ça m'a fait rire. Je vois comment cela peut arriver.

Pour être honnête, j'ai trouvé un insert de bibliothèque appelé 'OrderSendReliable.mqh'. Je vais d'abord terminer cette EA, puis je vais poster un message sur la façon dont j'ai utilisé cet insert de bibliothèque avec l'autre EAcode que j'ai publié car je pense que cela pourrait résoudre le problème du marché chaud.

J'ai rigolé, parce que je peux maintenant voir comment, avec l'expérience, il y aurait toutes sortes de #includes en haut de l'EA, haha, et vous transportez un cache de 1mb de fichiers pour chaque EA.

Vous savez, votre commentaire me fait réfléchir, je viens de faire un déclic. J'ai juste coupé et collé du code entre mes EAs quand je trouve une {section} que j'aime, et je les lie (par exemple, cette {section} qui me posait problème dans cette autre EA). J'avais des problèmes avec cette {section} dans l'autre post que j'ai mentionné auparavant). Je n'avais même pas pensé à en faire un insert de bibliothèque et à y faire référence... Je suis très loin de ce genre de choses... J'étais sur le point de commencer ma première insertion de bibliothèque après cette EA avec celle-là pour voir comment elles fonctionnent.... les possibilités sont tellement cool. C'est assez addictif ce MQL.

Oh oui, tout est sur la bonne voie avec mon code aussi, il fonctionne parfaitement pour son but, je suis revenu pour donner un grand merci :) ..

J'apprécie vraiment votre soutien, j'aimerais pouvoir le décrire avec des mots ;)

 

Vous pouvez avoir vos propres ensembles de fonctions de bibliothèque "de base", que je vous recommande fortement de considérer plus tôt que plus tard.

J'ai aussi commencé avec ma première EA, même chose, copier, coller, copier coller.....

Le tournant s'est produit lorsque j'ai réalisé cette EA pour mon ancien collègue du service militaire, déjà à la retraite. Cela a tout changé, j'ai commencé à utiliser la bibliothèque pour la première fois.

Je garde toujours cette bibliothèque jusqu'à aujourd'hui. Si elle peut vous donner des idées, vous aider à avancer... voici son en-tête, mon pote :

#define PI              3.1415629
#define GOLDEN_RATIO    1.618

#import "command.ex4"
   bool     isInit();
   bool     isFractional(string ins);
   bool     isOrderLimit(int cap);
   bool     isRiskLimit(double risk);
   
   int      ioSession(int h);
   string   ioWkday(datetime d);
   double   ioOrderPriceLvl(string ins, int type, double oPrice);    
   double   ioPriceLvl(string ins,double dPrice);
   bool     ioTrailStop(string ins, int tkt, int type, double oPrice,int lvl, double stop=0);
   int      ioTotalOrd(int magic);
         
   int      opClose(string ins,int ticket,int cmd,double lLot,bool Activate.NO_BREAK_ONE=false);
   int      opOpen(string ins, int cmd, double lLot, double lPrice, double lLoss, double lProfit, string comment,int EA.Id, int lSlip=0, bool Activate.NO_BREAK_ONE=false);
   int      opModify(string ins, int ticket,int cmd,double lPrice,double lLoss,double lProfit,bool Activate.NO_BREAK_ONE=false);   
   double   opStopLvl(string ins,double p);
   double   opNorm(string ins,double price);
   double   opNormL(string ins,double d);   
   double   opPoint(string ins);
   
   double   intelLot(string market, double risk,double stop); 
   double   intelCorrel(string s1,string s2, int f, int type);   
   int      intelPriceMove(string ins, int p, int L);
   int      intelTrend(string ins, int p, int q);   
#import

J'espère que cela vous aidera....

 
diostar:

Vous pouvez avoir vos propres ensembles de fonctions de bibliothèque "de base", que je vous recommande fortement de considérer plus tôt que plus tard.

J'ai aussi commencé avec ma première EA, même chose, copier, coller, copier coller.....

Le moment décisif a été lorsque j'ai fait cette évaluation environnementale pour mon ancien collègue du service militaire, déjà à la retraite. Cela a tout changé, j'ai commencé à utiliser la bibliothèque pour la première fois.

Je garde toujours cette bibliothèque jusqu'à aujourd'hui. Si elle peut te donner des idées, t'aider à avancer... voici son en-tête, mon pote :

J'espère que cela vous aidera....


Salut Diostar, c'est vraiment cool mon pote, merci de partager cette information, je n'avais pas encore lu sur les bibliothèques. Cela semble être un moyen génial de transporter des variables et de les avoir prédéfinies pour plus tard. Je vais y réfléchir. J'aime la façon dont vous avez dit "plus tôt que plus tard", j'aime les conseils comme ça, merci mon pote. Cela me fait penser à l'apprentissage de la guitare, quand 20 ans plus tard je me dis que j'aurais aimé faire telle ou telle chose dès le début, cela aurait rendu les 20 dernières années plus faciles, lol. Je vais sérieusement me pencher sur la question, merci.

Ah, juste quand je pensais que j'étais sur le feu, j'ai un drame, que je ne peux pas penser à résoudre. J'ai du mal à sélectionner les bons ordres dans ces deux sections de jonction :

Je pourrais montrer deux de mes exemples, et montrer les effets, mais mon cerveau ne veut pas cliquer sur celui-ci...

Exemple 1 :

Il parcourt les ordres précédents exactement comme je le veux, mais il les modifie à CHAQUE COUP.

(le drame original avec la sélection de l'ordre Raptor m'a aidé à arrêter les niveaux de conflit, donc le SL slopping autour pour cette raison avant aussi. J'avais l'impression que cette dernière partie était facile à régler, mais cela fait des jours que je suis dessus et que j'essaie d'empêcher que cela se produise à chaque tic).

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)))
            {
                IfGap_SELLLevel_00AlreadyExe = false;
            }
            if (IfGap_SELLLevel_00AlreadyExe == false)
            {
                IfGap_SELLLevel_00AlreadyExe = true;
                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) 
        { 
            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);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Exemple 2 :

Cet exemple n'est pas ce que je veux... J'ai essayé cette option pour l'empêcher de modifier l'envoi à chaque tick... cependant il ne fait pas défiler les ordres, et modifie juste un des bons tickets à chaque tick (il modifie le premier ordre, je suppose le dernier dans le cache des ordres de l'Index).

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()
{
    bool IfGap_SELLLevel_00AlreadyExe = FALSE;
    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;
            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()));
        }
    }
    
}


J'ai encore 50 essais, en essayant d'abord une petite section IF EXECUTED 00 pour la passer à IFGAP si elle n'a pas été exécutée avant... cependant je n'ai pas eu beaucoup de chance en insérant un switch avant hand...... Je pourrais juste poster cet exemple pour montrer cette option....

Exemple 3 :

Avec un interrupteur... il a toujours le même effet que l'exemple 1. Il fait défiler les commandes correctement mais modifie toujours à chaque ticck...

Je peux voir que l'interrupteur continue de recevoir un false à nouveau, donc il passe à nouveau... cependant d'autres tentatives ne le laisseraient pas passer du tout... devrais-je m'en tenir à cette option et essayer de déclarer IfGap_SELLLevel_00AlreadyExe = true ailleurs, si oui où ?

void IfGap_SELLLevel_00AlreadyBlock()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES))
    {
        IfGap_SELLLevel_00AlreadyExe = false;
    }
    if (IfGap_SELLLevel_00AlreadyExe == false)
    {
        IfGap_SELLLevel_00AlreadyExe = true;
        IfGap_SELLLevel_00();  
    }
}


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) 
        { 
            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 ret = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Alors oui j'ai vraiment essayé les gars avant de vous embêter tous encore une fois.... pendant des heures et des heures... Je suis encore perdu...

Toute aide ou indication serait appréciée ;)