※実用的なサンプル付き!
チャートサービス「TradingView」にはストラテジーテスターという機能があります。
これは主にOHLCVを軸にしたトレード戦略を自在にバックテスト(売買シミュレーション)することのできる機能です。
「こういうタイミングのときに買ったらどうなるんだろう?」
という疑問があったとき、特別なスキルがなくても簡単に検証できるため重宝しています。
今日はそんなTradingViewのストラテジーテスターをそのまま自動化して売買するための最も簡単な方法をお伝えします。
目次
自動化するサンプルストラテジー
サンプルとして、先日書いた『4歳児からのストラテジーのパラメータ変更』で紹介したストラテジーを自動化してみます。実用性があるものでないと面白くありません。これは一瞬で作ることのできるストラテジーにしてはかなり実用的であると言ってよいと思います。こんな結果のものです。
2017年1月から右肩上がりで、2019年10月25日にあった30%以上の暴騰にも乗れていますね。
自動化のために必要な仕組みは2点あります。
①売買するべきタイミングでアラートを出す仕組み
②アラートを感知して売買をする仕組み
さっそく①をどうやって実現するのか考えていきます。
TradingViewは非常に都合が良いサービスであり、好きなタイミングでアラートを出すことができます。TradingViewからそのままアラートを出すのであれば、プログラミング言語を駆使して自分で約定履歴からローソク足を作成したりする必要はありません。
表題にある通り、一定のやり方に従って手を動かせば「何も考えずに」自動化ができます。
売買タイミングでアラートを出す方法
好きなタイミングでアラートを出すためには、ストラテジーのソースコードをちょっとだけ変更してあげる必要があります。
そのためここではTradingViewのスクリプト言語であるpine scriptを触ります。
まずストラテジーのソースコードを表示させます。
※ソースコードを表示させるやり方や、その前にそもそも今回使うサンプルストラテジーを作るやり方については 『4歳児からのストラテジーのパラメータ変更』を参考にしてください。
大体2分ぐらいでできます。
//@version=4 strategy("ChannelBreakOutStrategy", overlay=true) length = input(title="Length", type=input.integer, minval=1, maxval=1000, defval=30) upBound = highest(high, length) downBound = lowest(low, length) if (not na(close[length])) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")
大丈夫です!
ここに書いていることが一行も理解できない人でも必ずクリアできます。
TradingViewでは任意のタイミングでアラートを出すためには、alertconditionというスクリプトを使います。
このスクリプトをいい感じに機能させることが今からやることです。
ステップはたったの3つです。
Step1:strategyのコードをstudyのコードに変更する
Step2:plotshapeというスクリプトで売買タイミングに印をつける
Step3:alertconditionというスクリプトでアラートを出せるようにする
Step1:strategyのコードをstudyのコードに変更する
最初はとても簡単です。
ソースコードの最初にあるstarategyとなっているものをstudyに書き換えます。
Before
//@version=4 strategy("ChannelBreakOutStrategy", overlay=true)
After
//@version=4 study("ChannelBreakOutStrategy", overlay=true)
strategy → study
です。5秒ぐらいで済みますね。
Step2:plotshapeというスクリプトで売買タイミングに印をつける
次に売買タイミングをチャート上に表示させます。
これがちょっと難しいステップです。
売買タイミングならもう表示されているじゃないか。と思われるかもしれませんが、今の表示はstrategy関数の表記なので、studyでは別のやり方で表示させてあげなくてはいけません。
そのときに使うのがplotshapeという関数です。
まず売買する箇所を特定します。
if (not na(close[length])) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")
ここが該当します。
皆さんが言いたいことはわかります。本当によくわかります。
意味不明ですよね。大丈夫です。これはシンプルに言ってしまえば、upBoundというラインを超えたときに買い注文、downBoundというラインを下回ったときに売り注文を出すというロジックです。
ちなみにこのコードをstrategyに関するコードなので、studyで表示させるときにはすべて削除します。
このコード自体の意味を理解しなくても、このコードを見たらこういう風に書き換えればいいんだということを覚えておけば第一歩としては十分過ぎるぐらいです。
この形だと意味不明なのでわかりやすく書き換えます。
upBound = highest(high[1], length) downBound = lowest(low[1], length) plot(upBound, title="upBound", color=color.green, linewidth=2) plot(downBound, title="downBound", color=color.red, linewidth=2) LONG = high > upBound SHORT = low < downBound
upBoundとdownBoundのタイミングをわかりやすく、チャート上にラインを引いて表示させます。これが上の4行です。
下の2行は
high(高値)がupBoundを超えたときに、LONG(買い注文)
low(安値)がdownBoundを下回ったときに、SHORT(売り注文)
というコードです。
どうでしょうか。こうやって書くと、プログラミングが何もわからなくても何となく意味がわかると思います。
これをplotshapeというスクリプトに組み込みます。
plotshape(LONG,title="LONG",style=shape.triangleup,text="LONG",color=color.green,textcolor=color.green,location=location.belowbar) plotshape(SHORT,title="SHORT",style=shape.triangledown,text="SHORT",color=color.red,textcolor=color.red,location=location.abovebar)
ぐちゃぐちゃ書いてありますが、難しくありません。
LONGのときには買い注文っぽいマークをつけろ、SHORTのときには売り注文っぽいマークをつけろ、と指示をしています。
とりあえずここまでで全体像を見てみましょう。
//@version=4 study("ChannelBreakOutStrategy", overlay=true) length = input(title="Length", type=input.integer, minval=1, maxval=1000, defval=30) upBound = highest(high[1], length) downBound = lowest(low[1], length) plot(upBound, title="upBound", color=color.green, linewidth=2) plot(downBound, title="downBound", color=color.red, linewidth=2) LONG = high > upBound SHORT = low < downBound plotshape(LONG,title="LONG",style=shape.triangleup,text="LONG",color=color.green,textcolor=color.green,location=location.belowbar) plotshape(SHORT,title="SHORT",style=shape.triangledown,text="SHORT",color=color.red,textcolor=color.red,location=location.abovebar)
これを「チャートを追加」で追加してみてください。
下画像のような画面が表示されると思います。
拡大して見てみてください。
それっぽく表示はされていますが、なんだかぐちゃぐちゃです。
LONGとSHORTの印が本来アラートを出して欲しいタイミング以上にひっきりなしに出てきます。
ですが、順調に進んでいます。
このコードではLONGとSHORTの条件を満たしたときにアラートを出すという条件になっているのでこんな風に表示されてしまっているだけです。
LONGの条件を満たしたら、次にSHORTの条件が満たされるまで、LONGの条件は出ないようにコードを追加してあげます。
つまりLONGとSHORTのアラートが交互に出るようにしてあげます。
これには複数のやり方がありますが、ここではこんなコードを使います。
switch = 0 LONGcondition = 0 SHORTcondition = 0 if (LONG and (switch[1] == 0)) switch := 1 LONGcondition := 1 SHORTcondition := 0 else if (SHORT and (switch[1] == 1)) switch := 0 LONGcondition := 0 SHORTcondition := 1 else switch := nz(switch[1],0) LONGcondition := 0 SHORTcondition := 0
これでLONGconditionとSHORTconditionが交互に出てくれます。
この2つの条件がplotshapeで書くべき条件です。
plotshape(LONGcondition,title="LONG",style=shape.triangleup,text="LONG",color=color.green,textcolor=color.green,location=location.belowbar) plotshape(SHORTcondition,title="SHORT",style=shape.triangledown,text="SHORT",color=color.red,textcolor=color.red,location=location.abovebar)
LONG → LONGcondition
SHORT → SHORTcondition
とそれぞれ変更しています。
これで②のステップは完了です。
Step3:alertconditionというスクリプトでアラートを出せるようにする
ラストです。
②のステップを何とか乗り越えた人であれば③は①並みに楽勝です。
alertconditionというスクリプトを使います。
alertcondition(LONGcondition, title = "LONG", message = "買いだよ!") alertcondition(SHORTcondition, title = "SHORT", message = "売りだよ!")
これだけです。
LONGconditionとSHORTconditionでアラートが出る仕組みがこれで完成しました。
完成したコードはこれです。
ついでにわかりやすいように日本語でコメントしておきました。
//@version=4 study("ChannelBreakOutStrategy", overlay=true) //ストラテジーのパラメータ length = input(title="Length", type=input.integer, minval=1, maxval=1000, defval=30) //売買の基準とそのラインを表示 upBound = highest(high[1], length) downBound = lowest(low[1], length) plot(upBound, title="upBound", color=color.green, linewidth=2) plot(downBound, title="downBound", color=color.red, linewidth=2) LONG = high > upBound SHORT = low < downBound //LONGとSHORTが交互に行われるようにする switch = 0 LONGcondition = 0 SHORTcondition = 0 if (LONG and (switch[1] == 0)) switch := 1 LONGcondition := 1 SHORTcondition := 0 else if (SHORT and (switch[1] == 1)) switch := 0 LONGcondition := 0 SHORTcondition := 1 else switch := nz(switch[1],0) LONGcondition := 0 SHORTcondition := 0 //売買のタイミングをチャート上に表示 plotshape(LONGcondition,title="LONG",style=shape.triangleup,text="LONG",color=color.green,textcolor=color.green,location=location.belowbar) plotshape(SHORTcondition,title="SHORT",style=shape.triangledown,text="SHORT",color=color.red,textcolor=color.red,location=location.abovebar) //売買のタイミングでアラートを出す alertcondition(LONGcondition, title = "LONG", message = "買いだよ!") alertcondition(SHORTcondition, title = "SHORT", message = "売りだよ!")
これをチャートに表示させるとこうなります。
starateyの売買ポイントと、studyの売買ポイントがぴったり重なっていることがわかります。
これで完成です!
アラートを飛ばしてみる
あとはアラートをセットしてタイミングを待つだけです。
タイミングになったらこんなアラートが飛んできます。
(アラートを飛ばすやり方についてのTradingViewのHow to記事も後で書きます)
お疲れさまでした!
これで下記の自動化に必要な2つの仕組みのうち、①をクリアしました。
このやり方はそのストラテジーに限らず、他にも応用が効くやり方です。
「TradingViewから任意のタイミングでアラートを出したい」
というときにはぜひ参考にしていただけると嬉しいです。
①売買するべきタイミングでアラートを出す仕組み
②アラートを感知して売買をする仕組み
あとは②だけです。
アラートを感知して売買を行う
②を実現する方法として、「はむとれ」という仕組みを無料で提供しています。
「はむとれ」であれば、簡単導入マニュアル付きで②の仕組みを作ることができます。
ついでにこのようなストラテジーを複数同時に回したり、スマホ上でストラテジーのON/OFFやロット調整を行うこともできます。他にもLINEに売買通知を飛ばしたりなど色々。
簡単さで言えば、とりあえず今回のStep2よりは10倍ぐらい簡単なので安心してください。今回のStep2を乗り越えた人であれば間違いなく設定できます。
全部無料です。
「はむとれ」以外の選択肢として、自分で環境を構築するやり方ももちろんあります。
ネット上には色々やり方が転がっていますが、「文系でもわかる!BitcoinのBOT自動売買トレードの始め方」というサイトがオススメです。
そもそもTradingViewを使うやり方ではありませんが、BOTトレードに関して初学者向けに最もわかりやすく解説しているサイトだと思います。
ゼロから作成するためのステップは、Pythonで環境構築を行い、取引所からデータを取得し、売買アルゴリズムを書き、エラー処理を行う、というのが一連の流れになります。
自分でローソク足も作りたいし、環境構築もしてみたい!という方はぜひチャレンジしてみてください。こっちはこっちで楽しめます。
BBBでした。