このシリーズの記事一覧 (クリックで開閉)
【 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) //stopIDを揃えて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年に大きな収益を生んだ。
コードの理解のみならず
指値・逆指値を覚えていないといけない。
ここの理解が初心者にとっておそらく大変なので説明も難しかった。
理解していただけたら幸いだ。
少々複雑なので間違っていたらご連絡頂ければと思う。
