Перетаскивание SL и TP в тестере. - страница 13

 
Artyom Trishkin:
А можно совместить с кнопками клавиатуры ;)
Да, тоже вариант.
 
khorosh:
Значит здесь я не прав. В случае, если нужно вытаскивать из линии открытия ордера и SL и TP так уже не получится, так как возникает проблема как узнать, что тащить. Поэтому нужно как на реальном графике идентифицировать тип действия по направлению движения курсора, либо использовать нажатие клавиши клавиатуры, либо создать кнопку, которой задавать тип действия. Первый вариант используется на реальном графике и он на мой взгляд лучший.
Ctrl+мышь - стоп. Просто мышь - тейк. И таскай куда нужно сразу.
 
Artyom Trishkin:
Да это понятно. Имеется в виду вот что: если у ордера нет стопа, то можно потащить линию самого ордера, и стоп будет выставлен туда, куда "притащим" линию. Это в случае, если нет обработки тейка. А если есть обработка и стопов, и тейков, но у ордера нет ни того, ни другого, то если потянуть линию ордера, то что устанавливать? Тейк или стоп?

если нет стопа и тейка

например для buy :  если тащиш вверх то тп, если вниз то сл 

 
pako:

если нет стопа и тейка

например для buy :  если тащиш вверх то тп, если вниз то сл 

Так в терминале. А чтобы сделать для Buy перенос стопа в профитную зону - это и обсуждается.
 
Artyom Trishkin:
Так в терминале. А чтобы сделать для Buy перенос стопа в профитную зону - это и обсуждается.
Я и говорю сделать как в терминале
 
pako:
Я и говорю сделать как в терминале
О том, как сделано в терминале уже говорилось. Теперь говорится тут о том, как сделать НЕ как в терминале.
 
Artyom Trishkin:
О том, как сделано в терминале уже говорилось. Теперь говорится тут о том, как сделать НЕ как в терминале.
Я вроде по русски пишу
 
pako:
Я вроде по русски пишу
Так и отвечаю вродь на том же языке... ;)
 

Сегодня утром на свежую голову нашёл решение. К тому же в функции модификации избавился от лишнего цикла. Сделал функцию модификации для двух вариантов:

1) Если у ордера не установлены SL и TP, щёлкаем по ордеру - на расстоянии 50 п выскакивают  SL и TP. Если надо, перетаскиваем их куда надо. Если у ордера уже есть SL и TP перетаскиваем их куда захотим.

2) Вариант как это сделано на реальном графике. Если нет  SL и TP вытаскиваем их из линии ордера, а потом двигаем куда хотим.

Первый вариант:

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

 Второй вариант:

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

 При этом нужно не забыть объявить глобальные переменные OnSL, OnTp и OnOrd. А также в советнике, где делается сброс TicketModifyOrder добавить сброс этих переменных. Ну и скорректировать имена некоторых переменных и имя функции модификации в эксперте. 

Жду аплодисментов от благодарной публики.  Поаплодируем и разойдёмся господа.)

 

Придумал ещё 3-й вариант. Это для тех кто не любит таскать SL  и  TP. Алгоритм установки  SL  и  TP  такой: однократно щёлкаем по ордеру, тем самым выбирая его(определяем тикет), далее однократно щёлкаем в точке графика, куда хотим поставить SL(обычно это точки за локальными минимумами и максимумами цены). При этом SL будет установлен в выбранной точке, а TP будет установлен в точке расположенной на расстоянии от цены ордера большем в Ктр раз, чем расстояние SL от цены ордера . Ктр - это во сколько раз ТР больше SL, задаём во внешней переменной. Обратите внимание, что TicketModifyOrder и OnOrd теперь сбрасываются не в теле OnTick(), а в самой функции. Сброс этих переменных в теле OnTick() нужно убрать. Можно бы было ещё в этом варианте сделать возможность перетаскивания SL и ТР, но мне уже лень думать. Можно просто переключать на 1 вариант, если надо. А переключатель в виде кнопки.

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