ライブラリ: シングルテスター・キャッシュ

 

シングルテスター・キャッシュ:

テスターのシングルパスデータ。

シングルテスター・キャッシュ

Author: fxsaber

 

シングルランレポートにあるすべての統計が利用可能です。以前は、Expert Advisorのソースを持っていても、この多くを取得することは不可能でした。

  double            ghpr;                    // 幾何平均トランザクション 
  double            ghprpercent;             // 取引額の幾何平均(単位:パーセント 
  double            ahpr;                    // トランザクションの算術平均 
  double            ahprpercent;             // 取引の算術平均(パーセント 
  double            zscore;                  // シリーズテスト 
  double            zscorepercent;           // パーセンテージでの連続テスト 
  double            lrcorr;                  // 線形回帰の相関係数 
  double            lrstderror;              // 線形回帰からのバランス偏差の標準誤差 
  double            corr_prf_mfe;            // MFEと利益の相関性 
  double            corr_prf_mae;            // 前受金と利益の相関関係 
  double            corr_mfe_mae;            // MAEとMFEの相関性 
  double            mfe_a;                   // mfeと利益の相関、直線回帰線の係数 
  double            mfe_b;                   // mfeと利益の相関、直線回帰線の係数 
  double            mae_a;                   // 前受金と利益との相関、線形回帰直線の係数 
  double            mae_b;                   // 前受金と利益との相関、線形回帰直線の係数 
  UINT              in_per_hours[24];        // インプットの時間別分布 
  UINT              in_per_week_days[7];     // インプットの曜日別分布 
  UINT              in_per_months[12];       // 月別投入量分布 
  double            out_per_hours[24][2];    // インプットの時間別分布 
  double            out_per_week_days[7][2]; // インプットの曜日別分布 
  double            out_per_months[12][2];   // 月別投入量分布 
  INT64             holding_time_min;        // 最小位置保持時間 
  INT64             holding_time_max;        // 最大位置保持時間 
  INT64             holding_time_avr;        // 平均ポジション保持時間
 

現在のバージョンのtstフォーマットには以下のデータがない。

  • ミリ秒単位の時間。
  • PositionID。
  • マジックナンバー。
このため、使用シナリオに 制限がある。
 

いくつかのバグを再現。ヘッジ口座でテスターのExpert Advisorを実行します。

#include <MT4Orders.mqh> //https://www.mql5.com/ja/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
    }
}


次のようになる。

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


次に、スクリプトで対応するtstファイルを読み込む。

#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> //https://www.mql5.com/ja/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> //https://www.mql5.com/ja/code/26132

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // 1回の実行の最後のキャッシュ・レコードを読むことができる場合
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // それを対応するオブジェクトに打ち込む。

    for (int i = 0; i < ArraySize(SingleTesterCache.Positions); i++)
      Print(SingleTesterCache.Positions[i].ToString());
  }
}


ポジションのデータが表示される。

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


この投稿のすべてを比較すると、以下のバグが定式化されている。

  • 正しいIDの代わりにヌルIDが使われている。
  • 利益を計算する際に手数料とスワップが考慮されない。
  • 出金取引が誤って決済済みポジション数に含まれている。
 

セットファイルの代わりにtstファイルを使っている。入力パラメーターだけでなく、完全なバックテストもできるので、非常に素早く切り替えることができます。

tstにはミリ秒単位のデータがないため、異なるTSをポートフォリオに組み合わせることができないのは残念です。


開発者が既存のフィールドをフルに使い始めることを願っています。

INT64             TradeDeal::time_create;             // レコード作成時間

INT64             TradeOrder::time_setup;             // クライアントからシステムへの注文受付時間
INT64             TradeOrder::time_done;              // 注文のキャンセル

時間値を秒単位ではなくミリ秒単位で記述することによって。


一般的に、tstを使用することのすべてのクールさを実証するために、実際にはtstの非常に小さな欠陥を与えることはありません。修正すべきである

 
シングルパスのバランスグラフをより詳細に見る必要がある場合が多い。
// インタラクティブなシングルパス・バランス・グラフ。

#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> //https://www.mql5.com/ja/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> //https://www.mql5.com/ja/code/26132

#include <..\Files\Graph.mqh> //https://www.mql5.com/ja/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) // 1回の実行の最後のキャッシュ・レコードを読むことができる場合
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // それを対応するオブジェクトに打ち込む。
    
    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);      
  }
}


もし

TradeState[i].balance -> TradeState[i].equity

と置き換えると、エクイティ・グラフになる。

 

取引/注文の数量が誤って tst に記述されています。常にSYMBOL_TRADE_CONTRACT_SIZE= 100 000 として計算されます。

異なる値が設定されている場合、tst の出来高値には影響しません。

 
fxsaber:

tstの 小さな欠点によって、tstを実際に使用することのクールさが まったく発揮されていない。修正すべきである

最初の飲み込み

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

そこで答えた。

 

ブログではどうなっているのか分かりませんが、(返信でない場合)新しいコメントの出現は何らかの方法で通知されるのでしょうか?それとも、新しいコメントが表示されるフォーラムのスレッドに投稿した方がいいのでしょうか?

なぜKBで公開しなかったのでしょうか?その方が便利だろう。

では、どこに投稿すれば迅速に対応してもらえるのでしょうか?