Karı Geri Çekme İşlemlerini Modellemek için TesterWithdrawal() İşlevini Kullanma
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.
Ş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:
Ş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.
Ş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.
Şekil 4. Expert Advisor'ı test etme ayarları
Ş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.
Şekil 6. Expert Advisor'ın 6 aylık test çalışması için bakiye değişikliği
Ş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.
Şekil 8. Optimizasyon ve para çekme işlevi etkinleştirilmiş Expert Advisor'ın parametresi
Ş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.
Ş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.
Ş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.
Ş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.
Ş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.
Ş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:
- 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.
- 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.
- 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
- Ücretsiz ticaret 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