スクリーンショット_2018-04-20_23

暗号通貨自動トレードシステム開発キャンプ#6:Pineスクリプトの簡単な解説

#bot開発キャンプ第6夜
#Trading Viewの投資戦略テスターの使い方解説&Pineエディタの説明
#Channel Breakout 戦略を元に実装を説明

//このキャンプに参加して実際にbot作った人っていますか?
//Trading Viewの投資戦略テスターとは
//ChannelBreakout戦略のソースコードを元に解説
//バックテストをする際の注意事項
//バックテストの期間を指定できるスクリプト
//Pineエディタの記述方法

こんばんは、しゃしゃしゃしゃです。
しばらく更新が途絶えていましたが、bot開発キャンプ第6夜を始めたいと思います。今回のnoteではTrading Viewをつかったバックテストの方法などを説明していこうと思います。今夜は「参加者の方々がTradingview で他人の戦略やインジケータのソースコードを見たときに何をしているのかを理解できる状態になる」というのを目標に進めていきたいと思います。既にPineエディタでコーディングができる方とかにはあんまり有益な情報では無いかもしれません。

・本キャンプに参加して実際にbotを作った方いますか?
 
いきなり皆さんに質問になってしまって申し訳ないのですが、聞かせてください。タイトルの通りです。どの取引所でもいいですし、どんなロジックでもいいです。このキャンプの内容だけでbotを作るのは無理だと思うので、ご自身がbotを作る際に有益になった、このnoteを見た後にbotを作ったって方がいればTwitterで教えてください。単純な興味という面もあるのですが、無料で情報が得られたときに実際に行動する人の割合というのが知りたいのです。
もしくは「有料note買ってそのまま運用してます。収益出てます。」でもいいですし、「Tipsが詰まった有料noteを買ったはいいものの実装に落とせて無いです」でもいいです。なんでもいいので最近のブームに乗ってbotに関わる行動を取った方が知りたいです。Twitterアカウントは@syasyasyasyathxです。DMでもリプライでもいいです。できればDMで年齢とかも添えていただくとなおさら嬉しいです。
是非とも協力お願いします。そこから自分なりの考察ができたらみなさんに共有させていただきますので

・投資戦略テスターとは
 このキャンプに参加するほど勉強熱心な皆さんなら既に登録していると思いますがTradingview というチャート分析のサイトで提供されている自身のシステムトレード戦略や他人が公開している戦略のバックテストが簡単にできる機能です。本当便利です。
Tradingview の登録がまだの方はこちらから登録できます。アフィです。
<Trading Viewの会員になる>
https://tradingview.go2cloud.org/aff_c?offer_id=2&aff_id=9758

ちなみに私は無料会員です。笑
ビットコインのチャートの表示方法等は以下のnoteでも触れているのでわからない方は参考にしてください。

上記noteではVIX戦術を実際に適用したコードを公開しています。これを元に解説していくのもいいのですが、今回は界隈を騒然とさせたChannelBreakout戦略のコードを元に説明していきます。

・ChannelBreakout戦略のソースコード
 まず始めに言っておきます。このソースコードはTradingViewで公開されているソースコードです。
ではそのことを前提に他人が公開しているソースコードを投資戦略テスターでバックテストする方法について説明していきます。

上画像「インジケーター」をクリックするとこの様な表示になると思います。「騰落株線」とか「騰落レシオ」とか色んな指標名が表示されていると思います。そのなかでよく見ると指標名の最後に「↑↓」が付いているものがあると思います。「ローソク足アップダウン(上昇下降)戦略」とか「ボリンジャーバンド戦略」とかですね。

あれ??
よく見ると

いました話題の「チャネルブレイクアウト戦略」こいつを選択してください。

こんな感じの画面になるはずです。このときチャートの時間軸を変えると自動的にバックテスト結果も変わってくれます。便利ですね。ここからソースコードを見る方法を説明していきます。

↑画像の「設定」という可愛い吹き出しが出ている「歯車」っぽいマークのところをクリックしましょう。

これでソースコードを表示させる方法がわからない方はBOT開発無理です。諦めましょう。嘘です。「スタイル」の右側にある「ソースコード」をクリックしてください。

やっとこさソースコードが表示できました。ここからやっと説明に入っていきます。かなり短くて説明しやすいですね。本当簡単です。編集したい場合は「コピーを作る」をクリックして好きな名前をつけて保存してください。保存したコードはオープンのところからいつでもひらけます。

//@version=3
strategy("ChannelBreakOutStrategy", overlay=true)

length = input(title="Length", type=integer, minval=1, maxval=1000, defval=5)

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")

//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)


一行目「//@version=3」はPineスクリプトのVersion3を使いますよという宣言です。Version2と3の違いってなにって言われるとFor文が使えたりIf文が使えたりするのが3で使えないのが2って感じですもっと大きい違いがあるのですがあとで説明します。とりあえず3にしとけばいいです。
以下のリンクにバージョン3の説明が書いてあるのでご覧になってください。

次の行がストラテジー名を決めている部分。あまり気にしなくてたい丈夫です。「strategy」を「study」にすると戦略ではなく指標になります。


length = input(title="Length", type=integer, minval=1, maxval=1000, defval=5)

ここで過去何本分のローソク足の高値安値を見るのかというのを設定しています。input関数は設定の部分で自由にいじることのできるパラメータですよっていう指定のところです。
[type]:変数のタイプintegerは整数
[minval]:最小の値を指定。今回は一本
[maxval]:最大の値を指定。今回は1000本
[defval]:デフォルトの値を指定。今回は5本

設定を押して入力のタブに移動すればご覧の様に長さの指定ができます。これはinputで指定した変数ならなんでも編集できる様になるので指標のパラメータはinputで指定すると便利です。

upBound = highest(high, length)
downBound = lowest(low, length)

upBoundに過去length分の高値の中の最高値を代入する。
downBoundに過去length分の安値の中の最低値を代入する。
これを過去length分の終値の最高値をcloseHigh、最低値をcloseLowに代入する場合は以下の様になります。

closeHigh = highest(close, length)
closeLow = lowest(close, length)
if (not na(close[length]))

na(X)のXが有効な値でない、つまりNaN(なにも入っていないとか)ならtrueになって有効な値、つまり1とか2とかならfalseが返り値となります。
close[length]はlength本前の終値と言う意味です。
close[1]なら1本前の終値
close[2]なら2本前の終値
。。。という様に[X]が大きいほど過去の値に遡っていきます。

要するに、if (not na(close[length]))はlength本前の終値が有効な値ならば次のプログラムを実行してくださいと言う意味です。

strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE")
strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")

実行するプログラムはこれ。
上側
「"ChBrkLE"というIDで、stop注文でロングエントリー(strategy.long)してください。stopの値はupBondに最小ティック幅を足したところです。最後にエントリーしたポイントに"ChBrkLE"ってコメントを残してね」
下側
上側のショートVer
ってプログラムです。
これで一番簡単なチャネルブレイクアウト戦略のPineスクリプトで書くことができます。

・バックテストをする時の注意事項
 さっき貼ったリンクにも記述してあるのですが、ver2だとバックテストの際に未来の値をとって計算してしまうのでものすごいパフォーマンスの高いbotができてしまいます。バックテストする際はver3を使いましょう。

・バックテストの期間を指定できるスクリプト
 以前Twitterか何かでバックテストの期間を指定できるスクリプトを公開している方がいたのでそれを取り入れたのが以下のプログラムです。
注意点としては短い足だとそもそもそんなに過去のローソク足が取れないので指定した期間よりも短期間しかテストできないことがあるってところですね。

//@version=3
strategy("ChannelBreakOutStrategy", overlay=true)

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

length = input(title="Length", type=integer, minval=1, maxval=1000, defval=5)

upBound = highest(high, length)
downBound = lowest(low, length)

if (not na(close[length]))
   strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE",when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
   strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE",when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

・Pineエディタの記述方法
リファレンスは以下。ここ見ればだいたい書いてます。他人の作ったコードをこのページで検索すれば何しているのかわかると思います。

最後までご参加いただきありがとうございました。
Pineスクリプト書いててなんか困ることあれば相談してください。協力できる時間があれば協力します。

次回は短めに、有用そうな戦略を見つける方法について記述しようと思います。

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