このシリーズの記事一覧 (クリックで開閉)
【 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.closestrategy.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を出しても効果がない。
whenorderや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でコードを書いてみるのが練習には最適かと思う。
