今回は、MT4のEAのサンプルソースを公開します。
今回はトレードする系ではなく少しマニアックですが便利機能という感じです。
はじめに
MT4でファイルコピーや移動等の操作を行いたいと思い色々調べていたのですが、fileフォルダ内でしか操作できなかったりと色々不便かつ実装も難しいという事がわかりました。
そこで、bat(バッチファイル)を呼び出しファイルのコピー処理等をそっちで行おうとしたのですが、MT4からbatは実行できない(めちゃくちゃ複雑な事をしたらいけるかも)ようでこちらも諦め。MT4でファイル操作ってわりと難しいんですね。
ただ、ファイルコピーや移動はどうしてもやりたかった為に代替案を用意し上記のお悩みを解消すべくbatではなくcmdで代用する方法について解説しています。
MT4でファイル操作や外部のファイルを実行したい方は参考にしてみてください。
外部ファイルを呼び出す方法
まず外部ファイルを呼び出す方法についてです。
今回、外部ファイルを呼び出すのに必要なshell32.dll(Widowsに標準搭載のwindowsAPI)の「ShellExecuteW()」関数を使用します。
ソースコード上の先頭部分で以下のようにインポートしてあげましょう。
#import "shell32.dll"
int ShellExecuteW(int hWnd,string lpVerb,string lpFile,string lpParameters,string lpDirectory,int nCmdShow);
#import
上記のようにshell32.dllをインポートしてあげないと、「ShellExecuteW()」関数は使えない為注意してください。
あとは、こんな感じでcmdを実行して上げるとMT4から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』としましょう
ファイルコピーについて
次はファイルコピー(filepocy.cmdファイル)についてです。
MQL4とは関係ないため読み飛ばして頂いても大丈夫です。
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ヵ所に集めて集計なんてこともできますね!
ソースコード
以下サンプルソースコードになります。
※丸々コピペでコンパイルできます
//+------------------------------------------------------------------+
//| 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でファイル関連の操作をしたい(外部ファイルを実行するサンプルソース)でした。
各MT4のファイルを手作業でまとめるのって、いちいち各MT4を開いてデータフォルダを開いて・・・って面倒なんですよね。ショートカットを作ればいいだけなんですが・・・5個や6個のブローカーになってくるとそれでも大変です。
なので、各MT4の取引履歴を自動で1つにまとめて一括で集計するぞー!と作り始めたのですが思った以上にMQLでファイル操作ができなかったため試行錯誤しながら今回の記事のような機能を作成しました。
※ EAのサンプルソースを一覧表にまとめました
※EA作成依頼はこちら
※オンラインレッスンやってます
コメント