2020-07-21

【Pine】strategy.exitでトレイリングストップ【Trading View】

strategy.exitを解説。今回のメインはトレイリングストップを設定するオプション。後半で詐欺ストラテジの注意喚起を入れた。

Article Image

前提:トレイリングストップを知っていること

わかりやすい動画があったので貼り付けておく

先に結論

exitのトレイリングストップは内部ロジックに不備があるので私個人的に使わないほうが良いとしている。

記事後半にこれをつかった「詐欺ストラテジのサンプル」を掲載しているので騙されないように知っておいてほしい。

とは言えこちらの内容を理解しておくと投資の知識となるのでぜひとも読んでほしい。

もしトレイリングストップを使うのであればstopオプションを使ってコードを自前で実装するのが良いと考えている(未検証)

前準備

これまで通りバーの上にわかりやすいようにラベルを表示させている。

bar_no = 0
if(bar_index > 21699 and bar_index < 21750)
    bar_no := bar_index - 21699
    l = label.new(bar_index,high+10000,text=tostring(bar_no),color=color.blue, textcolor=color.white,style=label.style_labeldown,yloc=yloc.price)

image-20200625214525219

次のコードは上のラベルが1の時に取引をするコードである。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long)

このbar_noだけ私が用意した変数なので注意。足の頭に表示させた数字である。

strategy.exit

strategy.exitstrategy.closeも**「ポジションを決済するコード」**だ。

この記事は引き続きstrategy.exitに絞って解説する。

引数一覧

公式のドキュメントは次

Pineスクリプト言語リファレンスマニュアル — TradingView

まずは引数の一覧

strategy.exit(id, from_entry, qty, qty_percent, profit, limit, loss, stop, trail_price, trail_points, trail_offset, oca_name, comment, when)

本日解説するのは次の3つ

  • trail_price
  • trail_points
  • trail_offset

trail_price:トリガー価格

通常トレイリングストップは損切りではなく含み益になっている場合に考えるものである。

trail_priceはトレイリングストップが開始するトリガーとなる。

つまり価格がこの価格を有利な方に抜けた時にトレイリングストップがスタートする。

含み益になっていないといけないのでtrail_priceは次を守ること。

  • ショートの場合はエントリー価格より低い価格であること
  • ロングの場合はエントリー価格より高い価格であること

trail_offset:利確ラインの指定

trail_offsetにより利確するラインを設定する。

**「最も利益が出た価格からtrail_offsetに指定した価格だけ逆行した時」**に決済される。

つまりショートの場合はトリガー価格を超えた時点から現在までの最安値からtrail_offset値だけ上に反発したところに利確ラインが置かれるという仕組み。

例:ショートの場合

わかりにくいと思うので例を使って順番に確認する。

ショートの場合

コード

if (bar_no == 1)
    strategy.entry("Short", strategy.short)
    strategy.exit("Trailing Stop(Short)", "Short", trail_price=1028570, trail_offset=10000)
  • トリガーのライン(trail_price) = 1028570
  • 利確のオフセット(trail_offset) = 10000

となっている。

①トリガーを超える

まずトリガーとなるラインを超える。このときトリガーは必ず「利益」となっている価格であることに注意。

トレイリングストップは利益が乗ってきて初めて発動するものである。

image-20200721143244143

エントリーした足と同じ足でトリガーを切ったので、ここでトレイリングストップが開始した。

trail_offsetに指定した金額だけ逆行する

次の画像で示した足が

「最も利益がのった場所(最安値)からtrail_offsetに指定した(1万円逆行した)箇所」

となる。

image-20200721143648810

補足:1003332 - 993332 = 10000

このオフセットの10000は利益額ではなく銘柄の値段なので注意。

trail_points:価格差でトリガー

trail_priceの代わりにtrail_pointsで指定しても良い。

これはtrail_priceが価格の絶対値だったのに対し

trail_pointsはエントリー価格から相対的な価格幅(利益が出る方向)にしただけだ。

例えば

ショートエントリーの価格が100, exittrail_price = 90というコードがあれば

trail_priceを指定する代わりにtrail_points = 10 にしても同じ効果ということ。

注意点としてはあくまで値幅なので含み益の額ではない。つまりqtyの影響は受けないので注意。

どちらを使うかは好みの問題だ。

とりあえず初心者はここまで

トレイリングストップの基礎はここまで理解しておけば良い。

ここからはPineの内部の面倒な部分を探るが、どういうわけか内部的に

**「利益を最大に見せようとする動き」**をするので、初心者は....

exitのトレイリングストップは使わないほうが良い

と考えている。

見せかけだけの利益に喜んでいるとシストレで損をするのは自分である。

では詳しく説明する。

ここから上級:利確の位置おかしいのでは?

もう一度先ほどの利確ポイントをよく見てみよう。

image-20200721152559000

⑤の足には1万幅の値動きが含まれる。

これは1時間足なので値動きによってはトレイリングストップがかかっても良いはずである

かかっていない。

ということは、足が確定した時点でオフセットの枠を抜けていなければポジションは継続されてしまうというロジックになっていそうだ。

このロジックは使い物にならない?

恐らくPineのexitによるトレイリングストップは

足が確定した時点、つまり**「後出しジャンケンで」**利確したポイントを確定していると思われる。

このロジックでは不具合が出る。

バックテストでは1本の足の内部の動きがどうなっているかは追従できないので、その対応として一本前の安値(高値)を元に利確ラインを決めるほかない。

つまり本来は次のロジックが正しいと思われる。

image-20200721153005697

画像のように⑦の足のスタート時点で

⑥の足までの最安値(最も利益が乗ったポイント)からのオフセットを利確ラインにすべきであるが

後出しジャンケンなので⑦の足が確定する瞬間に「この辺で利確したことにしといたろ」となってしまっている。

恐らくあまり使われないコードなので

恐らくこのトレイリングストップ自体が使われているケースがまれなので

このインシデントは殆ど運営に挙がっていないと思われる。

なので無視されているのではないだろうか。

注意!詐欺ストラテジ実演(v4でも防げない)

残念ながらこのロジックでは詐欺コードが作れると思うので実演する。v4でも防げない。

コード

if(bar_index > 20000) //bar_indexはエントリー数を絞るためだけに入れているので自由に設定する
    strategy.entry("Short", strategy.short)
    strategy.exit("Trailing Stop(Short)", "Short", trail_points=1, trail_offset=0)

なんとたった3行。これだけでOKだ。

trail_offsetを0にすると、全てのバーの最安値を利確ポイントとできる。

※バーが確定するときに最安値とoffsetを使った判定となる不具合を突いている。運営が仕様変更しない限り対応不可能。

trail_pointsを1円にすると、下ヒゲさえあれば全てのバーで利確が走る。

image-20200721155042163

勝率100%なのでPF計測不可能

image-20200721155117441

ちょっと工夫して...詐欺ではないように見せかけてみよう

if(bar_index > 20000)
    strategy.entry("Short", strategy.short)
    strategy.exit("Trailing Stop(Short)", "Short", trail_price=close, trail_offset=0)

trail_pricecloseにすることで、勝率が100%にならないように調整

image-20200721155241192

僅かに損が入ることでなんか実現できそうなグラフに見え始める。

これは本当によろしくない。

公開しないほうがいいのでは?

詐欺案件が増える可能性があるので公開しないほうが良いという葛藤もあるが...

そもそもこのロジックが表に出ていないければ誰も指摘できない可能性のほうが高いので

先に拡散しておこうと考えた次第。※テレビで巧妙な詐欺の手法を放送するのと同じ。

他人のストラテジをコードから評価する場合に意識しておいてもらえたらと思う。

未検証:自前でトレイリングストップを用意したらどうなる?

しっかりと不利な価格で利確する自前のトレイリングストップを自前で実装すればよいのではないだろうか。

exitにはstop注文があるので計算してやれば実装できる筈だ。

時間があればこちらにも取り組んでみたい。

まとめ

  • strategy.exitでトレイリングストップは一応可能
  • 不具合により利益が最大化される恐れがあるため利用は避けたほうが良い(v4でもダメ)
  • (重要)公開されているストラテジにtrail系のコードが含まれている場合詐欺に注意!


この記事をシェア


謎の技術研究部 (謎技研)