Arrastre y suelte SL y TP en el probador. - página 13

 
Artyom Trishkin:
O puedes combinarlo con los botones del teclado ;)
Sí, también es una opción.
 
khorosh:
Así que aquí es donde me equivoco. En caso de que necesitemos sacar tanto el SL como el TP de la línea de apertura de la orden, no podemos hacerlo, porque hay un problema de cómo saber qué sacar. Así que tenemos que identificar el tipo de acción en un gráfico real como en la dirección del cursor, ya sea usando una tecla del teclado o creando un botón para establecer el tipo de acción. La primera opción se utiliza en la carta real y es la mejor en mi opinión.
Ctrl+ratón - parar. Sólo ratón - toma. Y arrastra donde necesites de una vez.
 
Artyom Trishkin:
Sí, está claro. Lo que quiero decir es lo siguiente: si no hay stop, podemos tirar de la línea de la propia orden y el stop se fijará donde "tiramos" de la línea. Este es el caso si no tenemos el procesamiento de la comida para llevar. Y si tenemos tratamiento tanto de los stops como de los toes, pero la orden no tiene ninguno de los dos, entonces si dibujamos la línea de la orden, ¿qué debemos poner? ¿Una toma o una parada?

si no hay una parada y toma

Por ejemplo, para comprar: si tira hacia arriba, entonces toca, si tira hacia abajo, entonces sl

 
pako:

si no hay una parada y toma

Por ejemplo, para comprar: si tira hacia arriba, entonces toca, si tira hacia abajo, entonces sl

Así es como funciona en el terminal. Y para mover el stop a la zona de beneficios para la compra - eso es lo que estamos discutiendo.
 
Artyom Trishkin:
Así es en el terminal. Y hacer que el stop de compra se mueva a la zona de beneficios, eso es lo que estamos discutiendo.
Eso es lo que digo: que sea como en el terminal
 
pako:
Hablo de hacerlo como el terminal.
Ya se ha dicho de hacerlo como en el terminal. Ahora se trata de cómo NO hacerlo en el terminal.
 
Artyom Trishkin:
Ya se ha explicado cómo se hace en el terminal. Ahora se trata de cómo NO hacerlo en el terminal.
Parece que estoy escribiendo en ruso
 
pako:
Creo que escribo en ruso.
Estoy respondiendo en el mismo idioma... ;)
 

Esta mañana, con la cabeza despejada, he encontrado una solución. Además, me deshice del bucle extra en la función de modificación. He realizado una función de modificación para dos variantes:

1) Si el SL y el TP no están establecidos para una orden, haga clic en la orden y el SL y el TP aparecerán en 50 puntos. Si es necesario, arrástrelos y suéltelos donde sea necesario. Si la orden ya tiene SL y TP, los arrastramos donde queramos.

2) Una variante de cómo se hace en un gráfico real. Si no tenemos SL y TP, los arrastramos fuera de la línea de orden, y luego los movemos donde queramos.

La primera 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 segunda opción:

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

No debemos olvidar declarar las variables globales OnSL, OnTp y OnOrd. Y también, en el Asesor Experto donde se restableceel TicketModifyOrder, añadir el restablecimiento de estas variables. Y corregir los nombres de algunas variables y el nombre de la función de modificación en EA.

Espero los aplausos del público agradecido. Aplaudamos y dispersémonos señores).

 

También he pensado en una tercera opción. Esto es para los que no les gusta llevar SL y TP. El algoritmo para establecer el SL y el TP es el siguiente: también debe hacer clic una vez en la orden, para así seleccionarla (definimos la entrada) y luego hacer clic una vez en el punto del gráfico donde desea establecer el SL (normalmente es un punto más allá del mínimo y el máximo del precio local). Al mismo tiempo, el SL se fijará en el punto elegido y el TP se fijará en un punto situado a una distancia del precio de la orden que sea Kt veces mayor que la distancia del SL al precio de la orden. Ktp es el número de veces que SL es mayor que SL y se define en una variable externa. Tenga en cuenta que TicketModifyOrder y OnOrd ahora se restablecen no en el cuerpo de OnTick() sino en la propia función. El restablecimiento de estas variables en el cuerpo de OnTick() debe ser eliminado. También sería posible en esta variante hacer que se pueda arrastrar y soltar SL y TP, pero me da pereza pensar en ello. Puede cambiar a una variante, si lo necesita. Y cambiar en forma de botón.

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