MT4でインジケーター値をCSV化するスクリプト(ZigZag編)

MT4学習

どうも潤奈です( ・Д・)

インジケーターを表示して分析する際に、CSVファイルにデータを抽出して色々と加工して分析したいと思った事はありませんか?

今回はそのインジケーター値をCSVに出力するスクリプトの作成方法を解説して行きたいと思います。

【スクリプトとは】

チャートに適用された1回だけ実行されるプログラムです。

スクリプト作成

まずはMetaEditorで新規作成「スクリプト」を作成します。

任意の名前を決めて完了をクリックして下さい。

プロパティ追加

ではコードを記述して行きます。

上の4行は初めから記載されていますので、追加するのは5行目の「#property show_inputs」です。

このshow_inputsを設定しておくと、スクリプト実行前にパラメータ等の設定ウインドウを開きます。

EAやインジケーターでは必ず表示される画面ですが、スクリプトではshow_inputsを設定しておかないとパラメータ等の設定ウインドウが開かずに処理を開始してしまいます。

パラメータ等の設定ウインドウ

パラメーター設定

先ほどのプログラムの下に設定したいパラメーターを記述して行きます。

それぞれの単語の説明は以下になります。

説明
input後からパラメーターを変更可能にする。
string文字列を格納する為に変数の型を指定する。
FileName=”ZigZag.csv”;任意の変数名=保存するCSVのファイル名を格納する。
datetime1970年1月1日から経過秒数を保存する定数です。
StartTime;任意の変数名です。ここでは何も格納させていませんので、datetimeの初期値である1970.01.01 00:00が設定されます。
EndTime;StartTimeと同様です。

インジケーターのパラメーター設定

すぐ下にインジケーターのパラメーター設定も記述して行きましょう。

今回はZigZagインジケーターのパラメーター設定を記述しています。

すべてint型で宣言をして各変数に数値を格納しています。

※ここではZigZagインジケーターの各パラメーターの説明は割愛させて頂きます。

メインコードの作成

メインとなるコードはOnStart()内に記述します。

コード全文

まずはコード全文をご覧下さい。

では順番に説明して行きます。

ファイルを開くor作成

まず初めに出力させたいCSVファイルを開きます。

int型で宣言したFile変数に、FileOpen関数を使ってファイルデータにアクセスする為のファイルハンドルを取得し格納します。

【FileOpen関数とは】

指定したフラグ(ファイルオープンフラグ)で、指定した名前のファイルを開きます。存在しなければ作成されます。エラーの場合はINVALID_HANDLEを返します。

【ファイルオープンフラグとは】

FILE_CSV:CSV形式のファイル読み取り、書き込みモードとなります。

FILE_WRITE:ファイルを書き込みの為に開きます。

そして取得した結果がINVALID_HANDLE(エラー)の場合はエラーコードをプリントさせてreturn;で終了します。

出力する範囲を指定

パラメーターで設定した開始日時と終了日時がどのローソク足(バーシフト数)になるのかを取得します。

その取得した値をStart変数とEnd変数に格納します。

【iBarShift関数とは】

指定した時間のバーシフト数を取得します。指定したバーが存在しない場合は-1が返されます。

ファイルに見出し作成

File変数を使って先ほど読み込みor作成したcsvファイルに、「,」で区切った”テキスト”を見出しとして書き込みます。

【FileWrite関数とは】

CSVファイルにデータを書き込みます。「,」カンマ区切りで63個まで指定出来ます。

取得する枠を作成

for文を使用してStart変数とEnd変数に格納された、開始バーシフト位置から終了バーシフト位置までループ処理をします。

次はこの中にプログラムを記述して行きます。

土日データはスキップ

業者によっては週の始まりがサーバー時間で日曜日の深夜になっている事があります。

すると日足では月~金の5本のバーとは別に、日曜日の深夜の数時間のデータだけのバーが1本追加されている事があります。そのバーの値幅は小さく参考にならないのでスキップさせてしまいます。

TimeDayOfWeek変数を使用して曜日を取得し、取得した曜日が0:日か6:土の場合はcontinue;を使ってfor文のループ処理の始めに戻します。

【TimeDayOfWeek関数とは】

指定した日付データの曜日(0:日曜日~6:土曜日)を取得します。

【continue処理とは】

最も近くになる外側のwhile,do while,forのループ処理の始めに戻ります。

よってその下の処理には進みません。

日付、時間、インジケーター値を取得

まず日付をTimeToStr関数を使って日付データ(”yyyy.mm.dd”フォーマット)を取得して、string型のdate変数に代入します。

次に時間をTimeToStr関数を使って時間データ(”hh:mi”フォーマット)を取得して、string型のtime変数に代入します。

最後にiCustom関数を使ってZigZag値を取得して、double型のzg変数に代入します。

【TimeToStr関数とは】

datetimeデータ(1970年1月1日 0時0分0秒からの経過秒数)を”yyyy.mm.dd hh:mi”フォーマットの文字列に変換します。

TIME_DATE:”yyyy.mm.dd”フォーマットで出力させます。

TIME_MINUTES:”hh:mi”フォーマットで出力させます。

【iCustom関数とは】

指定したカスタムインジケーターを計算し、その値を返します。

取得したデータを書き込む

File変数を使って先ほど取得したデータをcsvファイルに、「,」で区切ってデータを書き込みます。

【FileWrite関数とは】

CSVファイルにデータを書き込みます。「,」カンマ区切りで63個まで指定出来ます。

書き込んだファイルを閉じる

for文のループは抜けました。

その後にFile変数を使って開いていたファイルをFileClose関数で閉じます。

完了通知をプリント

最後にGetLastError関数でエラーが発生していないかチェックして、エラー無し=0の場合はPrint関数で”書き込み成功”とプリントアウトさせます。

もし、エラーが出ていたらエラーコードをプリントアウトさせます。

コンパイル処理

プログラムが書けたらコンパイルをクリックします。

下のウインドウでエラーが出ていなければ完成です。

使用方法

MT4に移ってナビゲーターウインドウを確認します。

スクリプト使用手順

今回はスクリプトで作成したので、スクリプトフォルダの中に先ほどのプログラムが保存されています。

こちらをデータ抽出したい通貨ペアチャートを開いた状態で、チャートにドラック&ドロップするか、右クリックして「チャートで実行」をクリックします。

パラメーター等の設定ウインドウが開きますので、各種パラメーターを入力して「OK」をクリックします。

ターミナルウインドウの「エキスパート」で「書き込み成功」がプリントアウトされていれば成功です。

出力されたデータ確認

「ファイル」→「データフォルダを開く」をクリックします。

開いたフォルダの「MQL4」→「Files」→「ZigZag.csv」に保存されていますので開いて確認してみて下さい。

まとめ

出力したCSVを開くとこの様なデータが出力されています。(5分足チャートに適用した場合)

これでZigZagの値がHighと同じか、Lowと同じかで頂点と底辺が分かるので、頻度や間隔などいろいろとデータ分析が出来そうですよね!

応用すれば複数のインジケーター値を出力して分析する事も出来ますので是非試してみて下さい。

では今回はこの辺で!

では( ・Д・)

コメント

タイトルとURLをコピーしました