メタトレーダー4でプログラムを作ってみよう -15ページ目

メタトレーダー4でプログラムを作ってみよう

無料のトレードソフトであるメタトレーダー4のプログラムを作るコツをアップします。初心者がインジケーターとEAのプログラムを作成できるのを目指します。

OrdersHistoryTotal() は過去に決済した注文の数を調べる関数です。

ここで注意なのですが、ここれで調べられるのは、

ターミナル」の「口座履歴」タブに表示されている数です。

口座履歴の期間を「全履歴」にしていると全てが表示されますが、

期間を区切っている場合は全てが表示されるとは限りません。

なので、全ての履歴を調べたい場合は、先に「全履歴」の設定をしておく必要があります。


また、指値注文で約定せずにキャンセルした注文も過去の履歴として残ります。

純粋に約定した注文ではないので、この点もご注意ください。




 
前回、口座履歴を書き出す方法で、 FileWrite のところで別な方法があると書いたので、

今回はその方法を説明します。

というか、今回説明する方が正式な使い方だったりします。(;´▽`A``


まずは、FileOpen を以下のように修正します。

handle = FileOpen(LogFileName, FILE_CSV|FILE_WRITE, ',');

前回と変わっているのは、後ろに , ',' がつきました。

これは、区切り文字の設定です。

CSVで区切る時に、区切り文字として , を指定します、ということです。

区切り文字は ' で囲みます。


つぎに、FileWrite を、以下のように修正します。

FileWrite(handle,
   OrderTicket(),
   BuySellType,
   DoubleToStr(OrderLots(),2),
   TimeToStr(OrderOpenTime(),TIME_DATE),
   TimeToStr(OrderOpenTime(),TIME_SECONDS),
   DoubleToStr(OrderOpenPrice(),5),
   TimeToStr(OrderCloseTime(),TIME_DATE),
   TimeToStr(OrderCloseTime(),TIME_SECONDS),
   DoubleToStr(OrderClosePrice(),5),
   OrderMagicNumber(),
   OrderComment(),
   AccountCompany()
   );


handle の後ろに書き出したい項目を , 区切りで並べます。

HistoryData は使用しないので削除してください。


出力されるデータ自体は変わりません。

作成方法の好みの問題なので、どちらで作成してもOKです。




   
それでは、プログラムの解説をしていきます。

string UserName = "修一";
int handle;
string LogFileName;
string HistoryData;
string BuySellType;
LogFileName = "Log_" + UserName + ".csv";

最初の方は、使用する変数の宣言をやっています。

LogFileName は実際に作成されるcsvファイルの名前です。

特にこの名前にこだわる必要はないので、わかりやすい名前に変更してください。


handle = FileOpen(LogFileName, FILE_CSV|FILE_WRITE);

これは、ファイルを開く関数です。

後に出てくる、FileClose とセットで使用します。

FileOpen では書き込みたいファイル名を指定し、その後ろにモードを設定します。

今回はCSVモードで、書き込みの設定をしています。

FileOpen が成功すると、ファイルの番号が返ってきますので、

それを handle に覚えさせておき、後で使用します。


for (int i = 0; i < OrdersHistoryTotal(); i++)
{
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == true)
   {


for 文で口座履歴データの個数を設定して、古いものから順に読み込ませます。


      if (OrderType() == 0) BuySellType = "Buy";
      if (OrderType() == 1) BuySellType = "Sell";
      if (OrderType() == 2) BuySellType = "BuyLimit";
      if (OrderType() == 3) BuySellType = "SellLimit";
      if (OrderType() == 4) BuySellType = "BuyStop";
      if (OrderType() == 5) BuySellType = "SellStop";

売買の注文の種類により、書き出す文字を設定します。

注文の種類に関する記事


      HistoryData = OrderTicket()
         +","+ BuySellType
         +","+ DoubleToStr(OrderLots(),2)
         +","+ TimeToStr(OrderOpenTime(),TIME_DATE)
         +","+ TimeToStr(OrderOpenTime(),TIME_SECONDS)
         +","+ DoubleToStr(OrderOpenPrice(),5)
         +","+ TimeToStr(OrderCloseTime(),TIME_DATE)
         +","+ TimeToStr(OrderCloseTime(),TIME_SECONDS)
         +","+ DoubleToStr(OrderClosePrice(),5)
         +","+ OrderMagicNumber()
         +","+ OrderComment()
         +","+ AccountCompany();

ファイルに書き出す情報をまとめます。

CSVファイルなので、間に "," を入れて、カンマ区切りの情報にします。

他のやり方もあるのですが、こちらの方が好きなのでこれで作成しています。


      FileWrite(handle, HistoryData);

まとめたデータをファイルに書き込みます。

書き込みたいファイルの番号と、書き込みたいデータを設定します。


FileClose(handle);

最後にファイルを閉じて終了です。

ファイルを閉じる処理をやらないと、ファイルにアクセスできなくなることがありますので、

閉じる処理は忘れないようにしてください。