このシリーズの記事一覧 (クリックで開閉)
【 strategy解説(Pine) 】
strategy.entry
とstrategy.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番の足
としてカウントしているだけだ。
order
とentry
があるが、実はオプションは共通である。
公式より引用する。
strategy.order(id, long, qty, limit, stop, oca_name, oca_type, comment, when)
strategy.entry(id, long, qty, limit, stop, oca_name, oca_type, comment, when)
完全に一致している。
本日は左から順に4つまでを解説する
必須オプション。第一引数に直接文字列を入れる。
strategy.entry("LONG", //つづく
注文の変更やキャンセルに使う。
指値関係は後述。
order
とentry
order
とentry
が両方あり、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
結果
紫色なので、後に書いているorder
で上書きされている。
他にも更に後でentry
を加えると注文すらされなくなる等、想定外の挙動をする可能性があるので複雑にいくつも注文を出す場合はIDを分けることを前提で書き分けよう。
必須オプション。第2引数に直接boolean
を入れる。
単純にtrue
ならロング、false
ならショート扱いだが、わかりにくい。
そこで次のビルトイン変数を使う方法が用意されている。
strategy.long
:ロングstrategy.short
:ショートstrategy.entry("LONG", true) //これでも良いが...
strategy.entry("LONG", strategy.long) //こうしたほうがわかりやすい\
ロット数。省略可能。
注意:省略可能だが
qty = 1
にしても良いし、第三引数に直接値を入れても良い。以前説明したが
変数=値
形式のオプションは省略が可能と言える。このあたりPineは厳格なルールではなくかなり曖昧でも通るようになっている模様。
指定なしの場合自動で「1
」になる。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,qty=2)
例:2
で指定した場合、矢印のところが2
になっている事がわかる。
entry
でロングとショートで違うロット数の場合次のコードだとどうなるか分かるだろうか
2
ロットでロングentry
10
ロットでショートentry
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
ロットのショートではないことが想像できるかと思う。
結果
非常に見にくいが12
のショートとなっている。
これは初めにエントリーした2
をドテンする分ショートが2
追加された結果である。
ちなみにorder
ならその数字通りのポジションを取る(ドテン計算しない)
指値による注文にする。指定しない場合は成行となる。
指定方法は簡単でlimit=数字
で良い。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=指値を入れる) //このコードだとバーが1の終値直後に発注となる
例えば次のコードの場合は
バーが1
の終値が確定した瞬間に指値が入る。
つまりその次のバーである2以降からしか約定しない。
これは使ってみないと本当に混乱するので例を出す
まず、2番め足の高値と安値(単位:円)
高値:1018511
安値:1013251
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=1)
limit
を1
円にした。
結果
当然価格は1円にはなっていないので指値はで約定することはない。
安値ジャストを指値にしてみる。
strategy.entry("LONG", strategy.long,limit=1013251)
約定した。
微妙な位置にロングを入れてみる。
画像の矢印のあたりに「買い指値」
strategy.entry("LONG", strategy.long,limit=1017500)
ここで約定
さて、どういうことか分かるだろうか?
これがまず初心者躓きポイント。
実際の相場で考えてみよう。
バー1の終値が確定した時点で、終値より高い位置にロング指値を置いたらどうなる?
おそらく多くの取引所が**「成行」**として実行されるのではないだろうか。
指値の構造は逆張りなので、現在の価格より「低い」価格を指定しないといけないという一般的な取引のルールを理解していないとココが混乱する。
つまり...
バー1の終値1014365
より安い位置に買いを置くということを忘れずに。
売りの場合は真逆で、終値より高い位置に置くようにする。
すこし混乱する難しい問題なので面倒なら飛ばして良い。
以前はバグ狙いで詐欺プロフィットを生むことができた手法を試す(v4になって修正されたかどうかのテスト)
1番目の終値より
同時に指値を置いた場合どうなるだろうか。
if (bar_no == 1)
strategy.entry("LONG", strategy.long,limit=1017500)
strategy.entry("SHORt", strategy.short,limit=1013741)
確か以前はバグにより詐欺プロフィットを計算していたが....
始値の部分で買いと売りが同時に処理され
詐欺ストラテジにはならない模様。一安心。
しかも手数料を設定すると...
ちゃんと実際のトレードと同じく手数料分損するらしい。これは完璧だ。
余計なトレードは避けるように。
すこし混乱する難しい問題なので面倒なら飛ばして良い。
先程は「1本目の終値より高い位置で買い指値(NG)して低い位置で売り指値(NG)」というバグをついてみたが
今回は正しく「1本目の終値より高い位置に売り指値、低い位置に買い指値」を置いてみる。
正しく2回トレードされた。指値としての置き方も正しく、プログラムの内容としても正しい挙動である。
プロフィットも勝ちで計上されている。
とりあえずはうまくトレードできたが、このあたり厳密に調査したわけではないので以前のように詐欺ストラテジになってしまう可能性はまだある。
一本の足で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
を上書きしているので...
約定は一度きり。価格も厳密に見ると1013730
(上書きしたほう)で約定している。
if (bar_no == 1)
strategy.entry("LONG1", strategy.long,limit=1013740)
strategy.entry("LONG2", strategy.long,limit=1013500)
先ほどと違って2つのentry
でIDを変えた。すると...
しっかり2個が別々で約定している。
ID
はこのような処理で必要だ。
limit
に関する理解が難しいので本日はここまでとする。
試そうと思えばまだいくらでも「微妙なトレード」のコードが浮かんできそうである。
またv4でもバグを突いたPF詐欺ストラテジが作れる可能性が無くなったわけではないので注意するように。
次回stop
オプションを解説する。単純な損切りオプションに見て実はstop
は難しい。
頑張ってわかりやすい解説を目指したい。