2020-07-06

【Pine】strategy.closeの説明とexitの違い【Trading View】

strategy.closeをメインで解説。またstrategy.exitとの違いも解説する。

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.closestrategy.exitの違いは?

本日は**「ポジションを決済するコード」**である。

用意されたコードは次の2つがある。

  • strategy.close
  • strategy.exit

この2つがパッと見で混乱するのでまずは違いを見ていく。

決済対象のidが必須か、そうでないか

  • strategy.closeは必ず閉じる取引のidが必要。
  • strategy.exitは対象のidなしでも閉じることができる(オープンのものを全て閉じる)

補足:exitは対象のidは必須ではないがexit自体のidは必須。混乱するので今は覚えなくて良い。

成行かそうでないか

  • strategy.closeは必ず成行となる(openで決済される)

  • strategy.exit指値・逆指値によるクローズが可能(バーの途中で決済できる)

基本的には以上の2つ

厳密にはexitocaを使ったりトレイリングストップにしたりと更に複雑なことができる。

ただ、大きな違いは上記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で成行で売りのコード。

最初のentryid"LONG"なのでそれを指定すればよい。

image-20200701133703974

正しくクローズされた。

※バーが一つズレて見えるのは成行の仕様上1のcloseで取引を実行 = 2のopenで取引成立となるため。3の足も同様。

ただし....

if (bar_no == 1)
    strategy.entry("LONG", strategy.long)
    strategy.close("LONG")

このコードは注意だ。

strategy.closeは既に取引が成立しているポジションに対してしか効果がない。

つまりこのコードは

image-20200701133929033

同じタイミングでstrategy.closeを出しても効果がない。

when

orderentryにもあるようにifに指定している**「条件」**をwhenに入れることが可能だ。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long)

strategy.close("LONG",when=bar_no == 2)

これも先程の例と全く同じで正しく動作する(バー3openでクローズされる。)

image-20200701133703974

ただしこれも注意

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をクローズしました")

image-20200701141219879

紫なので長いコメントは少々見にくいが...

色を変更するオプションは今の所無い。

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)

image-20200701140229365

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ロットだけクローズされる。

注意:最低でも1はクローズされる

非常に小さいパーセンテージを指定しても0以上であれば最低1ロットは解消されるので注意。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,qty=10)
if(bar_no == 2)
    strategy.close("LONG",qty_percent=0.0000001) //非常に小さい値

これも

image-20200701140516193

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%

image-20200701140637856

同様に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より大きい!

エラーログに出ず、チャートにエラーが表示される。

image-20200701141041173

おまけ:ちょっと難しい問題

さて、次の例はどうなるだろうか。

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")

ロング > ショート > ロングをクローズ

結果は....

image-20200701141700761

strategy.closeは動作していない。

2番の足でショートがドテンするという処理をするため(ロングは解消される)

3の足確定時点で既に"LONG"というポジションは無い。

よってstrategy.closeは無視されている。

最後のstrategy.closeid"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") //これはどうなる!?

結果は...

image-20200701142154782

orderはドテンではなく指定された数量を指定方向に発注するコードであった。

orderはオプション指定しなければ**「成行」「ロット数1」**という動作なので2番の足では1ロットショート(1ロング分解消)

最後にロングはまだ1ロット残っているのでstrategy.closeが動作し、ノーポジションとなる。

これは正しい動作である。

exitは別記事にて

exitは難しいので別記事とする。

さいごに

closeは非常に簡単なコードなので初心者はとりあえず先に覚えたいコードである。

ただし逆に複雑なことが殆どできないので損切りなどにはあまり向いていない。

ストラテジ制作をはじめて行う場合まずはstrategy.entrystrategy.closeでコードを書いてみるのが練習には最適かと思う。



この記事をシェア


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