MT4(MQL4)/MT5(MQL5)のTesterStop
テスト中にテスト終了コマンドを発行します。
void TesterStop();
MT5から新しく登場した関数です。
最適化で、口座の残高が〇〇円を下回った場合=失敗とみなして次のパラメータへ進める…等で使えそうですね。
(MT4時代から存在したExpertRemove()との違いがよく分からなかったのですが…Metaquotes社的にはストラテジーテスターで使うのはTesterStop()が好ましいそうです)
サンプルコード
ちょっと長いです。
3分に1回、すぐ決済されるような狭いSLTP(スプレッド差分負け続ける)で売り注文を出し続けます。口座残高が2000万円を下回ったらテスト終了…というロジックです。(初期入金額が2000万円にセットしてあるので、ちょっとでもマイナスの決済がプラスを上回った瞬間テスト終了)
input int Dummyloop = 10; //DummyLoop テスト回数(ロジックには使用されていない)
int minuteTime = -1;
void OnInit()
{
return;
}
void OnTick()
{
if(minuteTime + 3 * 60 <= iTime(NULL, PERIOD_M1, 0)) //5分毎にひたすら売買し続ける
{
minuteTime = iTime(NULL, PERIOD_M1, 0);
MqlTick last_tick;
SymbolInfoTick(_Symbol,last_tick);
double SL = 0.01;
double TP = 0.01;
double Ask=last_tick.ask;
double Bid=last_tick.bid;
int MagicNumber = 123456;
double lots = 0.1;
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.type = ORDER_TYPE_SELL; // 注文タイプ
request.magic = MagicNumber; // マジックナンバー(識別用)
request.symbol = Symbol(); // 通貨ペア名
request.volume = lots; // ロット数
request.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK);// 注文価格
request.sl = Bid+SL; // ストップロス価格
request.tp = Bid-TP; // リミット価格
request.deviation = 3; // スリッページ
request.expiration = 0; // 有効期限
request.comment = "aaa"; // コメント
OrderSend(request, result);
//return result.retcode;
Print("現在の口座残高 = ",AccountInfoDouble(ACCOUNT_BALANCE));
if(AccountInfoDouble(ACCOUNT_BALANCE)<20000000) //口座残高が2千万円以下ならテスト終了
{
TesterStop();
}
}
return;
}
void OnDeinit(const int reason) //EAが終了する時にに1回だけ動く
{
Print("現在の口座残高 = ",AccountInfoDouble(ACCOUNT_BALANCE));
Print("テスト中の出金額は",TesterStatistics(STAT_WITHDRAWAL));
Print("テストの頭金は",TesterStatistics(STAT_INITIAL_DEPOSIT));
return;
}
ポイントは
if(AccountInfoDouble(ACCOUNT_BALANCE)<20000000) //口座残高が2千万円以下ならテスト終了
{
TesterStop();
}
の部分。
この部分を有効化した場合とコメントアウトした場合でテスト結果を比較します。
結果
【TesterStop()コマンドを有効化した場合】
口座残高が2000万円を下回った時点(=TesterStopの発動条件)でテスト終了になっています。
2021.10.05 21:27:31.538 Core 01 2020.01.13 00:04:30 現在の口座残高 = 20000000.0
(中略)
2021.10.05 21:27:31.538 Core 01 2020.01.13 00:07:00 現在の口座残高 = 20000000.0
(中略)
2021.10.05 21:27:31.538 Core 01 2020.01.13 00:10:00 現在の口座残高 = 19999998.0
2021.10.05 21:27:31.538 Core 01 TesterStop() called on 0% of testing interval
(中略)
2021.10.05 21:27:31.538 Core 01 final balance 19999998 pips
2021.10.05 21:27:31.538 Core 01 2020.01.13 00:10:00 現在の口座残高 = 19999998.0
2021.10.05 21:27:31.538 Core 01 2020.01.13 00:10:00 テスト中の出金額は0.0
2021.10.05 21:27:31.538 Core 01 2020.01.13 00:10:00 テストの頭金は20000000.0
【TesterStop()コマンドをコメントアウトした場合】
期間が終了するまでひたすらテストが続きます。期間を長くすると、資金が続く限りテストが続きます。
(前略)
2021.10.05 21:30:26.907 Core 01 2020.12.29 23:48:00 現在の口座残高 = 19981953.0
2021.10.05 21:30:26.907 Core 01 2020.12.29 23:51:00 現在の口座残高 = 19981962.0
2021.10.05 21:30:26.907 Core 01 2020.12.29 23:54:00 現在の口座残高 = 19981962.0
2021.10.05 21:30:26.907 Core 01 2020.12.29 23:57:00 現在の口座残高 = 19981960.0
2021.10.05 21:30:26.907 Core 01 final balance 19980778 pips
2021.10.05 21:30:26.907 Core 01 2020.12.29 23:59:59 現在の口座残高 = 19981958.0
2021.10.05 21:30:26.907 Core 01 2020.12.29 23:59:59 テスト中の出金額は0.0
2021.10.05 21:30:26.907 Core 01 2020.12.29 23:59:59 テストの頭金は20000000.0
(追記)最適化で使えるか?
「最適化時はうまくいったか?」という質問を頂いたので、確認した結果を追記しました。
【結論】最適化でも稼動していそう
結論としては、最適化でも稼動してそうです。
最適化時の稼動結果
【TesterStop()コマンドを有効化した場合】
損益が-290、取引回数が2回で止まっています。
【TesterStop()コマンドをコメントアウトした場合】
損益が-7236855、取引数が106212回で、口座残高が2000万円を下回っても延々と取引が繰り返されているのが確認できます。
コメント / Comments
ExpertRemoveもTesteStopも、最適化時にロジックを通ると、上手く動作しなかったのですが、最適化時は上手くいきましたか?
質問頂きありがとうございます。
早速最適化時に使えるか確認してみました。
結論から言うと、ExpertRemoveもTesterStopも最適化時に稼働していそうです。
最適化時に上手くいかない、というのは不思議ですね…。
環境由来なのか、何かMetatrader的な引っ掛かりポイントがあるのか…。
ExpertRemoveとTesterStopの記事の下の方に、最適化時の挙動を追記して更新しました。
何か解決のヒントになれば幸いです。