Pineスクリプトの基本

TrandingView でバックテストしたりインジケーター作ったりするためのスクリプト言語である Pine スクリプトについて、基礎的なことを調べたりしたので備忘録として残します。

サンプルスクリプト

バックテストの簡単なチュートリアル

以下のように「空のストラテジースクリプト」を選択すると、以下のようなテンプレートが生成されます。

//@version=4
strategy("マイストラテジー", overlay=true)

longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)

これをそのまま以下のように「チャートに追加」すると、バックテストが自動で実行されます。

このテンプレート(サンプル)でやっていることは、「14日移動平均線と28日移動平均線がクロスしたときにエントリーまたは決済」というのを永遠にドテン繰り返しているという感じです。

例えば、S&P500 の CFD で4時間足でやってみたときの結果は、以下の感じでした。

なんと、ただのサンプルなのに約$500プラス収益になってます!

・・・といっても、投資条件がどうなっているのかわからないので、確認してみます。
以下のように、歯車を選択して、プロパティを表示してみます。

初期投資資金が100,000円で、一回当たりの発注数が1枚ということみたいです。
(ちなみに、ここを変更数とバックテスト条件を変更できるみたいです)
これを考えると、利益はたった+50%なので、普通にS&P500をホールドし続けるほうが良い成績ということになりますね。

やっぱり適当なストラテジーでは、ただの長期投資には負けるということか・・・

サンプルスクリプトの簡単な解説

上記のスクリプトコードですが、現在わかっている段階の説明です。

バージョン

//@version=4

よくわかっていません。ぱっと見、コメントアウトされているので、効力はなさそうな気がしますが・・・ちょっとググった感じ、「何のバージョンで動くスクリプト」ということを表明する効果があるという記事が見当たりました。
とりあえず、現状では情報が多くあるのはバージョン3なので、3 に書き換えたほうがいいのかもしれません。

ストラテジーかインジケーターか

strategy("マイストラテジー", overlay=true) で、このスクリプトがストラテジー(つまりバックテストができる)であることを示すみたいです。
対して、インジケーターの場合は study(~) とやればよいみたいです。

ストラテジーとインジケーターの違いは以下の通りです。

  • ストラテジー
    • バックテストができる
    • インジケーターの機能を包含する
    • 2000件以上の売買が発生するとエラーになるらしい
  • インジケーター
    • バックテストできない

つまり端的に言うと、ストラテジーはインジケーターの上位互換ってことでよいと思います。ただし、数には限りがあるよという感じでしょうか。

売買判断

crossover 関数と crossunder 関数でゴールデンクロス(値の上抜け)とデッドクロス(値の下抜け)を判断できるみたいです。
このサンプルスクリプトだと、crossover 関数で「14日線が28日線を上抜けたか」を判断し、crossunder 関数で「14日線が28日線を下抜けたか」を判断します。

売買指示

strategy.entry("任意の文字列A", strategy.long) で「任意の文字列A」という識別子を付けてロングポジションをエントリーします。
このポジション中に strategy.entry("任意の文字列B", strategy.short) で「任意の文字列B」という識別子をつけてショートすると、「任意の文字列A」が決済されます。
ちょっとややこしいのですが、「任意の文字列A」とか「任意の文字列B」は、オーダー変更やキャンセルに使用すときに使いますが、ロング中のポジションがあればショートで決済される仕様?がちょっと意味が分かりません。

今わかっていないこと

両建てというか、ロングポジション持ちつつショートポジションをとる方法はないのでしょうか。
上記の strategy.entry でロングした後にショートすると、新しくポジションをとるのではなく決済が強制されるので、ちょっとそこらへんがわからないです。

コメント

タイトルとURLをコピーしました