Trailingstop EA çalışmayacak

 

Herkese selam. EA'mın düzgün çalışmasını sağlayamıyorum. Aynı anda 10 farklı çift/grafik üzerinde çalıştırıyorum. İki sorun var gibi görünüyor:

1. Çoğu zaman Trailingstop'u tetiklemez. Bazen işe yarıyor ama. Sorunun OrderSelect'imde olduğunu düşünüyorum, ancak çözemiyorum.

2. Bazen bana Hata 130 veriyor, ancak SL/TP'min nasıl geçersiz olabileceğini göremiyorum. Yazdırdığım tüm değerler, tüm çiftler için durma seviyesinin üzerinde. Ve 130 hatası almama rağmen, aslında bazen hiçbir şey yanlış değilmiş gibi sırayı değiştiriyor.

İşte tüm EA. Lütfen bir göz atıp sorunun ne olabileceğini bana bildirir misiniz?

 #property strict ;
extern string Label_TrailingStart= "Pip threshold to activate TrailingStop" ;
extern int TrailingStart= 11 ;
extern string Label_TrailingStop= "Pips trailing behind" ;
extern int TrailingStop= 5 ;
double stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
int TS=TrailingStart-TrailingStop- 1 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if (TS<stoplevel){
       MessageBox ( "Please note: Your inputs for TrailingStart and/or TrailingStop cannot" +
                 "\nbe less than the minimum levels required by your broker and the" +
                 "\nTrailingStart has been increased automatically to " + StringConcatenate (stoplevel+TrailingStop+ 1 )+ " Pips" );
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip= Point * 10 ;
   if (TS<stoplevel) TrailingStart=( int )stoplevel+TrailingStop+ 1 ;
   
   Print ( "stoplevel = " ,stoplevel);
   Print ( "TrailingStart = " ,TrailingStart);
   Print ( "TrailingStop = " ,TrailingStop);
   Print ( "TS = " ,TS);
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
       if ( OrderSelect (i,SELECT_BY_POS)){
         if (OrderSymbol()!= Symbol ()) continue ;{
             if (OrderType()==OP_BUY){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if (Bid-OrderOpenPrice()>TrailingStart*Pip){
                     if (OrderStopLoss()<Bid-TrailingStop*Pip){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Pip,OrderTakeProfit(),Blue))
                         Print ( "Buy = " , GetLastError ());
                         Print ( "Bid = " ,Bid);
                         Print ( "Bid-TrailingStop*Pip = " ,Bid-TrailingStop*Pip);
                         Print ( "TrailingStart*Pip = " ,TrailingStart*Pip);
                        }     
                    }  
                }     
            }  
             if (OrderType()==OP_SELL){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if (OrderOpenPrice()-Ask>TrailingStart*Pip){
                     if (OrderStopLoss()>Ask+TrailingStop*Pip){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Pip,OrderTakeProfit(),Red))
                         Print ( "Sell = " , GetLastError ());
                         Print ( "Ask = " ,Ask);
                         Print ( "Ask+TrailingStop*Pip = " ,Ask+TrailingStop*Pip);
                         Print ( "TrailingStart*Pip = " ,TrailingStart*Pip);
                        }
                    }
                }  
            }
         }
      }   
   return ( 0 );
}
//+------------------------------------------------------------------+
 
  1. Eksik parantez nedeniyle birkaç hatalı hizalanmış kod bloğunuz var. Dengeli olmalarına rağmen, "for"un başında ve "if" bloklarından birkaçında olduğu gibi, bunlar eksiktir.
  2. " if(OrderSymbol()!=Symbol()) Continue;{ " satırı çok şüpheli ve kod akışının nasıl olması gerektiğini görmeyi zorlaştırıyor. Sadece " if(OrderSymbol()==_Symbol) { " yapın. " Symbol() " yerine " _Symbol " kullanabilirsiniz.
  3. " Sor " veya " Teklif " değil " OrderClosePrice() " kullanın.
  4. Okumayı kolaylaştırmak ve işlerin sırasını garanti etmek için karşılaştırma yaparken parantez ekleyin. Örneğin, " if(Bid-OrderOpenPrice()>TrailingStart*Pip) " yerine " if( ( OrderClosePrice() - OrderOpenPrice() ) > ( TrailingStart * Pip ) ) " kullanın
  5. Hem Al hem de Sat kod bloklarını, her ikisini de işleyen tek bir kod bloğunda birleştirmeyi deneyin. Bu, gelecekte daha az kod hata ayıklamasını ve okunmasını ve değiştirilmesini kolaylaştıracaktır.

not! Dikkat! Ayrıca Siparişler için bir Sihirli Numara kullanın!

not! Ayrıca 130 hataya neden olabilecek kaymayı da hesaba katmayı unutmayın. Minimum StopLevel tek başına yeterli değildir. Mevcut yayılmanın bir faktörünü eklemek gibi olası kaymaları hesaba katmak için biraz daha büyük yapın. Ayrıca Broker tarafından yerinde bir FreezeLevel olabilir!

 
FMIC :
  1. Eksik parantez nedeniyle birkaç hatalı hizalanmış kod bloğunuz var. Dengeli olmalarına rağmen, "for"un başında ve "if" bloklarından birkaçında olduğu gibi eksiktirler.
  2. " if(OrderSymbol()!=Symbol()) Continue;{ " satırı çok şüpheli ve kod akışının nasıl olması gerektiğini görmeyi zorlaştırıyor.
    Sadece " if(OrderSymbol()==_Symbol) { " yapın. " Symbol() " yerine " _Symbol " kullanabilirsiniz.
  3. " Sor " veya " Teklif " değil " OrderClosePrice() " kullanın.
  4. Okumayı kolaylaştırmak ve işlerin sırasını garanti etmek için karşılaştırma yaparken parantez ekleyin:
    Örneğin, " if(Bid-OrderOpenPrice()>TrailingStart*Pip) " yerine " if( ( OrderClosePrice() - OrderOpenPrice() ) > ( TrailingStart * Pip ) ) " kullanın
  5. Hem Al hem de Sat kod bloklarını, her ikisini de işleyen tek bir kod bloğunda birleştirmeyi deneyin. Bu, gelecekte daha az kod hata ayıklamasını ve okunmasını ve değiştirilmesini kolaylaştıracaktır.

not! Dikkat! Ayrıca Siparişler için bir Sihirli Numara kullanın!

not! Ayrıca 130 hataya neden olabilecek kaymayı da hesaba katmayı unutmayın. Minimum StopLevel tek başına yeterli değildir. Mevcut yayılmanın bir faktörünü eklemek gibi olası kaymaları hesaba katmak için biraz daha büyük yapın. Ayrıca Broker tarafından yerinde bir FreezeLevel olabilir!

Cevabınız ve bana yardım etmeye çalıştığınız için çok teşekkür ederim. Birkaç sorum/yorumum var:

1. #1'de parantez () eklememi önerdiniz, bunu #4'teki önerinize göre yaptım. Ama "for" un başına nasıl parantez () ekleyeceğimi anlamıyorum. Lütfen bunu açıklar mısınız yoksa süslü parantezleri mi kastettiniz {}?

2. Onu _Symbol olarak değiştirdim, ancak bilgimi geliştirmek için, Symbol() yerine _Symbol kullanmanın yararının/avantajının ne olduğunu açıklayabilir misiniz acaba?

3. Tüm Talepleri ve Teklifleri OrderClosePrice() olarak değiştirdim, ancak bunun faydasının/avantajının ne olduğunu açıklar mısınız?

4. Bunu yaptım

5. Bunu daha nasıl basitleştirebileceğimi deneyeceğim.

6. İşlemlerimi manuel olarak girdiğim için MagicNumbers'ı kullanamayacağımı anlıyorum. Bu doğru değil mi?

7. Kaymayı nasıl ve nerede açıklayacağımı bilmiyorum. Bunu nereye veya nasıl ekleyeceğinizi söyler misiniz? OrderModify için yalnızca aşağıdaki parametrelere izin verir:

 bool   OrderModify(
   int         ticket,       // ticket
   double      price,       // price
   double      stoploss,     // stop loss
   double      takeprofit,   // take profit
   datetime    expiration,   // expiration
   color       arrow_color   // color
   );

8. Kodumda, çoğu durumda yayılmayı hesaba katması gereken minimum durma seviyesine 1 pip (10 puan) ekledim.

9. Dondurma seviyesini tüm çiftler için yazdırdım ve hepsi 0.0, yani bir sorun görünmüyor.

10. Hala 130 hatası ve bir hata alıyorum olsa da, EA çalıştığında yine de siparişi değiştiriyor ve kapatıyor. Bu sonuçlara göre, sipariş aynı anda değiştirildiği için hatayı alıyorum. Sanki bir parti sorunu gibi:

2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28598 tp: 0.00000 tamam

2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: Satın Al = 130

2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28597 tp: 0.00000 tamam

2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28596 tp: 0.00000 tamam

2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: Satın Al = 130

2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: Satın Al = 130

2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28590 tp: 0.00000 tamam

2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28582 tp: 0.00000 tamam

2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28581 tp: 0.00000 tamam

2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28577 tp: 0.00000 tamam

2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: Satın Al = 130

2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28575 tp: 0.00000 tamam

2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: Satın Al = 130

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: Satın Al = 1

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: #50202284 değiştir 0.01 USDCAD'i 1.28477 sl'de satın alın: 1.28571 tp: 0.00000 tamam

İşte Trailingstop'un durma seviyesinin açıkça üzerinde olduğu (10 pip/100 puan) ve yine de 130 hatası verdiğine dair başka bir örnek:

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Satın alma hatası = 130

2016.04.15 14:15:03.432 İzleyen_v18 EURAUD,M15: TS = 20

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: durma düzeyi = 10.0



 

Lütfen yaptığınız güncellemelerle birlikte en son kodu sağlayın. Aksi takdirde, doğru olup olmadığını görmek için yaptığınız son değişiklikler hakkında yorum yapamam.

  1. Pardon, küme parantezlerini kastetmiştim. Bunu düzeltmelisin, yoksa başarısız olmaya devam edecek. Bu, tüm noktaların en önemlisidir.
  2. a) Bu nokta öncelikle "_Symbol" ile ilgili değil, bunun yerine "!=" ve "devam" ile ilgilidir.
    b) "_Symbol" bir değişken olduğu için daha hızlı yürütülürken, "Symbol()" daha yavaş olan bir işlev çağrısı olarak yürütülür.
  3. OrderClosePrice() , emrin mevcut kapanış fiyatıdır. Hala açıksa, sipariş türüne bağlı olarak Teklifi veya Talebi otomatik olarak rapor eder. Lütfen bu işlev için belgeleri okuyun.
  4. TAMAM! Yaptığınız kod değişikliklerini görelim.
  5. TAMAM! Yaptığınız kod değişikliklerini görelim.
  6. Evet, manuel işlemler için sihirli sayı 0'dır. Ancak, kodunuzda Magic Number'ı bir "harici" veya "giriş" olarak tanımlayın, ona varsayılan olarak bir "0" atayın ve ardından bu değişkeni kodunuzda kullanın. Bu şekilde, EA'yı diğer durumlar için kolayca kullanabilir veya kodunuzu diğer EA'lar için yeniden kullanabilirsiniz.
  7. Kaymanın nasıl hesaplanacağını açıkladım. Faktörün en az "1.0" (ideal olarak "1.5" veya "2.0"; aşırı kayma nedeniyle hala Hata 130 ile karşılaştığınızı görürseniz daha büyük) olduğu "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )" olduğundan emin olun. .
  8. 10 puanın spreadi hesaba katacağının garantisi yoktur, çünkü spread Symbol'e bağlı olarak farklıdır ve özellikle haber etkinlikleri sırasında ve çalışma saatleri gibi likiditenin düşük olduğu zamanlarda sürekli değişir.
  9. TAMAM! "FreezeLevel" kullanılmıyorsa, bu sorun değil, ancak farklı bir komisyoncuyla (buna sahip olabilir) kullanmanız durumunda, yine de kodunuzda buna karşılık vermenizi öneririm. EA çalışmaya devam edecek.
  10. Analiz edilebilmesi için değişikliklerle birlikte yeni kod sağlayın.
 
FMIC :

Lütfen yaptığınız güncellemelerle birlikte en son kodu sağlayın. Aksi takdirde, doğru olup olmadığını görmek için yaptığınız son değişiklikler hakkında yorum yapamam.

  1. Pardon, küme parantezlerini kastetmiştim. Bunu düzeltmelisin, yoksa başarısız olmaya devam edecek. Bu, tüm noktaların en önemlisidir.
  2. a) Bu nokta öncelikle "_Symbol" ile ilgili değil, bunun yerine "!=" ve "devam" ile ilgilidir.
    b) "_Symbol" bir değişken olduğu için daha hızlı yürütülürken, "Symbol()" daha yavaş olan bir işlev çağrısı olarak yürütülür.
  3. OrderClosePrice() , emrin mevcut kapanış fiyatıdır. Hala açıksa, sipariş türüne bağlı olarak Teklifi veya İsteği otomatik olarak rapor eder. Lütfen bu işlev için belgeleri okuyun.
  4. TAMAM! Yaptığınız kod değişikliklerini görelim.
  5. TAMAM! Yaptığınız kod değişikliklerini görelim.
  6. Evet, manuel işlemler için sihirli sayı 0'dır. Ancak, kodunuzda Magic Number'ı bir "harici" veya "giriş" olarak tanımlayın, ona varsayılan olarak bir "0" atayın ve ardından bu değişkeni kodunuzda kullanın. Bu şekilde, EA'yı diğer durumlar için kolayca kullanabilir veya kodunuzu diğer EA'lar için yeniden kullanabilirsiniz.
  7. Kaymanın nasıl hesaplanacağını açıkladım. Faktörün en az "1.0" (ideal olarak "1.5" veya "2.0"; aşırı kayma nedeniyle hala Hata 130 ile karşılaştığınızı görürseniz daha büyük) olduğu "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )" olduğundan emin olun. .
  8. 10 puanın spreadi hesaba katacağının garantisi yoktur, çünkü spread Symbol'e bağlı olarak farklıdır ve özellikle haber etkinlikleri sırasında ve çalışma saatleri gibi likiditenin düşük olduğu zamanlarda sürekli değişir.
  9. TAMAM! "FreezeLevel" kullanılmıyorsa, bu sorun değil, ancak farklı bir komisyoncuyla (buna sahip olabilir) kullanmanız durumunda, yine de kodunuzda buna karşılık vermenizi öneririm. EA hala çalışacak.
  10. Analiz edilebilmesi için değişikliklerle birlikte yeni kod sağlayın.


Çok teşekkürler. Yukarıdaki tüm tavsiye ve önerileri dikkate alacağım. Bu arada en son kod burada. Ayrıca, bu satırda bir hata buldum sanırım:

 #property strict ;
extern string Label_TrailingStart= "Pip threshold to activate TrailingStop" ;
extern int TrailingStart= 12 ;
extern int TrailingStop= 5 ;
double stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if (TS<stoplevel){
       MessageBox ( "Please note: Your inputs for TrailingStart and/or TrailingStop cannot" +
                 "\nbe less than the minimum levels required by your broker and the" +
                 "\nTrailingStart has been increased automatically to " + StringConcatenate (stoplevel+TrailingStop+ 2 )+ " Pips" );
     } 
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip= Point * 10 ;
   int ticket= 0 ;
   if (TS<stoplevel) TrailingStart=( int )stoplevel+TrailingStop+ 2 ;
   
   /*Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   Print("Buy error = ",GetLastError());
                        Print("OrderOpenPrice = ",OrderOpenPrice());
                        Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ",
                        OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip);
                        Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        Print("TrailingStop*Pip = ",TrailingStop*Pip);
                        Print("OrderClosePrice = ",OrderClosePrice());
                        Print("OrderStopLoss = ",OrderStopLoss());
                        Print("OrderSymbol = ",OrderSymbol());
                        Print("OrdersTotal = ",OrdersTotal());
                        Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
                        Print("ticket = ",ticket);
                        Print("OrderTicket = ",OrderTicket());
                        Print("Selectbyticket = ",SELECT_BY_TICKET);
                        Print("Selectbypos = ",SELECT_BY_POS);
                        Print("Ask = ",Ask);
                        Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),
                        OrderTakeProfit(),Blue));*/
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
       if ( OrderSelect (i,SELECT_BY_POS)){
      ticket++;
         if (OrderSymbol()== _Symbol ){
             if (OrderType()==OP_BUY){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){
                     if (TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                         Print ( "Buy error = " , GetLastError ());
                        }     
                    }  
                }     
            }  
             if (OrderType()==OP_SELL){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){
                     if (TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red))
                         Print ( "Sell error = " , GetLastError ());
                         /*Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);*/
                        }
                    }
                }  
            }
         }
      }   
   return ( 0 );
}
//+------------------------------------------------------------------+

Yaptığım oldukça büyük bir değişiklik, aşağıdaki ilk satırı ikinciye değiştirmemdi, çünkü stoploss için sıfırdan yüksek bir değer olması gerektiğini düşünüyorum. Bu doğru mu?

 if (OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
 if (TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
 

Aşağıdaki kod örneği, kodunuza olası bir çözüm/alternatif olarak hizmet eder. Ancak, kodun test edilmediğini veya hatalarının ayıklanmadığını (yalnızca derlenmediğini) lütfen unutmayın, bu nedenle kodu yalnızca "sözde" kod olarak kullanın:

 #property strict

extern double
   dblTrailStartPips = 11.0 ,   // Trailing Start (Pips)
   dblTrailStopPips  = 5.0 ,   // Trailing Stop (Pips)
   dblPipMultiplier  = 10.0 ,   // Pips to Points Multiplier
   dblSpreadFactor   = 2.0 ;   // Spread Factor for Slippage Compensation
   
extern int
   intMagicNumber    = 0 ;     // Magic Number (0 for Manual Orders)
   
double
   dblTickSizeDelta,           // Size of a Tick (Delta)
   dblStopLevelDelta,         // Market Stop Level (Delta)
   dblTrailStartDelta,         // Trailing Start (Delta)
   dblTrailStopDelta;         // Trailing Stop (Delta)

// Initialisation
int OnInit ()
{
   dblTickSizeDelta   = MarketInfo( _Symbol , MODE_TICKSIZE );
   dblStopLevelDelta  = MarketInfo( _Symbol , MODE_STOPLEVEL ) * _Point ;
   dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier  * _Point ;
   dblTrailStopDelta  = dblTrailStopPips  * dblPipMultiplier  * _Point ;
   
   return ( INIT_SUCCEEDED );
}

// Process Tick Event
void OnTick ()
{
   double
      dblSpreadDelta  = Ask - Bid,
      dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ),
      dblTrailDelta   = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta;
   
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i-- )
   {
       if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if ( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) )
         {
             int intDirection = 0 ;
             switch ( OrderType() )
            {
               case OP_BUY:  intDirection = + 1 ; break ;
               case OP_SELL: intDirection = - 1 ; break ;
               default :                         continue ;
            }
            
             double
               dblOpenPrice  = OrderOpenPrice(),
               dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection;
               
             if ( dblCloseDelta > dblTrailStartDelta )
            {
               double
                  dblStopLossPrice = OrderStopLoss(),
                  dblStopLossDelta = ( dblStopLossPrice  - dblOpenPrice ) * intDirection,
                  dblTrailingDelta = dblCloseDelta - dblTrailDelta;
               
               if ( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) )
               {
                   double dblStopLoss = round ( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta;
                   if ( dblStopLoss != dblStopLossPrice )
                  {
                     if ( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) )
                     {
                         Print ( "Order Modification Failed with Error: " , GetLastError () );
                     }
                  }
               }
            }
         }
      }
   }
}
 

Bu Trader3000'i deneyin

Bu kodu zaten sahip olduğunuzla karşılaştırın ... çok benzer ve yıllardır kullanıyorum ve bomba gibi çalışıyor ...

 //+------------------------------+
//| TRAILING STOP Function       |
//+------------------------------+
void Trailing_Stop_Function()
{
bool Ticket_TS_Long;
   for ( int iTS_Long = OrdersTotal () - 1 ; iTS_Long >= 0 ; iTS_Long --)  
   {
      
       if ( OrderSelect (iTS_Long,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol ()
      && OrderType() == OP_BUY
      && OrderMagicNumber() == MagicNumberLong
      && Trailing_Stop_In_Pips > 0
      && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier), NULL , 0 ,Green));
         if (Ticket_TS_Long != true )
         {
         Print ( "TS-Order Modify Error " , GetLastError ());
         }
      }
    } 
bool Ticket_TS_Short;
   for ( int iTS_Short = OrdersTotal () - 1 ; iTS_Short >= 0 ; iTS_Short --)  
   {
      
   if ( OrderSelect (iTS_Short,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol ()
      && OrderType() == OP_SELL
      && OrderMagicNumber() == MagicNumberShort
      && Trailing_Stop_In_Pips > 0
      && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier), NULL , 0 ,Green));
         if (Ticket_TS_Short != true )
         {
         Print ( "TS-Order Modify Error " , GetLastError ());
         }
      }
   }
}

Trail_After_Pips_Profit, kullanıcının doldurduğu harici bir çift değişkendir... ve

PipMultiplier, para biriminin ondalık nokta değerini hesaplayan basit bir işlevdir ...

MagicNumbers kullanmıyorsanız o kriterleri silin....

Bu... veya daha doğrusu, herhangi bir tablodaki herhangi bir sırayı "izlemeli" .....

Düzeltme altındayım ama benim için çalışıyor ....

 //+------------------------------------------+
//| Check for 5 Digits - Pipmultiplier       |
//+------------------------------------------+
   
   if ( Digits == 5 || Digits == 3 ) 
   {
   PipMultiplier = 10 * Point ;
   }
   else if ( Digits == 2 ) 
   {
   PipMultiplier = 100 * Point ;
   }
   
   else
   {
   PipMultiplier = Point ;
   }
   

Yardımınızdan çok etkilendim FMIC.... Güzel bir tane

 

Mike.T :

Yardımınızdan etkilendim FMIC.... Güzel bir tane

Teşekkür ederim!

Bazı tavsiyeler; "Sor" veya "Teklif" kullanmayın - bunun yerine "OrderClosePrice()" kullanın. Al veya Sat emri olmasına bakılmaksızın gerçek zamanlı bir değerdir.
 

@Mike.T: PipMulytiplier kodunuzla ilgili bir sorun var:

 else if ( Digits == 2 ) 
{
   PipMultiplier = 100 * Point ;
}

Bu doğru görünmüyor! 2 basamaklı semboller için neden 100 ile çarpalım? Kesinlikle çoğaltılmamalıdır! 4 haneli sembollerle aynı koşulda olmalıdır.

İşte bir örnek. USD/JPY Fiyatı 108.65'ten 108.77'ye çıkarsa; bu 1200 pip değil, 12 piplik bir artış!
 
FMIC :

Teşekkür ederim!

Bazı tavsiyeler; "Sor" veya "Teklif" kullanmayın - bunun yerine "OrderClosePrice()" kullanın. Al veya Sat emri olmasına bakılmaksızın gerçek zamanlı bir değerdir.

Thanx... bunu bilmiyordum... o yüzden... (bu konuyu ele geçirmeden)... Bid veya Ask yerine OrderClosePrice() kullanmalı mıyım?
 
Mike.T :
Thanx... bunu bilmiyordum... o yüzden... (bu konuyu ele geçirmeden)... Bid veya Ask yerine OrderClosePrice() kullanmalı mıyım?
Evet! Örneğimde gösterdiğim gibi hem Buy hem de Sell mantığını tek bir kod bloğunda birleştirmenize izin vermenin yanı sıra belirtilen nedenlerle (belgelere bakın).
Neden: