バックテストをコマンドライン実行する(MT4)

この投稿文は次の言語で読めます: 日本語

テスト自動化

MT4では、 terminal.exe をコマンドラインから引数付きで起動することで、バックテストの自動化を行うことが出来ます。

これによって、テストの期間、時間足、EA等の入力値を変えながらバックテスト一括実行し、結果をDBへ格納するなどの
一連の処理を自動化することが出来ます。

バックテスト実行 → 結果を確認 というサイクルを1回ずつ手動で実施する方法が一般的ですが、
それだと手待ちの時間が多く発生し、時間がかかった割に対した分析ができなかったりすることがよくありますので、
できればまとめてバックテストを実行し、全ての結果が揃ってから総合的に評価をしたいものです。

実行方法

    terminal.exe "C:\Program Files\MetaTrader 4\config\settings25.ini"

     

    のように記載します。

    実行内容を制御するためにいくつかのパラメータを指定する必要がありますが、
    それらは1つのファイルにまとめて記載し、読み込みます。

     

    引数ファイルサンプル

    TestExpert=<ea_name>
    TestExpertParameters=<param_name>.set
    TestSymbol=USDJPY
    TestPeriod=H1
    TestModel=1
    TestOptimization=True
    TestDateEnable=True
    TestFromDate=2017.01.01
    TestToDate=2017.12.31
    TestReport=tester\report\<report_name>
    TestReplaceReport=True
    TestShutdownTerminal=True
    TestSpread=8

     

    のように書いておきます。

    実行対象の通貨ペア、Timeframe、日付期間、Tickモデル、実行モード(統計/バックテスト)だけでなく
    EAのパラメータも指定できるため、予めテストケースを整理しファイルにまとめておけば
    一括実行することができるようになります。

    尚、TestSpread は、ドキュメントには記載がありませんが、書いたらスプレッドも制御できました。

    ※ヘルプファイルの開き方

    1. Terminal.exeを開く
    2. F1キー押下(ヘルプファイルを開く)
    3. Tools → 起動時の構成

     

    更に自動化を進めるには、この書式になるように、スクリプト側からファイル設定値を書き換え、
    保存した後に terminal.exe の引数としてファイルを渡すと、より柔軟な自動化ができます。

    以下はPython でパラメータファイル文字列を生成するサンプルです。

        def create_mt4_config(execute_mode, date_from, date_to, spread,  ea_param_file_name, result_file_name):
    
                if execute_mode != ExecuteMode.balance.value and \
                   execute_mode != ExecuteMode.optimize.value and \
                   execute_mode != ExecuteMode.balance_queue.value:
                    print('実行モードが確認できません.')
                    print('列挙型 ExecuteMode に定義済のいずれかの値を設定して下さい.')
                    sys.exit(-1)
    
                config = []
                config.append('TestExpert=' + self.ea_name)
                config.append('TestExpertParameters=' + ea_param_file_name)
                config.append('TestSymbol=' + self.symbol)
                config.append('TestPeriod=' + self.period)
    
                if execute_mode == ExecuteMode.balance.value:
                    config.append('TestModel=0')
                    config.append('TestOptimization=False')
                elif execute_mode == ExecuteMode.optimize.value:
                    config.append('TestModel=1')
                    config.append('TestOptimization=True')
                elif execute_mode == ExecuteMode.balance_queue.value:
                    config.append('TestModel=0')
                    config.append('TestOptimization=False')
    
                config.append('TestDateEnable=True')
                config.append('TestFromDate=' + date_from)
                config.append('TestToDate=' + date_to)
                config.append('TestReport=' + result_file_name)
                config.append('TestReplaceReport=True')
                config.append('TestShutdownTerminal=True')
                config.append('TestSpread=' + spread)
    
                return '\n'.join(config)
    

     

    単一バックテストと、最適化モードも TestModeで切替できるため、

    1. 最適化モードでバックテスト実行
    2. 結果が出力されるレポートファイルから、profit, pf, drawdown等いくつかの値を条件として優秀なパラメータ値取得
    3. 単一バックテスト自動実行
    4. レポート出力、保存

    といった流れを自動化することもできます。

    MT5でも同様のことができるはずなので、調査してみたいと思います。

     

    スポンサーリンク

    関連記事

    スポンサーリンク

    Twitterでフォローしよう

    おすすめの記事