「MT4(MQL4)から外部ファイルを実行したい」
「取引履歴CSVを自動でコピー・集計したい」
「batを使おうとしたが、MT4から実行できず困っている」
この記事では、MT4(MQL4)からcmdファイルを実行し、ファイルコピーや外部処理を行う方法を、 実際に動作確認したサンプルコード付きで解説します。
MQL4はファイル操作に多くの制限がありますが、
Windows API(ShellExecute)を使うことで回避する実装方法を具体例で紹介します。
MT4(MQL4)で外部ファイルを実行する際の制限
まず前提として、MT4(MQL4)ではセキュリティ上の理由からファイル操作に強い制限があります。
具体的には、MQL4単体では以下のようなことができません。
- 任意の場所にあるexe・batファイルの直接実行
- MQL4\Files フォルダ外への自由なアクセス
- Windowsコマンド(cmd)を直接呼び出す処理
そのため、取引履歴CSVの自動集計や、複数MT4間でのファイル連携を行おうとすると、 「MQL4だけでは実現できない壁」に直面します。
本記事では、この制限を回避する方法として、 Windows API(ShellExecute)を使い、MT4から外部ファイルを間接的に実行する手法を紹介します。
MQL4から外部ファイルを実行する方法(ShellExecute)
まず外部ファイルを呼び出す方法についてです。
MQL4から外部プログラムを実行するためには、 Windowsに標準で用意されているWindows APIを利用します。
今回使用する ShellExecuteW() は、 Windows上で「ファイルを開く」「プログラムを起動する」といった処理を担う関数です。
これを使うことで、MT4から直接cmdファイルを実行し、 ファイルコピーや外部処理を行うことが可能になります。
まずは、「ShellExecuteW()」を使用するために必要な Windows標準APIである shell32.dll を、 MQL4のソースコード先頭でインポートします。
#import "shell32.dll"
int ShellExecuteW(int hWnd,string lpVerb,string lpFile,string lpParameters,string lpDirectory,int nCmdShow);
#import上記のようにshell32.dllをインポートしてあげないと、「ShellExecuteW()」関数は使えない為注意してください。
MT4からcmdを実行するサンプルコード
以下は、MT4上からcmdファイルを実行する最もシンプルな例です。 EA・スクリプトのどちらでも動作します。
なお、batファイルでは正常に動作しないケースがあったため、 拡張子は「.cmd」を使用しています。
string currentDir="C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\XXXXXXXXXXXX\MQL4\Files";
ShellExecuteW(0,"open",currentDir + "/filepocy.cmd","","",1);cmdファイルは、『MQL4\Files\filepocy.cmd』という感じで設置してあげましょう。
※『XXXXXXXXXXXX』の箇所は自分の環境のパスにしてください
※バックテストで行う場合は『tester\files\filepocy.cmd』としましょう
※ セキュリティソフトによってはcmd実行がブロックされる場合があるため、 その場合は例外設定を行ってください。
cmdでファイルコピー・移動を行う方法
次はファイルコピー(filepocy.cmdファイル)についてです。
ここからはcmdファイル側の処理になります。 MQL4とは直接関係ありませんが、自動化の要となる重要な部分です。
「cmdの書き方は分かる」という方は読み飛ばしても問題ありませんが、 ファイル集約・履歴管理を行いたい場合は一度目を通しておくと便利です。
cmdファイルまで来てしまえばファイルコピーや移動・削除は簡単ですのでこんな感じで(filepocy.cmd)ファイルを作ってあげましょう。
@echo off
set moto_src=C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\F1DD1D6E7C4A311D1B1CA0D34E33291D\MQL4\Files\取引履歴.csv
set saki_src=C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\7E6C4A6F67D435CAE80890D8C1401332\MQL4\Files\1.csv
echo FXTFファイルを検索し指定ディレクトリへコピーします。
copy %moto_src% %saki_src%
set moto_src=C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\7E6C4A6F67D435CAE80890D8C1401332\MQL4\Files\取引履歴.csv
set saki_src=C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\7E6C4A6F67D435CAE80890D8C1401332\MQL4\Files\2.csv
echo OANDAファイルを検索し指定ディレクトリへコピーします。
copy %moto_src% %saki_src%
pause
echo 終了します。
こうすることで、各MT4のファイルを1ヵ所に集めて集計なんてこともできますね!
実際にMT4から外部ファイルを実行した結果
実際にEA上のボタン操作からcmdファイルが起動し、 指定したファイルコピー処理が正常に実行されることを確認しました。
以下がMQL4で外部ファイルを実行するためのサンプルソースコードです。
※丸々コピペでコンパイルできます
//+------------------------------------------------------------------+
//| 27_GaibuFile.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#import "shell32.dll"
int ShellExecuteW(int hWnd,string lpVerb,string lpFile,string lpParameters,string lpDirectory,int nCmdShow);
#import
input string currentDir="";
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
ObjectCreate("BTN_GET", OBJ_BUTTON, 0, 0, 0);
ObjectSet ("BTN_GET", OBJPROP_CORNER, 3);
ObjectSet ("BTN_GET", OBJPROP_XDISTANCE, 155);
ObjectSet ("BTN_GET", OBJPROP_YDISTANCE, 90);
ObjectSet ("BTN_GET", OBJPROP_XSIZE, 145);
ObjectSet ("BTN_GET", OBJPROP_YSIZE, 30);
ObjectSet ("BTN_GET", OBJPROP_SELECTABLE, false);
ObjectSetString(0,"BTN_GET",OBJPROP_TEXT,"ファイル集め"); // 表示するテキスト
ObjectSetString(0,"BTN_GET",OBJPROP_FONT,"MS ゴシック"); // フォント
ObjectSetInteger(0,"BTN_GET",OBJPROP_FONTSIZE,11); // 色設定
ObjectSetInteger(0,"BTN_GET",OBJPROP_COLOR,clrBlack); // 色設定
ObjectSetInteger(0,"BTN_GET",OBJPROP_BGCOLOR,clrYellow); // 色設定
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectDelete(0,"BTN_GET");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if(id==CHARTEVENT_OBJECT_CLICK)
{
string clickedChartObject=sparam;
if(clickedChartObject=="BTN_GET")
{
//ボタンの状態
bool selected4=ObjectGetInteger(0,"BTN_GET",OBJPROP_STATE);
//--- ボタンが押されたら
if(selected4)
{
//cmdファイル実行(batだとだめだったので拡張子をcmdに変えたらいけた)
ShellExecuteW(0,"open",currentDir + "\filepocy.cmd","","",1);
Sleep(100);
ObjectSetInteger(ChartID(),"BTN_GET",OBJPROP_STATE,0);
Sleep(5000);
//ファイルを読んだり書いたりする
//--------------------
}
}
}
}
パラメータ設定のcurrentDirは、『C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\287469DEA9630EA94D0715D755974F1B\MQL4\Files』こんな感じで自分の環境に合わせてこのEAを実行するMT4のパスに設定してください。

MT4のEAからうまくcmdファイルを実行できましたね!
この方法が役立つケース(取引履歴の自動集計など)
この方法は、以下のようなケースで特に役立ちます。
- 複数MT4の取引履歴CSVを自動で1か所に集約したい
- バックテスト結果を定期的にコピー・保存したい
- EAの稼働ログや検証データを外部ツールで分析したい
まとめ
以上、MT4でファイル関連の操作をしたい(外部ファイルを実行するサンプルソース)でした。
MT4(MQL4)ではファイル操作に多くの制限がありますが、 Windows API(ShellExecute)を使うことで、外部ファイル実行という選択肢が広がります。
今回紹介した方法を使えば、取引履歴の自動集計や、 複数MT4環境をまたいだデータ管理も現実的に実装可能です。
MT4(MQL4)で外部ファイル実行に悩んでいる方は、 本記事の方法をベースに、取引履歴管理や検証作業の自動化をぜひ試してみてください。
✅ 今回のロジックをベースにしたEAサンプルも多数公開中
今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。
ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。
📊 EA運用・検証フェーズに進みたい方へ
今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。
EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。









コメント