ここでは、MetaTrader4に標準搭載されているインジケーター「ZigZag」とはどのようなインジケーターか、またその処理内容について解説します。
開発者の説明文
MetaTraderのZigZagを開発したMetaQuotes社の公式サイトでは、次の説明文があります。
ジグザグは、特定の天井と底の価格を線で結んだものです。
(中略)
最新のインジケーターのサインは変わる可能性があるということを認識しておくことが重要です。株価の変化がインジケーターの直近の値を変化させてしまうタイプのインジケーターです。
(中略)
したがって、ジグザグに基づいてトレードロジックを構築するべきではありません。予想をたてるよりも、過去のデータを分析するのに適しています。引用元: MQL5公式サイト ZigZag
単に暫定高値や暫定安値がスライドして変化することだけではなく、確定した(かと思った)高値や安値も変化することがあります。もともとリペイントするように設計されているということですね。
ZigZagリペイントの再現動画
次の動画は、ZigZagがリペイントする様子をストラテジーテスターで再現したものです。
ZigZagの処理内容
MT4/MT5のZigZagは、点在する点を時間経過順に直線でつなげて描画するタイプのDRAW_SECTIONで描画します。
ここでは、高値の点を「山」、安値の点を「谷」として解説します。
パラメーターは3つあり、次の表の通りです。
Depth | 最高値・最安値を調べるバーの数 |
---|---|
Deviation | 山の候補にする最高値からの許容ポイント数(谷の候補は最安値から) |
Backstep | 山や谷の候補を削除するバーの数 |
山や谷は、次の3つの手順で決定します。
-
再描画のバーシフト数を決める。
-
山候補・谷候補を決める。
-
山・谷を決める。
再描画のバーシフト数を決める
表示開始時や100本以内に山や谷が無い場合は、チャート全体を描画するようにバーのシフト数を決定します。
100本以内に山や谷がある場合は、直近の3つの点まで遡るように上限99でシフト数を決めます。
ここで決定したシフト数の1本手前から現在(シフト数0)までのデータを全てリセットします。
山候補・谷候補を決める
再描画シフト数のバーから現在のバーまで順に、山候補・谷候補かどうかを判定します。ここでは、山候補の決定方法を例に解説しますが、谷候補についても同じ要領で決定します。
山候補になる条件は、次の通りです。
- 期間Depthの最高値が変化したバー(もしくは再描画シフト数のバー)
- バーの高値が「期間Depthの最高値-Deviationポイント」以上
山候補になったバーからBackstep本分過去の最高値ではない山候補は削除します。
山・谷を決める
再描画シフト数のバーから現在のバーまで順に、山候補・谷候補を手掛かりに山・谷を決めていきます。
※山候補と谷候補の両方になっているバーは無視されます。
ここでの処理は、山探索モードと谷探索モードがあります。山探索モードで山を仮決定した後は谷探索モードになるというように交互に切り替わります。
※再描画のバーシフト数を決める際に最初の探索モードが決まりますが、決まっていない場合は山候補・谷候補のどちらが先かで決まります。
山探索モード
山探索モードで、山候補があれば一旦、山として仮決定して谷探索モードになります。
それまでの間に、前回仮決定した谷より低い谷候補があれば、前回の谷の仮決定を取り消し、低い方の谷候補を谷として仮決定します。
谷探索モード
谷探索モードで、谷候補があれば一旦、谷として仮決定して山探索モードになります。
それまでの間に、前回仮決定した山より高い山候補があれば、前回の山の仮決定を取り消し、高い方の山候補を山として仮決定します。
このように、仮決定→取り消しを繰り返して最終的に残ったものが山や谷として描画されます。
リペイントしないZigZagサンプルファイル
MetaTraderのZigZagの算出ロジックに似せたサンプルファイルを作成しましたので公開します。
サンプルファイル【ZigZag_Sample_03.mq4】をダウンロード
パラメーターは、ZZ_Periodのみで、Depthと同じです。バー確定時に表示更新するインジケーターです。
あとがき
動画では、山をまたいでBackstepによる谷候補削除があって、さらにその前の山の仮決定を取り消されたことで起こったリペイントということになります。
MT4/MT5のZigZagを使用する場合は、今回の解説を参考にしてみてくださいね。
ではでは。
リペイントしないZIGZAGを探して、こちらにたどり着きました。
サンプルありがとうございます。
サンプルインジケーターは該当チャートで有効となると思いますが、上位時間の
ZIGZAGを表示したい場合、どのようなコードにすれば良いでしょうか?
(例:15分足チャートで4時間足ZIGZAGを表示する)
ZZ_Periodの数で調整しようとしましたが、なかなかうまく行かず、コードの一部を
変更したほうが良いかと考えています。
そこで、MQLは勉強中でEAは少しはできるようになりましたが、インジケータがまだ
かけないため、不躾かとは思いましたが、ご相談申し上げた次第です。
差し支えなければアドバイスいただけましたら、幸いです。よろしくお願い
いたします。
こーいちさん
コメントありがとうございます。
下記の記事が参考になるかもしれません。
インジケーター作成9【MTF(マルチタイムフレーム)機能】
https://www.dr-ea.com/meta-blog/metatrader4/create-custom-ind/create-indicator-09.html
MT4搭載のZigZagでは偶におかしな山谷ラインになることに気づき、なんか気持ち悪いまま使ってました。
リペイントしないZigZagに出会えて一気に気分も晴れやかになり、自分なりのZigZagスタイルが確立しました!
動作も軽く本当に良かったです。ありがとうございました。
カオルさん
コメントありがとうございます。
お役にたてられたようでうれしいです。