zigzagストラテジーをつくる④|インジケーターを改良する1

Telah dikemas kini
以前みつけた高勝率のzigzagストラテジーを再現する試みです。
Pine講座㊿ バックテスト|ZigZag PA Strategy V4.1 の解説(パターンとフィボナッチによる売買)


とりあえず、フィボナッチの追加を行ってみました。

他にも少し手を加えています。

・line.newを削除
・コードの整理

と、ここまでやってみたは良いものの、
「変動率を考慮したジグザグ」よりも
「上位足のジグザグ」の方が良い気がしてきました。

なので、security関数を用いない
「上位足のジグザグ」を実装したいと思います。

※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)

=====
//version=4
study("Zig Zag 勉強中", overlay=true)


dev_threshold = input(title="Deviation (%)", type=input.float, defval=.1, minval=0.01, maxval=100)
depth = input(title="Depth", type=input.integer, defval=10, minval=1)

showPatterns = input(true, title='Show Patterns')
showFib0000 = input(title='Display Fibonacci 0.000:', type=input.bool, defval=true)
showFib0236 = input(title='Display Fibonacci 0.236:', type=input.bool, defval=true)
showFib0382 = input(title='Display Fibonacci 0.382:', type=input.bool, defval=true)
showFib0500 = input(title='Display Fibonacci 0.500:', type=input.bool, defval=true)
showFib0618 = input(title='Display Fibonacci 0.618:', type=input.bool, defval=true)
showFib0764 = input(title='Display Fibonacci 0.764:', type=input.bool, defval=true)
showFib1000 = input(title='Display Fibonacci 1.000:', type=input.bool, defval=true)


//**
//* depth -> length -> zero
//* lengthが最高値・最安値であるかを確認
//* trueならbar_indexと価格を返す
//*
pivots(src, length, isHigh) =>
 p = nz(src[length])
 if length == 0
  [bar_index, p]
 else
  isFound = true
  for i = 0 to length - 1
   if isHigh and src[i] > p
    isFound := false
   if not isHigh and src[i] < p
    isFound := false
  for i = length + 1 to 2 * length
   if isHigh and src[i] >= p
    isFound := false
   if not isHigh and src[i] <= p
    isFound := false
  if isFound and length * 2 <= bar_index
   [bar_index[length], p]
  else
   [int(na), float(na)]

[iH, pH] = pivots(high, floor(depth / 2), true)
[iL, pL] = pivots(low, floor(depth / 2), false)



// 変化率を算出する関数
calc_dev(base_price, price) =>
 100 * (price - base_price) / base_price


// 直近のpivotの情報を格納
var line lineLast = na  // lineのid (実際はidではなく識別している何か)
var float pLast = 0   // price
var bool isHighLast = true // High か Low か
var int linesCount = 0



//**
//* Lineを描画する関数
//*
pivotFound(dev, isHigh, index, price) =>
 if linesCount == 0
  [line(na), isHigh, true]
 else
  if abs(dev) >= dev_threshold
   [line(na), isHigh, true]
  else
   [line(na), isHighLast, false]



//**
//* 描画処理
//*
if not na(pH) and not na(pL) and pH == pL
 dev1 = calc_dev(pLast, pH)
 [id2, isHigh2, isNew2] = pivotFound(dev1, true, iH, pH)
 if isNew2
  linesCount := linesCount + 1
  isHighLast := isHigh2
  pLast := pH
 dev2 = calc_dev(pLast, pL)
 [id1, isHigh1, isNew1] = pivotFound(dev2, false, iL, pL)
 if isNew1
  linesCount := linesCount + 1
  isHighLast := isHigh1
  pLast := pL
else
 if not na(pH)
  dev1 = calc_dev(pLast, pH)
  [id, isHigh, isNew] = pivotFound(dev1, true, iH, pH)
  if isNew
   linesCount := linesCount + 1
   isHighLast := isHigh
   pLast := pH
 else
  if not na(pL)
   dev2 = calc_dev(pLast, pL)
   [id, isHigh, isNew] = pivotFound(dev2, false, iL, pL)
   if isNew
    linesCount := linesCount + 1
    isHighLast := isHigh
    pLast := pL



// 追加箇所

zigzag = pLast[1]!=pLast ? pLast : na
plot( zigzag ,color=color.red ,offset=-1*floor(depth / 2) )
plot( isHighLast ? 1 : 0 )

// ジグザグが発生したときのジグザグの値を取得
x = valuewhen(zigzag, zigzag, 4)
a = valuewhen(zigzag, zigzag, 3)
b = valuewhen(zigzag, zigzag, 2) //3つ前
c = valuewhen(zigzag, zigzag, 1) //前々回
d = valuewhen(zigzag, zigzag, 0) //前回

fib_range = abs(d-c)
fib_0000 = not showFib0000 ? na : d > c ? d-(fib_range*0.000):d+(fib_range*0.000)
fib_0236 = not showFib0236 ? na : d > c ? d-(fib_range*0.236):d+(fib_range*0.236)
fib_0382 = not showFib0382 ? na : d > c ? d-(fib_range*0.382):d+(fib_range*0.382)
fib_0500 = not showFib0500 ? na : d > c ? d-(fib_range*0.500):d+(fib_range*0.500)
fib_0618 = not showFib0618 ? na : d > c ? d-(fib_range*0.618):d+(fib_range*0.618)
fib_0764 = not showFib0764 ? na : d > c ? d-(fib_range*0.764):d+(fib_range*0.764)
fib_1000 = not showFib1000 ? na : d > c ? d-(fib_range*1.000):d+(fib_range*1.000)
plot(title='Fib 0.000' ,series=fib_0000 ,offset=-1*floor(depth/2) ,color=fib_0000 != fib_0000[1] ? na : color.black)
plot(title='Fib 0.236' ,series=fib_0236 ,offset=-1*floor(depth/2) ,color=fib_0236 != fib_0236[1] ? na : color.red)
plot(title='Fib 0.382' ,series=fib_0382 ,offset=-1*floor(depth/2) ,color=fib_0382 != fib_0382[1] ? na : color.olive)
plot(title='Fib 0.500' ,series=fib_0500 ,offset=-1*floor(depth/2) ,color=fib_0500 != fib_0500[1] ? na : color.lime)
plot(title='Fib 0.618' ,series=fib_0618 ,offset=-1*floor(depth/2) ,color=fib_0618 != fib_0618[1] ? na : color.teal)
plot(title='Fib 0.764' ,series=fib_0764 ,offset=-1*floor(depth/2) ,color=fib_0764 != fib_0764[1] ? na : color.blue)
plot(title='Fib 1.000' ,series=fib_1000 ,offset=-1*floor(depth/2) ,color=fib_1000 != fib_1000[1] ? na : color.black)
=====
Nota
次の投稿
zigzagストラテジーをつくる⑤|インジケーターを改良する2
Beyond Technical Analysispinescript

小次郎講師公式インジケーターのお申込
bit.ly/2vdSV4Q

小次郎講師のLINE@
bit.ly/2VZQFu3

小次郎講師のチャート情報局
bit.ly/2GvLAEp
Juga pada: