2020-07-07

【Pine】strategy.exit「idとfrom_entry」【Trading View】

strategy.exitを解説。今回はidとfrom_entryの2つに絞って解説する。

Article Image

前準備

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

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.closeを取り扱ったがこちらは成行でポジションを決済することしかできなかった。

そこで指値・逆指値を指定するようなより複雑なストラテジには今回説明する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)

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

  • id
  • from_entry

便宜上limitも一部取り扱うが私の過去の記事を見ていれば指値注文として使用方法は同様。次でlimitは解説済み

【Pine】strategy.orderとstrategy.entryのオプション【Trading View】

まず覚えておくこと:成行不可

strategy.exitは成行によるクローズは出来ない。

例えば次のコードはロングが入ったままとなりexitによるクローズは動作しない。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,qty=10)
if (bar_no == 2)
    strategy.exit("LONG")

idfrom_entry

これが初心者が最初に混乱する箇所だと思う。

exitの第一引数(id)は**「決済したい注文のID」ではなくexit注文そのものに付与するID」**である。

※余談:つまりcancelコードなどで指値を引き下げる時に使われるのがid

そしてfrom_entryに**「決済したい注文のID」**を入れる。

つまり上のコードはエラーではないが誤りだ。

id以外はオプションのため省略してもエラーが出ない

正確には次のコードなら良さそうに見えるのだが....

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,qty=10)
if (bar_no == 2)
    strategy.exit("LONG_EXIT","LONG")

厳密にはこれも誤り

誤りだらけで申し訳ないが、このコードもまだ不足な部分がある。

実行結果は

image-20200707150235791

最初のidだけ指定した場合と同様にロングを持ったまま決済されていない。

決済する価格と(逆)指値も必須

前述したがstrategy.exitのコードは第一引数のid以外はオプションなので

strategy.exit("LONG_EXIT")

というコードが入っていても文法エラーにはならない。

しかし、実際には**「いくらになったら決済するのか」という情報を入れてやらないと決済が実行されず**意味のないコードとなってしまうのだ。

ならば指値を指定:limit

というわけで「指値を指定」してやれば正しく決済できそうだ。

limitを指定すると指値になる。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,qty=10)
if (bar_no == 2)
    strategy.exit("LONG_EXIT", "LONG", limit=1000000) //100万に指値を置いた

結果は

image-20200707150541793

3の足で指値100万を下回ったため正しく決済された。

実は...from_entryは不要

第一引数の「exitそのものに付けるID」があれば「from_entry(exitする対象の注文id)」は不要である。

つまり

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,qty=10)
if (bar_no == 2)
    strategy.exit("LONG_EXIT", limit=1000000)

先程のコードはこれで同じ動作をする。

なぜfrom_entryがあるの?

という疑問が湧く。

実はこれはナンピンするような注文に対応している。

例えばfrom_entryを指定しない次のコード

10ロットロングして次の足で3ロット追加でロングしている。

if (bar_no == 1)
    strategy.order("LONG", strategy.long,qty=10) //10ロング
if (bar_no == 2)
    strategy.order("LONG2", strategy.long,qty=3) //ナンピンで3ロング
if (bar_no == 3)
    strategy.exit("LONG_EXIT", limit=1000000) //from_entryを指定していない

結果は

image-20200707151708593

10と3が纏めて決済された。

全決済するコード

つまりfrom_entryを指定しないと所持しているポジションを全決済することになる。

注意:バグの可能性あり

決済の三角形の位置がおかしい。Pineのバグの可能性があるため

ナンピンをfrom_entryなしで決済する方法は私個人から非推奨とする。

from_entryを指定して決済

では2番めの"LONG2"だけ決済してみよう。

if (bar_no == 1)
    strategy.order("LONG", strategy.long,qty=10) //10ロング
if (bar_no == 2)
    strategy.order("LONG2", strategy.long,qty=3) //ナンピンで3ロング
if (bar_no == 3)
    strategy.exit("LONG_EXIT", "LONG2", limit=1000000) //3ロット分積んでいるロングのID

結果は

image-20200707152040335

指定した注文のロット数と完全に同じロット数が決済されている。

つまり"LONG2"idが正しく指定できたということだ。

本日はここまで

既にidひとつで混乱し始めていると思うのでここまでにする。

まずはidfrom_entryの二種類を正しく理解しておきたい。

exitはまだ難しいコードが残っているので次回へと続く。



この記事をシェア


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