yeni başlayan birinin maceraları - sayfa 10

 
niko :
İsteğin benim emrim ('yüksek uçan' diyecektim ama sonra çevrimiçi sözlüğü kontrol ettim ve görünüşe göre bu kaba bir yorum, boşver)

Tamam. Şu anda benim zevkime göre biraz fazla rastgele davrandığın için sadece hızlıca baktım.

Değişikliklerinizi kodumun en son sürümüne dayandırmadınız.

Bu nedenle, önceki sürüme başka şeyler eklemeye başlamadan önce, kodumun en son sürümünün ihtiyacınız olanı yapıp yapmadığına dair hiçbir fikrim yok.

Ama fark ettiğim şey, start() fonksiyonunun başlangıcında, açılış küme ayracının eksik olduğuydu. Bunu atlattığımızı sanıyordum.

Biraz kontrol uygulaman gerekiyor. Bir şeyi değiştirecekseniz - değişikliğinizi en son sürüme eklediğinizden emin olun. Ve değişikliğinizin ne olduğunu ve bunu neden yaptığınızı bize bildirin.


CB.

 
niko wrote >>

Tim,

Strateji test cihazında henüz herhangi bir işlem yapmamasına rağmen, derlendiğinde herhangi bir hata bildirilmediğini gösterecek şekilde kodu aldım (sadece vurguladığınız birkaç hatayı düzeltiyordu). Ama bir şeye kafam karıştı: ...

Merhaba Nick,

Buradaki yorumlarınıza ve kodda yaptığınız bazı değişikliklere baktığımda, 'şaşırmanızın' değişkenler ve fonksiyon parametreleri arasındaki karışıklık nedeniyle ortaya çıkabileceğinden şüpheleniyorum. Oldukça benzer görünüyorlar ve hareket ediyorlar ama aslında oldukça farklı hayvanlar.


Belki aşağıdaki yorumlanmış kod örneği, işleri biraz daha netleştirecektir.


Geliştirme kodunu biraz daha toparlama ve diğer değişkenlerden ayırt etmeye çalışmak için birkaç fonksiyon parametre adını biraz değiştirme özgürlüğüne sahip oldum. Ayrıca tüm gereksiz notları, yorumları vs. istediğiniz gibi yapabilmeniz için dosyanın sonundaki "Ek" bölümüne taşıdım.

Kod iyi görünüyor. Hâlâ dosyada YAPILACAKLAR OLARAK işaretlediğim birkaç küçük ihtimal ve sonuç var, ancak şimdi önünüzdeki asıl görev hata ayıklama ve test etme.


Test, geliştirme döngüsünün çok önemli bir parçasıdır. Ticaret sistemlerinde, doğru şekilde test edilmemesi, ticaret stratejinize ve nihayetinde hesabınıza zarar verebilecek ince sorunlara neden olabilir. Test etmedeki ana görev, kodun yapmasını beklediğiniz şeyi yapmasını sağlamaktır. Etkili bir şekilde, ya yazmanız ya da kendinize "Bu durumda, bu sonucu bekliyorum" demeniz gerekir. Daha sonra, gerçekten olanın bu olup olmadığını görmek için testinizi tasarlar ve gerçekleştirirsiniz. Olmazsa, sorunu düzeltmeniz gerekir. Bu işlemi, tasavvur edebileceğiniz tüm olası durumlar ve belki de bazı olası olmayan durumlar için tekrarlarsınız. Ayrıca, MetaTrader sistem hata mesajlarıyla ortaya çıkabilecek veya görünmeyebilecek çalışma zamanı hataları veya hataları da arıyorsunuz.


MT4 ile ana test aracınız Strateji Test Cihazı ve günlük dosyaları (Günlük Sekmesi altında) ile Sonuçlar, Grafik ve Rapor olanakları olacaktır.


Günlük dosyasıyla, bir kısmına Günlük görüntüleyici aracılığıyla bakmaya çalışmak yerine, tüm dosyayı Microsoft Not Defteri'nde açmayı genellikle daha kolay buluyorum. Her çalıştırmadan önce günlük dosyasını/günlüğü temizlemeyi unutmayın, aksi takdirde birçok eski ve belki de artık alakalı olmayan bilgilere bakmayı bitirirsiniz. Strateji test cihazında çalıştırılan her testten sonra, hem hata ayıklama ifadeleri mesajları hem de metatrader sistem mesajları için günlük dosyasını incelersiniz. Ek bilgi için ap hata kodlarına bakmak için MetaTrader çevrimiçi belgelerinizi kullanabilirsiniz. Ayrıca programın herhangi bir belirli koşul kümesinde ne yaptığını görmek için Sonuçlar, Grafikler ve Rapor olanaklarını kullanın.


İpucu - İlk test çalıştırmalarınızı yaptığınızda, günlük dosyasındaki veri miktarını en aza indirmek için test süresini kısa tutun.


Zaten koda bazı hata ayıklama olanakları ekledik, ancak muhtemelen bunları genişletmeniz gerekecek. Günlük dosyasındaki bilgileri yoğun ve alakalı tutmak için gerektiği gibi bireysel hata ayıklama ifadelerini devre dışı bırakın. Kodda, oldukça zaman alıcı olabilen hata ayıklama ifadelerini silmeden veya yorumlamadan bunun nasıl yapılacağına dair bir örnek vardır. Ana hata ayıklama ifadelerimi program dosyasında süresiz olarak bırakıyorum ve testi bitirdikten sonra programdaki DEBUG_ON bayrağıyla hepsini kapatıyorum.


Günlük dosyalarını ve hata ayıklama ifadelerini verimli bir şekilde yönetmek, MetaTrader ortamında iyi ve verimli test ve hata ayıklamanın anahtarı olduğuna inanıyorum. Bu forumda MetaTrader'daki hata ayıklama olanaklarının eksikliğinden homurdanan insanlar gördüm. Milyonlarca satır ticari kod, MetaTrader'da bulduğunuzdan daha karmaşık olmayan tesisler kullanılarak başarıyla ayıklandı ve test edildi. Bu tesisler basit olabilir, ancak düzgün bir şekilde nasıl kullanılacağını bilmenizi sağlayarak iyi çalışırlar.


Dikkate değer bir başka nokta da, dağınık veya kötü organize edilmiş kodlarda hata ayıklamaya çalışmanın çok zaman alıcı ve sinir bozucu olabileceğidir. Bu noktadan itibaren, iyi yapılandırılmış ve iyi yorumlanmış kodunuzun faydalarını gerçekten toplamaya başlayacaksınız. Başka birinin kodunuz üzerinde çalışması gerekirse, bu konudaki çabalarınız için size çok minnettar olacaklardır.


Nick, bu yolculuğun daha gidecek çok yolu var. Benim için test etme, hata ayıklama ve optimize etme - "her şeyi çalışır hale getirmek" işin en ilginç kısmı ve çoğu zaman da en zorlu kısmı. Teste başlamak için kodu size geri vereceğim ve karşılaştığınız sorular ve/veya sorunlarla ilgili olarak bana geri dönmenizi bekleyeceğim.


Saygılarımızla

Tim



Global değişken ile fonksiyon parametresi arasındaki farkı denemek ve göstermek için basit bir kod örneği

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
string MyGlobalVariable ; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = " Nick "; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction( MyGlobalVariable ); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter ) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment( MyFunctionParameter ); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

Dosyalar:
 
hey CB, mq4 dosyasını her zaman yeni olarak, diğer dosyaları ayırmak için en son tarihle kaydettiğim için bu garip. kafa karışıklığı gitmiş olmalı. parantez dahil etmek istedim, ama bir noktada onu kaldırmamı istediğinizi düşündüm (sonuncusuydu, ancak sonuncusu olmadan start() dengesiz olurdu. bu yüzden ilkini de kaldırdım) , ama geri koyacağım).
 
niko :
hey CB, mq4 dosyasını her zaman yeni olarak, diğer dosyaları ayırmak için en son tarihle kaydettiğim için bu garip. kafa karışıklığı gitmiş olmalı. parantez dahil etmek istedim, ama bir noktada onu kaldırmamı istediğinizi düşündüm (sonuncusuydu, ancak sonuncusu olmadan start() dengesiz olurdu. bu yüzden ilkini de kaldırdım) , ama geri koyacağım).

İster istemez parantez ekleyip çıkarmaya başlamayalım. Her ikisi de çıkarılabilen tamamen gereksiz bir setiniz olduğunu daha önce belirtmiştim.

İşte en son sürüm. Lütfen aşağıdakileri yapın:

- Önce onu derleyin ve hataları düzeltin - bu şekilde sonraki hataların yapabileceğiniz değişikliklerden kaynaklandığını bileceksiniz.

- Düzeltmeniz gereken herhangi bir hata olup olmadığını bana bildirin

- Bir deneyin ve ihtiyacınız olanı yapıp yapmadığını görün

- Bunun nasıl olduğunu bana bildirin - ve yapmanız gerektiğini düşündüğünüz değişiklikleri bana bildirin


CB

Dosyalar:
 
CB'ye teşekkürler. Konuya gireceğim, seni biraz hayal kırıklığına uğrattıysam özür dilerim
 

Teşekkürler Tim,

Bu şeyleri bana açıklamak için harcadığınız uzunluğu gerçekten takdir ediyorum, bu çok cesaret verici. Görünüşe göre, onu almanın 'yanıp sönmesini' alıyorum ve sonra hiç alamıyorum (işlevler ve çağrılarla ilgili olarak), işlevlerle ilgili belgeleri zaten yirmi kez okumuş olmama rağmen. Üzerinde daha fazla zaman geçireceğim. 'Test etme ve hata ayıklama' hakkında bunu daha önce farklı bir pakette yaptım (yapılan her ticareti gözden geçirerek, her şeyin birbirine uymasını sağlayarak) çünkü bunun manuel ticaret için bile ( strateji testi ) gerekli olduğunu düşünüyorum. Kodunuzla devam edeceğim ve size bildireceğim.

 
niko :
CB'ye teşekkürler. Konuya gireceğim, seni biraz hayal kırıklığına uğrattıysam özür dilerim

Endişelenme dostum. Sadece her seferinde bir adım atmaya çalışıyorum.


CB

 

Hey CB,


Koddaki birkaç hatayı düzelttim, çoğunlukla parantez eksikti, kodda vurgulanmış. Artık sözdizimi hatası yok.

Kodu strateji test cihazında çalıştırıyorum, ancak yalnızca SATIN ALMA işlemleri yapıyor. Hiç kısa işlem yok. Günlüklere baktım, üretici hatası 130 (duraklarla ilgili) bu yüzden sorunumuza ışık tutmuyor.

Hatanın nerede olduğunu bulmaya çalıştım (fnSHouldWeTrade veya fnOrderDuplicate'de olduğunu varsayıyorum).

Eklenen kodun en son sürümü, stratejiyi ticaret yapmak için etkinleştirmek için TopFilter ve BotFilter'a değerler ekledim.

ps: neden eski kodu senin için daha önce yapıştırdığımı anladım, mt4'ü farklı bir klasöre yeniden yükledim (bağlantı hatası yok) ve kod eski klasörden eski bir kopyaydı

 
niko :

Hey CB,


Koddaki birkaç hatayı düzelttim, çoğunlukla parantez eksikti, kodda vurgulanmış. Artık sözdizimi hatası yok.

Kodu strateji test cihazında çalıştırıyorum, ancak yalnızca SATIN ALMA işlemleri yapıyor. Hiç kısa işlem yok. Günlüklere baktım, üretici hatası 130 (duraklarla ilgili) bu yüzden sorunumuza ışık tutmuyor.

Hatanın nerede olduğunu bulmaya çalıştım (fnSHouldWeTrade veya fnOrderDuplicate'de olduğunu varsayıyorum).

Eklenen kodun en son sürümü, stratejiyi ticaret yapmak için etkinleştirmek için TopFilter ve BotFilter'a değerler ekledim.

ps: neden eski kodu senin için daha önce yapıştırdığımı anladım, mt4'ü farklı bir klasöre yeniden yükledim (bağlantı hatası yok) ve kod eski klasörden eski bir kopyaydı


Değişiklik:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point,"Nikos First EA",0,0,Red);

ile:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point,"Nikos First EA",0,0,Red);


CB

 
teşekkürler CB, bunu fark etmeliydim, yani hata sonunda doğruydu (130).