SL ve TP'yi test cihazına sürükleyip bırakın. - sayfa 13

 
Artyom Trishkin :
Ve klavye butonları ile birleştirebilirsiniz ;)
Evet, ayrıca bir seçenek.
 
khorosh :
Yani burada yanılıyorum. Hem SL hem de TP'yi sipariş açılış satırından çekmeniz gerekiyorsa, bu artık çalışmayacaktır, çünkü neyin sürükleneceğini nasıl bulacağınız sorunu ortaya çıkar. Bu nedenle, gerçek bir grafikte imleç hareketi yönünde eylem türünü belirlemek veya klavye tuşuna basmak veya eylem türünü ayarlayan bir düğme oluşturmak gerekir. İlk seçenek gerçek bir grafikte kullanılıyor ve bence en iyisi.
Ctrl+fare - durdur. Sadece bir fare - al. Ve gitmen gereken yere götür.
 
Artyom Trishkin :
Evet, bu anlaşılabilir. Anlatılmak istenen şudur: emrin bir durağı yoksa, o zaman emrin satırını sürükleyebilirsiniz ve stop, satırı "sürüklediğimiz" yere yerleştirilir. Bu, alma işlemi olmaması durumunda geçerlidir. Ve hem stop hem de alma işlemi varsa, ancak siparişin ne biri ne de diğeri yoksa, o zaman sipariş satırını sürüklerseniz, o zaman ne ayarlanmalıdır? Al veya dur?

dur kalk yoksa

örneğin satın almak için: yukarı sürüklerseniz tp, aşağı ise sl

 
pako :

dur kalk yoksa

örneğin satın almak için: yukarı sürüklerseniz tp, aşağı ise sl

Yani terminalde. Ve stop'u Buy için kâr bölgesine taşımak için bu tartışılıyor.
 
Artyom Trishkin :
Yani terminalde. Ve stop'u Buy için kâr bölgesine taşımak için bu tartışılıyor.
terminaldeki gibi yap derim
 
pako :
terminaldeki gibi yap derim
Terminalde nasıl yapıldığı zaten söylendi. Şimdi burada terminalde nasıl YAPILMAYACAK yazıyor.
 
Artyom Trishkin :
Terminalde nasıl yapıldığı zaten söylendi. Şimdi burada terminalde nasıl SEVMEYECEĞİM yazıyor.
Rusça yazıyor gibiyim
 
pako :
Rusça yazıyor gibiyim
Yani aynı dilde cevap veriyorum ...;)
 

Bu sabah, taze bir zihinle bir çözüm buldum. Ayrıca modifikasyon fonksiyonunda fazladan bir döngüden kurtulmuş oldum. İki seçenek için bir değişiklik işlevi yaptı:

1) Siparişte SL ve TP seti yoksa siparişe tıklayın - SL ve TP 50 p mesafede açılır. Gerekirse, onları gerekli yerlere sürükleriz. Siparişte zaten SL ve TP varsa, bunları istediğimiz yere sürükleyin.

2) Gerçek bir çizelgede nasıl yapıldığının bir çeşidi. Eğer SL ve TP yoksa onları da sipariş satırından çekiyoruz ve ardından istediğimiz yere hareket ediyoruz.

İlk seçenek:

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

İkinci seçenek:

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

Bu durumda OnSL, OnTp ve OnOrd global değişkenlerini tanımlamayı unutmamalısınız. Ayrıca TicketModifyOrder'ın sıfırlandığı Expert Advisor'da bu değişkenlerin sıfırlamasını ekleyin. Pekala, Expert Advisor'da bazı değişkenlerin adlarını ve değişiklik işlevinin adını düzeltin.

Minnettar bir seyirciden alkış bekliyorum. Alkışlayalım ve dağılalım beyler.)

 

3. bir seçenekle geldim. SL ve TP taşımayı sevmeyenler için. SL ve TP'yi ayarlamak için algoritma aşağıdaki gibidir: siparişe bir kez tıklayın, böylece onu seçin (bir bilet tanımlayın), ardından grafikte SL'yi yerleştirmek istediğimiz noktaya bir kez tıklayın (genellikle bunlar yerel fiyat minimumlarının gerisindeki noktalardır) ve maksimum). Bu durumda, SL seçilen noktada kurulacak ve TP, emir fiyatından Ktr çarpı SL'nin emir fiyatından uzaklığından daha büyük bir mesafede bulunan bir noktada ayarlanacaktır. Ktr - bu, harici bir değişkende ayarlanan TP'nin SL'den kaç kez daha büyük olduğudur. TicketModifyOrder ve OnOrd'un artık OnTick() gövdesinde değil, işlevin kendisinde sıfırlandığını unutmayın. OnTick() gövdesinde bu değişkenlerin sıfırlanması kaldırılmalıdır. Bu sürümde SL ve TP'yi sürükleyip bırakmayı mümkün kılmak mümkün olabilir, ancak düşünmek için çok tembelim. Gerekirse sadece 1. seçeneğe geçebilirsiniz. Düğme şeklinde bir anahtar.

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