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.
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 ;
}}}}}}}
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)
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 ;
}
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 ;
}
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 ;
}
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 ;
}
}
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 ;
}
}
}
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_BUYelse// OP_SELL (or pending)
{ ...
} } // OrderSelect
} // Trailing
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)
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
Artık "&&" (ve "||") kısa devre operatörleri olduğuna göre s ise zincirleme yapmazlar.
Sipariş seçimi başarısız olduğunda siparişi değiştirmek istiyor musunuz?
Döngüden değişmeyen tüm testleri kaldırın.
Aynı şeyi hesaplayıp durmayın. Ne yapmak istediğini anla ve yapmalısın
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'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.
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
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.
{ i = 1 + 2 ; } { if (i == 3 ) { Print (i); } }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'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.