このシリーズの記事一覧 (クリックで開閉)
【 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.close
とstrategy.exit
の違いは?本日は**「ポジションを決済するコード」**である。
用意されたコードは次の2つがある。
strategy.close
strategy.exit
この2つがパッと見で混乱するのでまずは違いを見ていく。
id
が必須か、そうでないかstrategy.close
は必ず閉じる取引のid
が必要。strategy.exit
は対象のid
なしでも閉じることができる(オープンのものを全て閉じる)補足:exit
は対象のid
は必須ではないがexit
自体のid
は必須。混乱するので今は覚えなくて良い。
strategy.close
は必ず成行となる(open
で決済される)
strategy.exit
は指値・逆指値によるクローズが可能(バーの途中で決済できる)
厳密にはexit
はoca
を使ったりトレイリングストップにしたりと更に複雑なことができる。
ただ、大きな違いは上記2つなのでそれだけ理解しておけばほとんど問題はない。
利確・損切りなど難しいコードはstrategy.exit
を。シンプルにクローズしたいだけならstrategy.close
を使うと覚えておこう。
strategy.close
今回は簡単な方strategy.close
を解説する。
公式で用意されたオプションは次
strategy.close(id, when, comment, qty, qty_percent)
オプションが少ないので簡単である。
オプションを見て気付くと思うが、指値のオプションがない。
つまりこれは問答無用で**「成行」によってポジションを解消するコードである。**
id
まずクローズする取引のid
を必ず指定する。これがないとエラーになる。
例
if (bar_no == 1)
strategy.entry("LONG", strategy.long)
if (bar_no == 2)
strategy.close("LONG")
シンプルにバー1
で成行で買い。バー2
で成行で売りのコード。
最初のentry
のid
が"LONG"
なのでそれを指定すればよい。
正しくクローズされた。
※バーが一つズレて見えるのは成行の仕様上1のcloseで取引を実行 = 2のopenで取引成立となるため。3の足も同様。
ただし....
if (bar_no == 1)
strategy.entry("LONG", strategy.long)
strategy.close("LONG")
このコードは注意だ。
strategy.close
は既に取引が成立しているポジションに対してしか効果がない。
つまりこのコードは
同じタイミングでstrategy.close
を出しても効果がない。
when
order
やentry
にもあるようにif
に指定している**「条件」**をwhen
に入れることが可能だ。
if (bar_no == 1)
strategy.entry("LONG", strategy.long)
strategy.close("LONG",when=bar_no == 2)
これも先程の例と全く同じで正しく動作する(バー3
のopen
でクローズされる。)
ただしこれも注意
if (bar_no == 1)
strategy.entry("LONG", strategy.long)
strategy.close("LONG",when=bar_no == 2)
このコードはクローズが動作しない。先程と同様である。
comment
表示されているテキストを変更するだけ。
便利なのでよく使う。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,qty=10)
if(bar_no == 2)
strategy.close("LONG",comment="LONGをクローズしました")
紫なので長いコメントは少々見にくいが...
色を変更するオプションは今の所無い。
qty
クローズする数量を指定する。
entry
側にもqty
を設定している場合やピラミッディングを使用している時に仕様するパターンが考えられる。
次は10ロット
積んで2ロット
だけクローズする例。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,qty=10)
if(bar_no == 2)
strategy.close("LONG",qty=2)
3の足
で正しく2ロット
だけクローズされた。
qty_percent
こちらはパーセンテージでクローズするロットを指定する。
パーセンテージなので20%なら20
if (bar_no == 1)
strategy.entry("LONG", strategy.long,qty=10)
if(bar_no == 2)
strategy.close("LONG",qty_percent=20)
このコードは上と全く同じで2ロット
だけクローズされる。
非常に小さいパーセンテージを指定しても0
以上であれば最低1ロット
は解消されるので注意。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,qty=10)
if(bar_no == 2)
strategy.close("LONG",qty_percent=0.0000001) //非常に小さい値
これも
1ロット
のクローズ扱いとなった。
最小が1だが、1以上の少数は切り捨てとなる。
四捨五入ではないので注意。
例えば19%
。四捨五入や切り上げなら2
となるが...
if (bar_no == 1)
strategy.entry("LONG", strategy.long,qty=10)
if(bar_no == 2)
strategy.close("LONG",qty_percent=19) //19%
同様に1
のままである。
0 < qty_percent <= 100
マイナス値や100より大きい値が入るとストラテジ自体が動作停止するので注意。0
の指定もエラーだ。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,qty=10)
if(bar_no == 2)
strategy.close("LONG",qty_percent=100.1) //100より大きい!
エラーログに出ず、チャートにエラーが表示される。
さて、次の例はどうなるだろうか。
if (bar_no == 1)
strategy.entry("LONG", strategy.long)
if (bar_no == 2)
strategy.entry("SHORT", strategy.short)
if (bar_no == 3)
strategy.close("LONG")
ロング > ショート > ロングをクローズ
strategy.close
は動作していない。
2番の足
でショートがドテンするという処理をするため(ロングは解消される)
3の足確定時点で既に"LONG"
というポジションは無い。
よってstrategy.close
は無視されている。
最後のstrategy.close
のid
を"SHORT"
にするとクローズが動作する。
これは今までやってきた記事の復習でもあり、全て読んでいれば分かる問題。
entry
ではなくorder
に変更。
さらに最初のロングが2ロット
のロング。
最後のclose
はどのような動作をするだろうか。
if (bar_no == 1)
strategy.order("LONG", strategy.long,qty=2) //ロットを2にしてorderでロング
if (bar_no == 2)
strategy.order("SHORT", strategy.short) //orderでショート
if (bar_no == 3)
strategy.close("LONG") //これはどうなる!?
order
はドテンではなく指定された数量を指定方向に発注するコードであった。
order
はオプション指定しなければ**「成行」「ロット数1」**という動作なので2番の足
では1ロット
ショート(1ロング分解消)
最後にロングはまだ1ロット
残っているのでstrategy.close
が動作し、ノーポジションとなる。
これは正しい動作である。
exit
は別記事にてexit
は難しいので別記事とする。
close
は非常に簡単なコードなので初心者はとりあえず先に覚えたいコードである。
ただし逆に複雑なことが殆どできないので損切りなどにはあまり向いていない。
ストラテジ制作をはじめて行う場合まずはstrategy.entry
とstrategy.close
でコードを書いてみるのが練習には最適かと思う。