ホームホーム  [日本語 / English]

MT4 の取引履歴をテキストファイル(CSV 形式)に出力するスクリプト(MQL4)

はじめに

MT4 の取引履歴を Python などのプログラミング言語や Excel などの表計算ソフトで扱いやすいように,テキストファイル(CSV 形式)に出力するスクリプト(MQL4)を作成しました。

出力するテキストファイルは以下のような形式です。1 行目はヘッダ(コメント)で, 2 行目以降に取引履歴が続きます。

各行は,カンマ区切りで,オープン時刻,クローズ時刻,ロット数,損益,シンボル名,売買種別が並びます。

OpenTime,CloseTime,Lots,Profit,Symbol,Buy/Sell
2020.10.26 03:54:05,2020.10.26 04:10:03,1.41,-4371,USDJPY-cd,Sell
2020.10.26 04:21:22,2020.10.26 05:01:09,1.41,11985,USDJPY-cd,Buy
2020.10.26 07:23:36,2020.10.26 08:59:58,1.42,-426,USDJPY-cd,Buy
2020.10.26 10:00:11,2020.10.26 10:19:02,1.42,-710,USDJPY-cd,Buy
2020.10.26 10:36:15,2020.10.26 10:56:00,1.4,3360,USDJPY-cd,Sell

プログラム

MQL4 で作成したプログラムは以下のようになります。これを,MT4 のスクリプトとして実行すると,OrderHistory.csv というファイル名でテキストファイル(CSV 形式)が出力されます。

ファイルが出力される場所は,MT4 のメニューから,「ファイル」→「データフォルダを開く」を選択して,開いたフォルダの中の MQL4 フォルダの中の Files フォルダです。

#property strict

// 注文構造体
struct ORDER
{
   ORDER():openTime(0.0), closeTime(0.0), lots(0.0), profit(0.0) // メンバの初期化
   {
   }
   datetime openTime;   // オープン時刻
   datetime closeTime;  // クローズ時刻
   double lots;         // ロット数
   double profit;       // 損益
   string symbol;       // シンボル(通貨ペア)名
   string buyOrSell;    // 売買種別(Buy/Sell)
};

// ORDER 構造体同士の交換
void Swap(ORDER &a, ORDER &b)
{
   ORDER c = a;
   a = b;
   b = c;
}

// ORDER 構造体の配列をオープン時刻の昇順に並べ替える
// バブルソート!
void Sort(ORDER &a[])
{
   for(int i=0 ; i < ArraySize(a) - 1 ; i++)
   {
      for(int j = ArraySize(a) - 1 ; j > i ; j--)
      {
          if(a[j].openTime < a[j - 1].openTime) // ソート条件を変えたいときはここを変更
          {
             Swap(a[j], a[j - 1]);
          }
      }
   }
}
 
// MT4 スクリプトのエントリーポイント
void OnStart()
{
   // この日時以降の取引履歴のみ出力
   const MqlDateTime dt = { 2020, 1, 1, 0, 0, 0 };
   const datetime StartTime = StructToTime(dt);

   // 取引履歴の総数
   const int n = OrdersHistoryTotal();
   
   // OREDE 構造体の配列を宣言し要素を確保
   ORDER orders[];   
   ArrayResize(orders, n);
   
   // 取引履歴の数だけループ
   for (int i = 0 ; i < n ; i++)
   {
      // 取引履歴の中から i 番目の注文を選択
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      
      // 約定済みの注文だけデータを取得
      if (OrderType() == OP_BUY || OrderType() == OP_SELL)
      {
         orders[i].openTime = OrderOpenTime();
         orders[i].closeTime = OrderCloseTime();
         orders[i].lots = OrderLots();
         orders[i].profit = OrderProfit();
         orders[i].symbol = OrderSymbol();    
         orders[i].buyOrSell = (OrderType() == OP_BUY) ? "Buy" : "Sell";
      } 
   }
   
   // 並べ替え
   Sort(orders);
   
   // ファイルを開く
   int file = FileOpen("OrderHistory.csv", FILE_CSV | FILE_ANSI | FILE_WRITE, ',');
   
   // ヘッダの出力
   FileWrite(file, "OpenTime", "CloseTime", "Lots", "Profit", "Symbol", "Buy/Sell");
   
   // 取引履歴の数だけループ
   for (int i  = 0 ; i < n ; i++)
   {
      // 指定日時以降にオープンした注文だけファイルに出力
      if (orders[i].openTime >= StartTime)
      {
         FileWrite(
            file, orders[i].openTime, orders[i].closeTime, 
            orders[i].lots,orders[i].profit,
            orders[i].symbol, orders[i].buyOrSell);
      }
   }
   
   // ファイルを閉じる
   FileClose(file);
   
   // 出力完了をお知らせ
   Alert("Complete!");
}

保存した CSV ファイルを Python で扱う方法は以下の記事を参考にしてください。

豊嶋 久道 (著)
豊嶋 久道 (著)