PineScriptを使ったエンジニアによるチャート分析
本記事は、Timee Advent Calendar 2023 7日目の記事です。
はじめに
タイミーでフロントエンドエンジニアをしているnantanです。
普段はTypeScriptをメインで使っていますが、今日はPineScriptという言語を触っていこうと思います。
PineScriptとは?
エンジニアでもあまり聞き馴染みのないPineScriptは、TradingViewというプラットフォーム上で使用されるプログラミング言語です。
TradingViewは市場のリアルタイムデータを表示し、トレーディングの手助けを行ってくれるウェブベースのチャート分析ツールです。PineScript言語はテクニカル分析やトレードアルゴリズムの開発に使用されます。
名前からも想像出来るように、スクリプト言語ですので、比較的取っつきやすい文法が採用されています。
また、ドキュメントも非常に丁寧に書かれています。
この記事では、PineScriptを使った自作インジケーターの実装サンプルをご紹介したいと思います。
開発環境について
開発環境には多くのエンジニアが使い慣れているVisual Studio Codeを使用できます。
PineScript用の拡張機能もマーケットプレイスに存在していて、簡単なシンタックスハイライトや関数の補完、ヒント表示をしてくれます。
Pineエディタがオススメ
フロントエンドエンジニアっぽくVSCodeを紹介しましたが、私の感覚としてはTradingViewに内蔵されているPineエディタが優秀なため、そちらを利用することをオススメします。
スーパーチャートの画面左下に表示されている「Pineエディタ」から開くことができます。
Pineエディタの使い方については、以下の記事で分かりやすく解説されています。
インジケーターを作る
では、実際にインジケーターを作っていきます。
※少し専門的な単語が出てきますが、理解の助けとなりそうなリンクを載せておきますので、そちらをご参照ください。これを機にチャート分析にご興味を持っていただけると嬉しいです。
インジケーター仕様
今回作成しようとしているインジケーターの仕様を簡単にまとめました。
- 短期・中長期の指数移動平均線を表示する
- 短期は25日、中長期は75日とする
- 短期移動平均線が下から中長期移動平均線を上に抜けたら「ゴールデンクロス💪」と表示する
- 短期移動平均線が上から中長期移動平均線を下に抜けたら「デッドクロス💀」と表示する
-
ボリンジャーバンドを表示する
- 一般的な単純移動平均線20日、標準偏差±2σで表示する
- 終値がボリンジャーバンドの上部バンド/下部バンドを超えた時のローソク足の色を黄色に変える
コードサンプル
//@version=5
indicator("My Indicator", shorttitle="MyInd.", overlay=true)
// 指数移動平均線
// 短期 25日
ema25 = ta.ema(close, 25)
// 短期指数移動平均線をオレンジ色で描画
plot(ema25, color=color.orange, title="EMA25")
// 中長期 75日
ema75 = ta.ema(close, 75)
// 中長期指数移動平均線を黒色で描画
plot(ema75, color=color.black, title="EMA75")
// ゴールデンクロスを判定
isGoldenCross = ta.crossover(ema25, ema75)
// ゴールデンクロスを描画
if (isGoldenCross)
label.new(bar_index, ema25, text="ゴールデンクロス💪", color=color.green, textcolor=color.white, style=label.style_label_up)
// デッドクロスを判定
isDeadCross = ta.crossunder(ema25, ema75)
// デッドクロスを描画
if (isDeadCross)
label.new(bar_index, ema25, text="デッドクロス💀", color=color.black, textcolor=color.white, style=label.style_label_down)
// ボリンジャーバンド
// 単純移動平均線 20日、標準偏差 2
[sma20, bbUpper, bbLower] = ta.bb(close, 20, 2)
// ボリンジャーバンドを描画
plot(sma20, color=color.white, style=plot.style_circles, title="SMA20")
upperBand = plot(bbUpper, color=color.new(color.blue, 0), title="上部バンド")
lowerBand = plot(bbLower, color=color.new(color.blue, 0), title="下部バンド")
fill(upperBand, lowerBand, color=color.new(color.blue, 90), title="BB背景")
// 終値が上部バンドを抜けているかを判定
isAboveUpperBand = close > bbUpper
// 終値が下部バンドを抜けているかを判定
isBelowLowerBand = close < bbLower
// 終値が上部バンド、下部バンドを抜けている場合、ローソク足を黄色で描画
barcolor(isAboveUpperBand or isBelowLowerBand ? color.yellow: na, title="BBを抜けている")
インジケータを表示する
以下はインジケーターを何も表示していない状態の日経平均株価のチャートです。
作成したインジケーターをチャートに追加すると以下のようになります。
おわりに
TradingViewには様々なインジケーターが用意されており、ほとんどのものが無料で利用できます。実際には、自分で作る必要はそれほどないと考えていますが、TradingViewの無料版(Basicプラン)では、インジケーターは1つのチャートにつき1つしか表示できません(2023年11月執筆時点)。
ここで紹介した自作インジケーターは、1つとしてカウントされますが、その内容としては複数のインジケーターを表示しています。PineScriptを使用して自作することにより、プランを変更せずに制限以上の表示が可能となるため、一定の価値があると考えています。
今回は触れていませんでしたが、PineScriptを使用することで、トレード戦略(ストラテジー)を自作し、さらにバックテストも行うことができます。
普段とは少し違った言語に挑戦してみるのも面白いと思います。ご興味がありましたら、是非試してみてください。
Discussion