以前みつけた高勝率のzigzagストラテジーを再現する試みです。
とりあえず、フィボナッチの追加を行ってみました。
他にも少し手を加えています。
・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)
=====
とりあえず、フィボナッチの追加を行ってみました。
他にも少し手を加えています。
・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)
=====
Comentarios:
次の投稿