
どうも!和菓子職人トレーダー潤奈です( ゚Д゚)
今回は取引履歴を指定期間でCSV出力するスクリプトを作成したいと思います。
MetaEditorで作成
今回のコードはスクリプトになりますので、MetaEditorで作成する際には「スクリプト」を選択して作成して下さい。

全ソースコード
まずは全ソースコードが以下の通りです( ゚Д゚)その後に解説しますね!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
//+------------------------------------------------------------------+ //| ExportHistoryByPeriodCSV.mq4 | //| Copyright 2025, 潤奈FX | //| https://zyunafx.com/ | //+------------------------------------------------------------------+ #property strict #property show_inputs // スクリプト実行時にパラメータ設定ウインドウを必ず表示 //+------------------------------------------------------------------+ //| 外部入力パラメータ | //+------------------------------------------------------------------+ input datetime StartDateTime = D'2024.01.01 00:00'; // 出力開始日時 input datetime EndDateTime = D'2025.12.31 23:59'; // 出力終了日時 // 出力するCSVファイル名 string fileName = "TradeHistory_ByPeriod.csv"; //+------------------------------------------------------------------+ //| メイン処理 | //+------------------------------------------------------------------+ void OnStart() { // 開始日時と終了日時の整合性チェック if (StartDateTime >= EndDateTime) { Print("期間の指定が不正です。開始日時は終了日時より前にしてください。"); return; } // 取引履歴の総件数取得 int total = OrdersHistoryTotal(); // CSVファイルオープン int fileHandle = FileOpen(fileName, FILE_CSV | FILE_WRITE | FILE_TXT, ','); if (fileHandle == INVALID_HANDLE) { Print("CSVファイルの作成に失敗しました: ", fileName); return; } // ヘッダー行を書き込み FileWrite(fileHandle, "Ticket", "OrderType", "Symbol", "Lots", "OpenTime", "OpenPrice", "CloseTime", "ClosePrice", "Pips", "Commission", "Swap", "Profit", "TotalProfit", "MagicNumber", "Comment"); int count = 0; // 出力件数カウンター // 取引履歴をループ処理 for (int i = 0; i < total; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { datetime closeTime = OrderCloseTime(); // 決済日時が指定期間内に収まっているか判定 if (closeTime >= StartDateTime && closeTime <= EndDateTime) { // pips計算 double pips = CalculatePips(OrderSymbol(), OrderOpenPrice(), OrderClosePrice(), OrderType()); // 注文種別を文字列へ変換 string orderTypeStr = OrderTypeToString(OrderType()); // CSVファイルへデータ書き込み FileWrite(fileHandle, OrderTicket(), // チケット番号 orderTypeStr, // 注文種別(文字列) OrderSymbol(), // 通貨ペア DoubleToString(OrderLots(), 2), // ロット数 TimeToString(OrderOpenTime(), TIME_DATE | TIME_SECONDS), // オープン時間 DoubleToString(OrderOpenPrice(), Digits), // オープン価格 TimeToString(closeTime, TIME_DATE | TIME_SECONDS), // クローズ時間 DoubleToString(OrderClosePrice(), Digits), // クローズ価格 DoubleToString(pips, 1), // pips数 DoubleToString(OrderCommission(), 2), // 手数料 DoubleToString(OrderSwap(), 2), // スワップ DoubleToString(OrderProfit(), 2), // 損益 DoubleToString(OrderProfit() + OrderSwap() + OrderCommission(), 2), // 合計損益 IntegerToString(OrderMagicNumber()), // マジックナンバー OrderComment() // コメント ); count++; // 出力件数カウントアップ } } } // ファイルをクローズ FileClose(fileHandle); // 出力完了メッセージ Print(count, " 件の取引履歴をCSVに出力しました: ", fileName); } //+------------------------------------------------------------------+ //| 注文種別を文字列に変換する関数 | //+------------------------------------------------------------------+ string OrderTypeToString(int type) { switch (type) { case OP_BUY: return "OP_BUY"; // 買い成行注文 case OP_SELL: return "OP_SELL"; // 売り成行注文 case OP_BUYLIMIT: return "OP_BUYLIMIT"; // 買い指値注文 case OP_SELLLIMIT: return "OP_SELLLIMIT"; // 売り指値注文 case OP_BUYSTOP: return "OP_BUYSTOP"; // 買い逆指値注文 case OP_SELLSTOP: return "OP_SELLSTOP"; // 売り逆指値注文 default: return "UNKNOWN"; // 不明なタイプ } } //+------------------------------------------------------------------+ //| pips数を計算する関数 | //+------------------------------------------------------------------+ double CalculatePips(string symbol, double openPrice, double closePrice, int type) { double pointSize = AdjustPoint(symbol); if (pointSize == 0.0) return 0; if (type == OP_BUY) return (closePrice - openPrice) / pointSize; else if (type == OP_SELL) return (openPrice - closePrice) / pointSize; return 0; } //+------------------------------------------------------------------+ //| 通貨ペアごとの1pips幅を返す関数 | //+------------------------------------------------------------------+ double AdjustPoint(string Currency) { int SymbolDigits = (int)MarketInfo(Currency, MODE_DIGITS); switch(SymbolDigits) { case 2: return(0.01); case 3: return(0.01); case 4: return(0.0001); case 5: return(0.0001); } return(0.0); } //+------------------------------------------------------------------+ |
コード解説(各工程ごと)
スクリプト設定部分
1 2 |
#property strict #property show_inputs // スクリプト実行時にパラメータ設定ウインドウを必ず表示 |
ここでは基本設定を行います。
#property strict
→ MQL4の厳格モードを有効にして、型チェックなどを厳しくします。#property show_inputs
→ スクリプトをチャートにドロップしたときに、必ずパラメータ設定ウインドウを開くようにします。
これで、期間入力を忘れる心配がなくなります( ゚Д゚)
外部パラメータ設定(開始日時・終了日時)
1 2 3 4 5 |
//+------------------------------------------------------------------+ //| 外部入力パラメータ | //+------------------------------------------------------------------+ input datetime StartDateTime = D'2024.01.01 00:00'; // 出力開始日時 input datetime EndDateTime = D'2025.12.31 23:59'; // 出力終了日時 |
出力対象の期間を設定するパートです。
input datetime
型なので、直接日時入力ができます。
出力ファイル名の設定
1 2 |
// 出力するCSVファイル名 string fileName = "TradeHistory_ByPeriod.csv"; |
ここで、出力するCSVファイルの名前を指定しています。
保存先は、MT4の MQL4/Files
フォルダ内です。
必要に応じて好きな名前に変えてOKです!
メイン処理開始 OnStart()の冒頭部分
1 2 3 4 5 6 7 8 9 |
//+------------------------------------------------------------------+ //| メイン処理 | //+------------------------------------------------------------------+ void OnStart() { // 開始日時と終了日時の整合性チェック if (StartDateTime >= EndDateTime) { Print("期間の指定が不正です。開始日時は終了日時より前にしてください。"); return; } |
入力された期間の整合性をチェックします。
開始日時が終了日時よりも後だったら、処理を中断してエラーを表示します。
取引履歴の取得とファイルオープン
1 2 3 4 5 6 7 8 9 10 |
// 取引履歴の総件数取得 int total = OrdersHistoryTotal(); // CSVファイルオープン int fileHandle = FileOpen(fileName, FILE_CSV | FILE_WRITE | FILE_TXT, ','); if (fileHandle == INVALID_HANDLE) { Print("CSVファイルの作成に失敗しました: ", fileName); return; } |
ここで、
OrdersHistoryTotal()
で履歴の件数を取得FileOpen()
でCSVファイルを作成
しています。
もしファイル作成に失敗したらエラーを出して終了します。
CSVファイルのヘッダー行を書き込む
1 2 3 4 5 6 |
// ヘッダー行を書き込み FileWrite(fileHandle, "Ticket", "OrderType", "Symbol", "Lots", "OpenTime", "OpenPrice", "CloseTime", "ClosePrice", "Pips", "Commission", "Swap", "Profit", "TotalProfit", "MagicNumber", "Comment"); |
ここでは、CSVの列名を一番上に書き込んでいます。
これで後からExcelやスプレッドシートで見た時も、どの列が何かわかりやすくなります!
ちなみに、日本語の方が見やすい!という方は、以下の書き方でもOKです。
1 2 3 4 5 |
FileWrite(fileHandle, "チケット番号", "注文種別", "通貨ペア", "ロット数", "オープン時間", "オープン価格", "クローズ時間", "クローズ価格", "獲得Pips", "手数料", "スワップ", "利益", "累積利益", "マジックナンバー", "コメント"); |
取引履歴をループして、期間内だけ抽出
1 2 3 4 5 6 7 8 9 |
int count = 0; // 出力件数カウンター // 取引履歴をループ処理 for (int i = 0; i < total; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { datetime closeTime = OrderCloseTime(); // 決済日時が指定期間内に収まっているか判定 if (closeTime >= StartDateTime && closeTime <= EndDateTime) { |
ここでは、
- 履歴を1件ずつ選んで
OrderCloseTime()
(決済時間)が指定期間に入っているか判定
しています。
取引情報をCSVへ書き込む
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// pips計算 double pips = CalculatePips(OrderSymbol(), OrderOpenPrice(), OrderClosePrice(), OrderType()); // 注文種別を文字列へ変換 string orderTypeStr = OrderTypeToString(OrderType()); // CSVファイルへデータ書き込み FileWrite(fileHandle, OrderTicket(), // チケット番号 orderTypeStr, // 注文種別(文字列) OrderSymbol(), // 通貨ペア DoubleToString(OrderLots(), 2), // ロット数 TimeToString(OrderOpenTime(), TIME_DATE | TIME_SECONDS), // オープン時間 DoubleToString(OrderOpenPrice(), Digits), // オープン価格 TimeToString(closeTime, TIME_DATE | TIME_SECONDS), // クローズ時間 DoubleToString(OrderClosePrice(), Digits), // クローズ価格 DoubleToString(pips, 1), // pips数 DoubleToString(OrderCommission(), 2), // 手数料 DoubleToString(OrderSwap(), 2), // スワップ DoubleToString(OrderProfit(), 2), // 損益 DoubleToString(OrderProfit() + OrderSwap() + OrderCommission(), 2), // 合計損益 IntegerToString(OrderMagicNumber()), // マジックナンバー OrderComment() // コメント ); count++; // 出力件数カウントアップ } } } |
ここでいよいよ、取引データをCSVファイルへ書き込んでいます( ゚Д゚)
特に、
OrderTypeToString()
のオリジナル関数を使って、注文種別を文字列に変換CalculatePips()
のオリジナル関数で、正確なpips損益を計算
してから記録しています。
ファイルを閉じて終了メッセージ表示
1 2 3 4 5 6 |
// ファイルをクローズ FileClose(fileHandle); // 出力完了メッセージ Print(count, " 件の取引履歴をCSVに出力しました: ", fileName); } |
最後はファイルをきちんと閉じて、出力件数をログに表示します。
これで完了です!( ゚Д゚)
オリジナル関数の解説
【注文種別を文字列に変換】OrderTypeToString関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//+------------------------------------------------------------------+ //| 注文種別を文字列に変換する関数 | //+------------------------------------------------------------------+ string OrderTypeToString(int type) { switch (type) { case OP_BUY: return "OP_BUY"; // 買い成行注文 case OP_SELL: return "OP_SELL"; // 売り成行注文 case OP_BUYLIMIT: return "OP_BUYLIMIT"; // 買い指値注文 case OP_SELLLIMIT: return "OP_SELLLIMIT"; // 売り指値注文 case OP_BUYSTOP: return "OP_BUYSTOP"; // 買い逆指値注文 case OP_SELLSTOP: return "OP_SELLSTOP"; // 売り逆指値注文 default: return "UNKNOWN"; // 不明なタイプ } } |
OrderType()だと数値で注文タイプを返すので、注文タイプ(OrderType)を、
わかりやすいID名(OP_BUYなど)に変換する関数です!
【pips計算】CalculatePips関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//+------------------------------------------------------------------+ //| pips数を計算する関数 | //+------------------------------------------------------------------+ double CalculatePips(string symbol, double openPrice, double closePrice, int type) { double pointSize = AdjustPoint(symbol); if (pointSize == 0.0) return 0; if (type == OP_BUY) return (closePrice - openPrice) / pointSize; else if (type == OP_SELL) return (openPrice - closePrice) / pointSize; return 0; } |
OrderTypeのBUY/SELLに応じて、pips数を正確に算出する関数です。
【通貨ペアの桁数対応】AdjustPoint関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//+------------------------------------------------------------------+ //| 通貨ペアごとの1pips幅を返す関数 | //+------------------------------------------------------------------+ double AdjustPoint(string Currency) { int SymbolDigits = (int)MarketInfo(Currency, MODE_DIGITS); switch(SymbolDigits) { case 2: return(0.01); case 3: return(0.01); case 4: return(0.0001); case 5: return(0.0001); } return(0.0); } |
通貨ペアの小数点以下桁数に応じて、pips単位を自動調整します。
これがないと、pips計算がズレます!
ファイルの保存場所
CSVファイルは、MT4メニューの「データフォルダを開く」→「MQL4」→「Files」フォルダへ保存されます。
まとめ
このスクリプトなら、
✅ 開始・終了期間を自由に指定して
✅ 見やすいCSV形式で
✅ 注文種別もわかりやすく出力
できるようになります( ゚Д゚)
トレードの管理・集計・振り返りに、ぜひご活用ください!
コメント