TradingView ZigZagを高精度で引くためのプログラミング手法①

記事
マネー・副業
本投稿は、私が販売している堀江塾初級講座インジケータのロジックについて少し記載しています。

【本記事の対象の方】
① PineScriptでプログラミングがある程度できる方
② ZigZagでもっと細かく高精度のラインを引きたいが、私の出品しているインジケータを買うまでもないという考えの方
③ ②に付随し、高精度ラインプロットのヒントを知りたい方

上記以外で、ZigZagの高精度インジケータが欲しい場合は、もしよろしければ、私の出品しているインジケータをご覧ください。


【背景と目的】
TradingViewでZigZag系のインジケータを実装したい場合、ほとんどの場合、上下ラインの転換を、ローソク足の乖離率と暫定の高値と安値でみています。

この場合、プログラミング難度は低くかつ、インジケータ設定で上昇/下落転換の粗さをコントロールすることが可能です。

さらに、TradingViewでは、既にZigZagというインジケータが著作権フリーで全体公開されている状況になります。なので、だれでもすぐに使用可能です。

しかし、例えば上昇のラインを引く際、
「前の安値を切り上げている限り上昇と判断する」
等の細かい設定ができないため、どうしても細部までの高精度なZigZagラインは引けません。

実は、TradingViewのPineScriptは、C言語などのプログラマーには必ず頭に入っているはずの配列という概念が存在しません。(一応あるにはありますが、配列を想定して作られた言語ではないという意味でこう表現しています)

PineScriptは、私が思うになかなか特殊な言語であり、各バー毎に逐次処理をしており、未来のデータや過去データを保持することを想定して作られていないという根本的な原因が、ダウ理論系のインジケータ制作難度を上げています。

【どうすればいいのか】
非常に大雑把ですが、私は以下のロジックで実装しました。(version=5での記述が前提)
① if bar_index == last_bar_index
bar_indexが現在の足、last_bar_indexが最後の計算対象の足です。一度全足を計算しきった後に処理開始するような条件分岐を追加。
② low[last_bar_index-i]などで過去データを参照
プロットされている未来のデータは扱えないものの、PineScriptは過去のローソク足情報は[]記述で参照可能です。
そのため、①後に、初めの足から再度ループを回し、現在足まで計算します。この方法であれば、for文による配列参照も適用可能です。
③ line.new関数を使用してプロット
plot関数はif文を挟むことが出来ません。plot関数内に「?」「:」を入れることで条件分岐は可能ですが、元々、チャートのとある一部分を描画するように作られていませんので、line.new関数を使用して、ラインを引くスタート、エンド位置のx軸値(始まりのバー位置、転換地点のバー位置)を結ぶ線を引くようにします。

堀江塾の初級講座インジケータを作成するにあたり、一度すべての足を計算しきったのを確認した後、もう一度過去の足から判定し直してラインプロットする方法で、より高精度な線が引けるようにしました。

なお、私が現在知る限り、上記以外の方法で、ダウ理論に基づいた細かいラインプロットが出来るプログラミング手法はないと思います。(あれば教えてください。)

また、上記によるプログラムで実装すると、その性質上、バックテストのプログラムが組めなくなります。(検証済み)

そのため、あくまで裁量投資の一助として作ることを想定いただければと思います。

以上、もし最後まで読んでいただけた方がいらっしゃるなら、幸甚です。
次回に続くかもしれません。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す