CSVファイルを出力してみる。

CSVファイルを出力してみる。

4XP => メタトレーダー対応、固定スプレッド、最小1000通貨
50種類以上の通貨ペア、各種CFD(金、株など)対応

にほんブログ村 為替ブログ FX システムトレード派へ

今回は、ファイル出力を行いたいと思います。

タイトルでは、CSVファイルを出力することになっていますが、なるべく利用しやすいように文字列の行書きだしの関数を作ります。

CSVファイルも出力できますし、ログとして出力することもできます。

EAでもインジケータでもいいのですが、とりあえず、インジケーターで作成してみましょう。

何でもいいので、MetaEditorでインジケーターを作成してください。

別にパラメータなど入りませんので、適当でかまいません。

以下の関数をコピーして、最後にでもペースとしてください。

int LogWrite(string strFileName,string strText)
{
int handle;
handle=FileOpen(strFileName, FILE_BIN|FILE_READ|FILE_WRITE);
if(handle<1)
{
Print(”can’t open file error-”,GetLastError());
return(-1);
}
FileSeek(handle, 0, SEEK_END);
strText = strText + “\r\n”;
FileWriteString(handle, strText, StringLen(strText));
FileClose(handle);
return(0);
}

int LogWrite(string strFileName,string strText)

{

int handle;

handle=FileOpen(strFileName, FILE_BIN|FILE_READ|FILE_WRITE);

if(handle<1)

{

Print(”can’t open file error-”,GetLastError());

return(-1);

}

FileSeek(handle, 0, SEEK_END);

strText = strText + “\r\n”;

FileWriteString(handle, strText, StringLen(strText));

FileClose(handle);

return(0);

}

この関数は、

1.ファイルを開く

2.ファイルの最後に移動

3.ファイルへ出力

4.ファイルを閉じる

このことを行っています。

ちょこっと難しいというか、分かりにくいのが、

FileOpen(strFileName, FILE_BIN|FILE_READ|FILE_WRITE);

FILE_BIN|FILE_READ|FILE_WRITE

バイナリーモードで読み書きするという意味ですが、

その他にもファイルの中身を消去しないという意味があります。

今回は、書くだけなので「FILE_WRITE」だけでいいような気がしますが、

これだけだと、ファイルの中身を消してしまいます。

ということで、消したくないときは「FILE_READ|FILE_WRITE」の2つを指定する必要があります。

たぶん、ここが分かりにくいでしょうね。

FileSeek(handle, 0, SEEK_END);

は、ファイルの一番最後へ移動。

strText = strText + “\r\n”;

は、指定された文字の最後に改行コードを入れています。

これを入れないと改行されずに、連続した文字になってしまいます。

FileWriteString(handle, strText, StringLen(strText));

で、文字を指定した文字数分書き出しています。

FileClose(handle);

でファイルを閉じています。

この関数を使うと、簡単にファイルを出力できます。

LogWrite(ファイル名,出力したい文字列)

を指定すればいいだけです。

ちなみにファイルですが、

インストールパス\MetaTrader\experts\files

に出力されます。

EAのテストモードだけ出力先が変わって、

インストールパス\MetaTrader\tester\files

です。

では、関数を呼び出す部分を作ってみましょう。

int start()

の中に、以下の行を追加してください。

string strText = StringConcatenate(Year(),”/”,Month(),”/”,Day(),” “,Hour(),”:”,Minute(),”:”,Seconds(),”,”,Ask,”,”,Bid);

LogWrite(”AskBid.csv”,strText);

レートが変化したときの買値と売値を出力します。
ファイルの形式は、以下のようになります。

YYYY/MM/DD hh:mm:ss,買値,売値

CSVファイルで出力していますが、CSVファイルはカンマ区切りのテキストファイルです。

本当は、もう少し細かいルールがありますが、とりあえず問題ないはずです。

詳しく知りたい人は、ぐぐってみてください。

これで、コンパイルして適当な表にドラッグすれば、ファイルができあがっているはずです。

この関数は、文字なら何でも出力できるので、重宝すると思います。

せっかくなので、もう一つ出力例を

init()の上あたりに以下の宣言を追加してください。

datetime timeNow;

start()の中に以下の処理を追加してください。

if(timeNow != iTime(NULL,0,1))

{

timeNow = iTime(NULL,0,1);

string strTextAshi = StringConcatenate(TimeYear(timeNow),”/”,TimeMonth(timeNow),”/”,TimeDay(timeNow),” “,TimeHour(timeNow),”:”,TimeMinute(timeNow),”:”,TimeSeconds(timeNow),”,”,iHigh(NULL,0,1),”,”,iOpen(NULL,0,1),”,”,iClose(NULL,0,1),”,”,iLow(NULL,0,1));

LogWrite(”Ashi.csv”,strTextAshi);

}

今度のは、足が確定したときの高値、始値、終値、安値を出力しています。

レートが変わるたびに出力しても意味がないので、1本前の時間が変わったときに出力するようにしています。

こんな感じです。

ファイル出力は、分かりましたか?

他にも出力の仕方は、色々あるので試してみてくださいね。

にほんブログ村 為替ブログ FX システムトレード派へ 人気ブログランキングへ

タグ

トラックバック&コメント

この記事のトラックバックURL:

コメント

  1. 犬養 より:

    おぉおおお
    わかりやすい説明ありがとうございます!
    これが出力の仕方ですね!
    Indicate の変数を渡せば、 変数も同時に出力されるのか><
    これはExcelで分析するには便利ですね!

    ”が全角でエラーが出てましたが
    ” と半角に直したら無事にできました!

    次はcsvの読み込みよろしくお願いいたします><

    • kei より:

      csvの読み込みなんですが、読み込んだ後どうするんですか?
      利用方法が分からないので、ネタにしにくいんですが。。。

  2. 犬養 より:

    こんにちは、返信ありがとうございます。

    こういった指標(http://www.gaitame.com/market/yosoku/index.html)を読み込むIndicateを作りたいなぁーと思いまして。

  3. しょう より:

    こんにちは。 いろいろと検索していてたどり着きました。

    ウェブ上から重要指標のデータを取得する方法など、参考になる記事がいっぱいでした。^^

    テキストファイルについて、MQLの標準の関数では「experts/files」下のファイルしか扱えませんが、Windows標準のDLLなどを利用して、それ以外の保存先のテキストファイルを扱う方法に関して、もしご存知でしたら教えていただけると幸いです。

  4. takstarjp より:

    始めまして。

    ネットを探しこのサイトにたどり着きメールさせていただきます。
    かなり前のネタのようですのでレスを期待しての投稿です。

    MACDを使用したインジケーター(ネットで拾ったもの)で
    シグナルが出ると、インジケーター上にBUYやSELLの文字がでます。

    これをCSVに1分後とに出力させたいのですができますでしょうか。
    (その判断すらできないため、可能であればご教授ください。)

    現在これを達成するためにしていることは、あるツールを使用して
    MT4を1分ごとに終了、起動しています。
    コード内にmailsendを記述しておいて起動タイミングでメール送信。
    そのメールを別のツールでCSVで引き抜くということをしています。

    この修正をお受け頂けないでしょうか。
    ご連絡メールお待ちしております。

    • kei より:

      まず、MT4は、レートの変化でイベントが発生する仕組みになっています。
      そのため、残念ながら時間指定で行うことは不可能です。


コメントを投稿する



この記事のコメントだけのRSSフィードを取得

Spam Protection by WP-SpamFree


さわさわさん手法について考える »
« FX自動売買ロボット作成マニュアル