
MQL5'te Uzman Danışmanları Test Etme ve Optimize Etme Kılavuzu
Giriş
Bir geliştirici için bir Uzman Danışman yazma sürecinde, Uzman Danışmanın iyi bir kârlılık hedefine ulaşmasını sağlamak genellikle çok zorlu bir süreçtir. Bu yazıda, bir Uzman Danışmanı sınamak ve optimize etmek için gerekli olan bazı önemli adımlara bakacağız, böylece bir Uzman Danışma yazma hedefimize yaklaşabiliriz.
1. Kod Hatalarını Belirleme ve Düzeltme
Bu makaleye, bir Uzman Danışman kodu yazma sürecinde normal olarak karşılaşılan bazı yaygın kod hatalarına bakarak başlayacağız. Çoğu zaman yeni başlayanlar, kodlarını yazarken veya başka bir geliştirici tarafından yazılmış bir kodu değiştirirken kod hatalarını tespit etmekte ve düzeltmekte zorlanırlar. Bu bölümde, bu tür hataları belirlemek ve düzeltmek için MQL5 düzenleyicisini kullanmanın ne kadar kolay olduğunu göstereceğiz.
Kodu yazmayı yeni tamamladınız; görünen o ki her şey yolunda gidecek çünkü kodun hatasız olduğundan neredeyse eminsiniz. Ya da bu başkası tarafından yazılmış bir koddu ve siz birkaç değişiklik yaptınız. Ama o da ne! Derle düğmesine bastığınızda (veya F7 tuşuna bastığınızda), MetaEditor Araç Kutusu penceresinin Hata sekmesinde gösterildiği üzere kodda bir dizi hatayla karşı karşıya kaldınız.
Şekil 1. Uzman Danışman kodundaki derleme hataları
Vay canına! 38 hata ve 1 uyarı; kodunuzda burada gösterildiği kadar hata olmayabilir, tek bakmak istediğimiz şey kodumuzu derlerken ortaya çıkması muhtemel çeşitli hata türleri ve bunları nasıl çözebileceğimizdir. Yukarıdaki diyagramı açıklayalım.
- 1 olarak işaretlenen Bölüm, koddaki hatanın açıklamasını gösterir. Bize hatanın nasıl göründüğüne dair fikir veren şey budur.
- 2 ile işaretli kısım hangi dosyada hata aldığımızı gösterir. Eğer hatalı dosyalar eklemişsek, bu çok önemlidir. Bu sayede, açıklanan hatayı hangi dosyada arayacağımızı bilebileceğiz.
- 3 ile işaretli bölüm bize kodumuzda hatanın hangi satır ve sütunda (satır üzerindeki) bulunduğunu gösterir. Bu, açıklanan hatayı hangi satırda arayacağımızı bilmemizi sağlar.
- 4 ile işaretlenen bölüm, derleme hatalarının ve uyarıların özetini gösterir.
Şimdi sırasıyla hataları çözmeye başlayalım. En baştan başlayabilmemiz için Hata sekmesini ilk satıra kadar kaydıralım.
Şekil 2. Kod hatalarını belirleme ve çözme
İlk sorun "sabit değerin kesilmesi" olarak tanımlanmış ve satır 16 sütun 20'de tespit edilmiştir; kodumuzdaki tam satırı bulmak için MetaEditor'ın Düzenle menüsünden Satıra Git'i seçin veya klavyenizde CTRL G'ye basın.
Şekil 3. Hata kodu satır numarasının bulunması
Bir iletişim kutusu görüntülenecektir.
Şekil 4. Hata satırı numarasını bulma iletişim kutusu
İletişim kutusunda gösterilen sayı aralığı, koddaki toplam satır sayısıdır. Bu durumda (1-354), kodumuzun 354 satır kod içerdiğini gösterir.
Kontrol etmek istediğiniz satır numarasını kutuya yazın ve OK düğmesini tıklayın. Doğrudan koddaki satır numarasına yönlendirileceksiniz. O satırda fare imlecinin yanıp söndüğünü göreceksiniz.
Şekil 5. Hata satır numarasını gösteren imleç
Buradaki sorun, Lot'u bir tamsayı (int) değişkeni olarak bildirmemiz, ancak onu çift bir değerle (0.1) başlatmamızdır. Bu hatayı düzeltmek için int'yi çift olarak değiştireceğiz, dosyayı kaydedeceğiz ve düzeltilip düzeltilmediğini görmek için tekrar DERLE düğmesine basacağız.
Şekil 6. Düzeltme yapıldıktan sonra kodu derleme ve kaydetme
Tekrar derlemede, ilk sorun çözüldü, ancak aşağıda gösterildiği gibi hala sorunlarımız var:
Şekil 7. Derlemeden sonra kodda hala hatalar görünüyor
Şimdi yukarıdaki prosedürün aynısını izleyeceğiz ve 31. satıra gideceğiz. Ancak bu sefer Hatalar sekmesindeki hataya sağ tıklayıp Satıra git seçeneğini seçeceğiz.
Şekil 8. Kod hata satırını bulmanın başka bir yolu
Ya da sadece hatayı seçin ve klavyenizdeki Enter düğmesine basın. Hemen 31 numaralı kod satırına yönlendirileceksiniz.
Fare imlecinin yanıp söndüğünü ve ilgili 31. kod satırında küçük, yuvarlak bir kırmızı düğme (hata simgesi) göreceksiniz.
Şekil 9a. Kod hata satırını bulma
Ancak, daha önce düzelttiğimiz satır 16'daki ilk hata gibi bir uyarı mesajıysa, üçgen sarı bir düğme (uyarı simgesi) gösterecektir:
Şekil 9b. Kod hata satırını bulma
31. satırda herhangi bir sorunumuz olmadığı çok açık, ancak hata açıklaması şöyle diyor: "'STP' - beklenmedik belirteç".
O halde neyin yanlış olabileceğini görmek için önceki kod satırını (yani 30. satır) kontrol etmeliyiz. Yakın incelemede göreceğimiz gibi, 30. satırda"double ccminb = -95.0000" ifadesinden sonra noktalı virgül eksik; 31. satırdaki hatayı bu yüzden alıyoruz. Şimdi -95.0000 ifadesinden sonra noktalı virgül koyarak bu hatayı düzelteceğiz ve kodu tekrar derleyeceğiz.
Şimdi satır 31 hataları gitti. Sonraki, aşağıda gösterildiği gibi satır 100:
Şekil 10. Kodda hala hatalar var
Hey Olowsam, her düzeltmeden sonra derleme yapmak zorunda mıyız? Neden tüm satırların üzerinden tek seferde geçmiyoruz ve tüm düzeltmeleri yaptıktan sonra kodu her düzeltmeden sonra derlemek yerine bir kez derlemiyoruz?
Az önce bu soruyu mu sordunuz?
Bir bakıma haklı olabilirsiniz ama bunu tavsiye etmem. Sorunlar her zaman birbiri ardına çözülür. Adım adım. Sorunu bir araya getirip bir kerede çözmeye yönelik herhangi bir girişim, baş ağrısına yol açabilir. Birazdan nedenini anlayacaksınız, beni sabırla dinleyin.
Sorunumuza geri dönersek, sonraki hata için 100. satırı kontrol edeceğiz. Hata şunu belirtiyor: "if ifadelerine küresel kapsamda izin verilmez"; 100. satırdaki if ifadesinin küresel kapsamda olmadığından eminim, peki neden bu hatayı alıyoruz? Lütfen 100. satıra gidelim.
Şekil 11. Koddaki hatayı bulma
100. satırda herhangi bir sorun bulamıyoruz ve 31 numaralı satırı düzeltmeyi yeni bitirdiğimiz için sorunun şimdi 32. satır ile 99. satır arasında olduğundan eminiz. Öyleyse yukarıya doğru 99. satıra geçelim (bir yorumumuz var, bu yüzden hata olamaz). Yukarıya doğru bildirimlere (MqlTick, MqlTradeRequest ve MqlTradeResult) de bakarsak, bunların doğru bir şekilde bildirilmiş ve noktalanmış olduğunu görürüz.
Şimdi bu bildirim kodu satırlarından önce, kodda if ifadesi olup olmadığına bakalım ve ifadenin uygun olup olmadığını görelim. Çok yakından incelediğimizde, if ifadesinde bir kapanış ayracı olduğunu, ancak açılış ayracı olmadığını keşfettik.
Şekil 12. Hatayı belirlemek için hata satırı numarasının yukarısına bakma
Açılış ayracı ekleyin ve kodu tekrar derleyin.
//--- Do we have enough bars to work with int Mybars=Bars(_Symbol,_Period); if(Mybars<60) // if total bars is less than 60 bars { Alert("We have less than 60 bars, EA will now exit!!"); return; }
Kod derlendikten sonra; 100, 107, 121, 126, 129 vb. satırlardaki hatalar tamamen temizlendi ve yenileri ortaya çıktı. Adım adım izlemenin neden iyi olduğunu anladınız mı?
Şekil 13. Kodda hala hatalar var
Sonra iki hatası bulunan 56. satıra geçiyoruz: "'cciVal1' - parametre dönüştürmeye izin verilmez" ve "'cciVal1' - dizi gerekli"
56. satıra daha yakından bakıldığında, cciVal1'in bir dizi olarak bildirilmiş olması gerekiyordu. Bunu bir dizi olarak bildirmemiş olabilir miyiz ve şimdi onu bir dizi olarak kullanmaya çalışıyor olabilir miyiz? Bundan sonra ne yapacağımıza karar vermeden önce bunu teyit etmek için bildirim bölümünü kontrol edelim.
//--- Other parameters int maHandle; // handle for our Moving Average indicator int cciHandle1,cciHandle2; // handle for our CCI indicator double maVal[]; // Dynamic array to hold the values of Moving Average for each bars double cciVal1,cciVal2[]; // Dynamic array to hold the values of CCI for each bars double p1_close,p2_close; // Variable to store the close value of Bar 1 and Bar 2 respectively
Buradan, köşeli parantezleri ([]) atladığımız için cciVal1'i dinamik dizi yerine bir çift olarak bildirdiğimizi görebiliriz. Köşeli parantezleri ekleyelim (tıpkı cciVal2[] için yaptığımız gibi) ve sonra kodu derleyelim.
//--- Other parameters int maHandle; // handle for our Moving Average indicator int cciHandle1,cciHandle2; // handle for our CCI indicator double maVal[]; // Dynamic array to hold the values of Moving Average for each bars double cciVal1[],cciVal2[]; // Dynamic array to hold the values of CCI for each bars double p1_close,p2_close; // Variable to store the close value of Bar 1 and Bar 2 respectively
Şekil 14. Koddaki hatalar önemli ölçüde azaltıldı
Ne! Pek çok hata ortadan kalktı. Yalnızca 56. satırda bildirilen hatayı düzelttik ve diğer bazı hatalar otomatik olarak çözüldü. Bunun nedeni, 56. satırda bildirilen hatanın bu diğer hatalardan sorumlu olmasıdır. Bu nedenle, kodunuzdaki hataları çözmek için adım adım bir süreci takip etmek iyidir.
Şimdi 103. satırda bildirilen bir sonraki hataya geçeceğiz: "'GetLastError' - bildirilmemiş tanımlayıcı"; ama bir dakika, GetLastError'ın bir fonksiyon olması gerekiyor. Sorunun ne olduğunu görmek için 103. satıra gidelim.
//--- Get the last price quote using the MQL5 MqlTick Structure if(!SymbolInfoTick(_Symbol,latest_price)) { Alert("Error getting the latest price quote - error:",GetLastError,"!!"); // line 103 return; }
Sorun aslında 103. satırda. GetLastError bir fonksiyondur ve her fonksiyon, giriş parametreleri için bir çift parantez gerektirir. Boş bir parantez çifti yazıp kodu derleyelim. Boş parantez çifti, fonksiyonun hiçbir argüman veya parametre almadığını gösterir.
//--- Get the last price quote using the MQL5 MqlTick Structure if(!SymbolInfoTick(_Symbol,latest_price)) { Alert("Error getting the latest price quote - error:",GetLastError(),"!!"); // line 103 return; }
Ardından, 159. satıra geçiyoruz: "'=' - l-değeri gerekli" ve bir uyarımız da var: "ifade Boolean değil"; 159. satıra gidelim ve bu hatanın ne anlama geldiğini görelim.
else if(PositionGetInteger(POSITION_TYPE) = POSITION_TYPE_SELL) // line 159 { Sell_opened = true; // It is a Sell
Burada görüldüğü gibi, if ifadesinde POSITION_TYPE_SELL değerini PositionGetInteger(POSITION_TYPE)'a atamışız ve yapmak istediğimiz bu değil. Bunun yerine karşılaştırma yapmak istemiştik. Şimdi ifadeyi atama operatörü yerine eşittir operatörü kullanacak şekilde değiştireceğiz. (yani '=' yerine '=='). Düzeltmeyi yapın ve kodu derleyin.
else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) // line 159 { Sell_opened = true; // It is a Sell
Güzel! Şimdi bir tane daha var. 292. satıra gidelim ve neden "'PositionsTotal' - bildirilmemiş tanımlayıcı" yazdığını görelim. Bir dakika, daha önce böyle bir hata gördüğümüzü hatırlıyor musunuz? ‘GetlastError’ satır 103. Muhtemelen, PositionsTotal için de parantez çiftini eklemeyi unutmuşuz; çünkü bu bir fonksiyon. Onaylamak için 292. satıra gidelim.
bool CheckTrade(string otyp) { bool marker = false; for (int i=1; i<=PositionsTotal;i++) // line 292 {
Şüphelendiğimiz gibi, bunun nedeni PositionsTotal fonksiyonu için parantez çiftini eklemeyi unutmuş olmamızdır. Şimdi parantez çiftini (PositionsTotal()) ekleyin ve kodu derleyin. Şunu da belirteyim, kodun herhangi bir yerinde bildirmediğimiz bir değişkeni kullanırsak da bu hatayı almamız mümkün.
Şekil 15. Tüm derleme Hataları tamamen çözüldü
Müthiş! Tüm derleme hatalarını düzeltebildik. Şimdi kodumuzun hatalarını ayıklamanın ve çalışma zamanı hataları olup olmadığını görmenin zamanı geldi. Bu makalede daha önce açıklandığı için, burada kodumuzdan nasıl hata ayıklayacağımızın ayrıntılarına girmeyeceğiz.
Hata ayıklama oturumu başladığında, başka bir hata fark ediyoruz:
Şekil 16. Kodda hata ayıklanması sırasında gözlemlenen çalışma zamanı hatası
OK düğmesine tıklayın, böylece hatayı oluşturan kod satırına yönlendirileceksiniz.
Şekil 17. Çalışma zamanı hatası oluşturan kod satırını belirleme
Hata, yukarıdaki şekilde görebileceğiniz gibi 172. satırda bu kod tarafından üretiliyor. Hata bir "Array out of range" hatası olduğundan, diziden almayı düşündüğümüz değerin, mevcut dizi değerleri aralığının dışında olduğunu anlıyoruz. Şimdi sorunun ne olduğunu görmek için gösterge arabelleklerini dizilere kopyaladığımız satıra gideceğiz.
//--- Copy the new values of our indicators to buffers (arrays) using the handle if(CopyBuffer(maHandle,0,0,3,maVal)<0) { Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!"); return; } if(CopyBuffer(cciHandle1,0,0,3,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,3,cciVal2)<0) { Alert("Error copying CCI indicator buffer - error:",GetLastError()); return; }
CopyBuffer fonksiyonlarından sadece üç değeri (Bar 0, 1 ve 2) kopyaladığımızı gözlemleyebiliriz, yani sadece maVal[0], maVal[1], ve maVal[2], ayrıca cciVal1[0] , cciVal1[1] ve cciVal1[2] vb. öğelerin dizi değerlerine erişebiliriz. Ancak kodumuzun 172. satırında cciVal1[3] için dizi değerini almaya çalışıyorduk. Hata bu sebeple meydana geldi. Şimdi, hatayı düzeltebilmemiz için hata ayıklayıcıyı durdurun:
Şekil 18. Koddaki hatayı düzeltmek için hata ayıklayıcıyı durdurun
Bunu düzeltmek için Gösterge arabelleklerinden kopyalanacak kayıt sayısını 5'e çıkarmamız gerekiyor; böylece gerekirse cciVal1[0], cciVal1[1], cciVal1[2], cciVal1[3],ve cciVal1[4] dizi değerlerini elde edebileceğiz.
//--- Copy the new values of our indicators to buffers (arrays) using the handle if(CopyBuffer(maHandle,0,0,5,maVal)<0) { Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!"); return; } if(CopyBuffer(cciHandle1,0,0,5,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,5,cciVal2)<0) { Alert("Error copying CCI indicator buffer - error:",GetLastError()); return; }
Kodu gösterildiği gibi düzeltin, ardından hata ayıklayıcıyı yeniden başlatın. Artık herhangi bir hata mevcut değil çünkü Uzman Danışmanımızın alım satım işlemleri gerçekleştirdiğini görüyoruz.
Şekil 19. Tüm hatalar düzeltildi, Uzman Danışman hata ayıklama sırasında alım satım yapıyor
2. Uzman Danışmanı Sınama
Kodumuzun hatasız olduğundan emin olduktan sonra, bize en iyi sonuçları verecek en iyi ayarları alabilmek için artık Uzman Danışmanı sınamanın zamanı geldi. Sınamayı gerçekleştirmek için MetaTrader terminalinde yerleşik bir program olan Strateji Sınama Aracını kullanacağız. Strateji Sınama Aracını başlatmak için Terminal'de Görüntüle menüsüne gidin ve Strateji Sınama Aracını seçin.
Şekil 20. Strateji Sınama Aracını Başlatma
2.1. Uzman Danışmanımızın Ön Sınaması
Bu noktada, Piyasa Penceresindeki mevcut sembolleri kullanarak Uzmanımızı sınamak istiyoruz. Bu sonuçla, Uzmanımızı hangi para birimi çiftleri için daha iyi optimize edebileceğimizi tahmin edebileceğiz. Piyasa Penceresinin, Uzman için hedeflediğiniz para birimlerinin çoğunu içerdiğinden emin olun.
Strateji Sınama Aracı Ayarları Sekmesinde Uzmanı seçin, aklınızdaki dönemi/zaman dilimini seçin (elbette farklı zaman dilimleri için de sınama yapabilirsiniz) ve ardından optimizasyon alanında 'PİYASA İzlemede Tüm Semboller Seçili' seçeneğini seçin. Optimizasyon sonuçları parametresinin hemen önünde, Bakiye + maksimum Kâr Faktörü'nü seçin.
Şekil 21. Piyasa İzleme penceresindeki tüm sembollerle Uzman Danışman ön sınaması
1. Tik oluşturma modunu seçin –(Her Tik)
2. Optimizasyon Türünü Seçin – (Piyasa İzlemede Tüm Semboller Seçili)
3. Optimizasyondan beklenen Sonuç türünü seçin
Çeşitli optimizasyon türlerinin ayrıntılarına terminal yardım belgelerinden erişebilirsiniz. İleriye dönük test yapmıyoruz, bu nedenle İleri'yi Hayır olarak bırakın.
Bu sınama için Girdiler sekmesindeki ana değerler/parametreler (yeşil renkle vurgulanmıştır) kullanılacaktır.
Şekil 22. Ön sınama girdi parametreleri
İşiniz bittiğinde, Ayarlar sekmesine geçin ve Başlat düğmesine tıklayın. Sınamanın tamamlanmasının ardından, Günlük Sekmesinde aşağıdakine benzer bir mesaj göreceksiniz:
Şekil 23. Ön sınama tamamlandı
Sınama tamamlandıktan sonra sonuçları görmek için Optimizasyon Sonuçları Sekmesine gidin.
Şekil 24. Ön sınama optimizasyonu sonuçları
Bizim ilgi alanımız, ayarımıza göre en yüksek Sonucu veren semboldür – (Bakiye + maks. Kâr Faktörü). Bunu elde etmek için Sonuç başlığına tıklayarak en yüksek sonuca sahip sembol en üstte listelenecek şekilde sonucu sıralayalım.
Şekil 25. Ön optimizasyon sonuç analizi
Bu sonuçtan, Uzman Danışmanımızın seçtiğimiz zaman diliminde aşağıdaki semboller (EURUSD, EURJPY, AUDUSD)) için kârlı olabileceğini görebiliyoruz. Bu sınamayı başka bir zaman dilimi için, örneğin 30 dakika için yine gerçekleştirebilir ve neye sahip olduğunuzu görebilirsiniz. Bunu bir ödev olarak görebilirsiniz ve lütfen sonucu paylaşın ki hepimiz öğrenebilelim.
Ön sınamamızın sonucunda, şimdi Uzman Danışmanımızı hangi sembol(ler) ve zaman dilim(ler)i için optimize edeceğimize karar vereceğiz.
Bu örnekte, Uzman Danışmanımızı EURUSD ve 1 Saatlik zaman dilimi için optimize edeceğiz. Az önce yaptığımız seçimi motive eden şeyler nelerdir:
- Kâr Faktörü:
Kâr faktörü, toplam kârın o sınama için olan toplam zarara oranıdır. Kâr faktörü ne kadar yüksek olursa alım satım stratejiniz de o kadar kârlı olur.
- Düşüş yüzdesi:
Bu, öz sermayenin göreli düşüşünü veya öz sermayenin maksimum değerinden en büyük kaybı (yüzde olarak) ifade eder. Düşüş (yüzde olarak) ne kadar düşükse, strateji o kadar iyi olur.
- Kurtarma Faktörü:
Bu, kârın maksimum düşüşe oranıdır. Ticaret stratejisinin riskliliğini yansıtır.
Kullanılacak sembol ve zaman dilimine karar verdikten sonra, şimdi Uzman Danışmanımızı optimize etme zamanı.
2.2. Uzman Danışmanı Optimize Etme
Optimizasyon, Uzman Danışmanda kodlanmış Stratejimizin etkinliğini veya kârlılığını belirleyen çeşitli faktörler (parametreler) ile sınama yaparak Uzman Danışmanımızın performansına ince ayar yapma sürecidir. Sınamaya benzer bir prosedürdür, ancak Uzman Danışmanı yalnızca bir kez sınamak yerine, Girdi sekmesinde seçilen parametrelere bağlı olarak birçok kez sınamayı içerir.
Başlamak için ayarlar sekmesine gidip optimizasyonu etkinleştiriyoruz, ardından optimizasyonumuzdan istediğimiz sonuç türünü seçiyoruz.
Şekil 26. Uzman Danışman için optimizasyon ayarları
1. Tik oluşturma modunu seçin –(Her Tik)
2. Optimizasyon Tipini Seçin –(Hızlı Genetik Tabanlı Algoritma)
3. Optimizasyondan beklenen Sonuç türünü seçin (burada Bakiye + Maks. Kâr Faktörü'nü seçiyoruz)
Çeşitli optimizasyon türlerinin ayrıntılarına terminal yardım belgelerinden erişebilirsiniz. İleri testi yapmıyoruz, İleri kısmını Hayır olarak bırakın. Optimizasyon özelliklerini ayarladıktan sonra Girdiler sekmesinde optimizasyon için kullanılacak parametreleri ayarlayalım.
Şekil 27. Optimizasyon Girdi parametreleri
Optimizasyon yaptığımız için sadece sarı renkle vurgulanan alanlara odaklanacağız. Öncelikle optimizasyonda kullanmak istemediğimiz herhangi bir parametrenin işareti kaldırılmalıdır. Yani, sadece Uzman Danışmanın optimizasyonunda kullanmak istediğimiz parametreleri işaretleyeceğiz. Burada beş parametreyi işaretledim, ancak stratejinizin etkinliğinin dayandığı parametrelere bağlı olarak sadece bir veya iki tanesini işaretlemeye karar verebilirsiniz. Örneğin optimizasyon sonucunun, Uzman Danışmanınıza en iyi performansı veren Göstergelerin her biri için en iyi değeri vermesini sağlayacak şekilde yalnızca Hareketli Ortalama ve CCI dönemlerini seçebilirsiniz. Bu, optimizasyonun özüdür.
Ayrıca, işaretlenen parametre sayısı, Uzman Danışmanınızın geçeceği toplam sınama sayısını belirleyecektir. Neden bahsettiğimi birazdan anlayacaksınız.
Değerleri Ayarlama
Başlat:
Bu, optimizasyon için seçilen değişken için kullanılacak başlangıç değeridir. Değerlerin nasıl ayarlanacağını açıklamak için Zararı Durdur değişkenini kullanalım. Zararı Durdur için, sınama aracının 30 değeriyle başlamasını istedik. Bu, optimizasyon sırasında Zara Durdur için kullanılacak minimum değer olacaktır.
Adım:
Bu, Zararı Durdur için artış değeridir. 2'lik bir artış ayarlarsak; yani ilk sınamada Zarar Durdur için 30 kullanıyorsa, ikincide 32, 36, 34 vb. kullanacaktır… Yani 30 kullanıp ardından 32, 34 vb. kullanacağı anlamına gelmez. Hayır, değerleri rastgele seçer ancak bunlar her zaman Başlangıç değeri ile Durdurma değeri arasında iki (2)'nin katları olacaktır.
Durdur:
Bu, optimizasyon için kullanılacak maksimum veya en yüksek değerdir. Burada 38 olarak belirttik. Bu, test için kullanılacak değerlerin 30 ile 38 arasında olacağı, ancak 2'nin katları olan değerler olacağı anlamına gelir. 40 veya daha büyük bir değeri kullanmaz.
Gerçekleştirilecek toplam sınama sayısı bu üç bölümün ayarlarına bağlıdır. Örneğimizde sınama aracı, Girdiler Sekmesindeki Adımlar sütununda gösterildiği gibi tek başına Zarar Durdur için toplam 5 olasılığı birleştirecek, Kâr Al vb. için toplam 8 olasılığı birleştirecektir. Diğer tüm değişkenleri göz önünde bulundurduğunuzda, yüzlerce veya binlerce olasılığa (sınamalar/geçmeler) ulaşacaktır. Tek bir Uzman Danışmanı optimize etmek için uzun süre beklemek istemiyorsanız, çok fazla değişken eklemediğinizden veya seçmediğinizden emin olun; belki de Uzman Danışmanınızın performansının gerçekten bağlı olduğu sadece iki veya üçü yeterli olacaktır (özellikle, kendi kodunuzda kullanıyorsanız, gösterge dönemleri). Ayrıca adım değerinizin çok fazla olasılık (sınama) ile sonuçlanmadığından emin olmalısınız. Örneğin, adım değeri olarak 1 kullanırsak, yalnızca Zarar Durdurma denemelerinin sayısını bile 10'a çıkarmış oluruz. Daha önce de belirtildiği gibi, bir optimizasyon oturumunu tamamlamak için gereken toplam süre, sisteminizde kurduğunuz toplam kullanılabilir aracı sayısına bağlıdır.
Açıklamanın yeterli olduğuna inanıyorum.
Girdileri ayarlamayı bitirdikten sonra, şimdi Ayarlar sekmesine geri dönüyor ve Başlat Düğmesine tıklıyoruz.
Optimizasyon tamamlandıktan sonra detayları günlük sekmesinde görebiliriz.
Şekil 28. Optimizasyon, Günlük sekmesinde gösterildiği gibi tamamlanmıştır
Her sınama geçildiğinde veya tamamlandığında sonuçları görmek için Optimizasyon Sonuçları sekmesine gidiyoruz. Optimizasyon ayarımıza dayalı olarak, bize en iyi sonucu veren ayarları kolayca belirleyebilmemiz için çıktıyı Sonuçlara göre sıralamak her zaman iyidir. Optimizasyon Sonuçları sekmesindeki Sonuç başlığına tıklayarak, sonuçları artan veya azalan sırada düzenleyebiliriz.
Şekil 29. Optimizasyon raporu
Grafiğin nasıl göründüğünü görmek için Optimizasyon Grafiği sekmesine geçin.
Şekil 30. Optimizasyon grafiği
Ne gördüğünüzü anlamıyor musunuz? Merak etmeyin; gördüğünüz noktalar, seçtiğiniz optimizasyon sonucu türüne dayalı olarak Uzman Danışmanınızın optimizasyon sonucuna oranla geçtiği sınama sayısının bir grafiğidir. Biz burada Bakiye + maksimum Kâr faktörünü seçtik.
2.3. Sonucu yorumlama
Optimizasyon raporunu başarılı bir şekilde yorumlamak için Optimizasyon Sonuçları sekmesine gidin. Kâr faktörü, Beklenen Kazanç, Düşüş Yüzdesi gibi bazı alanları göremediğinizi fark edeceksiniz. Bunları görmek için Optimizasyon Sonuçları sekmesinde herhangi bir yere sağ tıklayın ve aşağıda gösterildiği gibi görmek istediğiniz ek bilgileri seçin:
Şekil 31. Optimizasyon sonucunda Düşüş Yüzdesini seçme
Şekil 32. Optimizasyon sonucunda Kâr Faktörünün seçilmesi
Bu ek kayıtları ekledikten sonra, Uzman Danışmanımız için en iyi ayarlara karar vermek üzere Optimizasyon sonucunu analiz edeceğiz.
Şekil 33. Optimizasyon sonucunu analiz etme
Yukarıdaki şekilde, A ve B olarak etiketlenen vurgulu bölümler, Uzman Danışmanımız için en iyi sonuçları gösterir. Artık yaptığınız seçim tamamen size ait, her şey ne aradığınıza bağlı. Ancak burada sadece en yüksek kârı veren ayarlarla değil, aynı zamanda daha düşük bir düşüş yüzdesine sahip olan ayarlarla da ilgileniyoruz.
Gördüğünüz gibi, A bölümü (sarı renkle vurgulanmıştır) 924.10 kâr ile 22381.71 değerinde en iyi sonuca (Bakiye + maks. Kâr Faktörü) sahipken, B bölümü (yeşil renkle vurgulanmıştır) 936.55 ile daha yüksek bir kâra sahip olsa da 22159.25 değeri ile en iyi ikinci sonucu vermektedir. A bölümü, 1.78'lik daha düşük bir Düşüş Yüzdesine sahipken, 1.95 ile B'nin daha yüksek bir düşüş oranı vardır.
Strateji Sınama Aracı, optimizasyon sonuçlarını "<Client terminal data folder>\Tester\cache" klasörüne kaydeder. Sizin durumunuzda tüm optimizasyon verileri cci_ma_ea.EURUSD.H1.0.xml dosyasına kaydedilecektir.
Dosya adı aşağıdaki forma sahiptir: ExpertName.SYMBOL.PERIOD.GenerationMode.xml, burada:
- ExpertName - Uzman Danışman Adı;
- Symbol - sembol;
- Period - zaman aralığı (M1,H1,...)
- GenerationMode - tik oluşturma modu (0-her tik, 1 - bir dakikalık OHLC, 2 - sadece açılış fiyatları).
XML dosyaları, MS Excel ile açılabilir.
2.4. En İyi Sonucu Seçmek
Sonunda en iyi sonucu elde etmek için Optimizasyon grafiğine tekrar bakmamız gerekiyor. Optimizasyon grafiğine geri dönün. Grafiğin herhangi bir yerine sağ tıklayın ve 1B Grafik'i seçin.
Şekil 34. Sonuç analizi için 1 boyutlu (1B) grafiği seçin
Bununla, en iyi sonucu veren girdi parametrelerinin her birinin değerlerini kolayca görebiliriz. Artık en iyi değeri görebilmek için her bir parametreyi seçmeye başlayabilirsiniz. Grafiğe sağ tıklayın ve X Ekseni'ni seçin, ardından kontrol etmek istediğiniz parametreyi seçin. Aşağıdaki gibi görünecektir (Zararı Durdur için)
Şekil 35. Optimizasyon sonucundan en iyi StopLoss değerini elde etme
Aslında optimizasyon sonucundan en iyi Stoploss'un 34, en iyi TakeProfit'in 78 ve en iyi CCI_Period1'in 62 olduğu çok açıktır. MAPeriod ve CCI_Period2 için en iyi değerleri elde etmek üzere her birini yukarıdaki gibi seçin.
Şekil 36. Optimizasyon sonucundan en iyi Hareketli Ortalama Periyot değerini alma
Bu grafik, en iyi sonucu veren MA_Period olarak 26 değerini gösterir.
Şekil 37. Optimizasyon sonucundan en iyi CCI_Period1 değerini elde etme
Bu grafik, en iyi sonucu veren CCI_Period1 olarak 62 değerini gösterir.
Şekil 38. Optimizasyon sonucundan en iyi CCI_Period2 değerini elde etme
Bu grafik, en iyi sonucu veren CCI_Period2 olarak 28 veya 30 değerini gösterir.
Her parametre için en iyi değerleri elde ettikten sonra, şimdi Uzman Danışmanımızın son sınamasına gelelim.
2.5. Son Sınama
Son sınama, Uzman Danışmanın sınanması için en iyi parametreleri bir araya getirmeyi içerir. Bu durumda, Strateji Sınama Aracının GİRDİ bölümünde keşfettiğimiz en iyi değerleri aşağıda gösterildiği gibi kullanacağız.
Şekil 39. Son sınama girdi parametreleri
Strateji Sınama Aracının AYARLAR sekmesinde, aşağıda gösterildiği gibi Optimizasyonu devre dışı bırakacağız.
Şekil 40. Son sınama ayarları
Şimdi sınamayı başlatmak için BAŞLAT düğmesine tıklayacağız. Sınama tamamlandıktan sonra, aşağıda gösterildiği gibi SONUÇLAR sekmesinde sonuçlarımızı görebiliriz.
Şekil 41. Son sınama sonuçları
Aynı şekilde, GRAFİK sekmesinde sınamanın grafiğini görebiliriz.
Şekil 42. Son sınama grafik sonucu
Sonuç
Bu makalede, kod hatalarını belirleme ve düzeltmenin yollarını tartıştık, ayrıca piyasa gözleminden en iyi sembolü elde etmek üzere bir Uzman Danışmanın nasıl sınanıp optimize edileceğini anlattık.
Bu makalede, Düzenleyiciyi kullanarak kodu hatalara karşı kontrol etmenin ve Strateji Sınama Aracını kullanarak Uzman Danışmanları optimize etmenin ve test etmenin, daha iyi ve kârlı bir Uzman Danışman yazmayı mümkün kıldığını göstermiş olduk.
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/156





- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz