レンジブレイクアウトを検証します。
ブレイクアウトでもいろんなブレイクアウト手法がある。
- 日足高値安値ブレイクアウト手法
- ドンチアンブレイクアウト手法
- ピボットブレイクアウト手法
- ボリンジャーバンドブレイクアウト手法
今回この記事を読んで気になる内容だったので検証します。
過去40本のローソク足に関して、下図のようにローソク足と移動平均線が交差した回数をカウントし、それが4回以上であることを横ばいの定義とします。
https://statistical-fx.com/2022/04/23/%e3%83%ac%e3%83%b3%e3%82%b8%e3%83%96%e3%83%ac%e3%82%a4%e3%82%af%e3%81%a7%e5%8b%9d%e3%81%a6%e3%82%8b%e3%81%ae%e3%81%8b%ef%bc%9f%e5%ae%9a%e9%87%8f%e5%8c%96%e6%96%b9%e5%bc%8f%e3%81%ae%e6%8f%90%e6%a1%88/
まずはそのまま実装しましょうか。
Table of Contents
トレーディングビューのパインスクリプトで検証する
エントリールール
- A ローソク足40本
- B 移動平均線期間N
- C 「終値」と「移動平均線」クロスを期間内に4回以上
- D チャネルブレイクアウト期間40 順張り
決済ルール
- A 期間40 最高値 ー 最安値
- B A ÷ 2
- C Bの値幅でトレーリングストップ
トレーディングビューでトレーリングストップ実装めんどくさいんだよな・・・😅
レンジブレイクアウト実装
まっさらな状態で組みます。
まずは移動平均線をとりあえず20に設定。
移動平均線の計算結果を ma 変数に代入しています。
データの保存メモリー
プログラムは0と1の数字の世界なのでデータは数字、変形する数字なので変数(へんすう)
英語ではvariable(ヴァリアブル)と呼びます。この言葉はスプラトゥーンでしか聞かないのではないでしょうか?
変数の=とプログラミングの=は意味が違います。
算数的な = はプログラミングでは、 == イコールイコールと書きます。
クロスはこれ使おうとおもった。
引数1、引数2の値がクロスしたらtrueを返す。
一般的にほぼ馴染みがないfalseはプログラムしてるとたびたび遭遇します。
〇か×かで
〇 は true;
× は false;
true(トゥルー) 又は false(フォルス) を真偽値(しんぎち)と呼びます。
真偽値はBoolean型、bool型、ブール型と呼ばれる。
引き渡すデータを引数と呼びます。
()の中身が引数です。
今回は引数を2個渡しています。
引数は呼ぶときに呼び出し元で記述します。
でもfor文の中で使えないみたいなので自分で考えてみます。
現在足を計算
次はエントリールールのチャネルブレイクアウトのストラテジーをコピペしてきましょう
1 2 3 4 5 6 7 8 |
//@version=5 strategy("ChannelBreakOutStrategy", overlay=true) length = input.int(title="Length", minval=1, maxval=1000, defval=5) upBound = ta.highest(high, length) downBound = ta.lowest(low, length) if (not na(close[length])) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE") |
3行目length =~~からコピペします。
そして、ソースコードをポジションを持っていない状態のみエントリーさせるように改変します。
1 2 3 4 |
if strategy.position_size == 0 if (not na(close[length])) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE") |
チャネルブレイクアウトは高値+1ポイントをブレイクアウトしたところに逆指値注文を毎回だします。
なのでカウンターが4未満なら注文をキャンセルさせます。
トレーリングストップの値幅を計算します。
トレーリングストップ決済注文
トレーリングストップ決済注文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
//@version=5 strategy("マイストラテジー", overlay=true) ma = ta.sma(close,20) count = 0 for i = 1 to 40 //移動平均線 <= 終値 up = ma[i+1] <= close[i+1] //移動平均線 >= 終値 down = ma[i+1] >= close[i+1] //現在足 移動平均線 <= 終値 current_up = ma[i] <= close[i] //現在足 移動平均線 >= 終値 current_down = ma[i] >= close[i] //もしもup状態でcurrent_downならクロス if up and current_down count+=1 //もしもdown状態でcurrent_upならクロス if down and current_up count+=1 length = 40 upBound = ta.highest(high, length) downBound = ta.lowest(low, length) if strategy.position_size == 0 if (not na(close[length])) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE") //もしもカウンターが4未満ならストラテジーをキャンセル if count < 4 strategy.cancel_all() //ポジションが0状態で(最高値ー最安値÷2)を記憶させる var float nehaba = 0.0 if strategy.position_size == 0 nehaba := (upBound - downBound) / 2 //ロングポジション保有状態でトレーリングストップ決済 if strategy.position_size > 0 strategy.exit("Trailing Stop(long)", "ChBrkLE", trail_price = close,trail_offset=nehaba) //ショートポジション保有状態でトレーリングストップ決済 if strategy.position_size < 0 strategy.exit("Trailing Stop(short))", "ChBrkSE", trail_price = close,trail_offset=nehaba) |
完成です。
チャートに追加をすると表示されます。
なんか違うような。でもとりあえずヨシ!
USDJPY 1時間足 (レンジブレイクアウトトレーリングストップ)
比較1 USDJPY 1時間足 (チャネルブレイクアウト期間40 通称元祖ドテン君40)
比較2 USDJPY 1時間足 (レンジブレイクアウトトレーリングストップ)
今回執行コスト(スプレッド、外部手数料、スリッページ)含まれておりません。
考察
よく分からない。
まとめ
ためしに作ってみたので、次回はMT4のEAにしてみます。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…