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

 
Yardım etmek isteyen var mı lütfen.....
 

Sorunun bir kısmı, bu kodu büyük uzun if koşulları dolu &&, || ve işlev çağrısından sonra işlev çağrısı ile hata ayıklamayı zorlaştırıyor, bu karışıklığı çözecek zamanı olan birini bulursanız şanslısınız. Kodun çok daha kısa satırlarda nasıl formatlanması ve yorumlanması gerektiğini görmek için dokümanlardaki kodlama örneklerine bakmalısınız.

 

"Hata ayıklamayı zorlaştırıyor"?? :( Bunları hiç duymadım gerçi bu gerçek mi...

Derleyici ayrıca kodumda hata ayıklamakta zorlanıyor :( ?

Sebep buysa, bu kısım için tüm kodlama fikrimi yeniden düşünmek zorunda kaldım mı? O zaman tamamen farklı bir şey ortaya çıkacak ...... :( :(

 

Evet, hata ayıklamak zordur, örneğin sondaki durdurma için bu koda bakın. Her satırın ne yaptığını görmek kolaydır, bu nedenle hataları tespit etmek kolaydır.

   int total= OrdersTotal ();
   
   for ( int cnt= 0 ; cnt<total; cnt++)
   { if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
    { if (OrderType()==OP_BUY)
     { if (TrailingStop> 0 )
      { if (Bid-OrderOpenPrice()> Point *TrailingStop)
       { if (OrderStopLoss()<Bid- Point *TrailingStop)
        { if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
         { Print ( "OrderModify error " , GetLastError ());
           return ;
   }}}}}}}
 
&& koşulunu kaldırmayı ve onları if ifadesi olarak koymayı denedim .... Ama yine de her zaman işe yaramadı, bazen zararı durdurmayı sadece bir kez değiştirdi, bazen hem alış hem de satış emirleri için gayet iyi çalıştı. .
 
SDC : Evet, hata ayıklamak zordur, örneğin sondaki durdurma için bu koda bakın. Her satırın ne yaptığını görmek kolaydır, bu nedenle hataları tespit etmek kolaydır.
   int total= OrdersTotal ();
   
   for ( int cnt= 0 ; cnt<total; cnt++)
   { if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
    { if (OrderType()==OP_BUY)
     { if (TrailingStop> 0 )
      { if (Bid-OrderOpenPrice()> Point *TrailingStop)
       { if (OrderStopLoss()<Bid- Point *TrailingStop)
        { if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
         { Print ( "OrderModify error " , GetLastError ());
           return ;
   }}}}}}}
  1. Birden fazla siparişin varlığında kapatırken/silerken geri sayım YAPMALISINIZ. EA'yı diğer grafiklerde düşünün. alışkanlık haline getirin.
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       { if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
        { if (OrderType()==OP_BUY)
         { if (TrailingStop> 0 )
          { if (Bid-OrderOpenPrice()> Point *TrailingStop)
           { if (OrderStopLoss()<Bid- Point *TrailingStop)
            { if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
             { Print ( "OrderModify error " , GetLastError ());
               return ;
       }}}}}}}
    Ayrıca x++ yerine ++x'i tercih edin (özellikle sınıflarla uğraşırken)
  2. Dil for() ifadesi, if() ifadesidir, bu nedenle tek bir ifadenin etrafına parantez koymak pek mantıklı değildir.
    yazmazdın
    ancak
    { i = 1 + 2 ; }
    { if (i == 3 ) { Print (i); } }
    i = 1 + 2 ;
    if (i == 3 ) Print (i);
    Çok Basitleştirin
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       if (OrderType()==OP_BUY)
       if (TrailingStop> 0 )
       if (Bid-OrderOpenPrice()> Point *TrailingStop)
       if (OrderStopLoss()<Bid- Point *TrailingStop)
       if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
  3. Artık "&&" (ve "||") kısa devre operatörleri olduğuna göre s ise zincirleme yapmazlar.
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && TrailingStop> 0 )
       && Bid-OrderOpenPrice()> Point *TrailingStop)
       && OrderStopLoss()<Bid- Point *TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
  4. Sipariş seçimi başarısız olduğunda siparişi değiştirmek istiyor musunuz?
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( O rderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && TrailingStop> 0 )
       && Bid-OrderOpenPrice()> Point *TrailingStop)
       && OrderStopLoss()<Bid- Point *TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
  5. Döngüden değişmeyen tüm testleri kaldırın.
     if TrailingStop> 0 ){
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && Bid-OrderOpenPrice()> Point *TrailingStop)
       && OrderStopLoss()<Bid- Point *TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
    }
  6. Aynı şeyi hesaplayıp durmayın.
       if (Bid-OrderOpenPrice()> Point *TrailingStop )
       if (OrderStopLoss()<Bid- Point *TrailingStop )
       if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop ,O...
    Ne yapmak istediğini anla ve yapmalısın
     if TrailingStop> 0 ){
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY){
           double SL = Bid - Point *TrailingStop;
           if (SL > OrderOpenPrice()     // Start trailing above open price
          && SL > OrderStopLoss()     // And it moves up ONLY
          && !OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(), 0 ,Green))
          {   Print ( "OrderModify error " , GetLastError ());
             return ;
          }
       }
    }
  7. Diğer davalar ne olacak? Diğer çizelgeler ve EA'lar ne olacak?
     if TrailingStop> 0 ){
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES)
       && OrderMagicNumber() == MyExternal
       && OrderSymbol()      == Symbol ()  
       ){  
           if (OrderType()==OP_BUY)
          {
             double SL = Bid - Point *TrailingStop;
             if (SL > OrderOpenPrice()     // Start trailing above open price
             && SL > OrderStopLoss()     // And it moves up ONLY
             && !OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(), 0 ,Green))
             {   Print ( "OrderModify error " , GetLastError ());
                 return ;
             }
          }   // OP_BUY
           else // OP_SELL (or pending)
          { ...                       
          }                           
       }   // OrderSelect
    }   // Trailing

 
WHRoeder :
  1. Birden fazla siparişin varlığında kapatırken/silerken geri sayım YAPMALISINIZ. EA'yı diğer grafiklerde düşünün. Ayrıca alışkanlık edinin.Ayrıca x++ yerine ++x'i tercih edin (özellikle derslerle uğraşırken)
  2. Dil for() ifadesi, if() ifadesidir, bu nedenle tek bir ifadenin etrafına parantez koymak pek mantıklı değildir.
    yazmazdın
    ancak
    Çok Basitleştirin
  3. Artık "&&" (ve "||") kısa devre operatörleri olduğuna göre s ise zincirleme yapmazlar.
  4. Sipariş seçimi başarısız olduğunda siparişi değiştirmek istiyor musunuz?
  5. Döngüden değişmeyen tüm testleri kaldırın.
  6. Aynı şeyi hesaplayıp durmayın. Ne yapmak istediğini anla ve yapmalısın
  7. Diğer davalar ne olacak? Diğer çizelgeler ve EA'lar ne olacak?

Bu kodu, okunması kolay bir kod örneği olarak gönderdim, tamamlanmış bir bağımsız işlev örneği olması amaçlanmamıştı.

Bu, MT4'e dahil olan MetaQuotes MACD örnek EA'sından takip eden durdurma kodunun satın alma siparişleri bölümüdür.

1) Doğru değil, yukarı veya aşağı sayabilirsiniz, döngü daha verimlidir, OrdersTotal() bir kez çağrılır ve yerel bir değişkene atanır.

 
SDC : Bu kodu sadece bir örnek olarak gönderdim o
Konuyu büyüterek paylaştım.
 

SDC'ye teşekkürler. İpuçları için de teşekkürler WHRoeder. Faydalı.

OrderClosePrice() öğesini önceki koddaki MarketInfo ile değiştirmeyi denedim ve düzenlenmiş ( && koşulunu kaldırarak onları if ifadesi olarak, 2. for döngüsündeki gibi koydum) , ancak sonuç hala bazen çalışmıyor bazen çalışmıyor Çalışma .

Havuzdaki toplam siparişleri saymak için kullanılan for döngüsü, geri sayım döngüsünü kullanır, ancak x-- ile. Neden --x önerdiğini anlamıyorum.

Google'da "kısa devre operatörleri" aradım ama bunun mql4'te ne anlama geldiğini gerçekten anlamadım, biraz açıklamanın sakıncası var mı ^_^ ?? 'if' zincirlemek neden kötüdür?

Bu arada, SDC'nin önerdiği yukarıdaki kod, kullandığım kod değil >.< .

 

if'leri zincirlemek kötü değildir. Yukarıda paylaştığım kodu MQL4 dilinin geliştiricileri yazmış. Örnek olarak macd örnek EA'larından kestiğim bir kod.

WHR, && || koşullar değerlendirilir, bu da onları zincirlenmiş if koşulları kadar eşit derecede verimli kılar. Önceden daha az verimliydiler. Her iki yöntemi de kullanabilirsiniz. Zincirlenmiş if'ler, kodda farklılıklar olduğunda kullanışlıdır, böylece 'else' kullanabilirsiniz.

Uzun if( && || ) koşulları satırları parantez karışıklığı yaratabilir, bu da hataları bulmayı zorlaştırır, bu yüzden yapmayı sevmiyorum. Ayrıca, kodlamanın 80 karakterden fazla olmaması gerektiğini söyleyen kabul edilmiş bir standart vardır. Yine de birçok kodlayıcı bu standarda uyma zahmetine girmez ve MQL4 geliştiricileri, eşit derecede büyük uzun adlara sahip işlevlere yapılan işlev çağrılarında kullanılmak üzere büyük uzun adlara sahip numaralandırılmış tanımlayıcılar oluşturmaya devam eder, bu da kodun bir bütün olarak biçimlendirilmesine yardımcı olmaz. çok güzelsin.