Bazı küçük hataları tespit etmek için yardıma ihtiyacınız var.

 

Takip eden bir EA yapıyordum, demoda test ettiğimde, sadece satın alma emirlerinin doğru bir şekilde aldığını (sanırım) fark ettim, oysa satış emirleri sadece bir KEZ zarar durdur. Yine de sorunun nerede olduğunu anlayamıyorum.

** Kodu düzenledi **

 

Kod biçiminiz okumayı zorlaştırıyor, ancak bir şey için bunu sondaki bir durakta nasıl kullanabilirsiniz. OrderClosePrice() olmaması için siparişin hala açık olması gerekir

 ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue )
 

Ama satın alma siparişleri iyi çalışıyor

 
Peki, Figure nedir bilmeden ..... açık siparişlerde OrderClosePrice == 0 bilerek mi yazdınız bu kodu, yani OrderClosePrice - OrderOpenPrice sipariş hala açıksa negatif bir değere sahip mi?
 

Hayır yapmadım, sadece OrderClosePrice - OrderOpenPrice kullanan diğer tüm betiğim veya tam tersi iyi çalışıyor.

 
Tamam, başka bir satın alma siparişinde denedim, şimdi başarısız oluyor. Aynı zamanda, bir kez stoploss'a taşındı.
 

Tamam evet haklısın, bir emir hala açıkken OrderClosePrice'ın mevcut fiyatı takip ettiğini bilmiyordum, bu yüzden OrderClosePrice alış emirlerinde mevcut Bid fiyatı olmalıdır. Bence bu belgelenmemiş bir özellik olmalı.

 


Alış emirleri iyi görünüyor, ancak satış emri sadece zararı durdur bir kez taşındı ... En az iki kez hareket etmeli.

 

Biri bana yardım edebilir mi, aslında çok yakınım. Kişisel olarak kodlamamda bir yanlışlık olduğunu düşünmüyorum ama neden her zaman düzgün çalışmayacağını bilmiyorum.

Her şeyi 1'de birleştirdiğimden beri uzun bir EA, pardon biraz gözlerim şimdi oldukça bulanık.

Şekil, her bir özel çift için puanların değerini döndürür.

Bu, takip eden kısımdır.

 //+------------------------------------------------------------------+
//| Program's global variables                                       |
//+------------------------------------------------------------------+
   extern double StartTrailingStop = 15.0 ;
   extern double TrailingStop = 5.0 ;
   extern double CummulativeValue = 5.0 ;
   extern int     NumberOfTrail = 10 ;
   double Figure ;
//+------------------------------------------------------------------+ 

   
//+------------------------------------------------------------------+
//| Program's sub-function                                           |
//+------------------------------------------------------------------+
   double PointsDetection()    {              Figure = 0.0 ;                                             if ( MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.01 || MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.001 )          {             Figure = 0.01 ;          }          else          {              if ( MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.0001 || MarketInfo ( OrderSymbol() , MODE_POINT ) == 0.00001 )             {                Figure = 0.0001 ;             }          }             return ( Figure ) ;    }


 //+------------------------------------------------------------------+
//| Program's sub-function                                           |
//+------------------------------------------------------------------+
   void ProcessTrailingStop()
   {
      
       bool Result ;
      
      
      
      
      
         for ( int x = ( OrdersTotal () - 1 ) ; x >= 0 ; x-- )
         {
             if ( OrderSelect ( x , SELECT_BY_POS , MODE_TRADES ) == True )
            {
               PointsDetection() ;
               
               
               

                   if ( OrderType() == OP_BUY )
                  {
                     for ( int xai = 0 ; xai < NumberOfTrail ; xai++ )
                     {
                         if ( xai == 0 )
                        {
                           if ( ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= StartTrailingStop ) && ( ( OrderStopLoss() == 0 ) || ( OrderStopLoss() < ( OrderOpenPrice() + ( TrailingStop * Figure ) ) ) ) )
                           {
                              Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                           }
                        }
                        
                        
                        
                         if ( xai == 1 )
                        {
                           if ( ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) ) && ( OrderStopLoss() == ( OrderOpenPrice() + ( TrailingStop * Figure ) ) ) )
                           {
                              Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                           }
                        }
                        
                        
                        
                         if ( xai >= 2 )
                        {
                           if ( ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) ) && ( OrderStopLoss() == ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * ( xai - 1 ) ) ) * Figure ) ) ) )
                           {
                              Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                           }
                        }
                     }
                  }
                   else
                  {
                     if ( OrderType() == OP_SELL )
                     {
                         for ( int xaii = 0 ; xaii < NumberOfTrail ; xaii++ )
                        {
                           if ( xaii == 0 )
                           {
                               if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= StartTrailingStop ) && ( ( OrderStopLoss() == 0 ) || ( OrderStopLoss() > ( OrderOpenPrice() - ( TrailingStop * Figure ) ) ) ) )
                              {
                                 Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                              }
                           }
                           
                           
                           
                           if ( xaii == 1 )
                           {
                               if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) ) && ( OrderStopLoss() == ( OrderOpenPrice() - ( TrailingStop * Figure ) ) ) )
                              {
                                 Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                              }
                           }
                           
                           
                           
                           if ( xaii >= 2 )
                           {
                               if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xaii ) ) ) && ( OrderStopLoss() == ( OrderOpenPrice() - ( ( TrailingStop + ( CummulativeValue * ( xaii - 1 ) ) ) * Figure ) ) ) )
                              {
                                 Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( ( TrailingStop + ( CummulativeValue * xaii ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                              }
                           }
                        }
                     }
                  }

            }
         }
 

Belki orada :

 ( OrderStopLoss() == ( OrderOpenPrice() - ( TrailingStop * Figure ) )

https://forum.mql4.com/45053

Belki sunucu hatasını önlemek için şu şekilde kodlanmalıdır:

 figure = PointsDetection();

if ( ( ( ( OrderOpenPrice() - OrderClosePrice() ) / Figure ) >= StartTrailingStop ) && ( ( OrderStopLoss() == 0 ) || ( OrderStopLoss() >= OrderOpenPrice() ) || ( OrderStopLoss() > ( OrderOpenPrice() - ( TrailingStop * Figure ) ) ) ) )
                              {
                                 Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() - ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                                 if( result == true ) break;                               
 }


satın alma siparişi için :

( OrderStopLoss() < ( OrderOpenPrice() + ( TrailingStop * Figure ) )
 

Denedim ama yine de işe yaramadı .... Neden bir if ifadesinde break kullanalım ???

Satış emri için ... eksi olmalı ve alış emri için artı olmalı ....