このシリーズの記事一覧 (クリックで開閉)
【 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.exitstrategy.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つ
idfrom_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はまだ難しいコードが残っているので次回へと続く。
