Trascinate SL e TP nel tester. - pagina 13

 
Artyom Trishkin:
Oppure puoi combinarlo con i pulsanti della tastiera ;)
Sì, anche un'opzione.
 
khorosh:
Quindi è qui che mi sbaglio. Nel caso in cui abbiamo bisogno di tirare sia SL che TP dalla linea di apertura dell'ordine, non possiamo farlo, perché c'è un problema di come sapere cosa tirare. Quindi abbiamo bisogno di identificare il tipo di azione su un grafico reale come nella direzione del cursore, utilizzando un tasto della tastiera o creando un pulsante per impostare il tipo di azione. La prima opzione è usata sul grafico reale ed è la migliore secondo me.
Ctrl+mouse - stop. Solo mouse - prendere. E trascinate ovunque abbiate bisogno in una volta sola.
 
Artyom Trishkin:
Sì, è chiaro. Quello che voglio dire è questo: se non c'è uno stop, possiamo tirare la linea dell'ordine stesso e lo stop sarà impostato dove "tiriamo" la linea. Questo è il caso in cui non abbiamo un trattamento da asporto. E se abbiamo l'elaborazione di entrambi gli stop e le punte, ma l'ordine non ha nessuno dei due, allora se disegniamo la linea dell'ordine, cosa dovremmo impostare? Una presa o una fermata?

se non c'è uno stop and take

Per esempio per comprare: se si tira su, poi toccare, se si tira giù, poi sl

 
pako:

se non c'è uno stop and take

Per esempio per comprare: se si tira su, poi toccare, se si tira giù, poi sl

Ecco come funziona nel terminale. E per spostare lo stop nella zona di profitto per Buy - questo è ciò di cui stiamo discutendo.
 
Artyom Trishkin:
Questo è il modo in cui è nel terminale. E per far sì che il Buy stop si muova verso la zona di profitto - questo è ciò di cui stiamo discutendo.
È quello che sto dicendo: fare come nel terminale
 
pako:
Sto parlando di renderlo come il terminale.
Si è già detto di farlo come nel terminale. Ora si tratta di come NON farlo nel terminale.
 
Artyom Trishkin:
Il modo in cui si fa nel terminale è già stato spiegato. Ora si tratta di come NON farlo nel terminale.
Credo di scrivere in russo
 
pako:
Credo di scrivere in russo.
Sto rispondendo nella stessa lingua... ;)
 

Questa mattina, a mente lucida, ho trovato una soluzione. Inoltre, ho eliminato il ciclo extra nella funzione di modifica. Ho fatto una funzione di modifica per due varianti:

1) Se SL e TP non sono impostati per un ordine, clicca sull'ordine e SL e TP appariranno a 50 punti. Se necessario, trascinateli dove serve. Se l'ordine ha già SL e TP, li trasciniamo dove vogliamo.

2) Una variante di come si fa su un grafico reale. Se non abbiamo SL e TP, li trasciniamo fuori dalla linea d'ordine, e poi li spostiamo dove vogliamo.

La prima 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 seconda opzione:

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

Non dobbiamo dimenticare di dichiarare le variabili globali OnSL, OnTp e OnOrd. E inoltre, nell'Expert Advisor dove ilTicketModifyOrder viene resettato,aggiungete il reset di queste variabili. E i nomi corretti di alcune variabili e il nome della funzione di modifica in EA.

Aspetto gli applausi del pubblico riconoscente. Applaudiamo e disperdiamo signori).

 

Ho anche pensato a una terza opzione. Questo è per coloro che non amano portare SL e TP. L'algoritmo per impostare lo SL e il TP è il seguente: bisogna anche cliccare una volta sull'ordine, quindi selezionarlo (si definisce il ticket) e poi cliccare una volta nel punto del grafico in cui si vuole impostare lo SL (di solito è un punto oltre il minimo e il massimo del prezzo locale). Allo stesso tempo, lo SL sarà impostato sul punto scelto e il TP sarà impostato su un punto situato a una distanza dal prezzo dell'ordine che è Kt volte maggiore della distanza di SL dal prezzo dell'ordine. Ktp è quante volte SL è maggiore di SL ed è definito in una variabile esterna. Si noti che TicketModifyOrder e OnOrd sono ora ripristinati non nel corpo di OnTick() ma nella funzione stessa. La reimpostazione di queste variabili nel corpo di OnTick() dovrebbe essere rimossa. Si potrebbe anche rendere possibile trascinare SL e TP in questa variante, ma sono troppo pigro per pensarci. Puoi semplicemente passare a 1 variante, se hai bisogno. E l'interruttore sotto forma di pulsante.

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