今回は、MT4のEAスクリプトのサンプルソース(FX用)を公開します。
今回はトレードする系ではなく、便利機能です。
はじめに
MT4の口座履歴ってマジックナンバー単位でソートできないので、どのEAで利益が出ているのか等を確認しずらいですよね。
そこで今回は、そんなお悩みを解消すべく取引口座履歴を簡単にファイルに書き出しちゃう自作スクリプトについて記載します。
機能紹介
まずは今回自作した機能の紹介です。
冒頭でも説明した通り、機能としてはマジックナンバー単位に口座履歴をファイルへ書き出します。
こんな感じで今回はEAではなくスクリプトにしました。スプリプトについてよく知らない方は後で解説していますので参考にして下さい。すごく便利で簡単ですよ。
そして、この『Trade_Rireki_Output』スクリプトをダブルクリックしパラメータの入力をクリックすると、
こんな感じでパラメータ入力画面でパラメータを入力できますので書き出したいマジックナンバーと、いつから書き出したいかを入力してください。
あとは、「OK」ボタンを押すとカンマ区切りのCSV形式で口座履歴が書き出されます。
もしパラメータ入力画面でマジックナンバーを入力していない場合は、全ての口座履歴が書き出されます。
書き出される項目は、『マジックナンバー』『注文時間』『取引種別』『数量』『通貨ペア』『価格』『決済時間』『決済価格』『TP』『SL』『スワップ』『損益』『コメント』となっており、取引日の古いものから順に書き出されます。
パラメータ設定詳細
今回のパラメータは
- セーブファイル名
- MagicNo
- dateT
と3つあります。
『セーブファイル名』はファイルを書き出した際のファイル名になります。特に変える必要は無いですがわかりやすいファイル名にしておきましょう。
次に『MagicNo』ですが、未入力で全マジックナンバーの取引履歴(全データ)を書き出します。ファイル名についてもALL_Kekka.csvというファイル名になります。また、MagicNoを12345と設定するとマジックナンバーが12345の取引履歴のみを書き出します。この場合、ファイル名は12345_Kekka.csvとなります。書き出したいマジックナンバーを設定してください。
また、EAによっては複数マジックナンバーが設定されている事もあるため、最大4つのマジックナンバーを1度に書き出せるようにしています。設定方法は例えば「55」「66」のマジックナンバーを書き出したい場合は55_66と設定してください。「55」「66」「77」「88」の場合は55_66_77_88としてください。
最後に『dateT』ですが、書き出しを始める日付を設定できるようにしています。書き出したい日付を設定してください。以降の日のデータを全て書き出します。
スクリプトについて
スクリプトは、基本的にEAの扱いと同じですがEAと違う点は、MT4からダブルクリックをすると1回だけ処理を行ってくれます。今回のように単発で何かを実行したい場合などに使える機能です。
ダウンロードファイルを使う場合
スクリプトファイルは、『MQL4』フォルダ内の『Scripts』フォルダ内にコピーしてください。
自分でコンパイルする場合
ソースコードでコンパイルする際は、まず新規作成から始めると思いますがスクリプトを選択してください。
コンパイルしたファイルは、『MQL4』フォルダ内の『Scripts』フォルダ内に作られます。
書き出しファイルの保存場所
スクリプトを実行した際、CSVファイルはここに書き出されます。
まずは、MT4の『ファイル』→『データフォルダを開く』をクリックしてください。
次に『MQL4』フォルダ➡『file』フォルダの順に開くと、
こんな感じでファイルが書き出されています。
CSV書き出し後の確認
書き出されたCSVファイルはExcel等で開きましょう。
最初は取引が古い順に書き出されていますが、
フィルタ機能を使って損益順等でも並び替え等ができるのでとても便利です!
ダウンロード
上記のスクリプトファイルになります。
“トレード履歴書き出し” をダウンロード Trade_Rireki_Output.ex4 – 282 回のダウンロード – 12.43 KBソースコード
以下サンプルソースコードになります。
※丸々コピペでコンパイルできます
//+------------------------------------------------------------------+
//| トレード履歴書き出し.mq4 |
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link "https://fx-prog.com/"
#property version "1.00"
#property strict
#property show_inputs
input string FileNm="Kekka.csv"; //セーブファイル名
input string MagicNo = "";
input datetime dateT = 1970/01/01;
string dataBuff[3];
int File;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int cnt =0,writeCnt = 0,WriteMagic = 0;
string FileName = "";
int spc = StringSplit(MagicNo, ',', dataBuff);
//マジックナンバーが空白の時
if(spc==0){
FileName = "ALL_" + FileNm;
}else if(spc==1){
FileName = dataBuff[0] + "_" + FileNm;
}else if(spc==2){
FileName = dataBuff[0] + "_" + dataBuff[1] + "_" + FileNm;
}else if(spc==3){
FileName = dataBuff[0] + "_" + dataBuff[1] + "_" + dataBuff[2] + "_" + FileNm;
}else if(spc==4){
FileName = dataBuff[0] + "_" + dataBuff[1] + "_" + dataBuff[2] + "_" + dataBuff[3] + "_" + FileNm;
}
//ファイルオープン
File = FileOpen(FileName,FILE_CSV|FILE_WRITE,',');
if(File==INVALID_HANDLE){
//ファイルのオープンに失敗した時
Print(FileName+"[書き出し失敗] Open error(",GetLastError(),")");
return;
}
//ファイル出力(見出し)
FileWrite(File,"マジックナンバー","注文時間","取引種別","数量","通貨ペア","価格","決済時間","決済価格","TP","SL","スワップ","損益","コメント");
for(cnt = OrdersHistoryTotal(); cnt > 0; cnt--){
bool writeFlg =false;
if(OrderSelect(cnt-1,SELECT_BY_POS,MODE_HISTORY) == true){
if(spc == 0 ){
WriteMagic = OrderMagicNumber();
writeFlg = true;
}else if(spc == 1 ){
if(OrderMagicNumber() == StringToInteger(dataBuff[0])){
WriteMagic = (int)(StringToInteger(dataBuff[0]));
writeFlg = true;
}
}else if(spc == 2 ){
if(OrderMagicNumber() == StringToInteger(dataBuff[0])){
WriteMagic = (int)(StringToInteger(dataBuff[0]));
writeFlg = true;
}else if(OrderMagicNumber() == StringToInteger(dataBuff[1])){
WriteMagic = (int)(StringToInteger(dataBuff[1]));
writeFlg = true;
}
}else if(spc == 3 ){
if(OrderMagicNumber() == StringToInteger(dataBuff[0])){
WriteMagic = (int)(StringToInteger(dataBuff[0]));
writeFlg = true;
}else if(OrderMagicNumber() == StringToInteger(dataBuff[1])){
WriteMagic = (int)(StringToInteger(dataBuff[1]));
writeFlg = true;
}else if(OrderMagicNumber() == StringToInteger(dataBuff[2])){
WriteMagic = (int)(StringToInteger(dataBuff[2]));
writeFlg = true;
}
}else if(spc == 4 ){
if(OrderMagicNumber() == StringToInteger(dataBuff[0])){
WriteMagic = (int)(StringToInteger(dataBuff[0]));
writeFlg = true;
}else if(OrderMagicNumber() == StringToInteger(dataBuff[1])){
WriteMagic = (int)(StringToInteger(dataBuff[1]));
writeFlg = true;
}else if(OrderMagicNumber() == StringToInteger(dataBuff[2])){
WriteMagic = (int)(StringToInteger(dataBuff[2]));
writeFlg = true;
}else if(OrderMagicNumber() == StringToInteger(dataBuff[3])){
WriteMagic = (int)(StringToInteger(dataBuff[3]));
writeFlg = true;
}
}
//日付が古い場合は書き込まない
if(dateT > OrderOpenTime()){
writeFlg = false;
}
if(writeFlg == true){
string type="";
if(OrderType()==OP_BUY){
type="buy";
}else{
type="sell";
}
FileWrite(File,WriteMagic,OrderOpenTime(),type,OrderLots(),OrderSymbol(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),OrderTakeProfit(),OrderStopLoss(),OrderSwap(),OrderProfit(),OrderComment());
writeCnt++;
}
}
}
//完了通知
if(GetLastError()==0){
Print(FileName +":" + IntegerToString(writeCnt) + "件 [書き出し成功]");
}else{
Print(FileName+"[書き出し失敗]errNo:",GetLastError());
}
FileClose(File);
}
//+------------------------------------------------------------------+
さいごに
以上、MT4の取引履歴をファイルに書き出すスクリプトのサンプルソースでした。
口座履歴をマジックナンバー単位で確認するのが現状、REAL-TRADE等と紐づけないと確認できなかったため外部出力するスクリプトを作成しました。
最初はEA形式でボタンを押したらという感じで作っていたのですが、スクリプトでいいやんとなりスクリプトにしています。
MT4の履歴は数カ月で消えてしまうFX業者もあるので定期的に書き出して振り返りができるようにしたいですね!
※ EAのサンプルソースを一覧表にまとめました
※オンラインレッスンやってます
コメント