2020-06-27

【Pine】strategy.orderとstrategy.entryのオプション「 stop 」【Trading View】

strategyのorderおよびentryのオプション「stop」だけを解説する。

Article Image

本日のオプション

strategy.entrystrategy.orderのオプションに関する解説の第二回目である。

オプションは以下

strategy.order(id, long, qty, limit, stop, oca_name, oca_type, comment, when)

こちらの項目のなかから

stopだけに絞って解説

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)

最初の数字は適当に私の方で調整しただけであり、各ユーザーは無視すること。

image-20200625214525219

こんな感じでラベルがつく。これは前回からやっているのでおなじみのコードである。

stop

どうみても「損切り」のstopに見える。しかし厳密には「逆指値注文」である点に注意が必要だ。

まず、次のコードを入れて「価格が下がったらロング、更に想定以上に下がったら損切り」というコードにしてみる

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,limit=1030000,stop=1000000)

これはバー1が確定した瞬間に

  • 103万円に書い指値
  • 100万円にストップ指値を置いた

というつもりである。

では実行してみよう。

image-20200625215011447

たしかに100万でロングは成功している。

しかしstopに設定した100万を切った時(つまり損切りラインに達した時)

ポジションが解消されていないのがわかる。

なぜ?

limitstopを混在してはダメ

実は大前提として一つのentry, order命令に対して2つの注文を同時に入れることは出来ない。

limitstopもそれぞれ「一つ分の注文」なのでとにかく混在はだめなのだ。

じゃぁ2行に分ければいいの?

2行に分けるのは正しい。

しかし、次のコードでは想定外の動作をする。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,limit=1030000) //limit
    strategy.entry("LONG", strategy.long,stop=1000000) //stop

IDを揃えてlimitstopを別々に発注した。

結果は

image-20200627220254806

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

image-20200627120619750

これも想定外だ。

なぜ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万より価格が上がったらロングする。 これは上記画像の上側にあるロング

stop100万を指定して発注したが、バーのopenが既に100万より上にあったため逆指値の条件を満たしているので成行でロングとなった(後ほど説明)

結局ロングしかしない(損切りではない)のだ

stop=損切りと理解してしまうと想定外の動作をしてしまう。

stopは逆指値注文である。

逆指値?なにそれ?となる人もいると思う。その場合は順に説明していくので少々長いがじっくり読んでほしい。

正しいコード

というわけで、正しいコードを記す。

正しくは

  • 発注を2行に分ける
  • longの損切りはshortexitで発注

に変更すればよい

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で持っているポジションを切ると思えば良い。

entryorderを当てるとポジション管理が面倒になりそうなので単純にポジションクローズで使うならexitをオススメ。

もう一つ言うとここでentryで逆指値を出してもいいがドテンしてしまうので非常に注意。orderexitしよう(厳密には後述)

第一引数のIDで「どのポジションを切るのか」を指定するので最初のLONGと同じものを指定する。

image-20200625233238495

正しく損切りされた。

余談:後述で2行のentryで同時にlimitstopを置くと想定外の動作をする解説をするがentryexitIDを揃えて同時に発注して良い模様。公式によるとlimitが約定してからexitstopが置かれるアルゴリズムになっているとのこと。

指値と逆指値を整理しておく

stop(逆指値)とlimit(指値)何が違うの?というところ。

このあたり理解していない人向けに記事を書く。

まず指値を理解(limit)

今回は「売り指値」で考える

  1. 例えばあなたが車を売りたいとする。
  2. 車買取業者に持っていったら100万で買ってやると言われた(買取業者が100万に書い指値を出している)
  3. いやいや、ちょっと安すぎる
  4. あなたはヤフオクに110万で車を出品した(あなたが110万で取引所に売り指値を出した)

これはいいだろうか。当然の取引である。

買い手がつかないリスクもあるが、売れたら10万円得する。

では次はどうか?(変な指値)

  1. 例えばあなたが車を売りたいとする。
  2. 車買取業者に持っていったら100万で買ってやると言われた(買取業者が100万に書い指値を出している)
  3. いやいや、ちょっと高すぎる
  4. 車買取業者に「いや、90万で買い取ってくれ」と言う or ヤフオクに90万で出す。 ← ???????????

これは普通おかしい。

よほどのボランティア精神か親しい友人でもない限り100万で買ってもらえる車をわざわざ90万で売ることはない。

つまり...?

現在価格が100万の物に対して90万の売り指値を置くことはできない。

この場合取引所側が「自ら進んで損をするなんて、それはいけません」ということで強制的に100万円で成行で売ったことになるのだ。

  • 売り指値は「現在より高い位置」

  • 買い指値は「現在より安い位置」

に置く(そうでなければ成行=現在価格付近で約定になる)ということを覚える。

これは良いだろうか?

今度は逆指値(stop)

もう一度先程の例に似た状況から逆指値を理解する

  1. 車を売りたいとする
  2. 車買取業者に持っていったら100万で買うと言われた
  3. いや、安すぎると思いヤフオクで110万で出した(正しい売り指値)
  4. 同時に業者に「逆に50万まで暴落があったらそのままに0円になりそう。その時は50万で即売りでOK」という条件で車を預けた。
  5. 後日、車のメーカーが大スキャンダルで大暴落し50万前後で取引されはじめた
  6. 契約の通り業者が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)

これでドテンできそうだが、同時に発注を出してしまうと...

image-20200626003212157

ちゃんと想定通りの価格で約定しているが、円の中に注意!

ドテンできていない。ノーポジになったと思われる。

image-20200626003300027

未決済が0円。つまりポジションが0になっている。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long, limit=1030000)
if (bar_no == 2)
    strategy.entry("SHORT",strategy.short,stop=1000000)

バーをずらすと

image-20200626003353845

ちゃんとショート側が-2になった。

image-20200626003414523

limitstopentryでドテンするときは要注意だ。

orderで厳密に管理したほうが良いかもしれない。

おまけ:両方ともlimitにしたら?

先程のコード両方とも「指値」に間違えたらどうなる。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,limit=1030000)
    strategy.entry("SHORT",strategy.short,limit=1000000)

SHORTの方をstopではなくlimitに変えた。

わかるだろうか?

image-20200625233732128

OPENでショートが入ってしまっている。

もう一度**「指値」**で説明した車の例を思い出す。

  • 現在のところ104万で値段がついているものを
  • いや103万で売ってやる

という指値注文になってしまっているのだ。

これは取引所が「それはいけません」ということで指値ではなく「104万で成行で売り」に変換されている。

正しい挙動であるが、先程同様ドテンできていない点にも注意だ。

おまけ:両方ともstopにしたら?

もう一つ。こんどは両方ともstop。逆指値である。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,stop=1030000)
    strategy.entry("SHORT",strategy.short,stop=1000000)

image-20200626003729803

もともとポジションを持っていない状態からスタートなのでちょっと混乱するかもしれないが、

ロングの場合のstop

空売りのポジションを持っていたが逆に103万以上に価格が上がってしまったら売りたい

というパターンに使うものだ。

とよくみると逆指値を出した時既に104万の価格だったのでこれは既にOPEN > 逆指値が成立しておりOPENで買いが走った。

ここの理解は結構重要なのでしっかり覚えておきたい。

おまけ:あえて発注を全てstopにする

恐らく仮想通貨の2018年ぐらいまで最前線だった売買方法。この方法だけで滅茶苦茶儲かったと思われる(私はそうでもない)

stopだけで売買するということはボリンジャーバンドのような物で現在価格の上下にラインを引いておいて

  • 価格が上がったら(線を上に抜けたら)買う
  • 価格が下がったら(線を下に抜けたら)売る

というめちゃくちゃシンプルな方法がある。つまり全部stopで注文。こんなんで儲かっていたのか、と言われそうだ。

いわゆる仮想通貨界隈の「ツッコミ」で売買する(と呼ばれていると思う。仮想通貨専門用語?違ったら申し訳ない)

イナゴフライヤーが流行ったのもこのあたりが理由かと思う。

実ははむとれではボリバンではなく「え、そんなラインのつかうの!?」という物が初期から人気があり2018年に大きな収益を生んだ。

以上!

コードの理解のみならず

指値・逆指値を覚えていないといけない。

ここの理解が初心者にとっておそらく大変なので説明も難しかった。

理解していただけたら幸いだ。

少々複雑なので間違っていたらご連絡頂ければと思う。



この記事をシェア


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