このシリーズの記事一覧 (クリックで開閉)
【 strategy解説(Pine) 】
strategy.entry
とstrategy.order
のオプションに関する解説の第二回目である。
オプションは以下
strategy.order(id, long, qty, limit, stop, oca_name, oca_type, comment, when)
こちらの項目のなかから
stop
だけ解説する。
本当にこれが厄介で最初は混乱する。
初心者は「逆指値注文」の理解が必要。
この記事で解説する。
これまでの記事通りサンプルとしてわかりやすいようにバーに数字を与えている。
コードは次
bar_no = 0
if(bar_index > 21699)
bar_no := bar_index - 21699
l = label.new(bar_index,na,text=tostring(bar_no),color=color.blue, textcolor=color.white,style=label.style_labeldown,yloc=yloc.abovebar)
最初の数字は適当に私の方で調整しただけであり、各ユーザーは無視すること。
こんな感じでラベルがつく。これは前回からやっているのでおなじみのコードである。
どうみても「損切り」のstop
に見える。しかし厳密には「逆指値注文」である点に注意が必要だ。
まず、次のコードを入れて「価格が下がったらロング、更に想定以上に下がったら損切り」というコードにしてみる
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=1030000,stop=1000000)
これはバー1が確定した瞬間に
103
万円に書い指値100
万円にストップ指値を置いたというつもりである。
では実行してみよう。
たしかに100万でロングは成功している。
しかしstop
に設定した100万を切った時(つまり損切りラインに達した時)
ポジションが解消されていないのがわかる。
なぜ?
limit
とstop
を混在してはダメ実は大前提として一つのentry
, order
命令に対して2つの注文を同時に入れることは出来ない。
limit
もstop
もそれぞれ「一つ分の注文」なのでとにかく混在はだめなのだ。
2行に分けるのは正しい。
しかし、次のコードでは想定外の動作をする。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=1030000) //limit
strategy.entry("LONG", strategy.long,stop=1000000) //stop
IDを揃えてlimit
とstop
を別々に発注した。
結果は
1回ロングしただけ。しかもopen
でロングしている。
なぜ?
これはID
を重複させたので1つ目のentry
は上書き消去され
2つ目のentry
であるstop
の逆指値注文だけが約定している。
ちょっと意味がわからないかもしれないが、とりあえずはそれで良い。
ならID
を変えてみよう。
//2行に分ける+idが重複すると上書きしてしまうのでIDを変えた
strategy.entry("LONG", strategy.long,limit=1030000) //limit
strategy.entry("LONG2", strategy.long,stop=1000000) //stop
これも想定外だ。
なぜ2回ロングしているのか?
stop
は逆指値注文(損切りではない)strategy.entry("LONG", strategy.long,limit=1030000) //limit
strategy.entry("LONG2", strategy.long,stop=1000000) //stop
なにがダメだったのだろうか。
まずこのコード。第2引数がstrategy.long
である。
limit
は指値。つまり103
万に価格が下がったらロングする。 これは上記画像の下側にあるロング
stop
は逆指値。つまり100
万より価格が上がったらロングする。 これは上記画像の上側にあるロング
stop
で100
万を指定して発注したが、バーのopen
が既に100
万より上にあったため逆指値の条件を満たしているので成行でロングとなった(後ほど説明)
結局ロングしかしない(損切りではない)のだ
stop
=損切りと理解してしまうと想定外の動作をしてしまう。
stopは逆指値注文である。
逆指値?なにそれ?となる人もいると思う。その場合は順に説明していくので少々長いがじっくり読んでほしい。
というわけで、正しいコードを記す。
正しくは
long
の損切りはshort
かexit
で発注に変更すればよい
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=1030000)
strategy.exit("LONG",stop=1000000, comment="損切りしました") //推奨
//strategy.order("SHORT",strategy.short,stop=1000000, comment="損切りしました") でも同様
//strategy.entryでもできるが要注意!
strategy.exit
に関してはまだ解説していないが単純にentry
で持っているポジションを切ると思えば良い。
entry
にorder
を当てるとポジション管理が面倒になりそうなので単純にポジションクローズで使うならexit
をオススメ。
もう一つ言うとここでentry
で逆指値を出してもいいがドテンしてしまうので非常に注意。order
かexit
しよう(厳密には後述)
第一引数のID
で「どのポジションを切るのか」を指定するので最初のLONG
と同じものを指定する。
正しく損切りされた。
余談:後述で2行のentry
で同時にlimit
とstop
を置くと想定外の動作をする解説をするがentry
とexit
はID
を揃えて同時に発注して良い模様。公式によるとlimit
が約定してからexit
のstop
が置かれるアルゴリズムになっているとのこと。
stop
(逆指値)とlimit
(指値)何が違うの?というところ。
このあたり理解していない人向けに記事を書く。
limit
)今回は「売り指値」で考える
100
万で買ってやると言われた(買取業者が100
万に書い指値を出している)110
万で車を出品した(あなたが110
万で取引所に売り指値を出した)これはいいだろうか。当然の取引である。
買い手がつかないリスクもあるが、売れたら10
万円得する。
100
万で買ってやると言われた(買取業者が100
万に書い指値を出している)90
万で買い取ってくれ」と言う or ヤフオクに90
万で出す。 ← ???????????これは普通おかしい。
よほどのボランティア精神か親しい友人でもない限り100
万で買ってもらえる車をわざわざ90
万で売ることはない。
現在価格が100
万の物に対して90
万の売り指値を置くことはできない。
この場合取引所側が「自ら進んで損をするなんて、それはいけません」ということで強制的に100
万円で成行で売ったことになるのだ。
売り指値は「現在より高い位置」
買い指値は「現在より安い位置」
に置く(そうでなければ成行=現在価格付近で約定になる)ということを覚える。
これは良いだろうか?
stop
)もう一度先程の例に似た状況から逆指値を理解する
100
万で買うと言われた110
万で出した(正しい売り指値)50
万まで暴落があったらそのままに0
円になりそう。その時は50
万で即売りでOK」という条件で車を預けた。50
万前後で取引されはじめた50
万送ってきて取引が完了した。ちょっと厳密には違うかもしれないがこれが逆指値だ。
つまり、あなたがロングポジションを持っている状態で
上がると思っていた価格が想定以上に下がってしまった場合**「損切り」をするパターンで逆指値**の注文が使われる。
この場合100
万で持っているBTCが50
万を切ったら成行で売り飛ばすということだ(あえて不利な価格で売る)
これをPine
にすると
strategy.order("LONG",strategy.long) //どこかで新しく車を買った
//月日が経って...今100万ぐらい
strategy.order("SHORT",strategy.short, limit=1100000) //ヤフオクで110万で出した
strategy.order("SHORT",strategy.short, stop=500000, comment="損切りしました") //暴落したら車を売る注文も出した
になる。
とりあえずこれで解説は終わりだ。
できるだけたくさんの人が理解してくれたらありがたいが....おそらく誰でも理解できるという内容ではなくなってきた。
まぁ、こういうものなのだ。
ここからはおまけでさらに難しい内容を実験する
逆にドテンすることもできる・・・が注意!
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=1030000)
strategy.entry("SHORT",strategy.short,stop=1000000)
これでドテンできそうだが、同時に発注を出してしまうと...
ちゃんと想定通りの価格で約定しているが、円の中に注意!
ドテンできていない。ノーポジになったと思われる。
未決済が0円
。つまりポジションが0
になっている。
if (bar_no == 1)
strategy.entry("LONG", strategy.long, limit=1030000)
if (bar_no == 2)
strategy.entry("SHORT",strategy.short,stop=1000000)
バーをずらすと
ちゃんとショート側が-2
になった。
limit
とstop
をentry
でドテンするときは要注意だ。
order
で厳密に管理したほうが良いかもしれない。
limit
にしたら?先程のコード両方とも「指値」に間違えたらどうなる。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=1030000)
strategy.entry("SHORT",strategy.short,limit=1000000)
SHORT
の方をstop
ではなくlimit
に変えた。
わかるだろうか?
2
のOPEN
でショートが入ってしまっている。
もう一度**「指値」**で説明した車の例を思い出す。
104
万で値段がついているものを103
万で売ってやるという指値注文になってしまっているのだ。
これは取引所が「それはいけません」ということで指値ではなく「104
万で成行で売り」に変換されている。
正しい挙動であるが、先程同様ドテンできていない点にも注意だ。
stop
にしたら?もう一つ。こんどは両方ともstop
。逆指値である。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,stop=1030000)
strategy.entry("SHORT",strategy.short,stop=1000000)
もともとポジションを持っていない状態からスタートなのでちょっと混乱するかもしれないが、
ロングの場合のstop
は
空売りのポジションを持っていたが逆に103万以上に価格が上がってしまったら売りたい
というパターンに使うものだ。
とよくみると逆指値を出した時既に104
万の価格だったのでこれは既にOPEN > 逆指値
が成立しておりOPEN
で買いが走った。
ここの理解は結構重要なのでしっかり覚えておきたい。
stop
にする恐らく仮想通貨の2018年ぐらいまで最前線だった売買方法。この方法だけで滅茶苦茶儲かったと思われる(私はそうでもない)
stop
だけで売買するということはボリンジャーバンドのような物で現在価格の上下にラインを引いておいて
というめちゃくちゃシンプルな方法がある。つまり全部stop
で注文。こんなんで儲かっていたのか、と言われそうだ。
いわゆる仮想通貨界隈の「ツッコミ」で売買する(と呼ばれていると思う。仮想通貨専門用語?違ったら申し訳ない)
イナゴフライヤーが流行ったのもこのあたりが理由かと思う。
実ははむとれではボリバンではなく「え、そんなラインのつかうの!?」という物が初期から人気があり2018年に大きな収益を生んだ。
コードの理解のみならず
指値・逆指値を覚えていないといけない。
ここの理解が初心者にとっておそらく大変なので説明も難しかった。
理解していただけたら幸いだ。
少々複雑なので間違っていたらご連絡頂ければと思う。