このシリーズの記事一覧 (クリックで開閉)
【 strategy解説(Pine) 】
これまで通りバーの上にわかりやすいようにラベルを表示させている。
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.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")
id
とfrom_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")
誤りだらけで申し訳ないが、このコードもまだ不足な部分がある。
実行結果は
最初の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万に指値を置いた
結果は
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を指定していない
結果は
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
結果は
指定した注文のロット数と完全に同じロット数が決済されている。
つまり"LONG2"
のid
が正しく指定できたということだ。
既にid
ひとつで混乱し始めていると思うのでここまでにする。
まずはid
とfrom_entry
の二種類を正しく理解しておきたい。
exit
はまだ難しいコードが残っているので次回へと続く。