見出し画像

Pine Scriptで書くTrading Viewオリジナルインジケーターの作り方!【入門編】

どうも、ビットコインFXトレーダーのぼーる丸です。

今回はPine Scriptを使用して、
TradingViewオリジナルインジケーターを作る方法について解説します!

プログラミング初心者でもこの記事に沿って学習するだけで、
ある程度のインジケーターが作れるようになれるかもしれません!

Trading Viewを導入していないという方は、
以下のリンクから事前に登録をお願い致します!
(基本無料で利用することができます)


Pine Scriptとは

PineスクリプトTradingViewが開発したプログラミング言語で、チャートに追加してテクニカル分析を行う為の独自のインジケーターやストラテジーの作成に用いられます。

Pineスクリプトとは何ですか? — TradingView

Pine ScriptはTradingView上で利用できるプログラミング言語で、
独自のインジケーターストラテジー(bot)の作成をすることができます。

詳しくは以下の記事をご一読ください。

「わざわざこれだけのためにプログラミング言語を覚えたくねぇ~」
と最初はぼーる丸も思いましたが、基本的な部分は他の言語と同じです。

プログラミング初学者に人気なCPythonあたりを扱うことができれば、
変数関数演算子if文for文の組み合わせで作ることができます。

ぼーる丸もC、C#、Java、JavaScript、PHP、Python、VB等を扱えますが、
基礎的なコードは特に新たな学習の必要もなくスムーズに移行できました。

参考サイト

プログラミング言語を学んだことが無いという方は、
以下のまとめ記事でプログラミング言語の基礎知識から学びましょう。
(#0からご覧ください!下の方に2ページ目のリンクもあります)

Pineスクリプトの学校(応用)もあるよ!)

上記の記事である程度基礎を学んだら、以下のサイトもおすすめです。
サンプルコードが豊富なので、ある程度コードを流用できると思います。

あとはPine Scriptのリファレンスマニュアルが辞書として使えるので、
ブックマークに登録しておきましょう。
(ぼーる丸は基本的にこれを見ながら開発しています)

これだけあれば十分ですが、イレギュラーなケースにも対応できるように
わからないことはGoogle等の検索エンジンを使って調べましょう。
(普段ご自身が使っている検索エンジンでも構いません)

検索方法ですが検索欄に『PineScript ○○』という感じで文字と文字の間に
スペースを開けて複数のキーワードを入力すると絞り込み検索ができます。

ただし後に解説しますがPine Scriptにはversionの違いがあり、
例えばversion4とversion5だとコードの書き方が微妙に違うので、
その点はご自身が扱うversionに合わせて修正してみてください。

Pineエディタの使い方

Trading ViewにはPineエディタという機能が実装されており、
その機能を利用してインジケーターやストラテジーの開発を行います。

Pineエディタの使い方については、以下の記事をご覧ください。

既にある記事に頼ってばかりでなんだか申し訳ないですが、
実際検索するとほとんどの情報が出てくるので引用させていただきます。
(だって1から全部書くと時間がかかるんだもん…🥺)

Pine Scriptの書き方

あとはPine Scriptに書いたコードをペタっと貼るだけです。

ここから先は『参考サイト』で基礎を固められた方だけご確認ください。
既にある程度の基礎知識がある方は読み進めていただいてもOKです。

---プログラマーの壁---

SMAインジを作ってみよう

まずは簡単に、
チャート上にSMAを表示させるインジケーターを作ってみましょう。

//@version=5
indicator("SMAサンプル", overlay=true)
plot(ta.sma(close, 50))

上記のコードをPineエディタにコピー&ペーストして、
『チャートに追加』をクリックしてみてください。

『SMAサンプル』をチャートに追加した状態

上記のようにチャート上にインジケーターが表示されれば成功です。

それでは、一行ずつ解説していきます。

//@version=5

1行目はPineScriptのversionを設定するコードです。

コメントアウトされているので不要かと勘違いするかもしれませんが、
これがないとversionが未設定の状態となりエラーコードが表示されるので、
必ずコードの一番上に記述するようにしてください。

indicator("SMAサンプル", overlay=true)

2行目はインジケーターのタイトルを設定するコードです。

1つ目の引数がタイトルで、
2つ目の引数はチャート上に表示するかパネルに表示するかの設定です。

2つ目の引数を『overlay=false』と設定すると以下のようになります。

『overlay=false』を設定した状態

SMAが別の画面に表示されていますが、これがパネル表示です。

チャート上に表示させたくないインジケーターの場合は、
overlay=false』を使いましょう。

plot(ta.sma(close, 50))

3行目はSMAをチャート上に表示するコードです。

ちなみにこちらはリファレンスマニュアルのコードを参考に記述しました。

https://jp.tradingview.com/pine-script-reference/v5/#fun_ta{dot}sma

plot』はチャート上にデータを表示する関数で、
ta.sma』はSMAを生成する関数です。

このようにPineScriptでは、
Tranding Viewに標準搭載されているインジを関数で呼ぶことができます。

ta.sma』の
1つ目の引数は、SMAの計算に使うソース(ローソク足等)の設定で、
2つ目の引数は、SMAの期間の設定です。

ちなみに1つ目の引数に設定されている『close』は、
ローソク足の終値を取得します。

以上です。
たった3行でインジケーターが作れるなんてなんだか感動しますよね。

ですが!
流石にこれだけでは寂しいのでちょっと改造したいと思います。

SMAサインインジを作ってみよう

短期SMAが長期SMAをゴールデンクロスしたらbuyサインを表示し、
短期SMAが長期SMAをデッドクロスしたらsellサインを表示する

といったインジケーターを作ってみます!

//@version=5
indicator("SMAサイン", overlay=true)

SRC = input.source(close, "Source")
LENShort = input(12, title='短期SMA期間')
LENLong = input(26, title='長期SMA期間')

SMAShort = ta.sma(SRC, LENShort)
SMALong = ta.sma(SRC, LENLong)

BUY = ta.crossover(SMAShort, SMALong)
SELL = ta.crossunder(SMAShort, SMALong)

plot(SMAShort, title='短期SMA', color=color.new(color.blue, 0))
plot(SMALong, title='長期SMA', color=color.new(color.red, 0))

plotshape(BUY, title='Buy', style=shape.labelup, location=location.belowbar, size=size.auto, text='BUY', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(SELL, title='Sell', style=shape.labeldown, location=location.abovebar, size=size.auto, text='SELL', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))

急にコードが複雑になってない?」と思われたかもしれませんが、
これはそのまま流用できるように必要な便利機能を搭載したためです。

このコードをテンプレートとしてアレンジすることで、
結構色んなインジケーターが作れると思います。

上記のコードをPineエディタに貼り付けて『チャートに追加』をすると、
以下のような表示となります。

『SMAサインインジ』をチャートに追加した状態

戦略の通り、
SMAのゴールデンクロスでBUYサインを表示し、
SMAのデッドクロスでSELLサインを表示しています。

結構本格的なインジケーターになったのではないでしょうか?

それでは、新規追加分のみを解説していきます。

SRC = input.source(close, "Source")
LENShort = input(12, title='短期SMA期間')
LENLong = input(26, title='長期SMA期間')

4行目~は値を入力できるようにするためのコードです。

SMAインジで出てきた『ta.sma』の引数を設定するには、
通常はコード上の値を直接弄って設定する必要がありましたが、
上記のコードを記述することでTrading View上で値の変更ができます。

パラメーターから値を設定できます

SMAサインの設定→パラメーターから値を設定できます。

input(12, title='短期SMA期間')』の二つ目の引数である、
title='短期SMA期間'』はこの画面で表示されます。

一つだけ特殊なのが一番上のソースのコード記述にある、
input.source(close, "Source")』です。

このコードを記述することで、
SMAの計算に使うソースを選択肢から選べるようになります。

ソースの選択肢

input.source(close, "Source")』の一つ目の引数を『close』にすると、
ローソク足の終値をデフォルト設定にすることができます。

SMAShort = ta.sma(SRC, LENShort)
SMALong = ta.sma(SRC, LENLong)

8行目~はSMAを呼び出すためのコードです。

最初のコードでは『plot(ta.sma(close, 50))』で直接描写していましたが、
今回は一旦変数に入れることで後から描写するようにしました。

ちなみに『ta.sma』の引数には4行目~で宣言した変数を設定しています。

BUY = ta.crossover(SMAShort, SMALong)
SELL = ta.crossunder(SMAShort, SMALong)

11行目~はゴールデンクロスとデッドクロスを判定するコードです。

ta.crossover』はゴールデンクロスを判定する関数で、
1つ目の引数が2つ目の引数を上回ったらゴールデンクロスと判定します。

ta.crossunder』はデッドクロスを判定する関数で、
1つ目の引数が2つ目の引数を下回ったらデッドクロスと判定します。

plot(SMAShort, title='短期SMA', color=color.new(color.blue, 0))
plot(SMALong, title='長期SMA', color=color.new(color.red, 0))

14行目~はSMAを表示するためのコードです。

今回のコードではSMAを二つ表示するため、
それぞれ判別しやすいように『plot』の3つ目の引数で色を設定しています。

color.new(color.blue, 0)』は、
1つ目の引数がカラーコードで、
2つ目の引数が透明度(0に近いほど不透明で100に近いほど透明)です。

Pine Scriptでの色の指定方法については、
以下の記事を参考にしてみてください。

plotshape(BUY, title='Buy', style=shape.labelup, location=location.belowbar, size=size.auto, text='BUY', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(SELL, title='Sell', style=shape.labeldown, location=location.abovebar, size=size.auto, text='SELL', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))

17行目~はBUYSELLサインを表示するためのコードです。

これが一番複雑で解説もなかなか難しいコードなので、
以下のリンクから各引数の詳細をご確認ください。

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

簡単に言語化して説明すると、
BUYはローソク足の下に緑色の吹き出しを表示させ、
SELLはローソク足の上に赤色の吹き出しを表示させています。

plotshape』の1つ目の引数だけ特別に解説すると、
これはbool型の変数を設定する引数で、
Trueだったら吹き出しを表示、Falseだったら吹き出しを非表示
というロジックになっています。

そのため『plotshape』の1つ目の引数に、
11行目~のゴールデンクロスとデッドクロスを判定するコードで宣言した
変数のBUYSELLを設定してサインを表示させています。

残りの引数はビジュアル方面の設定なので割愛します。

以上です。
このように分解して見てみると、割と難しいことはやっていません。

このコードを改造するだけでオリジナルのサインインジが作れるので、
是非一度コードに触れて勉強してみてください!

SMAロングストラテジーを作ってみよう

サインインジが作れたということは、
ストラテジー化することで自動売買システム(bot)を作ることもできます。

ただし、Trading View単体では自動売買をすることができないため、
自動売買する際ははむとれTANBOT等の外部ツールをご利用ください。

これらの外部ツールをTrading Viewと連携することで、
bybit等の取引所へ自動売買注文の信号を送ることが可能となります。

ここでは詳しい説明は割愛しますが、
興味があれば以下のnoteを参考に触ってみてください。
(はむとれとTANBOTのどちらも無料版と有料版があります)

はむとれ

TANBOT

ちなみにぼーる丸はどちらも触ってみた結果、
個人的にやりたいことができるTANBOTを利用することにしました。

何故なら、TANBOTのコミュニティに入るだけで
USDT建ての自動売買ができるようになるためです。

はむとれとTANBOTは無料版だとUSD建てにしか対応していないため、
有料版のコスパで考えたところTANBOTに軍配が上がりました。
(はむとれも高機能で素晴らしいのですが、若干高額です…!)

USD建ての場合BTCが暴落しているときに資産を実質減らしてしまうため、
それを避けるためにUSDT建てで自動売買をしたかったんですよね。

実際に試してみたところ無事USDT建ての自動売買ができたので、
個人的にはTANBOTコミュニティに入って満足しております。

興味があれば是非TANBOTコミュニティへの入会も検討してみてください。

話が少し脱線してしまい、失礼致しました。
(ストラテジーを作るメリットを紹介した方がやる気も出ると思ったので)

それでは、
短期SMAが長期SMAをゴールデンクロスしたらロングし、
短期SMAが長期SMAをデッドクロスしたらロングをクローズする

そんな勝てそうで勝てない自動売買ストラテジーを作ってみましょう!

//@version=5
strategy("SMAロングストラテジー", overlay=true)

SRC = input.source(close, "Source")
LENShort = input(12, title='短期SMA期間')
LENLong = input(26, title='長期SMA期間')

SMAShort = ta.sma(SRC, LENShort)
SMALong = ta.sma(SRC, LENLong)

BUY = ta.crossover(SMAShort, SMALong)
SELL = ta.crossunder(SMAShort, SMALong)

plot(SMAShort, title='短期SMA', color=color.new(color.blue, 0))
plot(SMALong, title='長期SMA', color=color.new(color.red, 0))

if BUY
    strategy.order('Long', strategy.long)

if SELL
    strategy.close('Long')

上記のコードをチャートに表示するとこんな感じになります。

『SMAロングストラテジー』をチャートに追加した状態

ストラテジーにすると、下のパネルにバックテスト結果が表示されます。

こうしてみると純利益-0.08%勝率36.47%なので全然勝てていませんね。
(ちなみに時間足を切り替えるとこの結果も合わせて変わります)

こういう感じでご自身が作ったストラテジーが、
過去のチャートの値動きからどれくらいの利益が得られるかがわかります。

間違ってもこのストラテジーを運用しないようにお願い致します。

お金を減らすだけだゾ!

それでは、新規追加分のみ解説していきます。

//@version=5
strategy("SMAロングストラテジー", overlay=true)

2行目ですが、タイトルのコードに変更があります。

SMAサインインジでは『indicator("SMAサイン", overlay=true)』ですが、
今回は『indicator』の部分を『strategy』に変更しました。

このように記述することにより、
コードはインジケーターではなくストラテジーとして起動します。

if BUY
    strategy.order('Long', strategy.long)

if SELL
    strategy.close('Long')

17行目はロング注文とクローズ注文を出すコードです。

SMAサインインジでサインのコードを書いていた箇所を丸々修正し、
上記のコードに置き換えました。

BUYがTrueになったときにロング注文を出し、
SELLがTrueになったときにクローズ注文を出します。

strategy.order』の
1つ目の引数は注文の識別子(Id)という扱いで、
2つ目の引数は注文の方向を指定することができます。
(orderとcloseのIdは同じにしてください)

2つ目の引数に
strategy.long』と設定するとロング(買い注文)、
strategy.short』と設定するとショート(売り注文)が出せます。

この注文を出す関数も色々と種類があり結構複雑なため、
詳しくは以下の記事をご覧ください。

残りはSMAサインインジと同じコードをそのまま流用しています。

これでストラテジーまで作れるようになりましたね!

ちなみにストラテジーをはむとれTANBOTテンプレートに合わせて
改造することで自動売買もすることができるようになります!

ご自身で最強の戦略を組み立てることができれば、
S級botterも夢ではないはずです!

トラブルシューティング

この項では私自身がPine Scriptで詰まったケースの解決策をご紹介します。

『=』と『:=』の違い

Pine Script『:=』というものが度々出てきます。

見慣れない記述だったので最初「これ何だろう?」と思っていましたが、
実はPine Scriptで変数に代入するときは『:=』を記述する必要があります。

そして通常の『=』は変数の宣言として扱うようです。

//@version=5
strategy("変数代入テスト", overlay=true)

Test = 30000
Test = 31000

plot(Test)

例えば上記のコードは変数『Test』に30000を宣言した後に、
『Test』に31000を更に代入しようとしています。

上記のコードを実行すると
「チャートへの追加に失敗しました。理由: line 5: 'Test' is already defined.」
というエラーメッセージが表示されます。

翻訳すると「変数『Test』は既に定義されています」という意味です。

そこでコードを以下のように修正すると正常に実行されます。

//@version=5
strategy("変数代入テスト", overlay=true)

Test = 30000
Test := 31000

plot(Test)

これで30000で定義された変数『Test』に31000が代入されて、
チャート上に31000のラインが表示されるようになりました!

調べてみたら『:=』はVBAやPythonでも使われているみたいですね。
この二つの言語は経験が浅かったためか、何故か私は知りませんでした…

versionごとに一部コードの書き方が違う

Pine Scriptでもう一つ厄介な点がversionです。

Pine Scriptのversionは結構頻繁に更新されており、
ネット上でPine Scriptを調べると色んなversionが混在しています。

このnoteを執筆している時点では最新版はversion5ですが、
ネット上にはversion4version3のコードが多い印象です。

どれくらい違うかというと、これくらい違います。

version4

//@version=4
study("SMAVersion4", overlay=true)
plot(sma(close, 50))

vesion5

//@version=5
indicator("SMAサンプル", overlay=true)
plot(ta.sma(close, 50))

間違い探しです。どこが違うのかわかりましたか?

以下、答え合わせです。

1行目は、『//@version=4』から『//@version=5』に変更されています。

2行目は、
version4ではタイトルの関数が『study』となっており、
version5ではタイトルの関数が『indicator』となっています。

3行目は、
version4ではSMAの関数が『sma』となっており、
version5ではSMAの関数が『ta.sma』となっています。

そして厄介なことに、
version4でversion5の書き方をするとエラーになりますし、
version5でversion4の書き方をするとエラーになります。

これが恐らく初心者が引っかかる一番の罠だと思います。

なのでエラーが出て「アレ?」と思った際には、
Pineスクリプト言語リファレンスマニュアルで調べるか、
PineScript version5 ○○』(○○にはエラーになった関数)
を検索エンジンで調べてみてください。

ちなみにTrading Viewには、
version4からversion5にコードを変換する機能もあります。

手順は以下の通りです。

1. Pineエディタにversion4のコードを貼り付けて右上の『・・・』(詳細)をクリックする
2. 出てきたプルダウンメニューの『v5に変換』をクリックする
3. 一旦現在のコードの保存を要求されるため保存をクリックする
4. スクリプトがコンパイルされ、version5へ変換される

ちなみにvesion3もvesion4への変換なら可能なので、
そこから更にversion5に変換すれば問題なくvesion3のコードも扱えます。

ところでversionって色々あるけどどのversionを使えば良いの?
という疑問に対しての解答ですが、
versionが新しいほど新たな機能が追加されているので、
そのversionに欲しい機能があるならそのversionを使えば良い
と思います。

特に理由が無ければどのversionを使っても構いません。

ちなみにぼーる丸は新しい物好きなので、
最新版のversion5でインジケーターの開発を行っています。

エラーが発生したらどう対処するべきか

これはプログラミング初心者が壁にぶち当たりがちだと思うのですが、
エラーが発生したらどう対処すれば良いかわからなくなるかもしれません。

ぼーる丸はもしエラーが発生したら、以下のような行動をとります。

  • エラー文をGoogleの検索欄にコピペして検索する。

  • エラーになった行の記述を確かめる(スペルミス等)

  • エラーになった行の関数をリファレンスマニュアルで調べる

  • 上記で解決できなかったら別の方法を探す or 諦める

プログラミングでは検索力自己解決能力が物を言います。

そしてわからなかったらスパっと諦めて別の方法を探したり、
別の作業をやっている間に新たな解決策が見つかるかもしれません。

request.securityを呼び出しすぎると起動が遅くなる

request.security』という、
現在表示している銘柄とは別のチャートを呼んだり
現在表示している銘柄の別の時間足のチャートを呼ぶという
外部のチャートを呼び出せるなかなかチート的な関数があるのですが、
これを呼び出しすぎると起動が劇的に遅くなるという事態に発展しました。
(ちなみに呼び出し制限もあり、無限に呼べるわけではありません)

というわけであまりにも重くてボツにしたインジケーター、
マルチタイムフレームEMA』をせっかくなのでここで公開致します。

//@version=5
indicator('マルチタイムフレームEMA', shorttitle='MTF-EMA', overlay=true)

//入力
EMA = input(title='EMA', defval=100)

//EMA生成
EMA_DEF = ta.ema(close, EMA)
EMA_1 = request.security(syminfo.tickerid, '1', ta.ema(close, EMA), barmerge.gaps_on)
EMA_3 = request.security(syminfo.tickerid, '3', ta.ema(close, EMA), barmerge.gaps_on)
EMA_5 = request.security(syminfo.tickerid, '5', ta.ema(close, EMA), barmerge.gaps_on)
EMA_15 = request.security(syminfo.tickerid, '15', ta.ema(close, EMA), barmerge.gaps_on)
EMA_30 = request.security(syminfo.tickerid, '30', ta.ema(close, EMA), barmerge.gaps_on)
EMA_60 = request.security(syminfo.tickerid, '60', ta.ema(close, EMA), barmerge.gaps_on)
EMA_240 = request.security(syminfo.tickerid, '240', ta.ema(close, EMA), barmerge.gaps_on)
EMA_D = request.security(syminfo.tickerid, 'D', ta.ema(close, EMA), barmerge.gaps_on)

//open取得
open1 = request.security(syminfo.tickerid, "1", open)
open3 = request.security(syminfo.tickerid, "3", open)
open5 = request.security(syminfo.tickerid, "5", open)
open15 = request.security(syminfo.tickerid, "15", open)
open30 = request.security(syminfo.tickerid, "30", open)
open60 = request.security(syminfo.tickerid, "60", open)
open240 = request.security(syminfo.tickerid, "240", open)
openD = request.security(syminfo.tickerid, "D", open)

//close取得
close1 = request.security(syminfo.tickerid, "1", close)
close3 = request.security(syminfo.tickerid, "3", close)
close5 = request.security(syminfo.tickerid, "5", close)
close15 = request.security(syminfo.tickerid, "15", close)
close30 = request.security(syminfo.tickerid, "30", close)
close60 = request.security(syminfo.tickerid, "60", close)
close240 = request.security(syminfo.tickerid, "240", close)
closeD = request.security(syminfo.tickerid, "D", close)

//high取得
high1 = request.security(syminfo.tickerid, "1", high)
high3 = request.security(syminfo.tickerid, "3", high)
high5 = request.security(syminfo.tickerid, "5", high)
high15 = request.security(syminfo.tickerid, "15", high)
high30 = request.security(syminfo.tickerid, "30", high)
high60 = request.security(syminfo.tickerid, "60", high)
high240 = request.security(syminfo.tickerid, "240", high)
highD = request.security(syminfo.tickerid, "D", high)

//low取得
low1 = request.security(syminfo.tickerid, "1", low)
low3 = request.security(syminfo.tickerid, "3", low)
low5 = request.security(syminfo.tickerid, "5", low)
low15 = request.security(syminfo.tickerid, "15", low)
low30 = request.security(syminfo.tickerid, "30", low)
low60 = request.security(syminfo.tickerid, "60", low)
low240 = request.security(syminfo.tickerid, "240", low)
lowD = request.security(syminfo.tickerid, "D", low)

//EMA表示
plot(EMA_1 , color=color.new(color.yellow, 50), title='EMA_1m')
plot(EMA_3 , color=color.new(color.orange, 50), title='EMA_3m')
plot(EMA_5 , color=color.new(color.red, 50), title='EMA_5m')
plot(EMA_15 , color=color.new(color.purple, 50), title='EMA_15m')
plot(EMA_30 , color=color.new(color.blue, 50), title='EMA_30m')
plot(EMA_60 , color=color.new(color.aqua, 50), title='EMA_1h')
plot(EMA_240 , color=color.new(color.lime, 50), title='EMA_4h')
plot(EMA_D , color=color.new(color.olive, 50), title='EMA_1D')
plot(EMA_DEF, color=color.new(color.white, 0), linewidth=2,title='EMA_DEF')

//サイン表示
plotshape(low1 < EMA_1 and open1 > EMA_1 and close1 > open1, title='buy_1m', style=shape.labelup, location=location.belowbar, size=size.auto, text='1m', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(low3 < EMA_3 and open3 > EMA_3 and close3 > open3, title='buy_3m', style=shape.labelup, location=location.belowbar, size=size.auto, text='3m', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(low5 < EMA_5 and open5 > EMA_5 and close5 > open5, title='buy_5m', style=shape.labelup, location=location.belowbar, size=size.auto, text='5m', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(low15 < EMA_15 and open15 > EMA_15 and close15 > open15, title='buy_15m', style=shape.labelup, location=location.belowbar, size=size.auto, text='15m', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(low30 < EMA_30 and open30 > EMA_30 and close30 > open30, title='buy_30m', style=shape.labelup, location=location.belowbar, size=size.auto, text='30m', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(low60 < EMA_60 and open60 > EMA_60 and close60 > open60, title='buy_1h', style=shape.labelup, location=location.belowbar, size=size.auto, text='1h', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(low240 < EMA_240 and open240 > EMA_240 and close240 > open240, title='buy_4h', style=shape.labelup, location=location.belowbar, size=size.auto, text='4h', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(lowD < EMA_D and openD > EMA_D and closeD > openD, title='buy_1D', style=shape.labelup, location=location.belowbar, size=size.auto, text='1D', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))

plotshape(high1 > EMA_1 and open1 < EMA_1 and close1 < open1, title='sell_1m', style=shape.labeldown, location=location.abovebar, size=size.auto, text='1m', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
plotshape(high3 > EMA_3 and open3 < EMA_3 and close3 < open3, title='sell_3m', style=shape.labeldown, location=location.abovebar, size=size.auto, text='3m', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
plotshape(high5 > EMA_5 and open5 < EMA_5 and close5 < open5, title='sell_5m', style=shape.labeldown, location=location.abovebar, size=size.auto, text='5m', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
plotshape(high15 > EMA_15 and open15 < EMA_15 and close15 < open15, title='sell_15m', style=shape.labeldown, location=location.abovebar, size=size.auto, text='15m', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
plotshape(high30 > EMA_30 and open30 < EMA_30 and close30 < open30, title='sell_30m', style=shape.labeldown, location=location.abovebar, size=size.auto, text='30m', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
plotshape(high60 > EMA_60 and open60 < EMA_60 and close60 < open60, title='sell_1h', style=shape.labeldown, location=location.abovebar, size=size.auto, text='1h', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
plotshape(high240 > EMA_240 and open240 < EMA_240 and close240 < open240, title='sell_4h', style=shape.labeldown, location=location.abovebar, size=size.auto, text='4h', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
plotshape(highD > EMA_D and openD < EMA_D and closeD < openD, title='sell_1D', style=shape.labeldown, location=location.abovebar, size=size.auto, text='1D', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))

plotshape(ta.crossover(close, EMA_DEF), title="GC", style=shape.triangleup, color=color.green,location=location.belowbar, size=size.auto)
plotshape(ta.crossunder(close, EMA_DEF), title="DC", style=shape.triangledown, color=color.red,location=location.abovebar, size=size.auto)
『マルチタイムフレームEMA』をチャートに表示させた状態

マルチタイムフレームEMAは、
1分足、3分足、5分足、15分足、30分足、1時間足、4時間足、日足
のEMAを一つのチャートで同時に表示するインジケーター
です。

ローソク足がEMAにサポートされたら緑色の吹き出しサインを、
ローソク足がEMAに抵抗されたら赤色の吹き出しサインを出します。

また、現在見ている時間足のチャートだけの機能ですが、
ローソク足がEMAをゴールデンクロスすると緑の▲サインが出て
ローソク足がEMAをデッドクロスすると赤の▼サインが出ます。

何故こんなインジケーターを作ったかというと、
ビットコインでは100EMAと200EMAが割とどの時間足でも効くらしくて、
全ての時間足のEMAを監視するためにこのインジを作ってみました。

そしたら思いのほか使いづらいのと、起動が遅いのでボツにしました。

ちなみにコードの解説は面倒なので割愛します。
興味があればコードを見ながらネットで検索して調べてみてください。

また『request.security』の重さの解決策ですが、
たくさん呼ぶと重くなるから必要以上に呼ぶなとだけ言っておきます。
(特に軽量化の方法は思いつきませんでした…)

ネット上のコードを読み漁ろう

そして一番の学習法ですが、
ネット上にたくさんPine Scriptのコードがあるので読み漁りましょう。

そして特にコードの複製禁止と明記されているものでなければ
見つけたコードを参考にして自分のコードに取り入れていきましょう。

ぼーる丸は入門とかをすっ飛ばして、
なんだかんだ人のコードを読むところから始めましたが、
結果的にオリジナルのインジケーターを作れるところまで成長しました。

ぼーる丸もnote上でいくつかインジケーターを公開しているので、
興味があれば見ていってください。

ぼーる丸のインジはしょうもない物ばかりなので全然パクリオーケーよ🐤

ただし!
意味もわからないままコピペするだけは成長の妨げになるのでNGです。
なのでコードの意味も理解した上でコピペしましょう。

勉強方法はコードを一行ずつ読みながら、
Pineスクリプト言語リファレンスマニュアルで調べるか、
Google等の検索エンジンで調べる方法がおすすめです。

インジケーターを作るならテクニカルも学ぼう

そして初心者の方へもう一つアドバイスなのですが、
強いインジケーターを作るならテクニカル分析も学ぶ必要があります。

テクニカルやインジケーターの知識が増えれば増えるほど、
強いインジケーターやストラテジーが作れるようになるはずです。

以下のnoteではぼーる丸がテクニカル分析を学ぶ際に
参考にした情報源をまとめているので是非参考にしてみてください。

強いインジケーターを作る人達をフォローしよう

ネット上には強いインジケーターを作る猛者達がたくさん居ます。

そういった人達が作ったインジケーターやストラテジーも見て、
刺激を受けるのも良いかもしれません。

とりあえずぼーる丸が観測していて「すげぇな!」って思う人達の
Twitterアカウントを列挙していきたいと思います!

尊敬します。マジリスペクト。感謝です。

おわりに

今回はこのnote一つでインジケーター開発ができるようになれるまで
成長できるようなnoteを目指して執筆させていただきました。

長い長い文章でしたが、ここまで読んでいただきありがとうございました。

当noteでは既存のインジケーターを組み合わせたコードを紹介しましたが、
幅広い知識を身につけることで全く新しいインジケーターも
もしかしたら作れるようになれるかもしれません!

そう考えるとインジケーター開発の道のりは果てしなく長いです…
私もまだまだ学び始めたばかりなので、一緒に成長していきましょう!

今後もぼーる丸のインジケーターを使ってみたいという方は、
是非Twitterアカウントをフォローいただければ幸いです!

普段はビットコインや草コインの相場分析をやっております!
ではでは!


[PR]

ぼーる丸のインジケーターが使えるTradingViewのご登録はコチラから!
基本無料ですが、有料版ではより多くの拡張機能がご利用できます!

おすすめの仮想通貨取引所はbybitです!
ぼーる丸もメインで利用している取引所になります!

上のリンクから登録すると、
20ドルのボーナスとお得な特典カードも付いてきます!

この記事が気に入ったらサポートをしてみませんか?