TradingViewで自作のインジケーターを作るには?その最初のステップとして、無料プランでも3つ以上のインジケーターを表示する方法を紹介します。
簡単なことから始めよう
私はもともとNinjaTraderというチャートプラットフォームを使っていました。 NinjaTraderにもPineScriptのような専用のプログラミング言語があって、 自作のインジケーターの制作はもちろん、様々な制御を可能にする環境が用意されています。
そこで結構な時間を使ってインジケーターの研究を行っていたので、基礎的なことは理解済み。 英語の情報を必死になって読んでいたのを思い出します。
NinjaScript Programmer’s Launch Pad
下地があったので、TradingViewに引越しても自作インジケーターを作るのにまったく苦労しませんでした。 TradingViewが提供するPineScriptという言語を使って、ルールに従いながらコードを書くだけです。
ただこれは、私に「慣れ」があったからの話。初めてのインジケーターを作ってみようと考えている人はそうもいかないでしょう。 コードを書くこと自体に不慣れな人もいるはずです。
専用言語であるPine Scriptの学習経験は他でも活きる
幸いなことに、NinjaTraderでの経験がTradingViewでも活きました。 つまり、基本的な考え方は同じなのです。
これから学ぶPine Scriptの知識も、プログラミングだけでなく、様々なところで役立つでしょう。 インジケーターの自作を通して、プログラミングの基礎や時系列データの扱い方などが自然と身に付くはずです。
それでも、最初は何からはじめれば良いか悩む人も多いはず。 そんな人のために、簡単かつ実用的なサンプル を用意しました。
英文ドキュメントを読んで挫折する前に、とりあえず簡単なインジケーターを完成させてチャートに表示するところまでやってみましょう。
インジケーターの表示制限数を突破する
TradingViewは無料でも使えますが、1つのチャートに表示できるインジケーターの数が3つまでに制限されます。
この制限はかなり厳しく、3つとなると何を選ぶか迷う人もいるはずです。 逆の言い方をすれば何を削るかという話になります。 例として一般的なインジケーターを4つ挙げてみます。
- 単純移動平均線(SMA)
- MACD
- ストキャスティクス
- RSI
さて、どれを不採用とするか?
ここで発想を転換し、この4つ全てを表示する方法がないか考えてみましょう。 表示するインジケーターの数は3つでまでという条件を満たしつつ、4つの指標を表示する方法 です。
インジケーターの分類
まず、インジケーターの性質について考えてみます。 先程挙げた4つのインジケーターの中に1つだけ「仲間はずれ」がいるのが分かるでしょうか。
単純移動平均線はローソク足と一緒に描写されますが、他の3つは下の別パネルに表示されるものです。 この意味で、単純移動平均線だけは別のグループだと言えるでしょう。
残りの3つの内、「ストキャスティクス」と「RSI」はとても似ています。どちらも算出される値が0から100の間を取るからです。 「MACD」はこの限りではありません。
では、この2つをまとめてしまいましょう。
- 単純移動平均線
- MACD
- ストキャスティクス + RSI
これで、インジケーターの数を3つに制限しつつ、4つの指標を表示することができます。
Stoch + RSI
一番下に表示されているのが自作のインジケーターです。とりあえず、名前は「Stoch + RSI」としました。 なんてことはない、「ストキャスティクス」と「RSI」を1つにまとめただけのものです。
//@version=5
Indicator("Stoch+RSI")
// Input
periodK = input.int(14, title="%K Length", minval=1)
smoothK = input.int(1, title="%K Smoothing", minval=1)
periodD = input.int(3, title="%D Smoothing", minval=1)
rsiLen = input.int(7, minval=1, title="RSI - Length")
// Stoch
k = ta.sma(ta.stoch(close, high, low, periodK), smoothK)
d = ta.sma(k, periodD)
// RSI
up = ta.rma(math.max(ta.change(close), 0), rsiLen)
down = ta.rma(-math.min(ta.change(close), 0), rsiLen)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
// Plot
plot(k, title="%K", color=color.blue)
plot(d, title="%D", color=color.red)
plot(rsi, "RSI", color=color.silver)
インジケーター数のカウントは、スクリプト単位で行なわれる
1つのスクリプトに複数の指標が含まれていても、それは1つのインジケーターと判断されます。 上記のコードは 1つのスクリプトの中で、ストキャスティクスを計算し、RSIを計算し、それぞれをプロットしています。 このように2つ以上の指標を計算していても、それらを1つにまとめてしまえば、1つのインジケーターと判断されるわけでです。
解説
分からない言葉がいくつもあるのは当たり前です。 主要なものに関しては情報をまとめていますので、そちらもご覧ください。 全てを網羅出来ているわけではありませんが、公式のリファレンスよりは分かりやすいはずです。
どれだけ調べたかが、スキルの上達に繋がります。
さて、コードの解説ですが、冒頭から順に見ていきましょう。
//@version=5
は、このコードがどのバージョンで書かれたかを明示しています。
これを記載しておかないとインジケーターが正常に動作しなかったりするのでご注意ください。
Indicator()
はそのまま、このコードがインジケーターであることを宣言しています。
こんな宣言をするからには、インジケーターに属さないものもあるはずです。頭の片隅に入れておきましょう。
"
で囲まれた中身はこのインジケーターのタイトルとなります。
タイトル以外の設定もここで行えたりするので、マニュアルを参照するといいでしょう。 マルチタイムフレームに対応するインジケーターを作る場合、「resolution」が鍵となります。これも頭の片隅に入れておくと良いかもしれません。
input()
は、ユーザーからの入力を受け付ける部分です。要は普段見るチャート上からも設定変更が可能なパラメーターを扱います。
//
は、その行がコメントであることを示し、その行の文字はコードとして処理されません。
自分が後から見ても分かりやすいようにメモを残して置くと良いでしょう。
後はそれぞれの指標の値を計算し、plot()
で描写するという流れになっています。
応用
極めて単純なインジケーターですが、その基本的な仕組みを理解すれば、応用範囲は広いはずです。
移動平均線には様々な種類があっても「ローソク足と同じ場所に描写される」という共通点があります。 ならば、「複数の期間設定」や「別の種類の移動平均線」を1つにまとめることは可能でしょう。
公開されているインジケーターの中には、そのコードを見る事ができるものがあります。 中身がブラックボックスではないので、これらは素晴らしい教材となるはずです。