FX自動売買基礎と応用

File関数を使用してトレード履歴を保存する方法


データを記憶させるのに役立つ関数


この記事では、File関数を利用してトレード履歴を保存する方法を紹介します。File関数は、文字通りファイルを操作するための関数です。一口にFile関数と言っても、さまざまな種類が用意されています。MQLリファレンスの目次にある「File Functions」をクリックすると、一通り確認できます。

MQLリファレンスの目次にある「File Functions」をクリック

File関数は半永久的なデータ記憶が可能で、記憶用途で使用されることが多くあります。プログラムのメモリーなどは、MT4を落としたときに消えてしまうことがあるため、長い間記憶させたい場合に有効です。また、トレードのデータは数か月でサーバーから消えてしまうので、それを保持するのにFile関数を利用して記憶しておくのも一つの手です。

ただ、File関数には限定的な条件があり、MT4画面上部メニューの「ファイル」→「データフォルダを開く」→「MQL4」→「Files」フォルダ内のファイルのみしか、基本的には扱うことができません。


CSVファイルを開いてデータを書き込む


今回は、サーバーにある直近のデータをCSVファイルに記憶するツールを作ります。一度実行したらそれで終了という形式のプログラムで良いので、作成するのは「スクリプト」です。ファイルの新規作成で「スクリプト」にチェックを入れて「次へ」を押し、ファイル名を「FileTest」とします。

新規作成で「スクリプト」にチェックを入れて「次へ」

新規ファイルができたら、先ほどのMQLリファレンスのFile関数一覧から参考となるコードをコピーしましょう。今回使うのは、「FileOpen」のページに記されている下記コードです。これを「OnStart」関数配下にコピーします。


ResetLastError(); 
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV); 
   if(filehandle!=INVALID_HANDLE) 
     { 
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(ENUM_TIMEFRAMES(_Period))); 
      FileClose(filehandle); 
      Print("FileOpen OK"); 
     } 
   else Print("Operation FileOpen failed, error ",GetLastError());

そして、「filehandle=FileOpen(“fractals.csv”,FILE_WRITE|FILE_CSV);」の「filehandle」の前に「int」を加え、「fractals.csv」を「result.csv」に変更します。これでコンパイルして、スクリプトにある「FileTest」をチャート上にドラッグ&ドロップすると、「Files」フォルダ内に「result.csv」というCSVファイルが自動的に作成されます。

このファイルを開いて内容を確認すると、一つのセルの中に日付や時間、通貨ペア名、時間足が表示されていることが分かります。


取引データを別々のマスに格納


次に、過去の取引データを確認しながら順番に一つ一つのマスに格納するように改修します。

まずfor文の中にポジションのデータを取得する「OrderSelect」関数を使ってif文を記述し、過去の取引履歴から注文の選択が成功した場合に処理を実行するようにします。


for (int i = 0; i <="" p="">
string str = NULL;
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

続いて、そのときの情報を「string」に積算していきます。一つ目は注文のチケット番号(OrderTicket)、二つ目は注文の通貨ペア名(OrderSymbol)、三つ目は注文の決済時間(OrderCloseTime)です。CSVファイルで別々のマスに格納したいので、それぞれのデータをカンマで区切っていきます。また、決済時間に関しては「TIME_DATE | TIME_SECONDS」として秒単位で表示するようにします。


str = (string)OrderTicket() + ",";
str += OrderSymbol() +",";
str += TimeToString(OrderCloseTime(), TIME_DATE | TIME_SECONDS) + ",";

そして、「OrderType」で注文のタイプが「買い」なのか「売り」なのかを記録します。

OrderTypeは、買い注文は「0」、売り注文は「1」という値なので、「OP_BUY」だったら「Buy」、そうでなかったら「Sell」とします。あとは注文のロット数と損益を追加して、最後に改行の「\n」を入れます。これで注文ごとに1行ずつ別々のマスにデータが書き込まれます。

最後に、「FileWriteString」でファイル範囲にデータを書き込むコードを記述すれば完了です。


str += (OrderType() == OP_BUY ? "Buy" : "Sell") + ",";
str += (string)OrderLots() + ",";  
str += (string)OrderProfit() + "¥n";  
FileWriteString(filehandle, str);

これでコンパイルして「FileTest」をチャート上にドラッグ&ドロップし、「result.csv」を更新すれば、取引データが一つ一つのマスに格納されます。


1行目にタイトルを追加


取引データだけだと分かりづらいので、1行目にタイトルを表示するようにしましょう。1行目に「Ticket」「Symbol」「Time」「Type」「Lot」「Profit」が表示されるよう、for文の前に次のコードを記述します。


string title = "Ticket,Symbol,Time,Type,Lot,Profit\n";
FileWriteString(filehandle, title);

これでもう一度コンパイルして「FileTest」をチャート上にドラッグ&ドロップし、更新された「result.csv」を開くと、1行目にタイトルが追加されます。このようにCSVファイルに取引データを書き込むと、損益などを簡単に集計できるので便利です。

ちなみに、コンパイルした「FileTest」をチャート上にドラッグ&ドロップする際、CSVファイルが開いているとエラーが発生してしまうので注意が必要です。必ずCSVファイルを閉じてからドラッグ&ドロップするようにしましょう。


ソースコード


今回、作成したソースコードは下記の通りです。


//+——————————————————————+
//| FileTest.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+——————————————————————+
#property copyright “Copyright 2021, MetaQuotes Software Corp.”
#property link “https://www.mql5.com”
#property version “1.00”
#property strict
//+——————————————————————+
//| Script program start function |
//+——————————————————————+
void OnStart()
{
ResetLastError();
int filehandle = FileOpen(“result.csv”, FILE_WRITE | FILE_CSV);
if(filehandle != INVALID_HANDLE) {
// FileWrite(filehandle, TimeCurrent(), Symbol(), EnumToString(ENUM_TIMEFRAMES(_Period)));
string title = “Ticket,Symbol,Time,Type,Lot,Profit\n”;
FileWriteString(filehandle, title);
for (int i = 0; i <="" p="">
string str = NULL;
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
   str = (string)OrderTicket() + “,”;
   str += OrderSymbol() +”,”;
   str += TimeToString(OrderCloseTime(), TIME_DATE | TIME_SECONDS) + “,”;
   str += (OrderType() == OP_BUY ? “Buy” : “Sell”) + “,”;
   str += (string)OrderLots() + “,”;
   str += (string)OrderProfit() + “\n”;
   FileWriteString(filehandle, str);
}
}
FileClose(filehandle);
Print(“FileOpen OK”);
} else Print(“Operation FileOpen failed, error “, GetLastError());
}
//+——————————————————————+


本記事の監修者・HT FX


2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。

EA(自動売買)を学びたい方へオススメコンテンツ

EA運用の注意点

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする

ホーム » FX自動売買基礎と応用 » File関数を使用してトレード履歴を保存する方法