Kütüphaneler: SingleTesterCache

 

SingleTesterCache:

Test cihazının tek geçiş verileri.

SingleTesterCache

Author: fxsaber

 

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.
Bu, kullanım senaryolarında sınırlamalar getirir.
 

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.

 
Genellikle tek geçişli denge grafiğine daha detaylı bakmak 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.

 
fxsaber:

Uygulamada tst kullanmanın tüm güzelliğini göstermek için tst'nin küçük eksiklikleri hiç verilmemiştir. Düzeltilmesi gerekiyor.

İlk yudum.

TesterPortfolio - портфель ТС
TesterPortfolio - портфель ТС
  • www.mql5.com
Возьмем третий пункт. Допустим, взяли несколько приглянувшихся советников из Маркета. Настроили их для каждого символа. TesterPortfolio запустит все варианты одновременно, показав общую торговую статистику (просадка эквити на реальных тиках и т.д.). Чаще всего использую для оценки диверсификации различных настроек своих ТС. Использование. На...
 
TesterPortfolio - портфель ТС
TesterPortfolio - портфель ТС
  • 2020.01.16
  • www.mql5.com
В приложении советник/робот, который объединяет несколько независимых одиночных проходов MT5-Тестера в один. Сценарии использования. Чужой советник с закрытым исходным кодом не запускается в MT5-Визуализаторе. TesterPortfolio сможет немного помочь. Сбор статистики прямо во время торговли советников с закрытым исходным кодом. Например...
 
 

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?