Ziehen Sie SL und TP per Drag & Drop in das Prüfgerät. - Seite 13

 
Artyom Trishkin:
Oder Sie können sie mit den Tasten des Tastenfelds kombinieren ;)
Ja, auch eine Option.
 
khorosh:
Das ist also der Punkt, an dem ich falsch liege. Wenn wir sowohl SL als auch TP von der Eröffnungslinie der Order ziehen müssen, können wir das nicht tun, weil es ein Problem gibt, wie man weiß, was man ziehen soll. Wir müssen also die Art der Aktion in einem realen Diagramm in Richtung des Cursors identifizieren, indem wir entweder eine Tastaturtaste verwenden oder eine Schaltfläche erstellen, um die Art der Aktion festzulegen. Die erste Option wird in der echten Karte verwendet und ist meiner Meinung nach die beste.
Strg+Maus - Stopp. Nur Maus - nehmen. Und ziehen Sie sie überall hin, wo Sie sie gerade brauchen.
 
Artyom Trishkin:
Ja, das ist klar. Was ich meine, ist Folgendes: Wenn es keinen Stopp gibt, können wir die Linie des Auftrags selbst ziehen und der Stopp wird dort gesetzt, wohin wir die Linie "ziehen". Dies ist der Fall, wenn wir keine Mitnahmeabwicklung haben. Und wenn wir sowohl Stopps als auch Zehenspitzen verarbeiten, der Auftrag aber weder das eine noch das andere hat, was sollen wir dann einstellen, wenn wir die Auftragslinie ziehen? Mitnehmen oder anhalten?

wenn es kein "Stop and Take" gibt

Beispiel für den Kauf: Wenn Sie nach oben ziehen, dann tippen Sie, wenn Sie nach unten ziehen, dann sl

 
pako:

wenn es kein "Stop and Take" gibt

Beispiel für den Kauf: Wenn Sie nach oben ziehen, dann tippen Sie, wenn Sie nach unten ziehen, dann sl

So funktioniert es im Terminal. Und den Stopp in die Gewinnzone für Buy zu verschieben - das ist es, worüber wir sprechen.
 
Artyom Trishkin:
So ist es auch im Terminal. Und um den Kaufstopp in die Gewinnzone zu bringen - das ist es, worüber wir sprechen.
Das ist es, was ich meine: Machen Sie es wie im Terminal
 
pako:
Ich spreche davon, es dem Terminal gleich zu tun.
Es wurde bereits gesagt, dass man es wie im Terminal machen soll. Jetzt geht es darum, wie man es im Terminal NICHT machen sollte.
 
Artyom Trishkin:
Wie dies im Terminal geschieht, wurde bereits erläutert. Jetzt geht es darum, wie man es im Terminal NICHT machen sollte.
Ich glaube, ich schreibe auf Russisch
 
pako:
Ich glaube, ich schreibe auf Russisch.
Ich antworte in derselben Sprache... ;)
 

Heute Morgen, als ich einen klaren Kopf hatte, fand ich eine Lösung. Außerdem habe ich die zusätzliche Schleife in der Änderungsfunktion entfernt. Ich habe eine Änderungsfunktion für zwei Varianten erstellt:

1) Wenn SL und TP für einen Auftrag nicht festgelegt sind, klicken Sie auf den Auftrag und SL und TP werden bei 50 Punkten angezeigt. Ziehen Sie sie bei Bedarf per Drag & Drop an die gewünschte Stelle. Wenn der Auftrag bereits über SL und TP verfügt, ziehen wir sie dorthin, wo wir wollen.

2) Eine Variante, wie es auf einer echten Karte gemacht wird. Wenn wir SL und TP nicht haben, ziehen wir sie aus der Auftragszeile heraus und verschieben sie dann an die gewünschte Stelle.

Die erste 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);   
        }           
     }  
 }

Die zweite Möglichkeit:

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);   
        }           
     }  
 } 

Wir sollten nicht vergessen, die globalen Variablen OnSL, OnTp und OnOrd zu deklarieren.Fügen Sie außerdem im Expert Advisor, in demder TicketModifyOrder zurückgesetzt wird,das Zurücksetzen dieser Variablen hinzu. Und korrekte Namen einiger Variablen und Namen von Änderungsfunktionen in EA.

Ich warte auf den Beifall des dankbaren Publikums. Wir applaudieren und gehen auseinander, meine Herren).

 

Ich habe auch an eine dritte Möglichkeit gedacht. Dies ist für diejenigen, die nicht gerne SL und TP tragen. Der Algorithmus für die Einstellung von SL und TP ist wie folgt: Klicken Sie einmal auf die Order, wählen Sie sie aus (wir definieren das Ticket) und klicken Sie dann einmal auf den Punkt im Chart, an dem Sie den SL einstellen möchten (normalerweise ist es ein Punkt jenseits des lokalen Preisminimums und -maximums). Gleichzeitig wird der SL auf den gewählten Punkt und der TP auf einen Punkt gesetzt, der Kt-mal weiter vom Orderpreis entfernt ist als der SL vom Orderpreis. Ktp gibt an, wie oft SL größer als SL ist und wird in einer externen Variablen definiert. Beachten Sie, dass TicketModifyOrder und OnOrd jetzt nicht mehr im OnTick()-Körper, sondern in der Funktion selbst zurückgesetzt werden. Das Zurücksetzen dieser Variablen im OnTick()-Körper sollte entfernt werden. Man könnte auch die Möglichkeit schaffen, SL und TP in dieser Variante zu ziehen, aber ich bin zu faul, darüber nachzudenken. Sie können bei Bedarf einfach zu 1 Variante wechseln. Und Schalter in Form einer Taste.

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;
           }   
        }           
     }  
 }