このシリーズの記事一覧 (クリックで開閉)
【 strategy解説(Pine) 】
わかりやすい動画があったので貼り付けておく
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)
次のコードは上のラベルが1
の時に取引をするコードである。
if (bar_no == 1)
strategy.entry("LONG", strategy.long)
このbar_no
だけ私が用意した変数なので注意。足の頭に表示させた数字である。
strategy.exit
strategy.exit
もstrategy.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)
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
) = 1028570trail_offset
) = 10000となっている。
まずトリガーとなるラインを超える。このときトリガーは必ず「利益」となっている価格であることに注意。
トレイリングストップは利益が乗ってきて初めて発動するものである。
エントリーした足と同じ足でトリガーを切ったので、ここでトレイリングストップが開始した。
trail_offset
に指定した金額だけ逆行する次の画像で示した足が
「最も利益がのった場所(最安値)からtrail_offset
に指定した(1万円逆行した)箇所」
となる。
補足:1003332 - 993332 = 10000
このオフセットの10000は利益額ではなく銘柄の値段なので注意。
trail_points
:価格差でトリガーtrail_price
の代わりにtrail_points
で指定しても良い。
これはtrail_price
が価格の絶対値だったのに対し
trail_points
はエントリー価格から相対的な価格幅(利益が出る方向)にしただけだ。
例えば
ショートエントリーの価格が100
, exit
のtrail_price = 90
というコードがあれば
trail_price
を指定する代わりにtrail_points = 10
にしても同じ効果ということ。
注意点としてはあくまで値幅なので含み益の額ではない。つまりqty
の影響は受けないので注意。
どちらを使うかは好みの問題だ。
トレイリングストップの基礎はここまで理解しておけば良い。
ここからはPineの内部の面倒な部分を探るが、どういうわけか内部的に
**「利益を最大に見せようとする動き」**をするので、初心者は....
と考えている。
見せかけだけの利益に喜んでいるとシストレで損をするのは自分である。
では詳しく説明する。
もう一度先ほどの利確ポイントをよく見てみよう。
⑤の足には1万幅の値動きが含まれる。
これは1時間足なので値動きによってはトレイリングストップがかかっても良いはずであるが
かかっていない。
ということは、足が確定した時点でオフセットの枠を抜けていなければポジションは継続されてしまうというロジックになっていそうだ。
恐らくPineのexit
によるトレイリングストップは
足が確定した時点、つまり**「後出しジャンケンで」**利確したポイントを確定していると思われる。
このロジックでは不具合が出る。
バックテストでは1本の足の内部の動きがどうなっているかは追従できないので、その対応として一本前の安値(高値)を元に利確ラインを決めるほかない。
つまり本来は次のロジックが正しいと思われる。
画像のように⑦の足のスタート時点で
⑥の足までの最安値(最も利益が乗ったポイント)からのオフセットを利確ラインにすべきであるが
後出しジャンケンなので⑦の足が確定する瞬間に「この辺で利確したことにしといたろ」となってしまっている。
恐らくこのトレイリングストップ自体が使われているケースがまれなので
このインシデントは殆ど運営に挙がっていないと思われる。
なので無視されているのではないだろうか。
残念ながらこのロジックでは詐欺コードが作れると思うので実演する。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円にすると、下ヒゲさえあれば全てのバーで利確が走る。
勝率100%なのでPF計測不可能
ちょっと工夫して...詐欺ではないように見せかけてみよう
if(bar_index > 20000)
strategy.entry("Short", strategy.short)
strategy.exit("Trailing Stop(Short)", "Short", trail_price=close, trail_offset=0)
trail_price
をclose
にすることで、勝率が100%にならないように調整
僅かに損が入ることでなんか実現できそうなグラフに見え始める。
これは本当によろしくない。
詐欺案件が増える可能性があるので公開しないほうが良いという葛藤もあるが...
そもそもこのロジックが表に出ていないければ誰も指摘できない可能性のほうが高いので
先に拡散しておこうと考えた次第。※テレビで巧妙な詐欺の手法を放送するのと同じ。
他人のストラテジをコードから評価する場合に意識しておいてもらえたらと思う。
しっかりと不利な価格で利確する自前のトレイリングストップを自前で実装すればよいのではないだろうか。
exit
にはstop
注文があるので計算してやれば実装できる筈だ。
時間があればこちらにも取り組んでみたい。
strategy.exit
でトレイリングストップは一応可能