どうも潤奈です( ・Д・)
インジケーターを表示して分析する際に、CSVファイルにデータを抽出して色々と加工して分析したいと思った事はありませんか?
今回はそのインジケーター値をCSVに出力するスクリプトの作成方法を解説して行きたいと思います。
スクリプト作成
まずはMetaEditorで新規作成「スクリプト」を作成します。
任意の名前を決めて完了をクリックして下さい。
プロパティ追加
ではコードを記述して行きます。
上の4行は初めから記載されていますので、追加するのは5行目の「#property show_inputs」です。
1 2 3 4 5 |
#property copyright "Copyright 2021, Zyuna32246" #property link "https://zyunafx.com/" #property version "1.00" #property strict #property show_inputs //実行前にパラメーターウインドウを表示する |
このshow_inputsを設定しておくと、スクリプト実行前にパラメータ等の設定ウインドウを開きます。
EAやインジケーターでは必ず表示される画面ですが、スクリプトではshow_inputsを設定しておかないとパラメータ等の設定ウインドウが開かずに処理を開始してしまいます。
パラメーター設定
先ほどのプログラムの下に設定したいパラメーターを記述して行きます。
1 2 3 4 |
//パラメーター input string FileName="ZigZag.csv"; //セーブファイル名 input datetime StartTime; //開始日時 input datetime EndTime; //終了日時 |
それぞれの単語の説明は以下になります。
説明 | |
input | 後からパラメーターを変更可能にする。 |
string | 文字列を格納する為に変数の型を指定する。 |
FileName=”ZigZag.csv”; | 任意の変数名=保存するCSVのファイル名を格納する。 |
datetime | 1970年1月1日から経過秒数を保存する定数です。 |
StartTime; | 任意の変数名です。ここでは何も格納させていませんので、datetimeの初期値である1970.01.01 00:00が設定されます。 |
EndTime; | StartTimeと同様です。 |
インジケーターのパラメーター設定
すぐ下にインジケーターのパラメーター設定も記述して行きましょう。
1 2 3 4 |
//インジケーター input int Depth=12; input int Deviation=5; input int Backstep=3; |
今回はZigZagインジケーターのパラメーター設定を記述しています。
すべてint型で宣言をして各変数に数値を格納しています。
※ここではZigZagインジケーターの各パラメーターの説明は割愛させて頂きます。
メインコードの作成
メインとなるコードはOnStart()内に記述します。
コード全文
まずはコード全文をご覧下さい。
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 |
void OnStart() { //ファイルオープン int File=FileOpen(FileName,FILE_CSV|FILE_WRITE,','); if(File==INVALID_HANDLE){ //ファイルのオープンに失敗した時 Print("File("+FileName+")Open error(",GetLastError(),")"); return; } //出力する範囲指定 int Start=iBarShift(_Symbol,0,StartTime); int End=iBarShift(_Symbol,0,EndTime); //ファイル出力(見出し) FileWrite(File,"Date","Time","Open","High","Low","Close","ZigZag"); //ファイル出力(中身データ) for(int i=Start;i>=End;i--){ //土曜日および日曜日のデータはスキップする int week=TimeDayOfWeek(Time[i]); if(week==0 || week==6)continue; //日付、時間、インジケーター値を取得 string date=TimeToStr(Time[i],TIME_DATE); string time=TimeToStr(Time[i],TIME_MINUTES); double zg=iCustom(_Symbol,0,"ZigZag",Depth,Deviation,Backstep,0,i); //取得したデータを書き込み FileWrite(File,date,time,Open[i],High[i],Low[i],Close[i],zg); } //ファイルを閉じる FileClose(File); //完了通知 if(GetLastError()==0){ Print("書き込み成功"); }else{ Print("File("+FileName+")error(",GetLastError(),")"); } } |
では順番に説明して行きます。
ファイルを開くor作成
1 2 |
//ファイルオープン int File=FileOpen(FileName,FILE_CSV|FILE_WRITE,','); |
まず初めに出力させたいCSVファイルを開きます。
int型で宣言したFile変数に、FileOpen関数を使ってファイルデータにアクセスする為のファイルハンドルを取得し格納します。
そして取得した結果がINVALID_HANDLE(エラー)の場合はエラーコードをプリントさせてreturn;で終了します。
1 2 3 4 5 |
if(File==INVALID_HANDLE){ //ファイルのオープンに失敗した時 Print("File("+FileName+")Open error(",GetLastError(),")"); return; } |
出力する範囲を指定
1 2 3 |
//出力する範囲指定 int Start=iBarShift(_Symbol,0,StartTime); int End=iBarShift(_Symbol,0,EndTime); |
パラメーターで設定した開始日時と終了日時がどのローソク足(バーシフト数)になるのかを取得します。
その取得した値をStart変数とEnd変数に格納します。
ファイルに見出し作成
1 2 |
//ファイル出力(見出し) FileWrite(File,"Date","Time","Open","High","Low","Close","ZigZag"); |
File変数を使って先ほど読み込みor作成したcsvファイルに、「,」で区切った”テキスト”を見出しとして書き込みます。
取得する枠を作成
1 2 3 4 5 6 |
//ファイル出力(中身データ) for(int i=Start;i>=End;i--){ //取得コード } |
for文を使用してStart変数とEnd変数に格納された、開始バーシフト位置から終了バーシフト位置までループ処理をします。
次はこの中にプログラムを記述して行きます。
土日データはスキップ
業者によっては週の始まりがサーバー時間で日曜日の深夜になっている事があります。
すると日足では月~金の5本のバーとは別に、日曜日の深夜の数時間のデータだけのバーが1本追加されている事があります。そのバーの値幅は小さく参考にならないのでスキップさせてしまいます。
1 2 3 |
//土曜日および日曜日のデータはスキップする int week=TimeDayOfWeek(Time[i]); if(week==0 || week==6)continue; |
TimeDayOfWeek変数を使用して曜日を取得し、取得した曜日が0:日か6:土の場合はcontinue;を使ってfor文のループ処理の始めに戻します。
日付、時間、インジケーター値を取得
1 2 3 4 |
//日付、時間、インジケーター値を取得 string date=TimeToStr(Time[i],TIME_DATE); string time=TimeToStr(Time[i],TIME_MINUTES); double zg=iCustom(_Symbol,0,"ZigZag",Depth,Deviation,Backstep,0,i); |
まず日付をTimeToStr関数を使って日付データ(”yyyy.mm.dd”フォーマット)を取得して、string型のdate変数に代入します。
次に時間をTimeToStr関数を使って時間データ(”hh:mi”フォーマット)を取得して、string型のtime変数に代入します。
最後にiCustom関数を使ってZigZag値を取得して、double型のzg変数に代入します。
取得したデータを書き込む
1 2 |
//取得したデータを書き込み FileWrite(File,date,time,Open[i],High[i],Low[i],Close[i],zg); |
File変数を使って先ほど取得したデータをcsvファイルに、「,」で区切ってデータを書き込みます。
書き込んだファイルを閉じる
1 2 |
//ファイルを閉じる FileClose(File); |
for文のループは抜けました。
その後にFile変数を使って開いていたファイルをFileClose関数で閉じます。
完了通知をプリント
1 2 3 4 5 6 |
//完了通知 if(GetLastError()==0){ Print("書き込み成功"); }else{ Print("File("+FileName+")error(",GetLastError(),")"); } |
最後にGetLastError関数でエラーが発生していないかチェックして、エラー無し=0の場合はPrint関数で”書き込み成功”とプリントアウトさせます。
もし、エラーが出ていたらエラーコードをプリントアウトさせます。
コンパイル処理
プログラムが書けたらコンパイルをクリックします。
下のウインドウでエラーが出ていなければ完成です。
使用方法
MT4に移ってナビゲーターウインドウを確認します。
スクリプト使用手順
今回はスクリプトで作成したので、スクリプトフォルダの中に先ほどのプログラムが保存されています。
こちらをデータ抽出したい通貨ペアチャートを開いた状態で、チャートにドラック&ドロップするか、右クリックして「チャートで実行」をクリックします。
パラメーター等の設定ウインドウが開きますので、各種パラメーターを入力して「OK」をクリックします。
ターミナルウインドウの「エキスパート」で「書き込み成功」がプリントアウトされていれば成功です。
出力されたデータ確認
「ファイル」→「データフォルダを開く」をクリックします。
開いたフォルダの「MQL4」→「Files」→「ZigZag.csv」に保存されていますので開いて確認してみて下さい。
まとめ
出力したCSVを開くとこの様なデータが出力されています。(5分足チャートに適用した場合)
これでZigZagの値がHighと同じか、Lowと同じかで頂点と底辺が分かるので、頻度や間隔などいろいろとデータ分析が出来そうですよね!
応用すれば複数のインジケーター値を出力して分析する事も出来ますので是非試してみて下さい。
では今回はこの辺で!
では( ・Д・)
コメント