English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Karı Geri Çekme İşlemlerini Modellemek için TesterWithdrawal() İşlevini Kullanma

Karı Geri Çekme İşlemlerini Modellemek için TesterWithdrawal() İşlevini Kullanma

MetaTrader 5Sınayıcı | 15 Aralık 2021, 10:41
82 0
Andriy Voitenko
Andriy Voitenko

Giriş

Spekülatif alım satımın amacı kar elde etmektir. Genellikle, bir alım satım sistemi test edildiğinde, şunun dışındaki tüm yönler analiz edilir: Kazanılan paranın bir kısmını yaşamak için geri çekmek. Alım satım, yatırımcı için tek para kaynağı olmasa dahi, bir alım satım dönemi (ay, üç aylık dönem, yıl) için planlanan karla ilgili sorular er ya da geç ortaya çıkar. MQL5'teki TesterWithdrawal() işlevi, hesaptan para çekme işlemlerini taklit etmeye yöneliktir.


1. Neleri Kontrol Edebiliriz?

Riskli bir durumda fazla para çekmeyi gerektiren alım satım sistemlerinin yanı sıra alım satım işlemi hakkında birtakım görüşler vardır. Toplam sermayenin yalnızca küçük bir kısmı alım satım hesabındadır; bu, bazı öngörülemeyen durumlardan dolayı tüm paranın kaybedilmesine karşı bir korumadır.

Bu, pratik olarak, Para Yönetimi stratejilerinin bir örneğidir. Yönetim için yatırımları kabul eden birçok fon, her yatırımcıya belirli bir kota (toplam sermayenin bir kısmı) koyar fakat sermayenin tamamı asla yatırımcılara verilmez. Başka bir deyişle, açılan pozisyonların hacmindeki limitlere ek olarak, bir yatırımcının kontrol edebileceği sermaye üzerinde sınırlamalar vardır. Nihayetinde, her yatırımcı riskli spekülasyonlar yapmak için varlıkların yalnızca küçük bir kısmına erişime sahiptir.

Başka bir sorun, test sırasında kazanılan varlıkların agresif bir şekilde yeniden yatırımıdır. Yatırımcılar, optimizasyon sırasında bakiye ve hisse senedi çizgilerini dikey olarak yükseltmeyi hedefler. Herkes her para düzeyinde belirli kurallar olduğunu anlasa da, 0,1 lot ile alım satımda karlı bir sistemin 100 lot alım satımında iyi olduğuna inanmanın hiçbir anlamı yoktur.

Ayrıca, psikolojik bir sorun var - Her uygulayıcı yatırımcı, bunu yapmamaya söz vermiş olsa da, hesaptaki belirli bir para düzeyinde alım satım sisteminin çalışmasına müdahale etmeyi kabul edebilir. Dolayısıyla, bu açıdan bakıldığında, fazlalıkları geri çekmek, alım satımda dengeleyici bir faktördür.

MQL5'te bir Expert Advisor testi sırasında para çekme işlemini gerçekleştirmeyi amaçlayan bir işlev vardır. Bir sonraki bölüm bu konuya ayrılmıştır.


2. İşlev Nasıl Kullanılır?

TesterWithdrawal() işlevi yalnızca strateji test cihazında hesaptan para çekmenin modellenmesi için tasarlanmıştır ve Expert Advisor'ın normal modda çalışmasını etkilemez. 

bool TesterWithdrawal(double money);

Para giriş parametresi, para yatırma para biriminde çekilecek para miktarını belirtmek için tasarlanmıştır. Döndürülen değere göre işlemin başarılı olup olmadığını anlayabilirsiniz. Test sırasında gerçekleştirilen her para çekme işlemi, Şekil 1'de gösterildiği gibi "Günlük" sekmesinde ve "Sonuçlar" sekmesinde karşılık gelen girişle gösterilir.

Test sırasında varlıkların başarıyla geri çekilmesiyle ilgili girişler

 Şekil 1. Test sırasında varlıkların başarıyla geri çekilmesiyle ilgili girişler

Para çekme boyutunun serbest marj boyutunu aşması ve para çekme işleminin gerçekleştirilmemesi durumunda, "Günlük"te aşağıdaki giriş görünür:

 Test sırasında başarısız olan geri çekme işlemiyle ilgili giriş

Şekil 2. Test sırasında başarısız olan para çekme işlemiyle ilgili giriş

Bu işlev çağrılırken, mevcut bakiye ve hisse senedi boyutu çekilen para miktarı kadar azalır. Ancak, strateji test cihazı, kar ve zararı hesaplarken para çekilmesini dikkate almaz fakat şekil 3'te gösterildiği gibi "Para Çekme" oranındaki toplam para çekme tutarını hesaplar.

Rapordaki toplam para çekme tutarının oranı

Şekil 3. Rapordaki toplam para çekme tutarının oranı

MQL5'te bir alım satım hesabına para yatırma varlıklarının ters bir işlevinin henüz mevcut olmadığına ve muhtemelen uygulanmayacağına dikkat edilmelidir. Sürekli mevduat artışı gerektiren sistemlere kim ihtiyaç duyar?

Sonraki bölüm, yalnızca uygulanan bir alım satım stratejisiyle değil, aynı zamanda gözlemlediğimiz işlevi kullanarak para çekme işlemlerini modellemek için bir araç kitiyle bir Expert Advisor örneğine ayrılmıştır.


3. Test için Gine Domuzu

  
Testi oldukça basit bir Expert Advisor üzerinde gerçekleştireceğiz. Expert Advisor'ın çalışma prensipleri ile ilgilenenler aşağıda alım satım sisteminin açıklamasını bulabilirler.

Fiyatın maksimum ve minimum değerleri, PERIOD giriş değişkeni kullanılarak belirlenen 5M verisinin belirli bir döneminde hesaplanır. Hesaplanan düzeyler, destek (CalcLow değişkeni) ve direnç (CalcHigh değişkeni) çizgileri ile yatay bir kanal oluşturur. Bekleyen talimatlar kanalın sınırlarına yerleştirilir. Oyun kanalın piercinginde oynanır.

Fiyat, INSIDE_LEVEL giriş değişkeninin değerinden daha az olmamak üzere kanalın içine girdiğinde bekleyen bir talimat verilir. Ayrıca, tek yönde yalnızca bir pozisyon veya bekleyen talimat açılabilir.

Düzeyler yeniden hesaplandığında kanal daralırsa ve fiyat hala bunun içinde kalırsa bekleyen talimat piyasa fiyatına yaklaşır. Bekleyen talimatları taşıma adımı, ORDER_STEP giriş değişkeni kullanılarak ayarlanır.

Bir yatırımdan elde edilen karın boyutu, TAKE_PROFIT giriş değişkeninde belirtilir ve maksimum zarar, STOP_LOSS kullanılarak belirtilir. 

Expert Advisor, TRAILING_STOP giriş değişkeninde belirtilen bir adımla Zararı Durdurun taşınmasını gerektirir.

Hem sabit bir lotla hem de para yatırma yüzdesi olarak hesaplanan bir lotla alım satım işlemi yapabilirsiniz. Lot değeri, LOT giriş değişkeni kullanılarak ve lot hesaplama yöntemi, LOT_TYPE değişkeni kullanılarak belirlenir. Lotu düzeltme olasılığı vardır (LOT_CORRECTION = true). Sabit bir lot ile alım satım işlemi yapıyorsanız ve boyutu bir pozisyon açmak için izin verilen boyutu aşarsa lot boyutu izin verilen en yakın değere göre düzeltilir.

Expert Advisor'ın algoritmasının ayarlanması için günlük yazma işlevini açabilirsiniz (WRITE_LOG_FILE = true). Böylece, tüm alım satım işlemleri ile ilgili girişler log.txt metin dosyasına yazılacaktır.

Para çekme işlemlerini yönetmek için Expert Advisor'a birkaç giriş değişkeni ekleyelim.

İlk parametreler, varlıkları geri çekme olasılığının bir işareti olarak kullanılacaktır.

input bool WDR_ENABLE = true; // Allow withdrawal

 İkinci parametre para çekme dönemini belirleyecektir.

enum   wdr_period
  {
   days      = -2, // Day
   weeks     = -1, // Week 
   months    =  1, // Month  
   quarters  =  3, // Quarter
   halfyears =  6, // Half a year    
   years     = 12  // Year    
  };
input wdr_period WDR_PERIOD = weeks; // Periodicity of withdrawals
 Üçüncü parametre, çekilecek para miktarını belirleyecektir.
input double WDR_VALUE = 1; // Amount of money to be withdrawn

Dördüncü parametre, çekilecek tutarın hesaplama yöntemini belirleyecektir.

enum lot_type 
   {
      fixed,  // Fixed
      percent // Percentage of deposit
   };
input lot_type WDR_TYPE = percent; // Method of calculation of the withdrawal amount

Hesaptan tek seferlik para çekme miktarını hesaplamak için wdr_value kullanılır. Toplam çekilecek para miktarını hesaplamak için wdr_summa değişkeni kullanılır.

Ayrıca, wdr_count değişkenini kullanarak toplamda kaç başarılı para çekme işlemi yapıldığını hesaplayacağız. Bu değişkenlerin değerleri, testin sonucu hakkında kendi raporumuzu oluşturmamız için gereklidir. Para çekmenin tüm işlevselliği aşağıdaki işlevde uygulanır.

//--- Function of withdrawing assets from the account
//+------------------------------------------------------------------+
bool TimeOfWithDrawal()
//+------------------------------------------------------------------+
  {
   if(!WDR_ENABLE) return(false); // exit if withdrawal is prohibited
   
   if( tick.time > dt_debit + days_delay * DAY) // periodic withdrawals with specified period
     {
      dt_debit = dt_debit + days_delay * DAY;
      days_delay = Calc_Delay();// Updating the value of period-number of days between withdrawal operations
      
      if(WDR_TYPE == fixed) wdr_value = WDR_VALUE;
      else wdr_value = AccountInfoDouble(ACCOUNT_BALANCE) * 0.01 * WDR_VALUE;

      if(TesterWithdrawal(wdr_value))
        {
         wdr_count++;
         wdr_summa = wdr_summa + wdr_value;
         return(true);
        }
     }
   return(false);
  }

Şimdi Expert Advisor'ımızı optimizasyon modunda test etmek üzere hazırlamamız gerekiyor. Birkaç optimizasyon parametresi olacak; bu nedenle gerekli parametreyi seçeceğimiz bir giriş değişkeni bildirelim.

enum opt_value
{
   opt_total_wdr,      // Total sum of withdrawal
   opt_edd_with_wdr,   // Drawdown with consideration of withdrawal
   opt_edd_without_wdr // Drawdown without consideration of withdrawal
};
input opt_value OPT_PARAM = opt_total_wdr; // Optimization by the parameter

Ayrıca Expert Advisor'a önemli bir işlev daha eklememiz gerekiyor - OnTester(); bu işlevin döndürülen değeri optimizasyon kriterini belirler.

//--- Displaying information about testing
//+------------------------------------------------------------------+
double OnTester(void)
//+------------------------------------------------------------------+
  {
   //--- Calculation of parameters for the report
   CalculateSummary(initial_deposit);
   CalcEquityDrawdown(initial_deposit, true, false);
   //--- Creation of the report
   GenerateReportFile("report.txt");

   //--- Returned value is the optimization criterion
   if (OPT_PARAM == opt_total_wdr) return(wdr_summa);
   else return(RelEquityDrawdownPercent);
  }

Bir sonraki bölüm, Expert Advisor'ımızın testlerinin ayrıntılı değerlendirmesine ayrılmıştır.


4. Expert Advisor'ı Test Etme

Testin bütünlüğü için öncelikle para çekme işlevi devre dışı olan Expert Advisor'ımızın test sonuçlarını almamız gerekiyor. Bunu yapmak için, test etmeden önce, Şekil 5'te gösterildiği gibi "Allow withdrawal" parametresini false olarak ayarlayın.

Test sonuçlarını tekrarlamak isteyenler için Expert Advisor'ın giriş parametrelerinin ayarları ve değerleri aşağıda şekil 4'te ve 5'te verilmiştir.

Expert Advisor'ı test etme ayarları

Şekil 4. Expert Advisor'ı test etme ayarları

 Para çekme işlevi olan Expert Advisor'ın parametreleri

Şekil 5. Para çekme işlevi devre dışı bırakılan Expert Advisor'ın parametreleri

Test sonunda elde edilen sonuçlar şekil 6 ve 7'de gösterilmiştir.

Expert Advisor'ın 6 aylık test çalışması için bakiye değişikliği

  Şekil 6. Expert Advisor'ın 6 aylık test çalışması için bakiye değişikliği 

 Expert Advisor'ın çalışma sonuçları tablosu

Şekil 7. Expert Advisor'ın çalışma sonuçları tablosu

Bizim için ilginç olan parametre, hisse senedinin göreceli düşüşüdür. Bu durumda, %4,75'e eşittir. 

Şimdi para çekme işlemlerini etkinleştirirsek bu parametrenin nasıl değişeceğini kontrol edelim. Farklı para çekme miktarları ve dönemleri ile testler yapalım.

Şekil 8'de, optimizasyon ve para çekme işlevi etkinleştirilmiş olan Expert Advisor'ın parametreleri ve şekil 9'da, bu tür testlerin sonuçları gösterilmiştir.

Optimizasyon ve para çekme işlevi etkinleştirilmiş Expert Advisor'ın parametresi

Şekil 8. Optimizasyon ve para çekme işlevi etkinleştirilmiş Expert Advisor'ın parametresi

Hisse senedinin göreceli düşüşünün hesaplamasına ilişkin sonuçlar

Şekil 9. Hisse senedinin göreceli düşüşünün hesaplanmasına ilişkin sonuçlar

Testin sonuçları biraz şaşırtıcıdır; zira bir günlük veya bir haftalık para çekme dönemi ile düşüş, para çekme işleminin devre dışı bırakıldığı duruma göre daha düşüktür.

Ayrıca, günlük düşüş çizgisi %100'e yükselir ve ardından %8'e geri döner ve düşmeye devam eder. Sonuçları doğru bir şekilde yorumlamak için, strateji test cihazında hisse senedinin göreceli düşüşünün nasıl hesaplandığını bilmeniz gerekir. Bu, sonraki bölümün konusu.


5. Hisse Senedi Düşüşünü Hesaplama

Meraklı beyinler, strateji test cihazında hisse senedi hesaplamasının nasıl yapıldığını ve bu parametrenin kendi başlarına nasıl hesaplanacağını bilmek isteyeceklerdir.

Expert Advisor'ımızda TesterWithdrawal() işlevi kullanılmıyorsa analiz ettiğimiz parametrenin hesaplanmasının MetaTrader 4'teki hesaplamasından hiçbir farkı yoktur; bu, "Expert Test Raporundaki Rakamlar Ne Anlama Geliyor?" makalesinde anlatılmış olup bunun kaynak kodu ve ortaya çıkan test cihazı sonuç raporunun diğer birçok parametresi "Expert Test Sonuçları Nasıl Değerlendirilir?" makalesinde ele alınmıştır.

Strateji test cihazında göreceli ve maksimum düşüşün hesaplanmasının görsel açıklaması aşağıda şekil 10'da verilmiştir.

Para çekme işlemleri dikkate alınmadan hisse senedi düşüşlerinin hesaplanması 

Şekil 10. Para çekme işlemleri dikkate alınmadan hisse senedi düşüşlerinin hesaplanması

Çalışması sırasında, strateji test cihazı, hisse senedinin mevcut maksimum ve minimum değerlerini belirler. Grafikte mavi onay işareti ile işaretlenen yeni bir hisse senedi en üst değerinin görünmesiyle, maksimum ve minimum düşüşler yeniden hesaplanır ve en büyük değer sonuç raporunda görüntülenmek üzere kaydedilir.

Önemli olan, testin sonunda parametrelerin son olarak yeniden hesaplanmasıdır; zira kayıt dışı son hisse senedi uçdeğerinin maksimum düşüş değerini verdiği bir durum ortaya çıkabilir. Düşüşlerin maksimum değerlerindeki değişimler sırasıyla mavi ve kırmızı renklerle gösterilmiştir. Gri renk, yeni en üst değerin her gelişinde kaydedilen düşüşü temsil eder.

TesterWithDrawal() işlevinin çağrısının, strateji test cihazındaki düşüşlerin hesaplama algoritmasını değiştirdiğine dikkat edilmelidir. Önceki varyanttan farkı, düşüş değerlerinin yalnızca yeni hisse senedi en üst değerlerinin gelmesinde değil, aynı zamanda varlıkların geri çekilmesinde de yeniden hesaplanmasıdır. Bunun görsel gösterimi şekil 11'de verilmiştir.

Geri çekilmeleri dikkate alarak düşüşleri hesaplama 

Şekil 11. Geri çekilmeleri dikkate alarak düşüşleri hesaplama

Varlıkların geri çekilme anı, yukarıdaki resimde yeşil onay işaretleriyle gösterilmiştir. Para çekme işlemleri oldukça sık olduğu için grafikteki uçdeğerler tarafından belirlenen maksimum düşüş değerlerinin sabitlenmesine izin vermez. Sonuç olarak, geri çekme dikkate alındığında ortaya çıkan düşüş, şekil 9'da belirtilenler dikkate alınmadan daha düşük olabilir.

Kar elde etmenin sonucu olarak para çekme miktarı hisse senedinin büyümesinden çok daha büyükse bu, düşük düşüş oranlarına yol açabilir. Bunun nedeni durumun grafikte uçdeğerlerin oluşmasına izin vermemesidir ve sınırda, göreceli düşüşün sıfır eğiliminde olduğu düz bir azalan çizgi gibi görünecektir. Bu etki, şekil 9'da gösterilen grafikte günlük 1000$'dan fazla para çekme ile ortaya çıkmaya başlamıştır.

Tüm algoritmayı aşağıda açıklandığı gibi tek CalcEquityDrawdown prosedüründe birleştirerek MQL5'te hisse senedinin maksimal ve göreceli düşüş hesaplamasını yeniden üretelim.

double RelEquityDrawdownPercent; // relative drawdown of equity in percentage terms
double MaxEquityDrawdown;        // maximal drawdown of equity
//--- Calculation of the drawdown of equity
//+------------------------------------------------------------------+
void CalcEquityDrawdown(double initial_deposit, // initial deposit
                        bool finally)          // flag of calculation that registers extremums
//+------------------------------------------------------------------+
  {
   double drawdownpercent;
   double drawdown;
   double equity;
   static double maxpeak = 0.0, minpeak = 0.0;

   //--- exclusion of consideration of profit withdrawals for the calculation of drawdowns
   if(wdr_ignore) equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
   else equity = AccountInfoDouble(ACCOUNT_EQUITY);

   if(maxpeak == 0.0) maxpeak = equity;
   if(minpeak == 0.0) minpeak = equity;

   //--- check of conditions of extremum
   if((maxpeak < equity)||(finally))
    {
      //--- calculation of drawdowns
      drawdown = maxpeak - minpeak;
      drawdownpercent = drawdown / maxpeak * 100.0;

      //--- Saving maximal values of drawdowns
      if(MaxEquityDrawdown < drawdown) MaxEquityDrawdown = drawdown;
      if(RelEquityDrawdownPercent < drawdownpercent) RelEquityDrawdownPercent = drawdownpercent;
    
      //--- nulling the values of extremums
      maxpeak = equity;
      minpeak = equity;
    }

   if(minpeak > equity) minpeak = equity;
 }

Hesaplamaların hassaslığı korumak için her yeni tick geldiğinde ve aşağıda verilen parametrelerle Expert Advisor'ımızın gövdesinden yukarıda yazılan prosedürü çağırmamız gerekir.

CalcEquityDrawdown(initial_deposit, false);

Ayrıca, düşüşlerin güvenilir değerlerini elde etmek için, OnTester() işlevinde Expert Advisor'ın sonunda, hesaplamanın sona erdiğini gösteren finally = true parametreleri ile çağrılmalıdır. Ve mevcut sabitlenmemiş düşüş, kaydedilen en üst değerden büyükse maksimum olanın yerini alacak ve sonuç raporunda gösterilecektir.

CalcEquityDrawdown(initial_deposit, true);

Para çekme algoritması bir Expert Advisor'da uygulanmışsa, düşüşlerin doğru hesaplanması için, her para çekme işlemi yapıldığında finally=true parametresiyle CalcEquityDrawdown işlevini çağırmanız gerekir. Çağırma sırası şu şekilde olabilir:

//--- Withdrawing assets and calculating drawdowns of equity
if(TimeOfWithDrawal())
    CalcEquityDrawdown(initial_deposit, true);
else 
    CalcEquityDrawdown(initial_deposit, false);

Yukarıda açıklanan metodolojinin doğruluğundan emin olmak için hesaplanan verileri strateji test cihazının verileriyle karşılaştıralım. Bunu yapmak için, OnTester() işlevinin kontrol etmek istediğimiz parametrenin değerini döndürmesini sağlamamız gerekir - RelEquityDrawdownPercent değişkeninde saklanan hisse senedinin göreceli düşüşü.

Bu, "Parametreye göre optimizasyon" giriş parametresi için "Çekilme dikkate alınarak düşüş" değeri ayarlanarak Expert Advisor kodunda uygulanır. Geri kalan parametreler, şekil 8'de gösterildiği gibi değişiklik yapılmadan bırakılmalıdır. Bu tür testlerin sonuçları şekil 12'de verilmiştir.

 Hesaplamalarımızın sonuçlarının strateji test cihazının verileriyle karşılaştırılması

Şekil 12. Hesaplamalarımızın sonuçlarının strateji test cihazının verileriyle karşılaştırılması

Elde edilen sonuçların karşılaştırılması, göreceli düşüş hesaplama algoritmasının doğru olduğunu kanıtlamaktadır.

Düşüş hesaplamasına başka bir varyant ekleyelim. Bu noktada, para çekme işlemlerinin hisse senedi üzerindeki etkisini hariç tutacağız ve hisse senedinin göreceli düşüşünün değişimini gözlemleyeceğiz.

Bu amaçla Expert Advisor'a bir değişken ekleyelim; bunu Expert Advisor'ın parametrelerini hesaplarken para çekme işlemlerinin dikkate alınmasının gerekli olup olmadığını belirlemek için kullanacağız.

bool wdr_ignore; // calculation of rate without the consideration of withdrawals

"Parametreye göre optimizasyon" değişkeni "Çekilme dikkate alınmadan düşüş" olarak ayarlanmışsa wdr_ignore değeri true değerine eşittir.

Bunun yanı sıra, CalcEquityDrawdown düşüşünü hesaplama prosedürünü, aşağıda gösterildiği gibi o parametre işlemesini ona ekleyerek düzeltmeniz gerekir.

if (wdr_ignore) 
  equity = AccountInfoDouble(ACCOUNT_EQUITY) + wdr_summa;
else 
  equity = AccountInfoDouble(ACCOUNT_EQUITY);

Artık düşüşlerin yeni değerlerini elde etmek için her şey hazır. Yeni hesaplama algoritması etkinken test yapalım. Testin sonucu şekil 13'te gösterilmiştir.

Çekme işlemleri dikkate alınmadan düşüş hesaplamasının sonuçları 

Şekil 13. Çekme işlemleri dikkate alınmadan düşüş hesaplamasının sonuçları

Sonuçlar, ne varlıkları çekme gerçeğinin ne de çekilen para miktarının düşüşe bağlı olmadığını göstermektedir. Böylece, TesterWithDrawal() işlevinden etkilenmeyen saf bir faktör elde etmiş olduk. Ancak, bu tür bir hesaplamayı kullanmak için, gerçek değerleri değiştiği için kar ve zarar değerlerini düzeltmemiz gerekir, bu faktörler test cihazının sonuç raporunda doğru değildir.

Kar, zarar ve bunların oranını (karlılık) hesaplayalım ve elde edilen değerleri bir metin dosyasına rapor olarak kaydedelim. Listelenen parametreleri hesaplama prosedürü aşağıda verilmiştir.

double SummaryProfit;     // Total net profit
double GrossProfit;       // Gross profit
double GrossLoss;         // Gross loss
double ProfitFactor;      // Profitability
//--- Calculation of parameters for the report
//+------------------------------------------------------------------+
void CalculateSummary(double initial_deposit)
//+------------------------------------------------------------------+
  {
   double drawdownpercent, drawdown;
   double maxpeak = initial_deposit, 
          minpeak = initial_deposit, 
          balance = initial_deposit;
          
   double profit = 0.0;
   
   //--- Select entire history
   HistorySelect(0, TimeCurrent());
   int trades_total = HistoryDealsTotal();

   //--- Searching the deals in the history
   for(int i=0; i < trades_total; i++)
     {
      long ticket = HistoryDealGetTicket(i);
      long type   = HistoryDealGetInteger(ticket, DEAL_TYPE);

      //--- Initial deposit is not considered
      if((i == 0)&&(type == DEAL_TYPE_BALANCE)) continue;

      //--- Calculation of profit
      profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) +
                 HistoryDealGetDouble(ticket, DEAL_COMMISSION) +
               HistoryDealGetDouble(ticket, DEAL_SWAP);
      
      balance += profit;

      if(minpeak > balance) minpeak = balance;

      //---
      if((!wdr_ignore)&&(type != DEAL_TYPE_BUY)&&(type != DEAL_TYPE_SELL)) continue;

      //---
      if(profit < 0) GrossLoss   += profit;
      else           GrossProfit += profit;
      SummaryProfit += profit;
     }

   if(GrossLoss < 0.0) GrossLoss *= -1.0;
   //--- Profitability
   if(GrossLoss > 0.0) ProfitFactor = GrossProfit / GrossLoss;
  }

Bir metin dosyasında rapor oluşturma işlevi aşağıda verilmiştir.

//--- Forming the report  
//+------------------------------------------------------------------+
void GenerateReportFile(string filename)
//+------------------------------------------------------------------+
  {
   string str, msg;

   ResetLastError();
   hReportFile = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_TXT|FILE_ANSI);
   if(hReportFile != INVALID_HANDLE)
     {

      StringInit(str,65,'-'); // separator

      WriteToReportFile(str);
      WriteToReportFile("| Period of testing: " + TimeToString(first_tick.time, TIME_DATE) + " - " +
                        TimeToString(tick.time,TIME_DATE) + "\t\t\t|");
      WriteToReportFile(str);

      //----
      WriteToReportFile("| Initial deposit \t\t\t"+DoubleToString(initial_deposit, 2));
      WriteToReportFile("| Total net profit    \t\t\t"+DoubleToString(SummaryProfit, 2));
      WriteToReportFile("| Gross profit     \t\t\t"+DoubleToString(GrossProfit, 2));
      WriteToReportFile("| Gross loss      \t\t\t"+DoubleToString(-GrossLoss, 2));
      if(GrossLoss > 0.0)
         WriteToReportFile("| Profitability       \t\t\t"+DoubleToString(ProfitFactor,2));
      WriteToReportFile("| Relative drawdown of equity \t"+
                        StringFormat("%1.2f%% (%1.2f)", RelEquityDrawdownPercent, MaxEquityDrawdown));

      if(WDR_ENABLE)
        {
         StringInit(msg, 10, 0);
         switch(WDR_PERIOD)
           {
            case day:     msg = "day";    break;
            case week:    msg = "week";  break;
            case month:   msg = "month";   break;
            case quarter: msg = "quarter"; break;
            case year:    msg = "year";     break;
           }

         WriteToReportFile(str);
         WriteToReportFile("| Periodicity of withdrawing       \t\t" + msg);

         if(WDR_TYPE == fixed) msg = DoubleToString(WDR_VALUE, 2);
         else msg = DoubleToString(WDR_VALUE, 1) + " % from deposit " + DoubleToString(initial_deposit, 2);

         WriteToReportFile("| Amount of money withdrawn     \t\t" + msg);
         WriteToReportFile("| Number of withdrawal operations \t\t" + IntegerToString(wdr_count));
         WriteToReportFile("| Withdrawn from account          \t\t" + DoubleToString(wdr_summa, 2));
        }

      WriteToReportFile(str);
      WriteToReportFile(" ");

      FileClose(hReportFile);
     }
  }

Bu işlevin yürütülmesinin sonucu, şekil 14'te gösterildiği gibi bilgilerle dolu bir metin dosyasının oluşturulmasıdır.

 GenerateReportFile prosedürü tarafından oluşturulan raporun dosyası

Şekil 14. GenerateReportFile prosedürü tarafından oluşturulan raporun dosyası

İşlev, her yeni raporu dosyanın mevcut içeriğine ekleyecek şekilde yazılmıştır. Bu nedenle, test sonuçlarının değerlerini Expert Advisor'ın farklı giriş parametreleriyle karşılaştırabiliriz.

Rapordan da görebileceğiniz gibi, para çekme işlemleri dikkate alınmadan (alt tablo) hesaplandığında, test cihazının hesaplamalarına kıyasla (üst tablo) toplam net kar daha az ve çekilen para miktarına göre brüt zarar daha fazladır. Strateji test cihazında varlıkları çekerken gerçek kar ve zarar değerini elde etmek için, "Çekme" parametresinin değerini toplam net kardan çıkarmanız ve brüt zarara eklemeniz gerektiğine dikkat edin.


6. Sonuç Analizi

Yapılan tüm denemelerden elde edilen sonuçlara dayanarak, birkaç sonuç çıkarabiliriz:

  1. TesterWithDrawal() işlevinin kullanılması, strateji test cihazındaki düşüşleri hesaplama algoritmasında değişikliklere yol açar. Birkaç farklı Expert Advisor'ı, bunlardan bir tanesi para çekme mekanizması içeriyorsa, göreceli düşüşün değeriyle karşılaştırmak yanlış olabilir. Bu işlevi kullanarak, belirtilen, kabul edilebilir hisse senedi düşüşü yüzdesine bağlı olarak hesaptan periyodik olarak ne kadar para çekebileceğinizin pragmatik bir hesaplamasını yapabilirsiniz.
  2. Bu işlevin kullanımı, Expert Advisor'ınızın çalışma istikrarını kontrol etmek ve para yönetiminden sorumlu kodun mantığını ayarlamak için kullanılan alım satıma ilişkin yapay bir istikrarsızlaştırıcı faktör olarak uygulanabilir. Expert Advisor'ınız bakiye veya hisse senedi düzeylerine göre karar verme mantığına sahipse bu işlevin kullanımı test ve ayarlama için ek fırsatlar sunar.
  3. Para çekme işlemleri dikkate alınmadan göreceli düşüşü yeniden hesaplarken, makalede açıklanan algoritmayı kullanarak, bu işlevin kullanımından etkilenmeyen göreceli düşüşün saf bir değerini elde edebilirsiniz.


Sonuç 

Bu makalede, bir hesaptan varlıkları çekme sürecini modellemek için TesterWithdrawal() işlevinin kullanımı ve bunun strateji test cihazında hisse senedi düşüşü hesaplama algoritması üzerindeki etkisi ele alınmaktadır.

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

Ekli dosyalar |
testexpert.mq5 (33.95 KB)
Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı Expert Advisor yazarken MQL5 Standard Alım Satım Sınıfı kitaplıklarının kullanımı
Bu makalede, bir alım satım işlemi yapmadan önce pozisyon kapatma ve değiştirme, bekleyen talimat verme ve Marjın silinmesi ve doğrulanmasını uygulayan Expert Advisor'ları yazarken MQL5 Standart Kitaplık Alım Satım Sınıflarının başlıca işlevlerinin nasıl kullanılacağı açıklanmaktadır. Ayrıca, talimat ve yatırım ayrıntılarını elde etmek için Alım Satım sınıflarının nasıl kullanılabileceğini de gösterdik.
Belirtilen Sihirli Sayıya Göre Toplam Pozisyon Hacmini Hesaplamak İçin Optimum Yöntem Belirtilen Sihirli Sayıya Göre Toplam Pozisyon Hacmini Hesaplamak İçin Optimum Yöntem
Bu makalede, belirtilen sembol ve sihirli sayının toplam pozisyon hacminin hesaplanması sorunu ele alınmaktadır. Önerilen yöntem, yatırım geçmişinin yalnızca gerekli olan minimum bölümünü ister, toplam pozisyonun sıfıra eşit olduğu en yakın zamanı bulur ve son yatırımlarla hesaplamaları gerçekleştirir. Ayrıca istemci terminalinin genel değişkenleriyle çalışmak da dikkate alınır.
Expert Advisor'ın Çalışması Sırasında Denge Eğrisinin Eğimini Kontrol Etme Expert Advisor'ın Çalışması Sırasında Denge Eğrisinin Eğimini Kontrol Etme
Bir alım satım sistemi için kurallar bulmak ve bunları bir Expert Advisor'da programlamak işin yarısıdır. Bir şekilde, alım satım işleminin sonuçlarını biriktirdiği için Expert Advisor'ın çalışmasını düzeltmeniz gerekir. Bu makalede, denge eğrisinin eğimini ölçen bir geri bildirim oluşturmak yoluyla bir Expert Advisor'ın performansını artırmaya olanak tanıyan yaklaşımlardan biri açıklanmaktadır.
MQL5 Nesne Yönelimli Programlama Yaklaşımını Kullanarak Expert Advisor Yazma MQL5 Nesne Yönelimli Programlama Yaklaşımını Kullanarak Expert Advisor Yazma
Bu makalede, "Yeni Başlayanlar için MQL5'te Expert Advisor yazmak için Adım Adım Kılavuz" adlı makalede yaptığımız şeyi yapmak için (Basit bir Expert Advisor oluşturma) nesne yönelimli yaklaşıma odaklanılmaktadır. Birçok kişi bunun zor olduğunu düşünüyor, ancak bu makaleyi okumayı bitirdiğinizde, nesne yönelimi temelinde kendi Expert Advisor'ınızı yazabileceğinizi garanti ediyorum.