過去のボラティリティをCSV出力するEA

CSV分析

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

今回は過去のボラティリティを各年毎に集計してCSV出力するEAを書いて行きたいと思います( ゚Д゚)
ボラティリティを取得する為にATR(アベレージトゥルーレンジ)のインジケーターを使用します!

CSV出力されるデータはこちらです。

コード作成の様子はYoutubeの作業配信でも行っていますので、どのように作成するのか参考にしたくて時間に余裕がある方はご覧ください( ゚Д゚)

スポンサーリンク

ソースコード

さっそくですが、全ソースコードは以下になります( ゚Д゚)

ソースコード説明

ではソースコードの説明に行きたいと思います( ゚Д゚)

パラメーター作成

パラメーターはシンプルに、ATRインジケーターに適用する時間軸と期間の2つを用意します。

全体に関わる変数/配列を宣言

それぞれの変数/配列の説明はコメントで加えていますので詳細は割愛します。

int OnInit()内のコード

OnInit()はチャートに適用した時や、チャートの時間軸を変更した時に最初に呼び出される関数です。
なので、1回だけ計算すれば良い物などはここに書いてしまいます。

point→pipsに変換する為の値を入れておく

全体のソースコードの一番下に配置しているAdjustPoint()関数を呼び出して、Pips変数に値を入れておきます。
この値は通貨ペアが変わる事がない限り変更しないので、ここで入れておきます。

どの様に使うかと言うと、例えばATRインジケーターの値がドル円チャートで0.0644だった場合、それにAdjustPoint()で取得した値(ドル円の場合は0.01)を÷ことでpips単位に計算出来ます。

0.0644÷0.01=6.44pips

配列のサイズを指定する

先ほど宣言した各配列のサイズ(個数)を宣言しておきます。
とりあえず各サイズを1個で宣言しておいて、あとから増やして行きたいと思います。

配列の値を初期化する

次に配列の値を初期化(初期値)を入れておきます。
AtrMinYear配列は最小値を上書きしていくので、まず最初は適当に大きい数字で初期化しておきます。

計測開始年、年月日を入れておく

ArrayYear[0]の最初の配列にはこの時点の年を取得して入れておきます。

sDate変数も同様に計測開始年月日として取得し、StringConcatenate関数を使って連結させます。

IntegerToString関数は指定した桁数に足らない場合、指定した文字で埋める関数です。
例えばMonth()=1の場合、1桁しかないので’0’で文字埋めして2桁にするようにしているので、01となります。

void OnTick()内のコード

OnTick()はティックを受信する度に処理される関数です。

バー始値制御で囲む

ティック毎に処理する必要はなく、ATRで取得したい時間軸毎に処理が動くように制御を入れておきます。

最初はnTime変数には0が入っているので、iTime関数で取得した値とは違いますのでif文内の処理に入ります。
最後に現在の時間を入れておくと、指定した時間足が切り替わらないとif文内の処理に入れなくなります。

ATR値を取得してpipsに変換

iATR関数を使用して、ATR値を取得します。その値をPips変数の値で割る事でpipsに変換して、ATR変数に入れます。

年が変わった時の処理

最初のif文の処理は、バー始値制御と同じ理屈で年が切り替わったタイミングのみ処理されるようにしています。

初年は各配列の個数は1で、配列番号は0となっています。
なので配列番号として使用するy変数に1を足して、配列のサイズ(個数)を1つ足して増やす処理を行います。

次に追加した配列に初期値として値を入れておきます。
AtrMinYear配列は前回同様で、初期値として大きい数字を入れておきます。
ArrayYear配列は新しい年を入れておきます。

ATR値の最大値、最小値を更新する

最大値はMathMax関数を使って、AtrMaxYear配列に入っている値と取得したATR値を比べて大きい方をAtrMaxYear配列に入れるようにします。

最小値はMathMin関数を使って、同様の処理で小さい方をAtrMinYear配列に入れるようにします。

ATR値を合計して回数をカウントする

AtrTotalYear配列にはATR値を「+=」を使って足していきます。
Count配列には「++」を使って1ずつ足していきます。
後でこの合計を回数で割る事で平均値を出す為に必要です。

double OnTester()のコード

OnTester()関数はバックテストした際に、最後に処理される関数です。
ここにCSV出力のコードを書いていきます。

計測終了年月日を取得する

計測開始年月日と同様で、このバックテスト終了時の年月日を取得しれ入れておきます。

CSVファイルを準備する

ファイルデータの名前として必要な情報を連結してfName変数に入れます。
CSVファイルなので最後に”.csv”を付け忘れないように注意して下さい。

【ファイル名に使用出来ない文字】
MT4上ではエラーは出ませんが正しく出力されない可能性があります。
\ / : * ? ” < > |

FileDelete関数でfName変数の名前のデータがあれば削除させます。
FileOpen変数でCSVファイルを作成します。
()内の引数はファイル名とCSVファイルを作成するのに必要な値として覚えて下さい。

【バックテスト後の注意】
実際にバックテストした後にファイルを開くと思います。そのファイルを開いたまま再度バックテストするとMT4ではそのファイルを操作出来ないので必ずCSVファイルを閉じて下さい。

見出しを書き込む

見出しに必要な情報をsubject変数に「,」カンマで区切って入れておきます。
FileWrite関数でその見出しをfOpenのファイルに書き込みます。それぞれの要素を「,」で区切る事でセルが分かれます。

FileSeek関数で行末(ファイルの最後)に移動します。

計測した年数分のデータを書き込む

y変数は計測した年数の値が入っているので、これを使ってfor文でループ処理を行います。

data変数に見出しと同じ順番のデータを「,」を間に入れながら「+=」で連結させていきます。
上からそれぞれ、計測年、最大値、最小値、平均値(合計÷回数)、計測回数となります。

NormalizeDouble関数を使って、不要な小数点以下の値を丸めてデータをスッキリさせます。

そして1行ずつFileWrite関数でファイルに書き込みを行います。

CSVファイルを閉じます

最後にFileClose関数で指定ファイルを閉じます。

オリジナル関数(AdjustPoint関数)

こちらの関数は以下の記事で説明していますので参考にして下さい。

コード説明は以上となります( ゚Д゚)

まとめ

今回のコードは年単位でのボラティリティを計測できるように作成しました。
途中の年が変わった時の処理のコードを、月単位に変更するなど応用してみて下さい。

では( ゚Д゚)

【免責事項】

※当ソースコードにおける如何なる損失もご自身の自己責任となります。投資資産における運用の結果生じた損害の全部若しくは一部について一切の責任及び負担を負わないものとします。
※当ソースコードにつきましても、バグや不具合がないことを保証するものではありません。

※当ソースコードについてはサポート等については行っておりません。
※このブログで掲載されている情報は、投資等の勧誘又は推奨を目的としたものではありません。
※掲載されている内容は予告なしに変更することがあります。

コメント

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