2020-06-26

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

今回は2回に渡って解説したstrategyのorderおよびentryのオプションを調べていく。

Article Image

strategy.entrystrategy.orderのオプション

今まで取り扱ったこの2つの記事ではオプションなしで取引をするバックテストだったが、いろいろなオプションが指定できる。

まずはどんなオプションが指定できるか見てみる。

前準備

これまでの記事通りサンプルとしてわかりやすいようにバーに数字を与えている。

コードは次

bar_no = 0
if(bar_index > 21650)
    bar_no := bar_index - 21650
    l = label.new(bar_index,na,text=tostring(bar_no),color=color.blue, textcolor=color.white,style=label.style_labeldown,yloc=yloc.abovebar)

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

つまり左から数えて21650番目の足を内部で0番の足としてカウントしているだけだ。

image-20200621211843256.png

オプションは共通!

orderentryがあるが、実はオプションは共通である。

公式より引用する。

strategy.order

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

strategy.entry

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

完全に一致している。

本日は左から順に4つまでを解説する

  • id
  • long
  • qty
  • limit

ID

必須オプション。第一引数に直接文字列を入れる。

strategy.entry("LONG", //つづく

注文の変更やキャンセルに使う。

指値関係は後述。

実験:同じIDが重複したorderentry

orderentryが両方あり、IDが重複した場合

//version=4
strategy("マイストラテジー", overlay=true)

bar_no = 0
if(bar_index > 21650)
    bar_no := bar_index - 21650
    l = label.new(bar_index,na,text=tostring(bar_no),color=color.blue, textcolor=color.white,style=label.style_labeldown,yloc=yloc.abovebar)
    
if (bar_no == 1)
    strategy.entry("LONG", strategy.long) //ここがentry
    strategy.order("LONG", strategy.long) //ここにorder

結果

image-20200623213952130

紫色なので、後に書いているorderで上書きされている。

他にも更に後でentryを加えると注文すらされなくなる等、想定外の挙動をする可能性があるので複雑にいくつも注文を出す場合はIDを分けることを前提で書き分けよう。

long

必須オプション。第2引数に直接booleanを入れる。

単純にtrueならロング、falseならショート扱いだが、わかりにくい。

そこで次のビルトイン変数を使う方法が用意されている。

  • strategy.long :ロング
  • strategy.short :ショート
strategy.entry("LONG", true) //これでも良いが...
strategy.entry("LONG", strategy.long) //こうしたほうがわかりやすい\

qty

ロット数。省略可能。

注意:省略可能だがqty = 1にしても良いし、第三引数に直接値を入れても良い。

以前説明したが変数=値形式のオプションは省略が可能と言える。このあたりPineは厳格なルールではなくかなり曖昧でも通るようになっている模様。

指定なしの場合自動で「」になる。

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

image-20200623215030732

例:で指定した場合、矢印のところがになっている事がわかる。

実験:entryでロングとショートで違うロット数の場合

次のコードだとどうなるか分かるだろうか

  1. はじめにロットでロングentry
  2. つぎの足で10ロットでショートentry
  3. ポジションはどうなる?
if (bar_no == 1)
    strategy.entry("LONG", strategy.long,qty=2) //最初に2ロング
    
if (bar_no == 2)
    strategy.entry("SHORT", strategy.short,qty=10) //次で10ショート

entryはドテンなので、私の以前の記事を読んで正しく理解していれば単純に2本目の足が10ロットのショートではないことが想像できるかと思う。

結果

image-20200623215356963

非常に見にくいが12のショートとなっている。

これは初めにエントリーしたをドテンする分ショートが追加された結果である。

ちなみにorderならその数字通りのポジションを取る(ドテン計算しない)

limit

指値による注文にする。指定しない場合は成行となる。

指定方法は簡単でlimit=数字で良い。

発注タイミング:約定は次の足から

if (bar_no == 1) 
    strategy.entry("LONG", strategy.long,limit=指値を入れる) //このコードだとバーが1の終値直後に発注となる

例えば次のコードの場合は

バーがの終値が確定した瞬間に指値が入る。

つまりその次のバーである2以降からしか約定しない。

例で見てみよう

これは使ってみないと本当に混乱するので例を出す

まず、2番め足の高値と安値(単位:円)

高値:1018511

安値:1013251

image-20200623215950599

実験1:やたら安い価格

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

limit1円にした。

結果

image-20200623220048237

当然価格は1円にはなっていないので指値はで約定することはない。

実験2:安値ジャスト

安値ジャストを指値にしてみる。

strategy.entry("LONG", strategy.long,limit=1013251)

image-20200623220417629

約定した。

実験3:安値と高値の間にロング

微妙な位置にロングを入れてみる。

画像の矢印のあたりに「買い指値」

strategy.entry("LONG", strategy.long,limit=1017500)

image-20200623220635342

ここで約定

image-20200623220707013

さて、どういうことか分かるだろうか?

これがまず初心者躓きポイント。

実際の相場で考えてみよう。

バー1の終値が確定した時点で、終値より高い位置にロング指値を置いたらどうなる?

おそらく多くの取引所が**「成行」**として実行されるのではないだろうか。

指値の構造は逆張りなので、現在の価格より「低い」価格を指定しないといけないという一般的な取引のルールを理解していないとココが混乱する。

つまり...

バー1の終値1014365より安い位置に買いを置くということを忘れずに。

image-20200623221143406

売りの場合は真逆で、終値より高い位置に置くようにする。

難しい問題:あり得ない指値で1本で2回エントリー(バグ狙い)

すこし混乱する難しい問題なので面倒なら飛ばして良い。

以前はバグ狙いで詐欺プロフィットを生むことができた手法を試す(v4になって修正されたかどうかのテスト)

1番目の終値より

  • 高い位置でロング(成行になる)
  • 低い位置にショート(成行になる)

同時に指値を置いた場合どうなるだろうか。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,limit=1017500)
    strategy.entry("SHORt", strategy.short,limit=1013741)

確か以前はバグにより詐欺プロフィットを計算していたが....

image-20200623221914754

始値の部分で買いと売りが同時に処理され

image-20200623221949311

詐欺ストラテジにはならない模様。一安心。

しかも手数料を設定すると...

image-20200623222035101

image-20200623222058973

ちゃんと実際のトレードと同じく手数料分損するらしい。これは完璧だ。

余計なトレードは避けるように。

難しい問題2:正しい指値で足1本で2回トレード

すこし混乱する難しい問題なので面倒なら飛ばして良い。

先程は「1本目の終値より高い位置で買い指値(NG)して低い位置で売り指値(NG)」というバグをついてみたが

今回は正しく「1本目の終値より高い位置に売り指値、低い位置に買い指値」を置いてみる。

image-20200623222607846

正しく2回トレードされた。指値としての置き方も正しく、プログラムの内容としても正しい挙動である。

image-20200623222639110

プロフィットも勝ちで計上されている。

注意:詐欺の可能性が消えたわけではない

とりあえずはうまくトレードできたが、このあたり厳密に調査したわけではないので以前のように詐欺ストラテジになってしまう可能性はまだある。

一本の足で2回トレードするストラテジ作成はバグになっていないか注意しよう。

またv3以前の一本足で2回トレードするタイプのストラテジはバグがある可能性が高いので詐欺だと思っておこう。

指値とID

既に混乱しているかもしれないが最後に一つだけ頑張ろう。

冒頭に出したIDとの関係。

IDを重複させるとどうなるか。

if (bar_no == 1)
    strategy.entry("LONG", strategy.long,limit=1013740) //全く同じidで
    strategy.entry("LONG", strategy.long,limit=1013730) //より低い指値で上書き

IDは説明したとおりentryの第一引数LONGである。

ここでは2行で2番めのentryが同IDを上書きしているので...

image-20200623223257371

約定は一度きり。価格も厳密に見ると1013730(上書きしたほう)で約定している。

IDを変えると

if (bar_no == 1)
    strategy.entry("LONG1", strategy.long,limit=1013740)
    strategy.entry("LONG2", strategy.long,limit=1013500)

先ほどと違って2つのentryでIDを変えた。すると...

image-20200623223544057

しっかり2個が別々で約定している。

IDはこのような処理で必要だ。

本日はここまで

limitに関する理解が難しいので本日はここまでとする。

試そうと思えばまだいくらでも「微妙なトレード」のコードが浮かんできそうである。

またv4でもバグを突いたPF詐欺ストラテジが作れる可能性が無くなったわけではないので注意するように。

次回stopオプションを解説する。単純な損切りオプションに見て実はstopは難しい。

頑張ってわかりやすい解説を目指したい。



この記事をシェア


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