NA0TA

array関数でヘッド&ショルダをシステム化

OANDA:GBPJPY   Livre sterling / Yen japonais
今月から新たにpineスクリプトに配列を扱えるarray関数がリリースされました。
どんなもんだろうとユーザーマニュアルを読んでみたら衝撃が走りました。
あらゆるデータを配列を使って要素を参照したり、追加したり削除したり、メジアンを求めたり更には
共分散や標準偏差を求めることができるようになったのです!
これはpythonでいうとNumpyやPandasのデータフレームのようなもので、今までコーディングが難しかった
テクニカル分析ができるのではないかとテンションが上がりました。

試しにピボットハイポイントの価格を配列にいれてみたらバッチリ格納されていたので
今回はヘッド&ショルダのチャートパターンを簡易的ながらスクリプトで書いてみました。
ヘッド&ショルダは左ショルダ、ヘッド、右ショルダから形成されるので配列データ数は3に設定します。

ピボットハイポイントが形成される毎に配列に格納していき配列の最初の数値を左ショルダ、中央の数値をヘッド
最後の数値を右ショルダと定義します。

まず、左ショルダが形成されてからATRの0.5倍以上の高さのところにヘッドが形成されると次のシーケンスに移ります。
ヘッドが形成されてから左ショルダの価格から上下0.5パーセント以内でピボットハイポイントが形成されたら
ヘッド&ショルダの完成とみなし、次のバーでショートエントリーします。

手仕舞いは仕掛けてから最安値から1ATRのところにトレイリングストップを置きますが含み益が2ATRを上回ったら
0.8ATRに変更し、ダイナミックトレイリングストップが発動します。
損切ポイントとして仕掛け値から直近5本のバーの最高値と最安値のレンジの5日移動平均の距離にストップロスをおきますが
含み益が1.5ATRを上回ったらストップロスを仕掛け値から0.5ATRに移動し、プロテクトストップに変更します。
さらに投資資金の2%の損失でロスカット

結果は素晴らしく、リターンと期待値は30%に到達し、リカバリーファクターは6.05でした。
array関数を使えばトレンドラインのブレイクやレジスタンスラインやサポートラインを使ったテクニカル分析が
システム化できそうです。

BCount = input(10, title="ATR", step=5, minval=5, maxval=30)
PCount = input(4, title="PCount", step=2, minval=1, maxval=20)

PH0 = pivothigh(1,1)
PH = not na(PH0)
phset = false
phset := PH ? true : false

PL0 = pivotlow(1,1)
PL = not na(PL0)
plset = false
plset := PL ? true : false

var PHlist = array.new_float(3,PH0)
var PLlist = array.new_float(3,PL0)
var indexH = array.new_int(3,bar_index)
var indexL = array.new_int(3,bar_index)

if phset == true
array.push(PHlist,PH0)
array.remove(PHlist,0)
array.push(indexH,bar_index)
array.remove(indexH,0)
if plset == true
array.push(PLlist,PL0)
array.remove(PLlist,0)
array.push(indexL,bar_index)
array.remove(indexL,0)

PH_1 = array.get(PHlist,0)
HH = array.get(PHlist,1)
PH_2 = array.get(PHlist,2)
PH1index = array.get(indexH,0)
HHindex = array.get(indexH,1)
PH2index = array.get(indexH,2)

PL_1 = array.get(PLlist,0)
LL = array.get(PLlist,1)
PL_2 = array.get(PLlist,2)
PL1index = array.get(indexL,0)
LLindex = array.get(indexL,1)
PL2index = array.get(indexL,2)

DT = time - time
var label h1 = na
label.delete (h1)
h1 := label.new(PH1index-20 ,highest(high,30),xloc=xloc.bar_index ,yloc=yloc.price ,color=color.lime, style=label.style_label_down)
label.set_text(h1,tostring(PHlist))
var label h2 = na
label.delete (h2)
h2 := label.new(PL1index-20 ,lowest(low,30),xloc=xloc.bar_index ,yloc=yloc.price ,color=color.aqua, style=label.style_label_up)
label.set_text(h2,tostring(PLlist))

H_head = PH_1 < HH and PH_2 < HH and PH_1*1000 < PH_2*(1000 + PCount) and
PH_1*1000 > PH_2*(1000 - PCount) and plset == true and (HH - atr * BCount *0.1) > PH_2
L_head = PL_1 > LL and PL_2 > LL and PL_1*1000 < PL_2*(1000 + PCount) and
PL_1*1000 > PL_2*(1000 - PCount) and phset == true and (LL + atr * BCount*0.1) < PL_2

if H_head
var line line1 = na
line.delete(line1)
line1 := line.new(PH1index, PH_1, HHindex, HH, extend=extend.none, width=3, color=color.blue)
var line line2 = na
line.delete(line2)
line2 := line.new(HHindex, HH, PH2index, PH_2, extend=extend.none, width=3, color=color.blue)

if L_head
var line line3 = na
line.delete(line3)
line3 := line.new(PL1index, PL_1, LLindex, LL, extend=extend.none, width=3, color=color.orange)
var line line4 = na
line.delete(line4)
line4 := line.new(LLindex, LL, PL2index, PL_2, extend=extend.none, width=3, color=color.orange)
Clause de non-responsabilité

Les informations et les publications ne sont pas destinées à être, et ne constituent pas, des conseils ou des recommandations en matière de finance, d'investissement, de trading ou d'autres types de conseils fournis ou approuvés par TradingView. Pour en savoir plus, consultez les Conditions d'utilisation.