Arraste e solte SL e TP no testador. - página 13

 
Artyom Trishkin:
Ou você pode combiná-lo com os botões do teclado ;)
Sim, também uma opção.
 
khorosh:
Então é aqui que estou errado. No caso de precisarmos puxar tanto SL como TP da linha de abertura do pedido, não podemos fazer isso, porque há um problema de como saber o que puxar. Portanto, precisamos identificar o tipo de ação em um gráfico real como na direção do cursor, seja usando uma tecla de teclado ou criando um botão para definir o tipo de ação. A primeira opção é usada no gráfico real e é a melhor, na minha opinião.
Ctrl+mouse - parada. Apenas o mouse - pegar. E arraste para onde você precisar ao mesmo tempo.
 
Artyom Trishkin:
Sim, é claro. O que quero dizer é o seguinte: se não houver parada, podemos puxar a linha da ordem em si e a parada será definida para onde "puxaremos" a linha. Este é o caso se não tivermos processamento de take-out. E se tivermos processamento de ambas as paradas e dedos dos pés, mas a ordem não tem nenhuma, então se traçarmos a linha de ordem, o que devemos estabelecer? Uma tomada ou uma parada?

se não houver parada e tomar

Por exemplo, para comprar: se você puxar para cima, então toque, se você puxar para baixo, então sl

 
pako:

se não houver parada e tomar

Por exemplo, para comprar: se você puxar para cima, então toque, se você puxar para baixo, então sl

É assim que funciona no terminal. E para mudar a parada para a zona de lucro para Comprar - é isso que estamos discutindo.
 
Artyom Trishkin:
É assim que é no terminal. E para fazer com que a Buy stop se mude para a zona de lucro - é isso que estamos discutindo.
É isso que eu estou dizendo: faça como no terminal
 
pako:
Estou falando em torná-lo como o terminal.
Já foi dito sobre fazer isso como no terminal. Agora se trata de como NÃO fazer isso no terminal.
 
Artyom Trishkin:
A maneira como isso é feito no terminal já foi explicada. Agora se trata de como NÃO fazer isso no terminal.
Acho que estou escrevendo em russo
 
pako:
Acho que escrevo em russo.
Estou respondendo na mesma língua... ;)
 

Esta manhã, com a cabeça limpa, encontrei uma solução. Além disso, eu me livrei do laço extra na função de modificação. Eu fiz uma função de modificação para duas variantes:

1) Se SL e TP não estiverem configurados para um pedido, clique no pedido e SL e TP aparecerão em 50 pontos. Se necessário, arraste-os e solte-os onde for necessário. Se o pedido já tem SL e TP, nós os arrastamos para onde quisermos.

2) Uma variante de como isso é feito em um gráfico real. Se não tivermos SL e TP, arrastá-los para fora da linha de pedido, e depois movê-los para onde quisermos.

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

A segunda opção:

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

Não devemos esquecer de declarar as variáveis globais OnSL, OnTp e OnOrd. E também, no Expert Advisor ondea TicketModifyOrder é reinicializada,acrescente a reinicialização destas variáveis. E nomes corretos de algumas variáveis e nome da função de modificação na EA.

Aguardo os aplausos do público agradecido. Vamos aplaudir e dispersar senhores).

 

Também pensei em uma terceira opção. Isto é para aqueles que não gostam de transportar SL e TP. O algoritmo para definir o SL e TP é o seguinte: você deve clicar uma vez no pedido, assim selecioná-lo (definimos o ticket) e depois clicar uma vez no ponto do gráfico onde você quer definir o SL (geralmente é um ponto além do preço mínimo e máximo local). Ao mesmo tempo, o SL será definido no ponto escolhido e o TP será definido em um ponto localizado a uma distância do preço do pedido que é Kt vezes maior do que a distância do SL do preço do pedido. Ktp é quantas vezes SL é maior que SL e é definido em uma variável externa. Note que TicketModifyOrder e OnOrd são agora redefinidos não no corpo OnTick(), mas na própria função. A reinicialização destas variáveis no corpo do OnTick() deve ser removida. Também é possível arrastar SL e TP nesta variante, mas eu sou preguiçoso demais para pensar nisso. Você pode simplesmente mudar para 1 variante, se precisar. E troque na forma de um botão.

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