シングルランレポートにあるすべての統計が利用可能です。以前は、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 の出来高値には影響しません。
- www.mql5.com
- 2020.01.16
- www.mql5.com
そこで答えた。
ブログではどうなっているのか分かりませんが、(返信でない場合)新しいコメントの出現は何らかの方法で通知されるのでしょうか?それとも、新しいコメントが表示されるフォーラムのスレッドに投稿した方がいいのでしょうか?
なぜKBで公開しなかったのでしょうか?その方が便利だろう。
では、どこに投稿すれば迅速に対応してもらえるのでしょうか?
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索


シングルテスター・キャッシュ:
テスターのシングルパスデータ。
Author: fxsaber