📈

PineScriptを使ったエンジニアによるチャート分析

2023/12/07に公開

本記事は、Timee Advent Calendar 2023 7日目の記事です。

はじめに

タイミーでフロントエンドエンジニアをしているnantanです。

普段はTypeScriptをメインで使っていますが、今日はPineScriptという言語を触っていこうと思います。

PineScriptとは?

エンジニアでもあまり聞き馴染みのないPineScriptは、TradingViewというプラットフォーム上で使用されるプログラミング言語です。

https://jp.tradingview.com/

TradingViewは市場のリアルタイムデータを表示し、トレーディングの手助けを行ってくれるウェブベースのチャート分析ツールです。PineScript言語はテクニカル分析やトレードアルゴリズムの開発に使用されます。

名前からも想像出来るように、スクリプト言語ですので、比較的取っつきやすい文法が採用されています。

また、ドキュメントも非常に丁寧に書かれています。

https://jp.tradingview.com/pine-script-reference/v5/

この記事では、PineScriptを使った自作インジケーターの実装サンプルをご紹介したいと思います。

開発環境について

開発環境には多くのエンジニアが使い慣れているVisual Studio Codeを使用できます。

PineScript用の拡張機能もマーケットプレイスに存在していて、簡単なシンタックスハイライトや関数の補完、ヒント表示をしてくれます。

https://marketplace.visualstudio.com/items?itemName=JeylaniB.pinescript

Pineエディタがオススメ

フロントエンドエンジニアっぽくVSCodeを紹介しましたが、私の感覚としてはTradingViewに内蔵されているPineエディタが優秀なため、そちらを利用することをオススメします。

スーパーチャートの画面左下に表示されている「Pineエディタ」から開くことができます。

Pineエディタ

Pineエディタの使い方については、以下の記事で分かりやすく解説されています。

https://www.oanda.jp/lab-education/tradingviewstrategy/pine/how_to_use_pine_edit/

インジケーターを作る

では、実際にインジケーターを作っていきます。

※少し専門的な単語が出てきますが、理解の助けとなりそうなリンクを載せておきますので、そちらをご参照ください。これを機にチャート分析にご興味を持っていただけると嬉しいです。

インジケーター仕様

今回作成しようとしているインジケーターの仕様を簡単にまとめました。

  • 短期・中長期の指数移動平均線を表示する
    • 短期は25日、中長期は75日とする
  • 短期移動平均線が下から中長期移動平均線を上に抜けたら「ゴールデンクロス💪」と表示する
  • 短期移動平均線が上から中長期移動平均線を下に抜けたら「デッドクロス💀」と表示する
  • ボリンジャーバンドを表示する
    • 一般的な単純移動平均線20日、標準偏差±2σで表示する
  • 終値がボリンジャーバンドの上部バンド/下部バンドを超えた時のローソク足の色を黄色に変える

コードサンプル

//storage.googleapis.com/zenn-user-upload/9e5bf3ef0395-20231201.png)
//@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を抜けている")

インジケータを表示する

以下はインジケーターを何も表示していない状態の日経平均株価のチャートです。

Before NI225

作成したインジケーターをチャートに追加すると以下のようになります。

After NI225

おわりに

TradingViewには様々なインジケーターが用意されており、ほとんどのものが無料で利用できます。実際には、自分で作る必要はそれほどないと考えていますが、TradingViewの無料版(Basicプラン)では、インジケーターは1つのチャートにつき1つしか表示できません(2023年11月執筆時点)。

ここで紹介した自作インジケーターは、1つとしてカウントされますが、その内容としては複数のインジケーターを表示しています。PineScriptを使用して自作することにより、プランを変更せずに制限以上の表示が可能となるため、一定の価値があると考えています。

今回は触れていませんでしたが、PineScriptを使用することで、トレード戦略(ストラテジー)を自作し、さらにバックテストも行うことができます。

普段とは少し違った言語に挑戦してみるのも面白いと思います。ご興味がありましたら、是非試してみてください。

Discussion