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

 
Eğer öyleyse, o zaman ben de 1. kodumdayım, o zaman, 1. for döngüsünden hemen sonra OrderSelect()'i çağırırım ..... Sorun şu ki, takip eden stop loss düzgün çalışmıyor ve hala hiç yok sorunun nerede olduğuna dair ipucu.
 
juniorlcq : geri sayım döngüsünü kullanır ancak x-- ile. Neden --x önerdiğini anlamıyorum.
  1. x++ değeri okur, bir kopyasını kaydeder , değeri artırır, yeni değeri x'te saklar ve sonraki kullanım için kopyayı geri alır .
  2. ++x değeri okur, değeri artırır, yeni değeri x'te saklar
  3. Tamsayılar için çok az fark yaratır. Bazı platformlarda ikincisi, onu birkaç kat daha hızlı hale getiren tek bir talimattır.
  4. Sınıflar için (yineleyiciler gibi) fazladan bir yapıcı ve yıkıcı çağrınız vardır, bu da onu birçok kez daha hızlı hale getirir.
    Önek operatörü++
    Sonek operatörü++
    RaRev* RaRev:: operator ++( void ){         // prefix
       ++mPos;
       return GetPointer( this ); // Allow (++It).Get()
    }
    
    RaRev RaRev:: operator ++( int ){               // postfix
       RaRev  orig( this ); // Make a copy to return.
       ++ this ;            // Increment myself.
       return orig;       // Return the original position.
    }
    
    Çoğu STL uygulamasında sık sık "iterator last=end; --end;" ifadesini görürsünüz. "yineleyici son=son--" yerine

 

Fiyatın OrderOpenprice()'den 600 puan arttığını varsayalım, = StartTraillingStop (200) + 8(xai)*50

kod burada:

   if ( xai >= 8 ) 
    {
    if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
        {
        if ( OrderStopLoss() == ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * ( xai - 1 ) ) ) * Figure ) ) )
           {
            Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
       }
    }

ancak kod, 0'dan 8'e kadar tüm xai'leri yapacak, diyelim ki kod xai = 4'te; bu durum doğru mu?

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

evet, o zaman SL şuna ayarlanacaktır: StartTraillinStop (200) + 4(xai)*50 (öncekiden aşağı gidiyor)

sonra xai 5, SL şuna ayarlanır: StartTraillinStop (200) + 5(xai)*50

vb., bu nedenle SL ayarlandıktan sonra ara vermek mümkün değildir;

 

juniorlcq Kodunuzu yeniden biçimlendirdiğiniz için okuması çok daha kolay. Göndermeyi küçültmek için biraz daha yeniden biçimlendirdim, olası sorunları vurguladım. Kodunuzun bazı izleri yürütmesini engelleyen "çift == çift hesaplanmış" sorununuz olabileceğini düşünüyorum. Hiç can price != price ile ilgili konuyu okudunuz mu?

Daha karmaşık hesaplamalar olduğu için en çok 2. ve 4. olanlardan şüpheliyim.

Gerçekten == yapıp yapmadıklarını görmek için Print() deyimlerini bu hesaplamalardan sonra koyun.

Kayan nokta hatası olarak bilinen hata, == olması gerektiği gibi görünse bile onları != yapabilir.

==, tamsayılarla kullanmak gerçekten yalnızca %100 güvenlidir, bu nedenle == öğesini bir test olarak <= veya >= olarak değiştirebilirsiniz.

   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)
       { if (( 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))
       { if (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)))
       { if (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)
        { if (( 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))
        { if (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)))
        { if (OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii- 1 )))*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(), 0 ,Color);
 }}}}}}}}}


Ayrıca bir yan not olarak: OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() öğesini OrderSelect() döngünüzün başında bir kez çağırırsanız ve değerlerini geri kalanında kullanmak üzere yerel değişkenlere atarsanız kodunuz çok daha verimli olacaktır. kodun. Yerel değişkenler, işlev çağrılarından çok daha hızlı erişimdir, bu nedenle aynı sonuç için tekrarlanan işlev çağrıları yapmaktan kaçınmalısınız... Genel bir kural olarak, kodunuzda ne kadar çok pembe yazı varsa, EA'nın performansı o kadar yavaş olur.

 

Anlıyorum, çalıştıramıyorum, bu sipariş satın alma ile çalışabilir, SL açıklandığı gibi aşağı iniyor:

   extern double CummulativeValue = 50.0 ;
   extern int      NumberOfTrail = 100 ;



   void ProcessTrailingStop()
   {
       double Figure = Point ;
     color Color = Yellow;
  
     bool Result ;
         for ( int x =  OrdersTotal (); x >= 0 ; x-- )
         {
         if ( OrderSelect ( x , SELECT_BY_POS , MODE_TRADES ) == false) continue;
        if ( OrderType() == OP_BUY )
           {
                 for ( int xai = 0 ; xai < NumberOfTrail ; xai++ )
                     {
                         if ( xai == 0 )
                        {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= StartTrailingStop )
                           {
                               if ( OrderStopLoss() == 0 ) 
                              {
                               Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } } }                        
                  
                         if ( xai == 1 )
                           {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } }                         
                        
                         if ( xai >= 2 )
                           {
                          if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                        } }                         
                     }
                  }
                  
       }}           
 
WHRoeder :
  1. x++ değeri okur, bir kopyasını kaydeder , değeri artırır, yeni değeri x'te saklar ve sonraki kullanım için kopyayı geri alır .
  2. ++x değeri okur, değeri artırır, yeni değeri x'te saklar
  3. Tamsayılar için çok az fark yaratır. Bazı platformlarda ikincisi, onu birkaç kat daha hızlı hale getiren tek bir talimattır.
  4. Sınıflar için (yineleyiciler gibi) fazladan bir yapıcı ve yıkıcı çağrınız vardır, bu da onu birçok kez daha hızlı hale getirir.
    Önek operatörü++
    Sonek operatörü++
    Çoğu STL uygulamasında sık sık "iterator last=end; --end;" ifadesini görürsünüz. "yineleyici son=son--" yerine


Ohhhhhhh bunu bilmiyordum. Teşekkürler WHRoeder :) .

Yani şu anlama mı geliyor,

Diyelim ki OrdersTotal() == 3 , for döngüsü için geri sayım ile ( int x = ( OrdersTotal() - 1 ) ; x >= 0 ; x-- ) x 1. değeri 2 olarak kaydedecek, sonra tekrar OrdersTotal()'a gitmeden for döngüsüne 2'den itibaren devam edin ??

 
SDC :

juniorlcq Kodunuzu yeniden biçimlendirdiğiniz için okuması çok daha kolay. Göndermeyi küçültmek için biraz daha yeniden biçimlendirdim, olası sorunları vurguladım. Kodunuzun bazı izleri yürütmesini engelleyen "çift == çift hesaplanmış" sorununuz olabileceğini düşünüyorum. Hiç can price != price ile ilgili konuyu okudunuz mu?

Daha karmaşık hesaplamalar olduğu için en çok 2. ve 4. olanlardan şüpheliyim.

Gerçekten == yapıp yapmadıklarını görmek için Print() deyimlerini bu hesaplamalardan sonra koyun.

Kayan nokta hatası olarak bilinen hata, == olması gerektiği gibi görünse bile onları != yapabilir.

==, tamsayılarla kullanmak gerçekten yalnızca %100 güvenlidir, bu nedenle == öğesini bir test olarak <= veya >= olarak değiştirebilirsiniz.



Hayır o konuyu daha önce okumadım. Sadece yaptı.

Önerdiğiniz şey mantıklı geliyor. İkinci bir düşüncede, bazen MT4'te fiyat özellikleri üzerine çizgiler çizmek gerçekten 5 haneli fiyatı göstermez, bunun yerine bazen bundan daha fazlasını gösterir.

Ama işte önceki hesaplardan birinde dalgalı ticaretimden biri, basit bir baskı kodlamasıyla çiftin neye benzediğini görmek için onu yazdırdım. Tuhaf MQL4 Sanırım @.@ ?

Hala double == double bölümünü nasıl değiştirmem gerektiğini düşünüyorum .....

SDC :


Ayrıca bir yan not olarak: OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() öğesini OrderSelect() döngünüzün başında bir kez çağırırsanız ve değerlerini geri kalanında kullanmak üzere yerel değişkenlere atarsanız kodunuz çok daha verimli olacaktır. kodun. Yerel değişkenler, işlev çağrılarından çok daha hızlı erişimdir, bu nedenle aynı sonuç için tekrarlanan işlev çağrıları yapmaktan kaçınmalısınız... Genel bir kural olarak, kodunuzda ne kadar çok pembe yazı varsa, EA'nın performansı o kadar yavaş olur.

Ohhh, hız yürütmede büyük bir fark olacağını bilmiyordum, SDC kılavuzu için teşekkürler. İz durdurma çalışmaya başladıktan sonra rehberinize göre değiştirilecektir.

 

Son kod bloğunu bu hata ayıklama sürümüyle değiştirmeyi deneyin. Kodumu kontrol et , derlemedim.

       if (xaii>= 2 )
       { if (((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        { Print ( "debug2.1: first condition true" );
         if (OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii- 1 )))*Figure)))
         { Print ( "debug2.2: second condition true" );
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(), 0 ,Color);
         } else
         { Print ( "debug2.2: second condition false" );
           Print ( "debug2.2: val1=" ,OrderStopLoss(), " val2=" ,OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii- 1 )))*Figure));
 }}}}}}}}}

Bu bir şeyi ortaya çıkarabilir, diğer == koşullarıyla da benzer bir şey yapabilirsiniz.

 
SDC :

Son kod bloğunu bu hata ayıklama sürümüyle değiştirmeyi deneyin. xa ile benzer bir şey yapabilirsin

Bu bir şeyi ortaya çıkarabilir, diğer == koşullarıyla da benzer bir şey yapabilirsiniz.


Evet, sorunlar ortaya çıkıyor, bu "çift == hesaplanmış çift sorun". SDC sorununu belirttiğiniz için teşekkür ederiz.

Aynı sorunu daha önce de belirttiğiniz için teşekkür ederim , ancak doğru şekilde düzenlemedim ve sorun olmadığını düşündüm .

Yine de bir öneriye ihtiyacım var, 2. ve 3. için 2. for döngüsündeyse, içine "arasında" bir ifade koymak daha mı iyi? OrderStopLoss() gibi >= x + 1 && x - 1 ?? Yoksa sadece >= veya <= ??

 

Umarım WHR bunu okumaz, nöbet geçirir, ama ben size NormalizeDouble()'ı denemenizi söyleyeceğim .... eşit olmaları gerektiğinde bu koşulları eşit yapmalıdır. Bunu OrderStopLoss() tarafına da yapmak gerekli olmamalı, ancak yine de eşit gelmiyorsa, durumun her iki tarafına da yapmayı deneyebilirsiniz....

       if (xaii>= 2 )
       { if (((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        { Print ( "debug2.0: condition true" );
         if (OrderStopLoss()== NormalizeDouble ((OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii- 1 )))*Figure)),Digits));
         { Print ( "debug2.1: condition true" );
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(), 0 ,Color);
         } else
         { Print ( "debug2.1: condition false" );
           Print ( "debug2.1: val1=" ,OrderStopLoss(), " val2=" ,OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii- 1 )))*Figure));
 }}}}}}}}}