Tek Çalıştırma Raporundaki tüm istatistikler mevcuttur. Önceden, Uzman Danışmanın kaynağına sahip olsanız bile bunların çoğunu elde etmek imkansızdı.
double ghpr; // geometrik ortalama işlem double ghprpercent; // yüzde cinsinden geometrik ortalama işlem double ahpr; // işlemin aritmetik ortalaması double ahprpercent; // işlemlerin yüzde cinsinden aritmetik ortalaması double zscore; // seri test double zscorepercent; // yüzde cinsinden seri test double lrcorr; // doğrusal regresyon korelasyon katsayısı double lrstderror; // doğrusal regresyondan denge sapmasının standart hatası double corr_prf_mfe; // mfe ve kar arasindaki̇ korelasyon double corr_prf_mae; // mae ve kar arasindaki̇ korelasyon double corr_mfe_mae; // mae ve mfe arasindaki̇ korelasyon double mfe_a; // mfe ve kâr arasındaki korelasyon, doğrusal regresyon çizgisi için katsayı double mfe_b; // mfe ve kâr arasındaki korelasyon, doğrusal regresyon çizgisi için katsayı double mae_a; // mae ve kar arasindaki̇ korelasyon, doğrusal regresyon doğrusu i̇çi̇n katsayi double mae_b; // mae ve kar arasindaki̇ korelasyon, doğrusal regresyon doğrusu i̇çi̇n katsayi UINT in_per_hours[24]; // girdilerin saatlere göre dağılımı UINT in_per_week_days[7]; // girdilerin haftanın günlerine göre dağılımı UINT in_per_months[12]; // girdilerin aylara göre dağılımı double out_per_hours[24][2]; // girdilerin saatlere göre dağılımı double out_per_week_days[7][2]; // girdilerin haftanın günlerine göre dağılımı double out_per_months[12][2]; // girdilerin aylara göre dağılımı INT64 holding_time_min; // minimum pozisyon tutma süresi INT64 holding_time_max; // maksimum pozisyon tutma süresi INT64 holding_time_avr; // ortalama pozisyon tutma süresi
tst formatının mevcut versiyonu aşağıdaki verilere sahip değildir
- Milisaniye cinsinden zaman.
- PositionID.
- MagicNumber.
Birkaç hatanın yeniden üretilmesi. Test Cihazındaki Uzman Danışmanı bir hedge hesabında çalıştırın.
#include <MT4Orders.mqh> // https://www.mql5.com/tr/code/16006 #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define PAUSE 100000 void OnTick() { static bool FirstRun = true; if (FirstRun) { OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0); Sleep(PAUSE); OrderSend(_Symbol, OP_BUY, 2, Ask, 0, 0, 0); Sleep(PAUSE); if (OrderSelect(0, SELECT_BY_POS)) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); Sleep(PAUSE * 2); if (OrderSelect(0, SELECT_BY_POS)) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); Sleep(PAUSE * 2); TesterWithdrawal(100); FirstRun = false; } } void OnDeinit( const int ) { const int Total = OrdersHistoryTotal(); for (int i = 0; i < Total; i++) if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { OrderPrint(); Print(OrderTicketID()); // MT5-PositionID } }
Bunu alıyoruz
2020.01.08 23:59:58 #1 2020.01.01 00:00:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.01 00:00:00 0.00000 0.00 0.00 100000.00 0 2020.01.08 23:59:58 0 2020.01.08 23:59:58 #4 2020.01.02 06:00:00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:03:20 1.12132 -3.56 0.00 -4.46 0 2020.01.08 23:59:58 2 2020.01.08 23:59:58 #5 2020.01.02 06:01:40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:06:40 1.12129 -7.14 0.00 -14.27 0 2020.01.08 23:59:58 3 2020.01.08 23:59:58 #6 2020.01.02 06:10:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.02 06:10:00 0.00000 0.00 0.00 -100.00 withdrawal 0 2020.01.08 23:59:58 0
Ardından, ilgili tst dosyasını komut dosyası ile okuyoruz.
#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/tr/code/27611 #include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/tr/code/26132 void OnStart() { uchar Bytes2[]; if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Tek bir çalıştırmanın son önbellek kaydını okumak mümkün olsaydı { const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Uygun nesnenin içine sürün. for (int i = 0; i < ArraySize(SingleTesterCache.Positions); i++) Print(SingleTesterCache.Positions[i].ToString()); } }
Verileri pozisyonlar üzerinde gösterecektir
id = 0 mfe = 0.0 mae = -8.029999999999999 profit = -4.46 lifetime = 00:03:20 id = 0 mfe = 0.0 mae = -21.4 profit = -14.27 lifetime = 00:05:00 id = 0 mfe = 0.0 mae = 0.0 profit = 0.0 lifetime = 00:00:00
Bu yazıdaki her şeyi karşılaştırırsak, aşağıdaki hatalar formüle edilmiştir.
- Doğru kimlikler yerine boş kimlikler.
- Kâr hesaplanırken komisyon ve takas dikkate alınmaz.
- Para çekme işlemi yanlışlıkla kapatılan işlem pozisyonlarının sayısına dahil edilmiştir.
Set dosyaları yerine artık tst dosyaları kullanıyorum. Bunlar arasında çok hızlı bir şekilde geçiş yapabilirsiniz, sadece giriş parametrelerine değil, aynı zamanda tam geriye dönük testlere de sahip olursunuz.
Tst'deki milisaniye verilerinin eksikliği nedeniyle farklı TS'leri bir portföyde birleştirmenin imkansız olması üzücü.
Umarım geliştiriciler mevcut alanları sonuna kadar kullanmaya başlarlar.
INT64 TradeDeal::time_create; // kayıt oluşturma zamanı INT64 TradeOrder::time_setup; // müşteriden sisteme sipariş alım zamanı INT64 TradeOrder::time_done; // sipariş iptal zamanı
Zaman değerini saniye yerine milisaniye cinsinden yazarak.
Genel olarak, pratikte tst kullanmanın tüm güzelliğini göstermek için tst'nin çok küçük kusurlarını vermeyin. Düzeltilmesi gerekir.
// Etkileşimli tek geçişli denge grafiği. #include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/tr/code/27611 #include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/tr/code/26132 #include <..\Files\Graph.mqh> // https://www.mql5.com/tr/code/18801 #import "shell32.dll" int ShellExecuteW( int, string, string, string, string, int ); #import #define BASEPATH (::TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\") bool CreateBalanceData( const SINGLETESTERCACHE &SingleTesterCache, const string FileName = "exdat.txt" ) { const int handle = FileOpen(FileName, FILE_WRITE | FILE_TXT | FILE_ANSI); const bool Res = (handle != INVALID_HANDLE); if (Res) { FileWriteString(handle, "var dat1=[\n"); for (uint i = 0; i < SingleTesterCache.Header.equities_total; i++) FileWriteString(handle, "[" + (string)((long)SingleTesterCache.TradeState[i].time * 1000) + "," + ::DoubleToString(SingleTesterCache.TradeState[i].balance, 2) + "],\n"); FileWriteString(handle, "];\n"); FileWriteString(handle, "var T1=dat1[0][0];\n"); FileWriteString(handle, "var T2=dat1[dat1.length-1][0];\n"); FileWriteString(handle, "var nTrades=dat1.length;\n"); FileWriteString(handle, "var Balance=" + ::DoubleToString(SingleTesterCache.TradeState[SingleTesterCache.Header.equities_total - 1].balance, 2) + ";\n"); FileWriteString(handle, "var Currency=\"" + (SingleTesterCache.Header.trade_pips ? "Pips" : SingleTesterCache.Header.trade_currency[]) + "\";\n"); FileClose(handle); } return(Res); } void OnStart() { uchar Bytes2[]; if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Tek bir çalıştırmanın son önbellek kaydını okumak mümkün olsaydı { const SINGLETESTERCACHE SingleTesterCache(Bytes2); // İlgili nesnenin içine sürün. const string FileName = "Report.htm"; uchar Array[]; if ((StringToCharArray(StrMQH, Array) > 0) && FileSave(FileName, Array) && CreateBalanceData(SingleTesterCache)) ShellExecuteW(0, "Open", BASEPATH + FileName, NULL, NULL, 3); } }
Eğer değiştirirsek
TradeState[i].balance -> TradeState[i].equity
Bu bir eşitlik grafiği.
İşlemlerin/siparişlerin hacmi tst'de yanlış yazılmıştır. Her zaman SYMBOL_TRADE_CONTRACT_SIZE = 100 000 gibi hesaplanır.
Farklı bir değer ayarlanırsa, tst'deki hacim değeri üzerinde hiçbir etkisi olmaz.
Uygulamada tst kullanmanın tüm güzelliğini göstermek için tst'nin küçük eksiklikleri hiç verilmemiştir. Düzeltilmesi gerekiyor.
- www.mql5.com
- 2020.01.16
- www.mql5.com
Orada cevaplandı.
Bloglarda nasıl olduğunu bilmiyorum, yeni bir yorumun (eğer cevap değilse) ortaya çıkması bir şekilde işaret ediliyor mu? Yoksa yeni yorumların görülebildiği forum başlıklarından birine göndermek daha mı iyi?
Neden KB'de yayınlamadılar? Bu daha uygun olurdu.
Peki hızlı yanıt için nereye gönderilmeli?
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz


SingleTesterCache:
Test cihazının tek geçiş verileri.
Author: fxsaber