MQL4 と MQL5 では「インディケーターの値を取得する方法」が全然異なるので、戸惑っている人も多いのではないでしょうか?
MQL4 では iMA() などの関数から直接、値を得ることができましたが、
MQL5 では 「インディケータの値を得る」には、‘ handle値 ‘ を経由する必要があるので最初はわかりにくいと思います。
その「’ handle値 ‘ を経由する」際に必要となるのが、CopyBuffer() 関数になります。
今回はこの CopyBuffer() 関数をわかりやすく説明しようと思います。
Contents
CopyBuffer はどのような用途で使うのか?
に使います。
MQL4 と違い、iMA() などのインディケーターの関数は、指標の値ではなく ’ handle 値 ‘ を返すので、
指標の値を取得するには、その handle 値を使って実際の値を取得する必要があります。
そこで CopyBuffer() を使います。
これだけではわかりにくいと思いますが、要は CopyBuffer 関数の機能としては、
ことです。
なお、この配列は自分で用意する必要があります。
MQL5 でインディケーターの値を取得する際の「流れ」とは
以上をまとめると、MQL5 でインディケータの値を取得する際には
という流れを踏むことになります。
CopyBuffer 関数の 3通りの使い方を解説
CopyBuffer() を使う際には、以下の項目を指定する必要があります。
- 指標の handle 値
- 期間(⇒ 開始位置 & 終了位置)
- 指標バッファの番号
1 … handle 値は iMA() などの指標関数から得たものです。
2 … 「期間」とは、例えば移動平均線なら「どの期間の移動平均の値がほしいか」を指定する必要があります。「開始位置」は一番新しいデータで、終了位置が一番古いデータになります。
3 … わかりにくいので以下に説明します。
指標バッファの番号とは?
基本的には 0 にしとけばオッケーです。
これは、「1つの指標」でも稀に「複数の値」がある指標もあって、その場合に「どの値」をいれるか、を指定するためのものです。
例を挙げると、MACDには「MACD線」と「シグナル線」があり、0 が MACD線、1がシグナル線 に相当します。
0 から始まるので、大体の場合は 0 になります。
このバッファ番号についてはテクニカル指標関数の公式ページ(例えば MACD なら iMACD())にすべて書いてあるので、公式ページを見てその通りに入力するだけです。
では CopyBuffer() の使用方法に移ります。
使用方法 ① :ともに datetime 形式で、開始日時と終了日時を指定する方法
配列に格納したい「指標値の期間」の指定において、「開始日時」と「終了日時」をともに datetime 形式で入力する方法です。
int CopyBuffer(
int indicator_handle, // handle値
int buffer_num, // 指標バッファの番号 (大体は 0)
datetime start_time, // 開始地点の日時
datetime stop_time, // 終了地点の日付
double buffer[] // 値を格納する配列
);
使用方法 ②:datetime 形式で、開始日時 を指定 + そこから遡るローソク足の本数(=count)を指定する方法
この場合は、start_time に datetime 形式の開始日時(一番新しいデータ)を入れるのは ① と同じですが、
その開始日時を起点として「何本のローソク足のデータを遡って保存するか」の “本数” を count にて指定します。
int CopyBuffer(
int indicator_handle, // handle値
int buffer_num, // 指標バッファの番号 (大体は 0)
datetime start_time, // 開始地点の日時
int count, // ローソク足の本数
double buffer[] // 値を格納する配列
);
使用方法 ③:開始位置を現在から何本前なのか(= Shift)指定 + そこから遡るローソク足の本数(=count)を指定する方法
開始位置の指定・終了位置の指定 をともに “本数” でする方法です。
- start_time → 開始位置(一番新しいデータ)を「今から何本前か」で指定する
- count → 開始位置からのローソク足の「本数」を指定する
int CopyBuffer(
int indicator_handle, // handle値
int buffer_num, // 指標バッファの番号 (大体は 0)
int start_pos, // 開始位置のShift数
int count, // ローソク足の本数
double buffer[] // 値を格納する配列
);
おそらく、③ の「両方とも “本数” でやる方法」が一番使い勝手がいいと思います。
注意点
注意点としては、この関数を実行すると必ず インデックス値が0の要素に、一番古いデータが来る ように配置される点です。
これは配列を「時系列配列」として設定している否かに関係なくこのような順序で格納されます。
つまり
という感じで格納されます。
まとめ
MQL5 で指標値を取得する際の流れとしては
となっており、 CopyBuffer() によって指標の値を一気に配列に格納することができます。
CopyBuffer() 3つの使い方があり、いずれかの方法で「開始位置」と「終了位置」を指定します。
なお、格納された値はインデックス値が0の要素に、一番古いデータが来るように配置されます。
また下記の記事では、「MQL4 から MQL5 に移行する」際にどういった内容をどういった順番で学習していけばよいかをわかりやすく説明しています。MQL5 の習得途中の方に取って非常に有益な内容だと思いますので、ぜひ一度読んでみてください。
⇒ MQL4(MT4) → MQL5(MT5) に移行する際に勉強すべき内容まとめ!
今回の記事に関して、わかりにくい部分や疑問点があったら、↓ のコメント欄に残してください(もちろん匿名でも平気です)。
全てしっかりと回答させていただきます。