English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5'te Uzman Danışmanları Test Etme ve Optimize Etme Kılavuzu

MQL5'te Uzman Danışmanları Test Etme ve Optimize Etme Kılavuzu

MetaTrader 5Sınayıcı | 9 Aralık 2021, 11:17
209 0
Samuel Olowoyo
Samuel Olowoyo

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.

Uzman Danışman kodundaki derleme hataları

Ş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.

Kod hatalarını belirleme ve çözme-1

Ş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ı

Ş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

Ş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ç

Ş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

Ş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:

Kodda çözülmesi gereken daha fazla hata mevcut

Ş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.

Kod hata satırını bulmanın başka bir yolu

Ş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.

Kod hata satırını bulma

Ş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:

Uyarı işareti

Ş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:

Kodda hala hatalar var

Ş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

Ş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

Ş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ı? 

Kodda daha fazla hata beliriyor

Ş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

Koddaki hatalar önemli ölçüde azaldı

Ş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ü

Ş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ı

Ş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.

Çalışma zamanı hatası oluşturan kod satırını belirleme

Ş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ı durdurma

Ş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 hata ayıklama sırasında alım satım yapıyor

Ş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

Ş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 34. Piyasa İzleme penceresindeki tüm sembollerle Uzman Danışman ön sınaması

Ş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 35. Ön sınama girdi parametreleri

Ş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 36. Ön sınama tamamlandı

Şekil 23. Ön sınama tamamlandı

Sınama tamamlandıktan sonra sonuçları görmek için Optimizasyon Sonuçları Sekmesine gidin.

Şekil 37. Ön sınama optimizasyon sonuçları

Ş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 38. Ön optimizasyon sonuç analizi

Ş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 39. Uzman Danışman için optimizasyon ayarları

Ş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 40. Optimizasyon Girdi parametreleri

Ş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 43. Optimizasyon, Günlük sekmesinde gösterildiği gibi tamamlanmıştır

Ş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 44. Optimizasyon raporu

Şekil 29. Optimizasyon raporu

Grafiğin nasıl göründüğünü görmek için Optimizasyon Grafiği sekmesine geçin.

Şekil 45. Optimizasyon grafiği

Ş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 46. Optimizasyon sonucunda Düşüş Yüzdesini seçme

Şekil 31. Optimizasyon sonucunda Düşüş Yüzdesini seçme

 Şekil 47. Optimizasyon sonucunda Kâr Faktörünün seçilmesi

Ş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.

Optimizasyon raporu Analizi

Ş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.

1 boyutlu grafik formu optimizasyon grafiğini seçme

Ş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 50. Optimizasyon sonucundan en iyi StopLoss değerini elde etme

Ş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 51. Optimizasyon sonucundan en iyi Hareketli Ortalama Periyot değerini alma

Ş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 52. Optimizasyon sonucundan en iyi CCI_Period1 değerini elde etme

Ş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 53. Optimizasyon sonucundan en iyi CCI_Period2 değerini elde etme

Ş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.

Son sınama için girdi değerleri

Ş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.

Son sınama için ayarlar

Ş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 56. Son sınama sonuçları

Şekil 41. Son sınama sonuçları

Aynı şekilde, GRAFİK sekmesinde sınamanın grafiğini görebiliriz.

Şekil 57. Son sınama grafik sonucu

Ş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

Ekli dosyalar |
cci_ma_ea.mq5 (14.23 KB)
MetaTrader 5 Emirler, Pozisyonlar ve Yatırımlar MetaTrader 5 Emirler, Pozisyonlar ve Yatırımlar
Güçlü bir alım satım robotu oluşturmak, MetaTrader 5 alım satım sisteminin mekanizmalarını anlamadan yapılamaz. Müşteri terminali, alım satım sunucusundan pozisyonlar, emirler ve yatırımlar hakkında bilgi alır. Bu verileri MQL5 kullanarak düzgün bir şekilde kullanmak için MQL5 programı ve müşteri terminali arasındaki etkileşimin iyi anlaşılması gerekir.
Uyarlanabilir Alım Satım Sistemleri ve Bunların MetaTrader 5 Müşteri Terminalinde Kullanımları Uyarlanabilir Alım Satım Sistemleri ve Bunların MetaTrader 5 Müşteri Terminalinde Kullanımları
Bu makale, her biri kendi "sanal" alım satım işlemlerini gerçekleştiren birçok stratejiden oluşan uyarlanabilir bir sistemin bir varyantını önermektedir. Şu anda gerçek alım satım en kârlı stratejinin sinyallerine göre gerçekleştirilir. Nesne yönelimli yaklaşımın kullanılması, verilerle çalışmak için sınıfların olması ve Standart kütüphanenin alım-satım sınıfları sayesinde sistemin mimarisi basit ve ölçeklenebilir görünüyordu; Artık yüzlerce alım satım stratejisini içeren uyarlanabilir sistemleri kolayca oluşturmak ve analiz etmek mümkün.
MetaTrader 5 Alım Satım Olayları MetaTrader 5 Alım Satım Olayları
Bir alım satım hesabının mevcut durumunun izlenmesi, açık pozisyonların ve emirlerin kontrol edilmesini gerektirir. Bir alım satım sinyali bir yatırım haline gelmeden önce, müşteri terminalinden alım satım sunucusuna bir istek olarak gönderilmeli ve işlenmeyi bekleyen emir kuyruğuna yerleştirilmelidir. Alım satım sunucusundan gelen bir isteği kabul etmek, süresi dolduğunda silmek veya bir anlaşma yürütmek - tüm bu eylemlerin ardından alım satım etkinlikleri gelir ve alım satım sunucusu, terminali onlar hakkında bilgilendirir.
Bill Williams'ın "Yeni Ticaret Boyutları" kitabına dayanan Uzman Danışman Bill Williams'ın "Yeni Ticaret Boyutları" kitabına dayanan Uzman Danışman
Bu makalede, Uzman Danışmanın Bill Williams tarafından yazılan "New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds and Commodities” (Yeni Ticaret Boyutları: Hisse Senetleri, Tahviller ve Emtialardaki Kaostan Nasıl Kar Edilir) kitabına dayanarak geliştirilmesini ele alacağım. Stratejinin kendisi iyi bilinmektedir ve kullanımı yatırımcılar arasında hala tartışmalıdır. Makale, sistemin alım satım sinyallerini, uygulanmasının özelliklerini ve geçmiş veriler üzerinde test sonuçlarını dikkate almaktadır.