English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Uzman Danışmanlar İçin Özel Optimizasyon Kriterleri Oluşturma

Uzman Danışmanlar İçin Özel Optimizasyon Kriterleri Oluşturma

MetaTrader 5Ticaret | 16 Aralık 2021, 15:50
70 0
Dmitriy Skub
Dmitriy Skub


Tanıtım

MetaTrader 5 Müşteri Terminali, Expert Advisor parametrelerinin optimizasyonu için çok çeşitli fırsatlar sunar. Strateji test cihazında yer alan optimizasyon kriterlerine ek olarak, geliştiricilere kendi kriterlerini oluşturma fırsatı verilir. Bu, Uzman Danışmanların test edilmesi ve optimize edilmesi için neredeyse sınırsız sayıda olanak sağlar. Makale, bu tür kriterleri oluşturmanın hem karmaşık hem de basit olan pratik yollarını açıklar.


1. Strateji Test Cihazının Özelliklerinin Gözden Geçirilmesi

Bu konu birçok kez ele alındı, bu yüzden sadece kısa açıklamalarıyla birlikte bir makale listesi yapacağım. Bu makaleyi okumadan önce aşağıdaki materyallere göz atmanızı tavsiye ederim.

Ve elbette, öncelikle müşteri terminali ile sağlanan belgelendirme ile tanışmanız gerekir.


2. Strateji Test Cihazına Yerleşik Optimizasyon Kriterleri

Belgelere bakarsanız, aşağıdaki açıklamayı bulacaksınız: Optimizasyon kriteri , değeri bir ürünün kalitesini tanımlayan belirli bir faktördür. test edilmiş parametre seti Optimizasyon kriterinin değeri ne kadar yüksekse, verilen parametre seti ile test sonucunun o kadar iyi olduğu kabul edilir.

Burada önemli bir not almalıyız: Bir optimizasyon kriteri sadece genetik algoritma optimizasyon modunda kullanılabilir. Tüm olası parametre değerleri kombinasyonlarının üzerinden geçildiğinde, bir Uzman Danışmanın optimal parametrelerinin seçilmesinde herhangi bir faktör olamayacağı açıktır. Diğer taraf ise, test sonuçlarını kaydedebilir ve ardından optimum parametre kombinasyonunu bulmak için işleyebiliriz.

Belgelerde yazıldığı gibi, strateji test cihazı, genetik algoritma ile kullanılacak aşağıdaki optimizasyon kriterlerini içerir:

  • Bakiye maksimum - bakiyenin en yüksek değeri;
  • Bakiye + maksimum Kar Faktörü - bakiye ve kar faktörünün ürününün en yüksek değeri;
  • Bakiye + maksimum Beklenen Kazanç - bakiyenin ve beklenen getirisinin çarpımının değeri;
  • Bakiye + min Düşüş - bu durumda, bakiye değeri ve drawdown seviyesi dikkate alınır: (%100 - Düşüş)*Bakiye;
  • Bakiye + maksimum Geri Kazanım Faktörü - bakiyenin ve geri kazanım faktörünün ürünü;
  • Bakiye + maksimum Sharpe Oranı - denge ürününün değeri ve Sharpe oranı;
  • Özel maksimum - özel optimizasyon kriteri. Buradaki optimizasyon kriteri, Uzman Danışman’daki OnTester() fonksiyonunun değeridir. Bu parametre, Uzman Danışmanın optimizasyonu için herhangi bir özel değerin kullanılmasına izin verir.

Şekilde gösterildiği gibi strateji test cihazının Ayarlar sekmesinde bir optimizasyon kriteri seçilebilir. 1:

Uzman Danışman

Şekil 1. Uzman Danışman için optimizasyon kriteri seçme

Listede son sırada yer alan Özel makskriteri bizim için en ilginç olanıdır ve kullanımı bu yazının konusunu oluşturmaktadır.


3. Özel Optimizasyon Kriterlerinin Oluşturulması

Yapılması gereken ilk şey, bir kullanıcıya, bir Uzman Danışmanın her çalışmasından sonra strateji test cihazı tarafından hesaplanan parametrelerin (şekil 1'de gösterilenlerle sınırlı değil, ancak özel) serbest kombinasyon imkanını vermektir.

Örneğin, aşağıdaki varyant ilginçtir: Bakiye maks + min Düşüş + İşlem Sayısı - ne kadar çok işlem varsa, sonuç o kadar güvenilir olur. Veya bir sonraki - Bakiye maks + min Drawdown + maks Kar Faktörü. Tabii ki, strateji test ayarlarına dahil olmayan birçok ilginç kombinasyon var.

Bu tür ölçüt kombinasyonlarını basit optimizasyon ölçütleri olarak adlandıralım.

Ancak bu kriterler, bir ticaret sisteminin güvenilir bir tahminini yapmak için yeterli değildir. Ticaret kavramı açısından bakarsak - minimum riskle kar elde etmek - aşağıdaki kriteri varsayabiliriz: ayrı işlemlerin sonuçlarının düz çizgiden minimum sapması ile en yumuşak bir denge eğrisi elde etmek için parametreleri optimize edebiliriz.

Bu kritere denge eğrisi ile optimizasyon kriteri diyelim.

Kullanacağımız bir sonraki optimizasyon kriteri, bir ticaret sisteminin güvenlik katsayısıdır. Bu katsayı https://championship.mql5.com/" makalesinde açıklanmıştır. Bir ticaret sisteminin piyasaya uygunluğunu karakterize eder; Parametrelerin optimizasyonu sırasında bulmamız gereken şey budur. Bir ticaret sisteminin (CSTS) güvenlik katsayısı ile optimizasyon kriteri olarak adlandıralım.

Ayrıca açıklanan kriterleri özgürce birleştirmeyi mümkün kılalım.


4. OnTester() İşlevi

Kod bölümlerini yazmadan önce, strateji test cihazında EA optimizasyonunun özel ölçütlerinin kullanım organizasyonuna bir göz atalım.

Önceden tanımlanmış OnTester() işlevi, özel optimizasyon kriterlerinin oluşturulması için tasarlanmıştır. Belirli bir zaman aralığında bir Uzman Danışman testi her geçtikten sonra otomatik olarak çağrılır. Bu işlev, OnDeinit() işlevinin çağrısından hemen önce çağrılır.

Bir kez daha, OnTester() işlevini kullanmak için, şekil 1'de gösterildiği gibi Hızlı genetik temel algoritma optimizasyon modunu etkinleştirmeniz gerektiğine dikkat edin.

Bu işlev, strateji test cihazında optimizasyon için kullanılan, döndürülen değerin çift biçimine sahiptir.

Belgelere bir kez daha bakın:

Genetik optimizasyonda, bir jenerasyon içindeki sonuçlara azalan yapılı sıralama uygulanır. Yani optimizasyon kriteri açısından en iyi sonuçlar en büyük değerlere sahip olanlardır. Bu şekildeki bir sıralamada, en kötü değerler sonda yer alır. Bu değerler daha sonra dışarı atılırlar ve yeni jenerasyonun oluşumuna katılmazlar.

Bu nedenle, özel bir optimizasyon kriteri oluştururken, Uzman Danışmanın alım satım tahmininde kullanılacak bir integral değeri almamız gerekiyor. Değer ne kadar büyükse, Uzman Danışman işlemleri o kadar iyi olur.


5. Deneysel Uzman Danışman Yazma

Şimdi strateji test cihazında optimize edeceğimiz bir Uzman Danışman yapma zamanı. Bu durumda, temel gereksinimler, rutin optimizasyon prosedürü için çok fazla zaman ayırmamak için basit ve hızlı olmaktır. Ayrıca, Uzman Danışmanın çok kârsız olmaması arzu edilir.

"MQL5'te Trend Bulmanın Birkaç Yolu" makalesinde anlatılan Uzman Danışmanı deneysel olarak alıp geliştirelim. Özellikle, EA, üç hareketli ortalamanın "hayranına" dayanmaktadır. İyileştirme, işlem hızını artırmak için göstergenin kullanılmasından kurtulmak ve kodun hesaplama kısmını EA'nın içinde taşımaktan ibarettir. Bu, test hızını önemli ölçüde artırmaya izin verir (iki yıllık bir aralıkta neredeyse üç kez).

Giriş parametrelerini ayarlama kısmı basittir:

input double Lots = 0.1; 
input int  MA1Period = 200; // period of the greatest moving average
input int  MA2Period = 50;  // period of the medium moving average
input int  MA3Period = 21;  // period of the smallest moving average

Hareketli ortalamaların periyotları, optimize edeceğimiz şeydir.

Uzman Danışmanın yapısı ve işleyişi yukarıda bahsettiğimiz yazıda detaylı olarak anlatılmıştır, o yüzden burayı geçelim. Ana yenilik, başka bir test geçişinin tamamlanması olayının işleyicisidir - OnTester() işlevi. Şu anda boştur ve kontrolü döndürür.

//---------------------------------------------------------------------
//  The handler of the event of completion of another test pass:
//---------------------------------------------------------------------
double OnTester()
{
  return(0.0);
}

EA - FanExpert.mq5 dosyası bu makaleye eklenmiştir. Gerçekleştirilen anlaşmalar açısından bunun FanTrendExpert.mq5 EA ile aynı olduğundan emin olabiliriz. Bir sinyalin varlığının ve yönünün kontrolü, bir grafik üzerinde yeni bir çubuğun açılmasıyla gerçekleştirilir.

Her geçişin sonunda hesaplanan test sonucunu elde etmek için TesterStatistics() kullanılır; test sonucunda hesaplanan istenen istatistiksel değeri döndürür. Yalnızca OnTester() ve OnDeinit() işlevinden çağrılabilir, aksi takdirde sonuç tanımsızdır.

Şimdi özel bir optimizasyon kriteri ekleyelim. En iyi sonuçları kurtarma faktörünün maksimum değeri - maksimum Kurtarma Faktörü temelinde bulmamız gerektiğini varsayalım. Bunu yapmak için, maks. değerlerini bilmemiz gerekir. Testin sonunda para bakiyesinin ve brüt kârın çekilmesi. Geri kazanım faktörü, kârın maksimum düşüş üzerindeki bölümü olarak hesaplanır.

Kurtarma faktörü test işleminin hesaplanan istatistiksel sonuçlarının listesine zaten dahil edilmiş olduğu için bu işlem yalnızca bir örnek olarak yapılır.

Bunu yapmak için OnTester() işlevine aşağıdaki basit kodu ekleyin:

//---------------------------------------------------------------------
//  The handler of the event of completion of another test pass:
//---------------------------------------------------------------------
double OnTester()
{
  double  profit = TesterStatistics(STAT_PROFIT);
  double  max_dd = TesterStatistics(STAT_BALANCE_DD);
  double  rec_factor = profit/max_dd;

  return(rec_factor);
}

Sıfır bölme kontrolü, kolaylaştırmak için koddan çıkarılmıştır. Maksimum düşüm sıfıra eşit olabileceğinden bu kontrol gerçek bir Uzman Danışmanda yapılmalıdır.

Şimdi yukarıda bahsettiğimiz kriteri oluşturalım: Bakiye maks + min Düşüş + İşlem Sayısı - Bakiye + Minimum Düşüş + İşlem Sayısı.

Bunu yapmak için OnTester() işlevini aşağıdaki şekilde değiştirin:

double OnTester()
{
  double  param = 0.0;

//  Balance max + min Drawdown + Trades Number:
  double  balance = TesterStatistics(STAT_PROFIT);
  double  min_dd = TesterStatistics(STAT_BALANCE_DD);
  if(min_dd > 0.0)
  {
    min_dd = 1.0 / min_dd;
  }
  double  trades_number = TesterStatistics(STAT_TRADES);
  param = balance * min_dd * trades_number;

  return(param);
}

Burada düşüşün tersi olan bir değer alıyoruz, çünkü diğer koşulların eşit olduğunu varsayarsak düşüş ne kadar küçükse, durum o kadar iyi olur. 2009.06.01 - 2011.06.03 aralığını ve Н1 zaman çerçevesini kullanarak MA1Period parametresi tarafından oluşturulan optimizasyon kriteri ile FanExpert EA'nın optimizasyonunu çalıştırın. Hareketli ortalamanın değer aralığını 100 ile 2000 arasında ayarlayın.

Optimizasyonun sonunda, en iyi parametrelere göre sıralanmış aşağıdaki değerler tablosunu alırsınız:

Bakiye maks + min Düşüş + İşlem Sayısı kriterine göre optimizasyonun en iyi sonuçları

Şekil 2. Bakiye maks. + min Düşüş + İşlem Sayısı kriterine göre optimizasyonun en iyi sonuçları

En iyi parametreler burada listelenir (Sonuç sütununa göre).

Şimdi en kötü parametrelere bir göz atalım:


Şekil 3. Balance maks. + min Drawdown + Trades Number kriterine göre optimizasyonun en kötü parametreleri

İki tabloyu karşılaştırdığınızda, işlem sayısı ile birlikte düşüş ve kârın dikkate alındığını, yani optimizasyon kriterimizin çalıştığını görebilirsiniz. Ek olarak, optimizasyon grafiğini görebiliriz (doğrusal):

Optimizasyon grafiği

Şekil 4. Bakiye maks. + min Drawdown + İşlem Sayısı kriterine göre optimizasyon grafiği

Yatay eksen optimize edilmiş parametreyi, dikey eksen ise optimizasyon kriterini gösterir. Belirlenen kriterin net maksimumunu görebiliriz; 980 ile 1200 periyot aralığında yer alır.

Bunun tam arama değil, parametrelerin genetik optimizasyonu olduğunu anlamalı ve hatırlamalısınız. Bu nedenle, Şekil 1'de gösterilen tablolar. 2 ve şek. 3, birkaç nesilde doğal seçilimden geçmiş en "uygun" parametreleri içerir. Muhtemelen, bazı başarılı varyantlar atılmıştır.

1106 dönemi için bakiye/özkaynak eğrisi aşağıdaki gibidir:

MA1Period = 1106 dönemi için bakiye/özkaynak eğrisi

Şekil 5. MA1Period = 1106 dönemi için bakiye/özkaynak eğrisi


6. Özel Optimizasyon Kriterleri Sınıflarının Oluşturulması

Böylece, basit optimizasyon kriterlerinin nasıl oluşturulacağını ve kullanılacağını öğrendik. Şimdi Uzman Danışmanlarda kullanımlarını basitleştirmek için bir sınıf yapalım. Bu sınıf için temel gereksinimlerden biri, kullanım kolaylığına ek olarak çalışma hızıdır. Optimizasyon kriterlerinin hesaplamaları hızlı bir şekilde yapılmalıdır, aksi takdirde sonuçlar için çok beklersiniz.

MetaTrader 5, optimizasyon için bulut hesaplama teknolojisinin kullanılmasına izin verir. Çok sayıda parametrenin işlenmesi devasa hesaplama gücü gerektireceği için bu çok büyük bir gelişmedir. Bu nedenle, sınıfımızı geliştirmek için programlama açısından çok şık olmasalar da en basit ve hızlı çözümleri kullanacağız.

Geliştirme için, istemci terminali ile birlikte teslim edilen standart veri organizasyon sınıflarını kullanacağız.

Her şeyden önce, hesaplanan istatistiksel test sonuçlarının türlerini sınıflandıralım:

  • Test sonucu ve optimizasyon kriteri değerleri arasındaki doğru orantılılık ile kayan veya tamsayı türü.

Başka bir deyişle, test sonucunun değeri ne kadar büyükse, optimizasyon kriterinin değeri o kadar iyi ve büyük olur. Böyle bir test sonucunun çarpıcı bir örneği, STAT_PROFIT testinin sonundaki Brüt kârdır. Değer değişken formattadır ve negatif sonsuzdan (aslında mevduat değeri ile sınırlıdır) pozitif sonsuzluğa değişebilir.

Bu türün test sonucunun bir başka örneği, STAT_TRADES işlem sayısıdır. Genel olarak, işlem sayısı ne kadar fazla olursa, optimizasyonun sonucu o kadar güvenilir olur. Değer tamsayı biçimine sahiptir ve sıfırdan pozitif sonsuzluğa değişebilir.

  • Test sonucu ve optimizasyon kriteri değerleri arasındaki ters orantılılığa sahip kayan veya tamsayı türü.

Başka bir deyişle, test sonucunun değeri ne kadar küçükse, optimizasyon kriterinin değeri o kadar iyi ve büyük olur. Bu tür test sonuçlarına bir örnek, STAT_BALANCE_DD para cinsinden maksimum bakiye düşüşü ve diğer düşüşlerdir.

Bu tür bir test sonucunu elde etmek için, optimizasyon kriterinin değerinin hesaplanması için ters bir değer alacağız. Tabii ki, ilgili hatayı önlemek için sıfır bölme kontrolünü uygulamamız gerekiyor.

TCustomCriterion optimizasyonunun özel kriterlerinin oluşturulması için temel sınıf çok basittir. Amacı, temel işlevselliğin belirlenmesidir. Aşağıdaki gibi görünüyor:

class TCustomCriterion : public CObject
{
protected:
  int     criterion_level;        // type of criterion

public:
  int   GetCriterionLevel();
  virtual double  GetCriterion();  // get value of the result of optimization
};

TCustomCriterion::GetCriterion sanal yöntemi, devralınan sınıflarda geçersiz kılınmalıdır. Bu, her test geçişinin sonunda bir Uzman Danışmanın testinin integral sonucunun değerini döndüren ana yöntemdir.

TCustomCriterion::criterion_level sınıf üyesi, bu sınıf örneğinde bulunan özel ölçüt türünü depolar. Nesnelerin türlerine göre ayırt edilmesi için ayrıca kullanılacaktır.

Artık optimizasyon için gerekli tüm sınıfları ondan miras alabiliriz.

TSimpleCriterion sınıfı, belirli bir istatistiksel test sonucuna karşılık gelen "basit" özel ölçütün oluşturulması için tasarlanmıştır. Belirlenmesi aşağıdaki gibi görünüyor:

class TSimpleCriterion : public TCustomCriterion
{
protected:
  ENUM_STATISTICS  stat_param_type;

public:
  ENUM_STATISTICS  GetCriterionType();     // get type of optimized stat. parameter

public:
  virtual double   GetCriterion(); // receive optimization result value
  TSimpleCriterion(ENUM_STATISTICS _stat); // constructor
};

Burada parametreleri olan bir kurucu kullanıyoruz; aşağıdaki gibi uygulanır:

//---------------------------------------------------------------------
//  Constructor:
//---------------------------------------------------------------------
TSimpleCriterion::TSimpleCriterion(ENUM_STATISTICS _stat)
:
stat_param_type( _stat )
{
  criterion_level = 0;
}

MQL5 dilindeki bu yeni özellik, sınıf örnekleri oluştururken kullanıma uygundur. Ayrıca, her test geçişinin sonunda optimizasyon sonucunu almak için kullanılan TSimpleCriterion::GetCriterion sanal yöntemini geçersiz kıldık. Uygulanması basittir:

//---------------------------------------------------------------------
//  Get the result of optimization:
//---------------------------------------------------------------------
double  TSimpleCriterion::GetCriterion()
{
  return(TesterStatistics(stat_param_type));
}

Gördüğünüz gibi, sadece ilgili istatistiksel test sonucunu döndürür.

"Basit" özel optimizasyon ölçütünün sonraki türü, TSimpleDivCriterion sınıfı kullanılarak oluşturulur. Test sonucu ve optimizasyon kriteri değerleri arasında ters orantılı olan kriterlere yöneliktir.

TSimpleDivCriterion::GetCriterion yöntemi aşağıdaki gibi görünür:

//---------------------------------------------------------------------
//  Get value of the optimization result:
//---------------------------------------------------------------------
double  TSimpleDivCriterion::GetCriterion()
{
  double  temp = TesterStatistics(stat_param_type);
  if(temp>0.0)
  {
    return(1.0/temp);
  }
  return(0.0);
}

Bu kod herhangi bir ek açıklama gerektirmez.

TSimpleMinCriterion ve TSimpleMaxCriterion sınıfları kullanılarak diğer iki tür "basit" özel optimizasyon ölçütü oluşturulur. Sırasıyla hem alttan hem de üstten yapılan testlerin istatistiksel sonuçlarının sınırlı değerlerine sahip kriterlerin oluşturulması için tasarlanmıştır.

Optimizasyon sırasında kasıtlı olarak yanlış parametre değerlerini atmanız gerektiğinde faydalı olabilirler. Örneğin, minimum işlem sayısını, maksimum düşüşü vb. sınırlayabilirsiniz.

TSimpleMinCriterion sınıfının açıklaması aşağıdaki gibidir:

class TSimpleMinCriterion : public TSimpleCriterion
{
  double  min_stat_param;

public:
  virtual double  GetCriterion();    // receive optimization result value
  TSimpleMinCriterion(ENUM_STATISTICS _stat, double _min);
};

Burada yapıcıyı iki parametre ile kullanıyoruz. _min parametresi, istatistiksel bir test sonucunun minimum değerini ayarlar. Başka bir test, belirtilenden daha düşük bir değerin elde edilmesiyle sonuçlanırsa, sonuç atılır.

TSimpleMinCriterion ::GetCriterion yönteminin uygulanması şu şekildedir:

//---------------------------------------------------------------------
//  Get value of the optimization result:
//---------------------------------------------------------------------
double  TSimpleMinCriterion::GetCriterion()
{
  double  temp = TesterStatistics(stat_param_type);
  if(temp<this.min_stat_param)
  {
    return(-1.0);
  }
  return(temp);
}

TSimpleMaxCriterion sınıfı benzer şekilde yapılmıştır ve herhangi bir ek açıklama gerektirmez. "Basit" özel ölçütlerin diğer sınıfları, yukarıda açıklananlara benzer şekilde yapılır; bu makaleye eklenmiş CustomOptimisation.mqh dosyasında bulunurlar. Aynı prensip, optimizasyonda kullanılacak başka herhangi bir sınıfı geliştirmek için de kullanılabilir.


Yukarıda açıklanan sınıfları kullanmadan önce, daha uygun bir işlem için bir dizi kriter ile bir konteyner sınıfı yapalım. Bu amaçla, verileri düzenlemek için standart sınıfları da kullanıyoruz. Basit bir ölçüt işlemeye ihtiyacımız olduğundan, bunun için en uygun sınıf CArrayObj'dir. CObject sınıfından devralınan dinamik bir nesne dizisini düzenlemeye izin verir.

TCustomCriterionArray kapsayıcı sınıfının açıklaması çok basittir:

class TCustomCriterionArray : public CArrayObj
{
public:
  virtual double  GetCriterion( );  // get value of the optimization result
};

Yalnızca bir yöntemi vardır - her test geçişinin sonunda optimizasyon ölçütü değerini döndüren TCustomCriterionArray::GetCriterion. Uygulanması aşağıdaki gibidir:

double  TCustomCriterionArray::GetCriterion()
{
  double  temp = 1.0;
  int     count = this.Total();
  if(count == 0)
  {
    return(0.0);
  }
  for(int i=0; i<count; i++)
  {
    temp *= ((TCustomCriterion*)(this.At(i))).GetCriterion();
    if(temp <= 0.0)
    {
      return(temp);
    }
  }

  return(temp);
}

Dikkat etmeniz gereken bir şey: Kriterler işlenirken negatif bir değerle karşılaşırsanız, döngünün daha fazla geçmesi anlamsız hale gelir. Ayrıca iki negatif değerin çarpımı sonucu pozitif bir değer elde ettiğinizde durumu ortadan kaldırır.


7. Özel Optimizasyon Ölçütü Sınıflarını Kullanma

Bu nedenle, Uzman Danışmanların optimizasyonu sırasında "basit" özel ölçütleri kullanmak için her şeye sahibiz. "Deneysel" EA FanExpert'i geliştirme adımlarının sırasını analiz edelim:

  • Özel ölçütlerin sınıflarının açıklamasını içeren içerme dosyasını ekleyin:
#include <CustomOptimisation.mqh>
  • Özel ölçütleri kullanmak için işaretçiyi kapsayıcı sınıfının nesnesine ekleyin:
TCustomCriterionArray*  criterion_Ptr;
  • Özel ölçütleri kullanmak için kapsayıcı sınıfının nesnesine işaretçiyi başlatın:
  criterion_array = new TCustomCriterionArray();
  if(CheckPointer(criterion_array) == POINTER_INVALID)
  {
    return(-1);
  }

OnInit işlevinde yapılır. Nesnenin başarısız oluşturulması durumunda, negatif bir değerle geri dönün. Bu durumda Uzman Danışman çalışmayı durdurur.

  • Uzman Danışmana gerekli optimizasyon kriterlerini ekleyin:
  criterion_Ptr.Add(new TSimpleCriterion(STAT_PROFIT));
  criterion_Ptr.Add(new TSimpleDivCriterion(STAT_BALANCE_DD));
  criterion_Ptr.Add(new TSimpleMinCriterion(STAT_TRADES, 20.0));

Bu durumda, EA'yı maksimum kâr, minimum düşüş ve maksimum işlem sayısıyla optimize etmeye karar verdik. Ek olarak, Uzman Danışmanın yirmiden az işlemle sonuçlanan harici parametre kümelerini atıyoruz.

  • İlgili çağrıyı OnTester işlevine ekleyin:
  return(criterion_Ptr.GetCriterion());
  • OnDeinit işlevinde, kapsayıcı nesnesinin silinmesi için kodu ekleyin:
  if(CheckPointer(criterion_Ptr) == POINTER_DYNAMIC)
  {
    delete(criterion_Ptr);
  }

Optimizasyon ile bu kadar. Optimizasyonu çalıştırın ve her şeyin olması gerektiği gibi çalıştığından emin olun. Bunu yapmak için, aşağıdaki şekilde gösterildiği gibi strateji test cihazının Ayarlar sekmesinde parametreleri ayarlayın:

Strateji test cihazının ayarları

Şekil 6. Strateji test cihazının ayarları

Şekilde gösterildiği gibi strateji test cihazının Giriş parametreleri sekmesinde giriş parametrelerinin optimizasyon aralığını ayarlayın. 7:

Optimize edilmiş giriş parametreleri

Şekil 7. Optimize edilmiş giriş parametreleri

Optimizasyon için "bulut" aracılarını kullanın. Bunu yapmak için Aracılar sekmesinde aşağıdaki parametreleri ayarlayın:

Test etme ajanlarının parametreleri

Şekil 8. Test ajanlarının parametreleri

Şimdi Başlat düğmesine tıklayın (şek.6) ve optimizasyonun tamamlanmasını bekleyin. "Bulut" hesaplama teknolojisini kullanırken, optimizasyon oldukça hızlı yapılır. Sonunda, belirtilen kriterlere göre aşağıdaki optimizasyon sonuçlarını alıyoruz:

Optimizasyon sonuçları

Şekil 9. Optimizasyon sonuçları

"Deneysel" Uzman Danışmanımız başarıyla optimize edildi. "Bulut" aracılarını kullanarak optimize etmek 13 dakika sürmüştür. Bu kriteri kontrol etmek için EA, makaleye eklenen FanExpertSimple.mq5 dosyasındadır.


8. Bakiye Eğrisinin Analizine Dayalı Özel Optimizasyon Kriteri Sınıfı Oluşturma

Bu sınıfın oluşturulmasının temeli "Uzman Danışmanın Çalışması Sırasında Denge Eğrisinin Eğimini Kontrol Etme" makalesidir. Bu optimizasyon kriterinin fikri, denge çizgisinin düz bir çizgiye maksimum derecede yakın olmasını sağlamaktır. Düz bir çizgiye yakınlık derecesi, ondan ticaret sonuçlarının standart sapma değeri ile tahmin edilecektir. Düz bir çizginin denklemi, strateji test cihazındaki anlaşmaların sonuçlarına göre çizilen regresyon çizgisi için hesaplanacaktır.

Negatif sonuç bakiyesi olan eğrileri atmak için ek limitler belirleyin - elde edilen kar belirli bir değerden büyük olmalı ve işlem sayısı belirtilen değerden az olmamalıdır.

Dolayısıyla, optimizasyon kriterimiz, elde edilen kârın limitleri ve işlem sayısı dikkate alındığında, işlem sonuçlarının düz çizgiden standart sapma değeri ile ters orantılı olacaktır.

Optimizasyon kriterini denge eğrisi bazında uygulamak için yukarıda bahsedilen makaleden TBalanceSlope sınıfına ihtiyacımız var. Bunu değiştireceğiz: parametreleri olan yapıcıları kullanın (kolaylık için) ve standart sapma hesaplamasını doğrusal regresyon hesaplamasına ekleyin. Bu kod, makaleye eklenen BalanceSlope.mqh dosyasında bulunur.

Bu optimizasyon kriterini Uzman Danışmana ekleme adımlarının sırası yukarıda açıklananla aynıdır. Şimdi, optimizasyon kriterleri aşağıdaki gibi görünüyor:

criterion_Ptr.Add(new TBalanceSlopeCriterion(Symbol( ), 10000.0));

Denge eğrisi kriterine ek olarak kendi geliştirdiğimiz başka kriterleri de ekleyebiliriz. Okuyucular için, farklı istatistiksel test parametreleri setleriyle deneme yapma olanağı bırakıyorum.

Belirlenen kriterlere göre optimizasyonu gerçekleştirelim. Daha fazla işlem elde etmek için H4 zaman çerçevesini, 2010.01.01 - 2011.01.01 dönemini ve EURUSD sembolünü kullanarak optimizasyonu gerçekleştirin. Bir dizi sonuç alacağız:

Denge eğrisine göre optimizasyonun sonucu

Şekil 10. Denge eğrisi ile optimizasyonun sonucu

Şimdi, optimizasyonun kalitesini tahmin etmemiz gerekiyor. Ana kriterin optimizasyon süresi dışında Uzman Danışman çalışması olduğunu düşünüyorum. Kontrol etmek için 2010.01.01-2011.06.14 dönemi içinde tek bir test yapın.

Optimal parametreler kümesinden iki sonucu (neredeyse aynı sonuçtaki kâr) karşılaştırın - ortadaki bir sonuçla en iyi sonuç. Optimizasyon döneminin dışındaki sonuçlar kırmızı çizgiyle ayrılır:

Optimizasyonun en iyi sonucu

Şekil 11. Optimizasyonun en iyi sonucu

Genel olarak, eğrinin davranışı daha da kötüleşmedi. Karlılık 1,60'tan 1,56'ya hafif bir düşüş gösterdi.

Testin orta sonucu

Şekil 12. Testin orta sonucu

Uzman Danışman, optimizasyon dönemi dışında kârlı değildir. Karlılık 2,17'den 1,75'e önemli ölçüde düştü.

Böylece, denge eğrisinin optimize edilmiş parametrelerin çalışma süresi ile korelasyonu hipotezinin var olma hakkı olduğu sonucuna varabiliriz. Elbette, bir Uzman Danışman için bu kriteri kullanmanın kabul edilebilir bir sonucuna ulaşılamadığında varyantı hariç tutamayız. Bu durumda, bazı ek analizler ve deneyler yapmamız gerekiyor.

Muhtemelen, bu kriter için mümkün olan maksimum süreyi kullanmamız gerekiyor (ama makul). Bu kriteri kontrol etmek için Uzman Danışman, makaleye eklenmiş FanExpertBalance.mq5 dosyasındadır.


9. Güvenli Ticaret Sisteminin (CSTS) Katsayısına Dayalı Bir Özel Optimizasyon Kriteri Sınıfı Oluşturma

"Aşamada Olun" makalesinde açıklandığı gibi, güvenli ticaret sistemi katsayısı (CSTS) aşağıdaki formül kullanılarak hesaplanır:

CSTS = Ort.Kazanç / Ort.Kayıp ((110% - %Kazanç) / (%Kazanç-10%) + 1)

Burada:

  • Ort. Kazanç - karlı bir anlaşmanın ortalama değeri;
  • Ort.Kayıp - kaybedilen bir anlaşmanın ortalama değeri;
  • %Kazanç - karlı anlaşmaların yüzdesi;

CSTS değeri 1'den küçükse, ticaret sistemi yüksek ticaret riski bölgesindedir; daha küçük değerler bile kârsız ticaret bölgesini gösterir. CSTS'nin değeri ne kadar büyükse, ticaret sistemi piyasaya o kadar iyi uyar ve o kadar karlı olur.

CSTS'nin hesaplanması için gereken tüm istatistiksel değerler, her test geçişinden sonra strateji testinde hesaplanır. Geriye TCustomCriterion'dan devralınan TTSSFCriterion sınıfını oluşturmak ve GetCriterion() yöntemini uygulamak kalıyor. Bu yöntemin kodda uygulanması şu şekildedir:

double  TTSSFCriterion::GetCriterion()
{
  double  avg_win = TesterStatistics(STAT_GROSS_PROFIT) / TesterStatistics(STAT_PROFIT_TRADES);
  double  avg_loss = -TesterStatistics(STAT_GROSS_LOSS) / TesterStatistics(STAT_LOSS_TRADES);
  double  win_perc = 100.0 * TesterStatistics(STAT_PROFIT_TRADES) / TesterStatistics(STAT_TRADES);

//  Calculated safe ratio for this percentage of profitable deals:
  double  teor = (110.0 - win_perc) / (win_perc - 10.0) + 1.0;

//  Calculate real ratio:
  double  real = avg_win / avg_loss;

//  CSTS:
  double  tssf = real / teor;

  return(tssf);
}

Sanırım bu optimizasyon kriteri için kısa süreler uygun. Ancak uydurmadan kaçınmak için optimizasyon sonuçlarının ortasında kalan sonuçları almalıyız.

Okurlarımıza kendi başlarına optimizasyon yapma imkanı verelim. Bu kriteri kontrol etmek için Uzman Danışman, makaleye eklenmiş FanExpertTSSF.mq5 dosyasındadır.


Sonuç

Her neyse, itiraf etmelisiniz ki, özel optimizasyon kriterleri (tek bir integral oranı kullanarak) oluşturma olasılığının uygulanmasına yönelik bu kadar basit bir çözüm, diğer varyantlarla karşılaştırıldığında neredeyse mükemmel. Sağlam ticaret sistemlerinin gelişim çıtasını daha yüksek bir seviyeye yükseltmeyi sağlar. "Bulut" teknolojisinin kullanılması, yürütülen optimizasyonların sınırlamasını önemli ölçüde azaltır.

Evrimin başka yolları, farklı bilgi kaynaklarında tanımlanan matematiksel ve istatistiksel olarak doğrulanmış kriterlere bağlanabilir. Bunun için bir aracımız var.


MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/286

Ekli dosyalar |
balanceslope.mqh (14.56 KB)
fanexpert.mq5 (8.82 KB)
fanexperttssf.mq5 (8.86 KB)
Yeni Başlayanlar için MQL5 Sihirbazı Yeni Başlayanlar için MQL5 Sihirbazı
2011'in başlarında MQL5 Sihirbazı'nın ilk sürümünü yayınladık. Bu yeni uygulama, otomatik olarak ticaret robotları oluşturmak üzere basit ve kullanışlı bir araç sağlar. Herhangi bir MetaTrader 5 kullanıcısı, MQL5'te nasıl programlama yapılacağını bile bilmeden özel bir Uzman Danışman oluşturabilir.
MetaTrader 5'te Kendi Kendini Düzenleyen Özellik Haritalarını (Kohonen Haritaları) Kullanma MetaTrader 5'te Kendi Kendini Düzenleyen Özellik Haritalarını (Kohonen Haritaları) Kullanma
Kendi Kendini Düzenleyen Özellik Haritalarının (Kohonen haritaları) en ilginç yönlerinden biri, verileri denetim olmadan sınıflandırmayı öğrenmeleridir. Temel biçiminde, girdi verilerinin (kümeleme) bir benzerlik haritası üretir. SOM haritaları, yüksek boyutlu verilerin sınıflandırılması ve görselleştirilmesi için kullanılabilir. Bu yazıda Kohonen haritalarının birkaç basit uygulamasını ele alacağız.
MQL5'te Gelişmiş Uyarlanabilir Göstergeler Teorisi ve Uygulaması MQL5'te Gelişmiş Uyarlanabilir Göstergeler Teorisi ve Uygulaması
Bu makale, gelişmiş uyarlanabilir göstergeleri ve bunların MQL5'teki uygulamalarını açıklayacaktır: Uyarlanabilir Siber Döngü, Uyarlanabilir Ağırlık Merkezi ve Uyarlanabilir RVI. Tüm göstergeler ilk olarak John F. Ehlers tarafından "Hisse Senetleri ve Vadeli İşlemler için Sibernetik Analiz" bölümünde sunuldu.
İstatistiksel Tahminler İstatistiksel Tahminler
Matematiksel model ve yöntemlerin çoğu farklı varsayımlara dayandığı için bir dizinin istatistiksel parametrelerinin tahmini çok önemlidir. Örneğin, dağılım yasasının normalliği veya ayrılma değeri veya diğer parametreler. Bu nedenle, zaman serilerini analiz ederken ve tahmin ederken, ana istatistiksel parametreleri hızlı ve net bir şekilde tahmin etmeye izin veren basit ve kullanışlı bir araca ihtiyacımız var. Makale, rastgele bir dizinin en basit istatistiksel parametrelerini ve görsel analizinin çeşitli yöntemlerini kısaca açıklamaktadır. Bu yöntemlerin MQL5'te uygulanmasını ve Gnuplot uygulamasını kullanarak hesaplama sonuçlarının görselleştirilmesi yöntemlerini sunar.