Faites glisser et déposez SL et TP dans le testeur. - page 13

 
Artyom Trishkin:
Ou vous pouvez le combiner avec les boutons du clavier ;)
Oui, c'est aussi une option.
 
khorosh:
C'est donc là que je me trompe. Dans le cas où nous devons tirer à la fois le SL et le TP de la ligne d'ouverture de l'ordre, nous ne pouvons pas le faire, car il y a un problème pour savoir ce qu'il faut tirer. Nous devons donc identifier le type d'action sur un graphique réel dans la direction du curseur, soit en utilisant une touche du clavier, soit en créant un bouton pour définir le type d'action. La première option est utilisée sur le graphique réel et est la meilleure à mon avis.
Ctrl+souris - arrêt. Il suffit d'utiliser la souris pour prendre. Et faites glisser tout ce dont vous avez besoin en une seule fois.
 
Artyom Trishkin:
Oui, c'est clair. Ce que je veux dire, c'est que s'il n'y a pas de stop, nous pouvons tirer la ligne de l'ordre lui-même et le stop sera fixé là où nous "tirons" la ligne. C'est le cas si nous n'avons pas de traitement à emporter. Et si nous avons le traitement à la fois des stops et des toes, mais que l'ordre n'en a aucun, alors si nous traçons la ligne de l'ordre, que devons-nous fixer ? Une prise ou un arrêt ?

s'il n'y a pas d'arrêt et de prise

Par exemple pour l'achat : si vous tirez vers le haut, alors tapez, si vous tirez vers le bas, alors sl

 
pako:

s'il n'y a pas d'arrêt et de prise

Par exemple pour l'achat : si vous tirez vers le haut, alors tapez, si vous tirez vers le bas, alors sl.

C'est ainsi que cela fonctionne dans le terminal. Et pour déplacer le stop vers la zone de profit pour l'achat - c'est ce dont nous discutons.
 
Artyom Trishkin:
C'est ainsi que cela se passe dans le terminal. Et faire en sorte que le Buy stop se déplace vers la zone de profit - c'est ce dont nous discutons.
C'est ce que je dis : faites-le comme dans le terminal.
 
pako:
Je parle de le rendre comme le terminal.
Il a déjà été dit qu'il fallait faire comme dans le terminal. Maintenant, il s'agit de savoir comment NE PAS le faire dans le terminal.
 
Artyom Trishkin:
La manière dont cela se passe dans le terminal a déjà été expliquée. Maintenant, il s'agit de savoir comment NE PAS le faire dans le terminal.
Je pense que j'écris en russe
 
pako:
Je pense que j'écris en russe.
Je réponds dans la même langue... ;)
 

Ce matin, à tête reposée, j'ai trouvé une solution. En outre, je me suis débarrassé de la boucle supplémentaire dans la fonction de modification. J'ai réalisé une fonction de modification pour deux variantes :

1) Si le SL et le TP ne sont pas définis pour un ordre, cliquez sur l'ordre et le SL et le TP apparaîtront à 50 points. Si nécessaire, faites-les glisser et déposez-les aux endroits voulus. Si l'ordre a déjà un SL et un TP, nous les faisons glisser où nous voulons.

2) Une variante de la façon dont cela se fait sur une carte réelle. Si nous n'avons pas de SL et de TP, nous les faisons glisser hors de la ligne d'ordre, puis nous les déplaçons où nous voulons.

La première variante :

void ModifySlTp(double priceModify=0)
 {
  double sl=0,tp=0;
  if(TicketModifyOrder==0)
    {  
     for(int i=0; i<OrdersTotal(); i++) 
      { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         { 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
            {
             if(MathAbs(OrderStopLoss()-priceModify)<30*Point())   {OnSL=true;}
             if(MathAbs(OrderTakeProfit()-priceModify)<30*Point()) {OnTP=true;}
             if(MathAbs(OrderOpenPrice()-priceModify)<30*Point())  {OnOrd=true;} 
               { 
                if(OnSL || OnTP || OnOrd)
                  {
                   TicketModifyOrder=OrderTicket(); break;
                  }
               }
            }
         }  
      }
    }
   if(TicketModifyOrder>0)
     {
      if(OrderSelect(TicketModifyOrder, SELECT_BY_TICKET))
        {
         bool typOrdBuy = OrderType()==OP_BUY  || OrderType()==OP_BUYSTOP  || OrderType()==OP_BUYLIMIT;
         bool typOrdSell= OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT;
         if(OnOrd)
           {
            if(typOrdBuy)
              {
               sl = NormalizeDouble(OrderOpenPrice()-500*Point(),Digits);
               tp = NormalizeDouble(OrderOpenPrice()+500*Point(),Digits);
              }
            if(typOrdSell)
              {
               sl = NormalizeDouble(OrderOpenPrice()+500*Point(),Digits);
               tp = NormalizeDouble(OrderOpenPrice()-500*Point(),Digits);
              }
           }
         if(OnSL) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();}
         if(OnTP) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}   
                                           
          ModifyOrder1(-1, sl, tp, 0);   
        }           
     }  
 }

La deuxième option :

void ModifySlTp(double priceModify=0)
 {
  double sl=0,tp=0;
  if(TicketModifyOrder==0)
    {  
     for(int i=0; i<OrdersTotal(); i++) 
      { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         { 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
            {
             if(MathAbs(OrderStopLoss()-priceModify)<50*Point())   {OnSL=true;}
             if(MathAbs(OrderTakeProfit()-priceModify)<50*Point()) {OnTP=true;}
             if(MathAbs(OrderOpenPrice()-priceModify)<50*Point())  {OnOrd=true;} 
               { 
                if(OnSL || OnTP || OnOrd)
                  {
                   TicketModifyOrder=OrderTicket(); break;
                  }
               }
            }
         }  
      }
    }
   if(TicketModifyOrder>0)
     {
      if(OrderSelect(TicketModifyOrder, SELECT_BY_TICKET))
        {
         bool typOrdBuy = OrderType()==OP_BUY  || OrderType()==OP_BUYSTOP  || OrderType()==OP_BUYLIMIT;
         bool typOrdSell= OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT;
         if(OnOrd)
           {
            if(typOrdBuy)
              {
               if(priceModify>OrderOpenPrice()) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}
               if(priceModify<OrderOpenPrice()) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();} 
              }
            if(typOrdSell)
              {
               if(priceModify<OrderOpenPrice()) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}
               if(priceModify>OrderOpenPrice()) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();} 
              }
           }
         if(OnSL) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();}
         if(OnTP) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}   
                                           
          ModifyOrder1(-1, sl, tp, 0);   
        }           
     }  
 } 

Nous ne devons pas oublier de déclarer les variables globales OnSL, OnTp et OnOrd. Et aussi, dans l'Expert Advisor où leTicketModifyOrder est réinitialisé,ajoutez la réinitialisation de ces variables. Et les noms corrects de certaines variables et le nom de la fonction de modification dans l'EA.

J'attends les applaudissements du public reconnaissant. Applaudissons et dispersons-nous messieurs).

 

J'ai aussi pensé à une troisième option. C'est pour ceux qui n'aiment pas porter SL et TP. L'algorithme pour fixer le SL et le TP est le suivant : vous devez cliquer une fois sur l'ordre, le sélectionner ainsi (nous définissons le ticket) et ensuite cliquer une fois sur le point du graphique où vous voulez fixer le SL (généralement c'est un point au-delà du minimum et du maximum du prix local). Dans le même temps, le SL sera fixé au point choisi et le TP sera fixé à un point situé à une distance du prix de l'ordre qui est Kt fois plus grande que la distance du SL au prix de l'ordre. Ktp est le nombre de fois où SL est supérieur à SL et est défini dans une variable externe. Notez que TicketModifyOrder et OnOrd sont maintenant réinitialisés non pas dans le corps de OnTick() mais dans la fonction elle-même. La réinitialisation de ces variables dans le corps de OnTick() doit être supprimée. Vous pourriez également permettre de faire glisser SL et TP dans cette variante, mais je suis trop paresseux pour y penser. Vous pouvez simplement passer à une seule variante, si vous en avez besoin. Et l'interrupteur sous forme de bouton.

void ModifySlTp2(double priceModify=0)
 {
  double sl=0,tp=0;  
  for(int i=0; i<OrdersTotal(); i++) 
     { 
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
        { 
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
           {
            OnOrd=false;
            if(MathAbs(OrderOpenPrice()-priceModify)<30*Point()) {OnOrd=true;}    
            if(OnOrd)
              {
               TicketModifyOrder=OrderTicket();
               return;
              }
           }
        }  
     }  
   if(TicketModifyOrder>0)
     {
      if(OrderSelect(TicketModifyOrder, SELECT_BY_TICKET))
        {
         bool typOrdBuy = OrderType()==OP_BUY  || OrderType()==OP_BUYSTOP  || OrderType()==OP_BUYLIMIT;
         bool typOrdSell= OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT;
         if(!OnOrd)
           {
            if(typOrdBuy)
              {
               sl = NormalizeDouble(priceModify,Digits);
               tp = NormalizeDouble(OrderOpenPrice()+Ktp*(OrderOpenPrice()-sl),Digits);
              }
            if(typOrdSell)
              {
               sl = NormalizeDouble(priceModify,Digits);
               tp = NormalizeDouble(OrderOpenPrice()-Ktp*(sl-OrderOpenPrice()),Digits);
              }                                               
            ModifyOrder1(-1, sl, tp, 0);
            TicketModifyOrder = 0;
           }   
        }           
     }  
 }
Raison: