VWAPストラテジーをつくる①|VWAPの途転戦略依然、裏ではZigZagの研究中ですが、
こちらではシンプルなVWAPのストラテジーを試してみたいと思います。
今、考えている基本ロジックは以下のような感じです。
・VWAPとcloseのクロスで途転
・1日の終わりに利確
ここで問題になるのは、
VWAPとcloseの乖離が大きいときです。
クロスしたからといって、
乖離が大きい状態でエントリーしてしまうと
反対に動いたときの損切りが大きくなってしまいます。
・乖離が大きいときはお休みする
・乖離が出やすい時間帯を避ける
などの回避策が必要かなと考えています。
何にしてもまずは形にして、
少しずつ改善していきたいと思います。
Pinescript
ZigZagストラテジーをつくる⑪|ロジックを精査するここからは、TradingViewでは投稿できない範囲の話になる(TradingViewでは5分足の投稿を掲載できず、検証も2ヶ月分だけです)ので、テキストのみになります。ご了承くださいm(_ _)m
さて、TradingViewで作成したロジックをPythonで精査しています。
TradingViewはロジックを作成するのには最適です。
チャートとの連携がスムーズで動作も早く、プログラムも簡易なため、素早くロジックを試すことができます。
しかし、5分足の検証は直近の2ヶ月程度しか(データ量を考えれば当然ですが)行なうことができません。なので、精査していくにはPythonやMT4などを使うしかないのですね。
で、精査してみて分かったことがいくつかあります。
まず、depth:6 くらいが良いと思っていたZigZagの計算値ですが、5分足だと10以上の方が圧倒的に収益が良いです。
なんともすごい偶然ですが、depth:6が良い成績になるのは今の期間がたまたま "そう" なだけで、長期的には10以上の方が収益が良いし安定しています。
あとは、フィルターの選定ですが、
・一目均衡表の現状分析
・ボリンジャーバンドの%Bチャート
あたりを組み合わせると勝率がかなり改善します。
でも、ここには落とし穴があって、勝率が改善しても取引回数が激減するので収益も悪化してしまいます。
収益は、期待値 ✕ 取引回数 なので、期待値(勝率)が改善しても取引回数が少なくなってしまってはまったく意味がないんですね。
今のところ、フィルターはなしで、TradingViewで実装したロジックそのままが良いかなと考えています。(2005年からの検証でマイナスの年が一度もない、素晴らしいロジックです!)
ここまでくれば、検証用のPythonのコードをBOT用のコードに移植して、テストして、実戦に投入するだけです。実戦に投入すると、スリッページなどの検証では再現が難しい問題が出てくるので、注意しながら監視していくことが必要です。
とくにご質問もなさそうなので、明日、「なぜ5分足にしたか」を解説して、このシリーズは終わりにしたいと思います。
ZigZagストラテジーをつくる⑫|なぜ5分足かZigZagストラテジーは初めて挑戦したロジックで、
確認したい(検証したい)ことが尽きません。
ロジックの精査に満足したところで
自動売買の実装に取り掛かろうと思いますが、
もうちょっと時間がかかそうです。
さて。
今日は、
「足種をなぜ5分足にしようと考えたのか」
について、少しだけ書いてみようと思います。
まず、私は、裁量トレードも自動売買も、
どちらも良いものであると考えているタイプの人間です。
どちらも、ちゃんと利益を出している人がいますし、
得意な方をそれなりに取り組めば成果が出ると考えています。
で、この2つのトレード方法ですが、
私の中での位置づけは、ざっくり次のような感じです。
< 裁量トレード >
1.チャートは芸術
2.図で判断する能力はPCに負けない
3.チャートを総合的に判断する能力はPCに負けない
4.②③により、優位性を捉える能力はPCよりも高い
< 自動売買 >
1.数字を扱うのが得意(記録も得意)
2.簡単な計算を高回転で行なう
3.ミリ秒単位の判断もできる
4.監視は必要だけど一度プログラムを組んでしまえばトレードの工数が少なくて済む
人間は優位性を捉える能力が非常に高いと思います。
とくにRR比を伸ばすような優位性です。
これは人間の総合判断の為せる技だと思っています。
一方で、PCは繰り返すことが得意です。
頑張ればミリ秒単位の判断もできます。
これは取引回数を増やすのに最適です。
収益は、「期待値(優位性)✕ 取引回数」ですから、
人間もPCも、それぞれ得意な土俵で勝負すれば良いんですね。
という長い前置きの上で、
私が "自動売買+5分足" にしたのは、
個人的な話で「少し時間を作りたかったから」です。
仕事とか、勉強とか、仕事とか、インプットに、アウトプットに、
ちょっと裁量トレードの時間を削りたくなったんですね。それで自動売買。
そして、前述の通りなんですけど、
自動売買をするなら "取引回数が多い方が有利" なんです。
その取引回数を増やすのには、
足種を短くしていくのが一番なんですね。
でも、
ここでちょっとだけ注意が必要です。
足種は短くすれば良いっていうものでもなくて、
短くすればするほど別の問題が出てきます。
1.高回転の自動売買には計算や通信のスペックが求められる
2.足種が短いほど1トレードのリターンが少なくなりコスト(スプレッド)が重くなる
3.取引回数の分、コストが積み上がる
4.スリッページの影響が強くなる
例えば、こんな問題があります。
このあたりを踏まえて、
「1分足は厳しいな~」というのが正直なところで、
だから5分足での開発にしようと考えたわけですね。
5分足のトレードなら、
1.売買判断にかかる時間が1秒→10秒になっても、大きな問題はない(サーバーやPCのスペックにお金をかけたくない)
2.コストのペイもさほど難しくなさそう(検証が必要)
こんな感じなんじゃないかなと判断したわけです。
実は、すでに4時間足のロジックをひとつ回しているのですが、
取引回数がすこし物足りなかったというのもあったりします。
「ZigZagストラテジーを5分足で開発しよう!」
と思い立ったのには、
こんな感じの思考がありました。
zigzagストラテジーをつくる⑩|カーブフィッティング(過剰最適化)についてさて、バックテストのチューニングというと
気になるのはカーブフィッティング(過剰最適化)ですね。
過剰に最適化してしまったバックテストは、
本番で再現することができません。
バックテストでは良い結果だったのに、
本番ではいつまでたってもマイナスのまま
なんていうことは、
割とよくある話です。
なぜそんなことが起こるかというと、
・その銘柄
・その足種
・その期間(特有の値動き)
に最適化しているから
なのですね。
なので、
銘柄が変わる、足種が変わる、期間が変わると
途端にワークしなくなってしまいます。
これがカーブフィッティング(過剰最適化)です。
では、どうすれば
カーブフィッティングを防ぐことができるのでしょうか?
答えは意外とシンプルで、
・あらゆる銘柄でワークする
・あらゆる足種でワークする
・あらゆる期間でワークする
これが満たせれば、
カーブフィッティングに陥っていないと言えます。
しかし、ここからが少し難しくて、
問題は上の3つをすべて満たす手法なんて存在しない(であろう)
ということなんですね。
ということは、どこか妥協しながら
丁度良いポイントを探る必要があります。
たとえば、ドル円、しかも5分足に、
固有のクセがあると仮定します。
「10年以上変わっていないようなクセ」です。
それは、
「過去10年間あらゆる期間のドル円5分足でワークした優位性」
と言い換えることができます。
こういうものを見つけることができれば、それは、
・ドル円でしかワークしない
・5分足でしかワークしない
・あらゆる期間でワークする(かもしれない)
ということですね。
これが "丁度良いポイント" なんだろうなと
わりと最近は妄想していたりします。
ポンドのクセってありますよね?
他の通貨にもクセっぽい動きってあると思います。
あと、「トレンドフォロー」も値動きのクセを指していると思うんですね。
「どんな銘柄でもいつか大きな動きが出る。それを狙おうぜ」
というのがトレンドフォローですから、
それって、
「人間の心理とか経済活動にもとづいた "値動きのクセ" 」
を指していると思うんですね。
こういうものを探して探して見つけ出して、再現して、
優位性として狙っていくことが必要なんだろうな
と考えていたりします。
zigzagストラテジーをつくる⑨|チューニング前回までで、ストラテジーはほぼ完成です。
ここからはチューニングを行っていきます。
カーブフィッティングに注意しながら、
良い設定を探していく作業です。
実際にドル円の30分足でチューニングしてみたので、
今回は、その設定値を共有したいと思います。
/////////////////
ドル円 30分足
/////////////////
勝率:74.67%
RR比:0.54
取引回数:150
純損益:+710.1%
※2019年1月からの検証
※スプレッドを0.004%(4銭)として検証
変数は以下のように設定しました。
/////////////////
ZigZag
/////////////////
偏差(%):0.1
深さ:6
深さは「6」が最適だと思います。
この設定値によってPivotの検出に必要な足の数が変わりますので、多ければ多いほど検知が遅くなります。かと言って、少なければ不要なPivotが多く検出されてしまいます。
偏差は、銘柄と足種に応じて若干の調整が必要です。
基本は「0」として、描画されるZigZagと検証結果をみながら調節します。
/////////////////
資金管理
/////////////////
Percent Of Unit Value:0.1
Lot:1
Reverge:50
ユニットはそのときの残高の10%としました。
これは、勝率重視で安定性の高い手法であることから少し大きめに設定しています。
LotとRevergeは取引会社のものを入力すれば良いです。
/////////////////
トレーディング
/////////////////
Entry Window:0.236
TP (Take Profit):0.618
SL (Stop Loss):-0.618
これは、成績を見ながら調整をします。
5分足だとTPが0.5の方が良かったり
30分足だとTPが0.5ではまったくダメだったりするので、
銘柄と足種を変更すると調整が必要です。
今のところ、
割と良いストラテジーができたかなと思っています。
実戦に投入するには、
・細かなところをPythonで精査して
・Pythonに書き直して
・テストを経て
と、もうすこしやることがあります。
このあたりは、この場での共有は難しいので、
次回以降は、注意点などの私見をすこしだけお話したいと思います。
とりあえず、次回はカーブフィッティングについて解説してみます。
他にも聞いてみたいことなど、
ご要望があればコメントをいただけると助かります。
できる範囲でお答えしたいと思いますm(_ _)m
zigzagストラテジーをつくる⑧|ストラテジーを作成する3今日は、以下の機能を実装してみました。
①.損切りの損失を資金のN%とする取引量を算出
②.レバレッジを考慮した取引量を算出
③.②を上限として①の取引量でトレードする
まず、①の算出ですが、
このストラテジーは損切り幅が明確なので、
以下の計算式で算出することができます。
/////////////////
// 損切り幅を算出
range = abs( close - target01_sl )
//「1トレードに当てる資金 / 損切り幅」で取引量を算出
// 同時に、round( 取引量 /lot ) * lot で取引単位(1000通貨等)に四捨五入してる
amount = round( unit_value / range / lot ) * lot
/////////////////
次に②の算出です。
これは、どういうことをするかというと、
「あるレバレッジで取引できる最大の取引量を算出する」
ということです。
これは、以下の計算式で算出します。
/////////////////
max_amount = floor( ( balance - unit_value * 1.1 ) / ( close / reverge ) )
/////////////////
まず、「close / reverage」で1通貨あたりの証拠金を求めます。
(ドル円が100円でレバ25倍なら、1通貨の証拠金は4円)
あとは、現在の残高で何通貨取引できるかを算出すれば良いので、
「balance / 1通貨の証拠金」とすれば良いですね。
その他の細かな調整として、小数点以下を切り捨てたり(floor)、
そのトレードが損失だったとしても強制ロスカットにならないように
「balance - unit_value * 1.1」を算出したりしています。
5分足でのストラテジーを目指しているので、
このあたりはできるだけリアルにしていく必要があります。
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
/////////////////
//@version=4
strategy( title='ZigZag PA Strategy 勉強中', shorttitle='S', overlay=true, pyramiding=0, initial_capital=100000 )
dev_threshold = input( title="Deviation (%)", type=input.float, defval=0, minval=0, maxval=100 )
depth = input( title="Depth", type=input.integer, defval=6, minval=1, maxval=10 )
//**
//* 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
var bool isNewPivot = false
// pivotを確認する関数
pivotFound(dev, isHigh, 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, pH)
if isNew2
linesCount := linesCount + 1
isHighLast := isHigh2
isNewPivot := true
pLast := pH
dev2 = calc_dev(pLast, pL)
[id1, isHigh1, isNew1] = pivotFound(dev2, false, pL)
if isNew1
linesCount := linesCount + 1
isHighLast := isHigh1
isNewPivot := true
pLast := pL
else
if not na(pH)
dev1 = calc_dev(pLast, pH)
[id, isHigh, isNew] = pivotFound(dev1, true, pH)
if isNew
linesCount := linesCount + 1
isHighLast := isHigh
isNewPivot := true
pLast := pH
else
if not na(pL)
dev2 = calc_dev(pLast, pL)
[id, isHigh, isNew] = pivotFound(dev2, false, pL)
if isNew
linesCount := linesCount + 1
isHighLast := isHigh
isNewPivot := true
pLast := pL
// 追加箇所
zigzag = pLast[1]!=pLast ? pLast : na
plot( zigzag ,color=color.red ,linewidth=3 ,title='zigzag' ,offset=-1*floor(depth / 2) )
bgcolor( isHighLast ? color.gray : color.white ,offset=-1*floor(depth / 2) )
// ジグザグが発生したときのジグザグの値を取得
float x = na
float a = na
float b = na
float c = na
float d = na
exist_zigzag = not na( zigzag ) and not isHighLast==isHighLast[1]
repaint = not na( zigzag ) and isHighLast==isHighLast[1]
x := exist_zigzag ? a[1] : x[1]
a := exist_zigzag ? b[1] : a[1]
b := exist_zigzag ? c[1] : b[1]
c := exist_zigzag ? d[1] : c[1]
d := exist_zigzag ? zigzag
: not repaint ? d[1]
: isHighLast and pLast > pLast[1] ? zigzag
: not isHighLast and pLast < pLast[1] ? zigzag
: d[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 )
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 ,color=fib_0000 != fib_0000[1] ? na : color.black ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.236', series=fib_0236 ,color=fib_0236 != fib_0236[1] ? na : color.red ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.382', series=fib_0382 ,color=fib_0382 != fib_0382[1] ? na : color.olive ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.500', series=fib_0500 ,color=fib_0500 != fib_0500[1] ? na : color.lime ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.618', series=fib_0618 ,color=fib_0618 != fib_0618[1] ? na : color.teal ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.764', series=fib_0764 ,color=fib_0764 != fib_0764[1] ? na : color.blue ,offset=-1*floor(depth / 2) )
plot( title='Fib 1.000', series=fib_1000 ,color=fib_1000 != fib_1000[1] ? na : color.black ,offset=-1*floor(depth / 2) )
xab = ( abs( b - a ) / abs( x - a ) )
xad = ( abs( a - d ) / abs( x - a ) )
abc = ( abs( b - c ) / abs( a - b ) )
bcd = ( abs( c - d ) / abs( b - c ) )
// 5つの点の比率からパターンを判断する関数
isBat(_mode)=>
_xab = xab >= 0.382 and xab <= 0.5
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad <= 0.618 and xad <= 1.000 // 0.886
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiBat(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618
_abc = abc >= 1.000 and abc <= 2.618 // 1.13 --> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 2.0 --> 2.618
_xad = xad >= 0.886 and xad <= 1.000 // 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAltBat(_mode)=>
_xab = xab <= 0.382
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.0 and bcd <= 3.618
_xad = xad <= 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isButterfly(_mode)=>
_xab = xab <= 0.786
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad >= 1.27 and xad <= 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiButterfly(_mode)=>
_xab = xab >= 0.236 and xab <= 0.886 // 0.382 - 0.618
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 - 2.618
_bcd = bcd >= 1.000 and bcd <= 1.382 // 1.27
_xad = xad >= 0.500 and xad <= 0.886 // 0.618 - 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isABCD(_mode)=>
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_abc and _bcd and (_mode == 1 ? d < c : d > c)
isGartley(_mode)=>
_xab = xab >= 0.5 and xab <= 0.618 // 0.618
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_xad = xad >= 0.75 and xad <= 0.875 // 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiGartley(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618 -> 0.786
_abc = abc >= 1.000 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.500 and bcd <= 5.000 // 1.618
_xad = xad >= 1.000 and xad <= 5.000 // 1.272
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isCrab(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.886
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.000 and bcd <= 5.000 // 3.618
_xad = xad >= 1.382 and xad <= 5.000 // 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiCrab(_mode)=>
_xab = xab >= 0.250 and xab <= 0.500 // 0.276 -> 0.446
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 1.618 -> 2.618
_xad = xad >= 0.500 and xad <= 0.750 // 0.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isShark(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.5 --> 0.886
_abc = abc >= 1.130 and abc <= 1.618 //
_bcd = bcd >= 1.270 and bcd <= 2.240 //
_xad = xad >= 0.886 and xad <= 1.130 // 0.886 --> 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiShark(_mode)=>
_xab = xab >= 0.382 and xab <= 0.875 // 0.446 --> 0.618
_abc = abc >= 0.500 and abc <= 1.000 // 0.618 --> 0.886
_bcd = bcd >= 1.250 and bcd <= 2.618 // 1.618 --> 2.618
_xad = xad >= 0.500 and xad <= 1.250 // 1.130 --> 1.130
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
is5o(_mode)=>
_xab = xab >= 1.13 and xab <= 1.618
_abc = abc >= 1.618 and abc <= 2.24
_bcd = bcd >= 0.5 and bcd <= 0.625 // 0.5
_xad = xad >= 0.0 and xad <= 0.236 // negative?
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isWolf(_mode)=>
_xab = xab >= 1.27 and xab <= 1.618
_abc = abc >= 0 and abc <= 5
_bcd = bcd >= 1.27 and bcd <= 1.618
_xad = xad >= 0.0 and xad <= 5
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isHnS(_mode)=>
_xab = xab >= 2.0 and xab <= 10
_abc = abc >= 0.90 and abc <= 1.1
_bcd = bcd >= 0.236 and bcd <= 0.88
_xad = xad >= 0.90 and xad <= 1.1
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isConTria(_mode)=>
_xab = xab >= 0.382 and xab <= 0.618
_abc = abc >= 0.382 and abc <= 0.618
_bcd = bcd >= 0.382 and bcd <= 0.618
_xad = xad >= 0.236 and xad <= 0.764
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isExpTria(_mode)=>
_xab = xab >= 1.236 and xab <= 1.618
_abc = abc >= 1.000 and abc <= 1.618
_bcd = bcd >= 1.236 and bcd <= 2.000
_xad = xad >= 2.000 and xad <= 2.236
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
// 売りパターンが出現したところに印を表示
plotshape( not showPatterns ? na : isABCD(-1) and not isABCD(-1)[1], text=" AB=CD", title='Bear ABCD', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isBat(-1) and not isBat(-1)[1], text="Bat", title='Bear Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isAntiBat(-1) and not isAntiBat(-1)[1], text="Anti Bat", title='Bear Anti Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isAltBat(-1) and not isAltBat(-1)[1], text="Alt Bat", title='Bear Alt Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isButterfly(-1) and not isButterfly(-1)[1], text="Butterfly", title='Bear Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiButterfly(-1) and not isAntiButterfly(-1)[1], text="Anti Butterfly", title='Bear Anti Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isGartley(-1) and not isGartley(-1)[1], text="Gartley", title='Bear Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiGartley(-1) and not isAntiGartley(-1)[1], text="Anti Gartley", title='Bear Anti Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isCrab(-1) and not isCrab(-1)[1], text="Crab", title='Bear Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiCrab(-1) and not isAntiCrab(-1)[1], text="Anti Crab", title='Bear Anti Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isShark(-1) and not isShark(-1)[1], text="Shark", title='Bear Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiShark(-1) and not isAntiShark(-1)[1], text="Anti Shark", title='Bear Anti Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : is5o(-1) and not is5o(-1)[1], text="5-O", title='Bear 5-O', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isWolf(-1) and not isWolf(-1)[1], text="Wolf Wave", title='Bear Wolf Wave', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isHnS(-1) and not isHnS(-1)[1], text="Head and Shoulders", title='Bear Head and Shoulders', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isConTria(-1) and not isConTria(-1)[1], text="Contracting Triangle", title='Bear Contracting triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isExpTria(-1) and not isExpTria(-1)[1], text="Expanding Triangle", title='Bear Expanding Triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
// 買いパターンが出現したところに印を表示
plotshape( not showPatterns ? na : isABCD(1) and not isABCD(1)[1], text="AB=CD ", title='Bull ABCD', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isBat(1) and not isBat(1)[1], text="Bat", title='Bull Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiBat(1) and not isAntiBat(1)[1], text="Anti Bat", title='Bull Anti Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAltBat(1) and not isAltBat(1)[1], text="Alt Bat", title='Bull Alt Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isButterfly(1) and not isButterfly(1)[1], text="Butterfly", title='Bull Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiButterfly(1) and not isAntiButterfly(1)[1], text="Anti Butterfly", title='Bull Anti Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isGartley(1) and not isGartley(1)[1], text="Gartley", title='Bull Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiGartley(1) and not isAntiGartley(1)[1], text="Anti Gartley", title='Bull Anti Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isCrab(1) and not isCrab(1)[1], text="Crab", title='Bull Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiCrab(1) and not isAntiCrab(1)[1], text="Anti Crab", title='Bull Anti Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isShark(1) and not isShark(1)[1], text="Shark", title='Bull Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiShark(1) and not isAntiShark(1)[1], text="Anti Shark", title='Bull Anti Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : is5o(1) and not is5o(1)[1], text="5-O", title='Bull 5-O', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isWolf(1) and not isWolf(1)[1], text="Wolf Wave", title='Bull Wolf Wave', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isHnS(1) and not isHnS(1)[1], text="Head and Shoulders", title='Bull Head and Shoulders', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isConTria(1) and not isConTria(1)[1], text="Contracting Triangle", title='Bull Contracting Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isExpTria(1) and not isExpTria(1)[1], text="Expanding Triangle", title='Bull Expanding Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
//
// 売買のロジック
////
fromY = input( 1900 ,type=input.integer ,minval=1900 ,title="test start year" )
fromM = input( 1 ,type=input.integer ,minval=1 ,maxval=12 ,title="test start month" )
fromD = input( 1 ,type=input.integer ,minval=1 ,maxval=31 ,title="test start date" )
endY = input( 3000 ,type=input.integer ,minval=1900 ,title="test end year" )
endM = input( 1 ,type=input.integer ,minval=1 ,maxval=12 ,title="test end month" )
endD = input( 1 ,type=input.integer ,minval=1 ,maxval=31 ,title="test end date" )
isWork = timestamp( fromY ,fromM ,fromD ,00 ,00 ) <= time and time < timestamp( endY ,endM ,endD ,00 ,00 )
cash_bool = input( true ,title="amount management" )
Unit_pct = input( 0.1 ,title="percent of unit value" )
lot = input( 1 ,title="lot" ,minval=1 )
reverge = input( 50 ,title="Reverge" ,minval=1 )
atr = ema( tr ,20 )[1]
balance = strategy.initial_capital + strategy.netprofit
unit_value = balance * Unit_pct
float max_amount = na
float amount = na
//「fib_rangeに対する指定された比率の幅」を返す関数
f_last_fib( _rate ) => d > c ? d - ( fib_range * _rate ) : d + ( fib_range * _rate )
target01_ew_rate = input( defval=0.236 ,title='Target Fib. Rate to use for Entry Window:', type=input.float )
target01_tp_rate = input( defval=0.5 ,title='Target Fib. Rate to use for TP:', type=input.float )
target01_sl_rate = input( defval=-0.618 ,title='Target Fib. Rate to use for SL:', type=input.float )
target01_ew = f_last_fib( target01_ew_rate )
target01_sl = f_last_fib( target01_sl_rate )
buy_patterns_00 = isABCD(1) or isBat(1) or isAltBat(1) or isButterfly(1) or isGartley(1) or isCrab(1) or isShark(1) or is5o(1) or isWolf(1) or isHnS(1) or isConTria(1) or isExpTria(1)
buy_patterns_01 = isAntiBat(1) or isAntiButterfly(1) or isAntiGartley(1) or isAntiCrab(1) or isAntiShark(1)
sel_patterns_00 = isABCD(-1) or isBat(-1) or isAltBat(-1) or isButterfly(-1) or isGartley(-1) or isCrab(-1) or isShark(-1) or is5o(-1) or isWolf(-1) or isHnS(-1) or isConTria(-1) or isExpTria(-1)
sel_patterns_01 = isAntiBat(-1) or isAntiButterfly(-1) or isAntiGartley(-1) or isAntiCrab(-1) or isAntiShark(-1)
range_rate = input( title='Rate to use for ATR filter', type=input.float, defval=1 )
range = abs( close - target01_sl )
if isWork and isNewPivot and range > atr * range_rate
max_amount := floor( ( balance - unit_value * 1.1 ) / ( close / reverge ) )
amount := cash_bool ? round( unit_value / range / lot ) * lot : na
amount := amount > max_amount ? max_amount : amount
if ( buy_patterns_00 or buy_patterns_01 ) and close <= target01_ew
strategy.entry( 'L1_target01', long=strategy.long, qty=amount, comment='L1' )
strategy.exit( "exit-L1" ,"L1_target01" ,stop=target01_sl ,limit=f_last_fib( target01_tp_rate ) ,comment="exit-L1" )
isNewPivot := false
if ( sel_patterns_00 or sel_patterns_01 ) and close >= target01_ew
strategy.entry( 'S1_target01', long=strategy.short, qty=amount, comment='S1' )
strategy.exit( "exit-S1" ,"S1_target01" ,stop=target01_sl ,limit=f_last_fib( target01_tp_rate ) ,comment="exit-S1" )
isNewPivot := false
/////////////////
教育 zigzagストラテジーをつくる⑦|ストラテジーを作成する2今回は、以下の機能を実装しました。
・日付を指定してテスト期間を制限する機能
・あまりにも小さなZigZagである場合のエントリーを制限する機能
どちらも設定画面から調整することができます。
小さなZigZagの判断にはATRを用いました。
初期値は「1」としていますが、これは、
「損切りまでにとるリスクが
ATRの1倍よりも小さい場合に
エントリーをしない」
ということにしています。
0.5~1くらいがちょうど良いと感じています。
来週月曜日は、
・損切りの損失を資金の1%とする
・レバレッジを考慮した取引量
この2点を実装していきたいと思います。
コーディングにあまり時間を割けないので
進みが遅いですが、気長にお付き合いくださいm(_ _)m
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
=====
//@version=4
strategy( title='ZigZag PA Strategy 勉強中', shorttitle='S', overlay=true, pyramiding=0, initial_capital=100000 )
dev_threshold = input( title="Deviation (%)", type=input.float, defval=0, minval=0, maxval=100 )
depth = input( title="Depth", type=input.integer, defval=6, minval=1, maxval=10 )
//**
//* 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
var bool isNewPivot = false
// pivotを確認する関数
pivotFound(dev, isHigh, 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, pH)
if isNew2
linesCount := linesCount + 1
isHighLast := isHigh2
isNewPivot := true
pLast := pH
dev2 = calc_dev(pLast, pL)
[id1, isHigh1, isNew1] = pivotFound(dev2, false, pL)
if isNew1
linesCount := linesCount + 1
isHighLast := isHigh1
isNewPivot := true
pLast := pL
else
if not na(pH)
dev1 = calc_dev(pLast, pH)
[id, isHigh, isNew] = pivotFound(dev1, true, pH)
if isNew
linesCount := linesCount + 1
isHighLast := isHigh
isNewPivot := true
pLast := pH
else
if not na(pL)
dev2 = calc_dev(pLast, pL)
[id, isHigh, isNew] = pivotFound(dev2, false, pL)
if isNew
linesCount := linesCount + 1
isHighLast := isHigh
isNewPivot := true
pLast := pL
// 追加箇所
zigzag = pLast[1]!=pLast ? pLast : na
plot( zigzag ,color=color.red ,linewidth=3 ,title='zigzag' ,offset=-1*floor(depth / 2) )
bgcolor( isHighLast ? color.gray : color.white ,offset=-1*floor(depth / 2) )
// ジグザグが発生したときのジグザグの値を取得
float x = na
float a = na
float b = na
float c = na
float d = na
exist_zigzag = not na( zigzag ) and not isHighLast==isHighLast[1]
repaint = not na( zigzag ) and isHighLast==isHighLast[1]
x := exist_zigzag ? a[1] : x[1]
a := exist_zigzag ? b[1] : a[1]
b := exist_zigzag ? c[1] : b[1]
c := exist_zigzag ? d[1] : c[1]
d := exist_zigzag ? zigzag
: not repaint ? d[1]
: isHighLast and pLast > pLast[1] ? zigzag
: not isHighLast and pLast < pLast[1] ? zigzag
: d[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 )
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 ,color=fib_0000 != fib_0000[1] ? na : color.black ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.236', series=fib_0236 ,color=fib_0236 != fib_0236[1] ? na : color.red ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.382', series=fib_0382 ,color=fib_0382 != fib_0382[1] ? na : color.olive ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.500', series=fib_0500 ,color=fib_0500 != fib_0500[1] ? na : color.lime ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.618', series=fib_0618 ,color=fib_0618 != fib_0618[1] ? na : color.teal ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.764', series=fib_0764 ,color=fib_0764 != fib_0764[1] ? na : color.blue ,offset=-1*floor(depth / 2) )
plot( title='Fib 1.000', series=fib_1000 ,color=fib_1000 != fib_1000[1] ? na : color.black ,offset=-1*floor(depth / 2) )
xab = ( abs( b - a ) / abs( x - a ) )
xad = ( abs( a - d ) / abs( x - a ) )
abc = ( abs( b - c ) / abs( a - b ) )
bcd = ( abs( c - d ) / abs( b - c ) )
// 5つの点の比率からパターンを判断する関数
isBat(_mode)=>
_xab = xab >= 0.382 and xab <= 0.5
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad <= 0.618 and xad <= 1.000 // 0.886
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiBat(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618
_abc = abc >= 1.000 and abc <= 2.618 // 1.13 --> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 2.0 --> 2.618
_xad = xad >= 0.886 and xad <= 1.000 // 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAltBat(_mode)=>
_xab = xab <= 0.382
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.0 and bcd <= 3.618
_xad = xad <= 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isButterfly(_mode)=>
_xab = xab <= 0.786
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad >= 1.27 and xad <= 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiButterfly(_mode)=>
_xab = xab >= 0.236 and xab <= 0.886 // 0.382 - 0.618
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 - 2.618
_bcd = bcd >= 1.000 and bcd <= 1.382 // 1.27
_xad = xad >= 0.500 and xad <= 0.886 // 0.618 - 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isABCD(_mode)=>
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_abc and _bcd and (_mode == 1 ? d < c : d > c)
isGartley(_mode)=>
_xab = xab >= 0.5 and xab <= 0.618 // 0.618
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_xad = xad >= 0.75 and xad <= 0.875 // 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiGartley(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618 -> 0.786
_abc = abc >= 1.000 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.500 and bcd <= 5.000 // 1.618
_xad = xad >= 1.000 and xad <= 5.000 // 1.272
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isCrab(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.886
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.000 and bcd <= 5.000 // 3.618
_xad = xad >= 1.382 and xad <= 5.000 // 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiCrab(_mode)=>
_xab = xab >= 0.250 and xab <= 0.500 // 0.276 -> 0.446
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 1.618 -> 2.618
_xad = xad >= 0.500 and xad <= 0.750 // 0.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isShark(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.5 --> 0.886
_abc = abc >= 1.130 and abc <= 1.618 //
_bcd = bcd >= 1.270 and bcd <= 2.240 //
_xad = xad >= 0.886 and xad <= 1.130 // 0.886 --> 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiShark(_mode)=>
_xab = xab >= 0.382 and xab <= 0.875 // 0.446 --> 0.618
_abc = abc >= 0.500 and abc <= 1.000 // 0.618 --> 0.886
_bcd = bcd >= 1.250 and bcd <= 2.618 // 1.618 --> 2.618
_xad = xad >= 0.500 and xad <= 1.250 // 1.130 --> 1.130
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
is5o(_mode)=>
_xab = xab >= 1.13 and xab <= 1.618
_abc = abc >= 1.618 and abc <= 2.24
_bcd = bcd >= 0.5 and bcd <= 0.625 // 0.5
_xad = xad >= 0.0 and xad <= 0.236 // negative?
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isWolf(_mode)=>
_xab = xab >= 1.27 and xab <= 1.618
_abc = abc >= 0 and abc <= 5
_bcd = bcd >= 1.27 and bcd <= 1.618
_xad = xad >= 0.0 and xad <= 5
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isHnS(_mode)=>
_xab = xab >= 2.0 and xab <= 10
_abc = abc >= 0.90 and abc <= 1.1
_bcd = bcd >= 0.236 and bcd <= 0.88
_xad = xad >= 0.90 and xad <= 1.1
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isConTria(_mode)=>
_xab = xab >= 0.382 and xab <= 0.618
_abc = abc >= 0.382 and abc <= 0.618
_bcd = bcd >= 0.382 and bcd <= 0.618
_xad = xad >= 0.236 and xad <= 0.764
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isExpTria(_mode)=>
_xab = xab >= 1.236 and xab <= 1.618
_abc = abc >= 1.000 and abc <= 1.618
_bcd = bcd >= 1.236 and bcd <= 2.000
_xad = xad >= 2.000 and xad <= 2.236
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
// 売りパターンが出現したところに印を表示
plotshape( not showPatterns ? na : isABCD(-1) and not isABCD(-1)[1], text=" AB=CD", title='Bear ABCD', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isBat(-1) and not isBat(-1)[1], text="Bat", title='Bear Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isAntiBat(-1) and not isAntiBat(-1)[1], text="Anti Bat", title='Bear Anti Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isAltBat(-1) and not isAltBat(-1)[1], text="Alt Bat", title='Bear Alt Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isButterfly(-1) and not isButterfly(-1)[1], text="Butterfly", title='Bear Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiButterfly(-1) and not isAntiButterfly(-1)[1], text="Anti Butterfly", title='Bear Anti Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isGartley(-1) and not isGartley(-1)[1], text="Gartley", title='Bear Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiGartley(-1) and not isAntiGartley(-1)[1], text="Anti Gartley", title='Bear Anti Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isCrab(-1) and not isCrab(-1)[1], text="Crab", title='Bear Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiCrab(-1) and not isAntiCrab(-1)[1], text="Anti Crab", title='Bear Anti Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isShark(-1) and not isShark(-1)[1], text="Shark", title='Bear Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiShark(-1) and not isAntiShark(-1)[1], text="Anti Shark", title='Bear Anti Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : is5o(-1) and not is5o(-1)[1], text="5-O", title='Bear 5-O', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isWolf(-1) and not isWolf(-1)[1], text="Wolf Wave", title='Bear Wolf Wave', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isHnS(-1) and not isHnS(-1)[1], text="Head and Shoulders", title='Bear Head and Shoulders', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isConTria(-1) and not isConTria(-1)[1], text="Contracting Triangle", title='Bear Contracting triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isExpTria(-1) and not isExpTria(-1)[1], text="Expanding Triangle", title='Bear Expanding Triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
// 買いパターンが出現したところに印を表示
plotshape( not showPatterns ? na : isABCD(1) and not isABCD(1)[1], text="AB=CD ", title='Bull ABCD', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isBat(1) and not isBat(1)[1], text="Bat", title='Bull Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiBat(1) and not isAntiBat(1)[1], text="Anti Bat", title='Bull Anti Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAltBat(1) and not isAltBat(1)[1], text="Alt Bat", title='Bull Alt Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isButterfly(1) and not isButterfly(1)[1], text="Butterfly", title='Bull Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiButterfly(1) and not isAntiButterfly(1)[1], text="Anti Butterfly", title='Bull Anti Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isGartley(1) and not isGartley(1)[1], text="Gartley", title='Bull Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiGartley(1) and not isAntiGartley(1)[1], text="Anti Gartley", title='Bull Anti Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isCrab(1) and not isCrab(1)[1], text="Crab", title='Bull Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiCrab(1) and not isAntiCrab(1)[1], text="Anti Crab", title='Bull Anti Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isShark(1) and not isShark(1)[1], text="Shark", title='Bull Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiShark(1) and not isAntiShark(1)[1], text="Anti Shark", title='Bull Anti Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : is5o(1) and not is5o(1)[1], text="5-O", title='Bull 5-O', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isWolf(1) and not isWolf(1)[1], text="Wolf Wave", title='Bull Wolf Wave', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isHnS(1) and not isHnS(1)[1], text="Head and Shoulders", title='Bull Head and Shoulders', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isConTria(1) and not isConTria(1)[1], text="Contracting Triangle", title='Bull Contracting Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isExpTria(1) and not isExpTria(1)[1], text="Expanding Triangle", title='Bull Expanding Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
//
// 売買のロジック
////
fromY = input( 1900 ,type=input.integer ,minval=1900 ,title="test start year" )
fromM = input( 1 ,type=input.integer ,minval=1 ,maxval=12 ,title="test start month" )
fromD = input( 1 ,type=input.integer ,minval=1 ,maxval=31 ,title="test start date" )
endY = input( 3000 ,type=input.integer ,minval=1900 ,title="test end year" )
endM = input( 1 ,type=input.integer ,minval=1 ,maxval=12 ,title="test end month" )
endD = input( 1 ,type=input.integer ,minval=1 ,maxval=31 ,title="test end date" )
isWork = timestamp( fromY ,fromM ,fromD ,00 ,00 ) <= time and time < timestamp( endY ,endM ,endD ,00 ,00 )
atr = ema( tr ,20 )[1]
float amount = na
//「fib_rangeに対する指定された比率の幅」を返す関数
f_last_fib( _rate ) => d > c ? d - ( fib_range * _rate ) : d + ( fib_range * _rate )
target01_ew_rate = input( defval=0.236 ,title='Target Fib. Rate to use for Entry Window:', type=input.float )
target01_tp_rate = input( defval=0.5 ,title='Target Fib. Rate to use for TP:', type=input.float )
target01_sl_rate = input( defval=-0.618 ,title='Target Fib. Rate to use for SL:', type=input.float )
target01_ew = f_last_fib( target01_ew_rate )
target01_sl = f_last_fib( target01_sl_rate )
buy_patterns_00 = isABCD(1) or isBat(1) or isAltBat(1) or isButterfly(1) or isGartley(1) or isCrab(1) or isShark(1) or is5o(1) or isWolf(1) or isHnS(1) or isConTria(1) or isExpTria(1)
buy_patterns_01 = isAntiBat(1) or isAntiButterfly(1) or isAntiGartley(1) or isAntiCrab(1) or isAntiShark(1)
sel_patterns_00 = isABCD(-1) or isBat(-1) or isAltBat(-1) or isButterfly(-1) or isGartley(-1) or isCrab(-1) or isShark(-1) or is5o(-1) or isWolf(-1) or isHnS(-1) or isConTria(-1) or isExpTria(-1)
sel_patterns_01 = isAntiBat(-1) or isAntiButterfly(-1) or isAntiGartley(-1) or isAntiCrab(-1) or isAntiShark(-1)
range_rate = input( title='Rate to use for ATR filter', type=input.float, defval=1 )
range = abs( close - target01_sl )
if isWork and isNewPivot and range > atr * range_rate
if ( buy_patterns_00 or buy_patterns_01 ) and close <= target01_ew
strategy.entry( 'L1_target01', long=strategy.long, qty=amount, comment='L1' )
strategy.exit( "exit-L1" ,"L1_target01" ,stop=target01_sl ,limit=f_last_fib( target01_tp_rate ) ,comment="exit-L1" )
isNewPivot := false
if ( sel_patterns_00 or sel_patterns_01 ) and close >= target01_ew
strategy.entry( 'S1_target01', long=strategy.short, qty=amount, comment='S1' )
strategy.exit( "exit-S1" ,"S1_target01" ,stop=target01_sl ,limit=f_last_fib( target01_tp_rate ) ,comment="exit-S1" )
isNewPivot := false
=====
zigzagストラテジーをつくる⑥|ストラテジーを作成する1前回までのコードで、
上位足のZigZagではPivotの確定が遅く
・利益の上がるストラテジーはできない
・ZigZagの良さが活かされない
・フィボナッチの良さが活かされない
ということがわかりました。
"ZigZagやフィボナッチの良さ" とは、
"価格にダイレクトである" という点です。
テクニカルが算出した数値が
そのまま利確や損切りのラインになる。
多くのテクニカルは、
算出された値が実際の価格から乖離することが多く
エントリーやイグジットの判断が遅れることが多々あります。
今回のZigZagストラテジーに魅力を感じたのは、
そんなところもあったりします。
ということで、
諦めずにストラテジーの開発を続けます。
今回は、以下の調整を行っています。
・TradingView由来のZigZagに変更
・ZigZag描画のズレを調整(描画を後ろにズラしただけ)
・フィボナッチのリペイント機能を実装
・売買機能の調整
・同じチャートパターンで複数回エントリーしないように調整
売買に指値を使うように調整しました。
これも、"価格にダイレクト" を活かすためです。
次回は、あまりにも小さなZigZagである場合の
エントリーを制限する機能を実装する予定です。
その次は、取引量の調整をする機能ですね。
「損切り=資金の1%」となるようにしたいと思います。
今日のコードを以下に貼り付けておきます。
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
=====
//@version=4
// study("Zig Zag 勉強中", overlay=true)
strategy( title='ZigZag PA Strategy 勉強中', shorttitle='S', overlay=true, pyramiding=0, initial_capital=100000 )
dev_threshold = input( title="Deviation (%)", type=input.float, defval=0, minval=0, maxval=100 )
depth = input( title="Depth", type=input.integer, defval=6, minval=1, maxval=10 )
// pivotを算出する
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
var bool isNewPivot = false
// pivotを確認する関数
pivotFound(dev, isHigh, 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, pH)
if isNew2
linesCount := linesCount + 1
isHighLast := isHigh2
isNewPivot := true
pLast := pH
dev2 = calc_dev(pLast, pL)
[id1, isHigh1, isNew1] = pivotFound(dev2, false, pL)
if isNew1
linesCount := linesCount + 1
isHighLast := isHigh1
isNewPivot := true
pLast := pL
else
if not na(pH)
dev1 = calc_dev(pLast, pH)
[id, isHigh, isNew] = pivotFound(dev1, true, pH)
if isNew
linesCount := linesCount + 1
isHighLast := isHigh
isNewPivot := true
pLast := pH
else
if not na(pL)
dev2 = calc_dev(pLast, pL)
[id, isHigh, isNew] = pivotFound(dev2, false, pL)
if isNew
linesCount := linesCount + 1
isHighLast := isHigh
isNewPivot := true
pLast := pL
// 追加箇所
zigzag = pLast[1]!=pLast ? pLast : na
plot( zigzag ,color=color.red ,linewidth=3 ,title='zigzag' ,offset=-1*floor(depth / 2) )
bgcolor( isHighLast ? color.gray : color.white ,offset=-1*floor(depth / 2) )
// ジグザグが発生したときのジグザグの値を取得
float x = na
float a = na
float b = na
float c = na
float d = na
exist_zigzag = not na( zigzag ) and not isHighLast==isHighLast[1]
repaint = not na( zigzag ) and isHighLast==isHighLast[1]
x := exist_zigzag ? a[1] : x[1]
a := exist_zigzag ? b[1] : a[1]
b := exist_zigzag ? c[1] : b[1]
c := exist_zigzag ? d[1] : c[1]
d := exist_zigzag ? zigzag
: not repaint ? d[1]
: isHighLast and pLast > pLast[1] ? zigzag
: not isHighLast and pLast < pLast[1] ? zigzag
: d[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 )
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 ,color=fib_0000 != fib_0000[1] ? na : color.black ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.236', series=fib_0236 ,color=fib_0236 != fib_0236[1] ? na : color.red ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.382', series=fib_0382 ,color=fib_0382 != fib_0382[1] ? na : color.olive ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.500', series=fib_0500 ,color=fib_0500 != fib_0500[1] ? na : color.lime ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.618', series=fib_0618 ,color=fib_0618 != fib_0618[1] ? na : color.teal ,offset=-1*floor(depth / 2) )
plot( title='Fib 0.764', series=fib_0764 ,color=fib_0764 != fib_0764[1] ? na : color.blue ,offset=-1*floor(depth / 2) )
plot( title='Fib 1.000', series=fib_1000 ,color=fib_1000 != fib_1000[1] ? na : color.black ,offset=-1*floor(depth / 2) )
xab = ( abs( b - a ) / abs( x - a ) )
xad = ( abs( a - d ) / abs( x - a ) )
abc = ( abs( b - c ) / abs( a - b ) )
bcd = ( abs( c - d ) / abs( b - c ) )
// 5つの点の比率からパターンを判断する関数
isBat(_mode)=>
_xab = xab >= 0.382 and xab <= 0.5
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad <= 0.618 and xad <= 1.000 // 0.886
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiBat(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618
_abc = abc >= 1.000 and abc <= 2.618 // 1.13 --> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 2.0 --> 2.618
_xad = xad >= 0.886 and xad <= 1.000 // 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAltBat(_mode)=>
_xab = xab <= 0.382
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.0 and bcd <= 3.618
_xad = xad <= 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isButterfly(_mode)=>
_xab = xab <= 0.786
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad >= 1.27 and xad <= 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiButterfly(_mode)=>
_xab = xab >= 0.236 and xab <= 0.886 // 0.382 - 0.618
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 - 2.618
_bcd = bcd >= 1.000 and bcd <= 1.382 // 1.27
_xad = xad >= 0.500 and xad <= 0.886 // 0.618 - 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isABCD(_mode)=>
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_abc and _bcd and (_mode == 1 ? d < c : d > c)
isGartley(_mode)=>
_xab = xab >= 0.5 and xab <= 0.618 // 0.618
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_xad = xad >= 0.75 and xad <= 0.875 // 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiGartley(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618 -> 0.786
_abc = abc >= 1.000 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.500 and bcd <= 5.000 // 1.618
_xad = xad >= 1.000 and xad <= 5.000 // 1.272
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isCrab(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.886
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.000 and bcd <= 5.000 // 3.618
_xad = xad >= 1.382 and xad <= 5.000 // 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiCrab(_mode)=>
_xab = xab >= 0.250 and xab <= 0.500 // 0.276 -> 0.446
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 1.618 -> 2.618
_xad = xad >= 0.500 and xad <= 0.750 // 0.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isShark(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.5 --> 0.886
_abc = abc >= 1.130 and abc <= 1.618 //
_bcd = bcd >= 1.270 and bcd <= 2.240 //
_xad = xad >= 0.886 and xad <= 1.130 // 0.886 --> 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiShark(_mode)=>
_xab = xab >= 0.382 and xab <= 0.875 // 0.446 --> 0.618
_abc = abc >= 0.500 and abc <= 1.000 // 0.618 --> 0.886
_bcd = bcd >= 1.250 and bcd <= 2.618 // 1.618 --> 2.618
_xad = xad >= 0.500 and xad <= 1.250 // 1.130 --> 1.130
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
is5o(_mode)=>
_xab = xab >= 1.13 and xab <= 1.618
_abc = abc >= 1.618 and abc <= 2.24
_bcd = bcd >= 0.5 and bcd <= 0.625 // 0.5
_xad = xad >= 0.0 and xad <= 0.236 // negative?
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isWolf(_mode)=>
_xab = xab >= 1.27 and xab <= 1.618
_abc = abc >= 0 and abc <= 5
_bcd = bcd >= 1.27 and bcd <= 1.618
_xad = xad >= 0.0 and xad <= 5
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isHnS(_mode)=>
_xab = xab >= 2.0 and xab <= 10
_abc = abc >= 0.90 and abc <= 1.1
_bcd = bcd >= 0.236 and bcd <= 0.88
_xad = xad >= 0.90 and xad <= 1.1
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isConTria(_mode)=>
_xab = xab >= 0.382 and xab <= 0.618
_abc = abc >= 0.382 and abc <= 0.618
_bcd = bcd >= 0.382 and bcd <= 0.618
_xad = xad >= 0.236 and xad <= 0.764
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isExpTria(_mode)=>
_xab = xab >= 1.236 and xab <= 1.618
_abc = abc >= 1.000 and abc <= 1.618
_bcd = bcd >= 1.236 and bcd <= 2.000
_xad = xad >= 2.000 and xad <= 2.236
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
// 売りパターンが出現したところに印を表示
plotshape( not showPatterns ? na : isABCD(-1) and not isABCD(-1)[1], text=" AB=CD", title='Bear ABCD', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isBat(-1) and not isBat(-1)[1], text="Bat", title='Bear Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isAntiBat(-1) and not isAntiBat(-1)[1], text="Anti Bat", title='Bear Anti Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2 )
plotshape( not showPatterns ? na : isAltBat(-1) and not isAltBat(-1)[1], text="Alt Bat", title='Bear Alt Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isButterfly(-1) and not isButterfly(-1)[1], text="Butterfly", title='Bear Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiButterfly(-1) and not isAntiButterfly(-1)[1], text="Anti Butterfly", title='Bear Anti Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isGartley(-1) and not isGartley(-1)[1], text="Gartley", title='Bear Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiGartley(-1) and not isAntiGartley(-1)[1], text="Anti Gartley", title='Bear Anti Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isCrab(-1) and not isCrab(-1)[1], text="Crab", title='Bear Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiCrab(-1) and not isAntiCrab(-1)[1], text="Anti Crab", title='Bear Anti Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isShark(-1) and not isShark(-1)[1], text="Shark", title='Bear Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isAntiShark(-1) and not isAntiShark(-1)[1], text="Anti Shark", title='Bear Anti Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : is5o(-1) and not is5o(-1)[1], text="5-O", title='Bear 5-O', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isWolf(-1) and not isWolf(-1)[1], text="Wolf Wave", title='Bear Wolf Wave', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isHnS(-1) and not isHnS(-1)[1], text="Head and Shoulders", title='Bear Head and Shoulders', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isConTria(-1) and not isConTria(-1)[1], text="Contracting Triangle", title='Bear Contracting triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
plotshape( not showPatterns ? na : isExpTria(-1) and not isExpTria(-1)[1], text="Expanding Triangle", title='Bear Expanding Triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0 )
// 買いパターンが出現したところに印を表示
plotshape( not showPatterns ? na : isABCD(1) and not isABCD(1)[1], text="AB=CD ", title='Bull ABCD', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isBat(1) and not isBat(1)[1], text="Bat", title='Bull Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiBat(1) and not isAntiBat(1)[1], text="Anti Bat", title='Bull Anti Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAltBat(1) and not isAltBat(1)[1], text="Alt Bat", title='Bull Alt Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isButterfly(1) and not isButterfly(1)[1], text="Butterfly", title='Bull Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiButterfly(1) and not isAntiButterfly(1)[1], text="Anti Butterfly", title='Bull Anti Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isGartley(1) and not isGartley(1)[1], text="Gartley", title='Bull Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiGartley(1) and not isAntiGartley(1)[1], text="Anti Gartley", title='Bull Anti Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isCrab(1) and not isCrab(1)[1], text="Crab", title='Bull Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiCrab(1) and not isAntiCrab(1)[1], text="Anti Crab", title='Bull Anti Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isShark(1) and not isShark(1)[1], text="Shark", title='Bull Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isAntiShark(1) and not isAntiShark(1)[1], text="Anti Shark", title='Bull Anti Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : is5o(1) and not is5o(1)[1], text="5-O", title='Bull 5-O', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isWolf(1) and not isWolf(1)[1], text="Wolf Wave", title='Bull Wolf Wave', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isHnS(1) and not isHnS(1)[1], text="Head and Shoulders", title='Bull Head and Shoulders', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isConTria(1) and not isConTria(1)[1], text="Contracting Triangle", title='Bull Contracting Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
plotshape( not showPatterns ? na : isExpTria(1) and not isExpTria(1)[1], text="Expanding Triangle", title='Bull Expanding Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0 )
//
// 売買のロジック
////
float amount = na
//「fib_rangeに対する指定された比率の幅」を返す関数
f_last_fib( _rate ) => d > c ? d - ( fib_range * _rate ) : d + ( fib_range * _rate )
target01_ew_rate = input( defval=0.236 ,title='Target Fib. Rate to use for Entry Window:', type=input.float )
target01_tp_rate = input( defval=0.5 ,title='Target Fib. Rate to use for TP:', type=input.float )
target01_sl_rate = input( defval=-0.618 ,title='Target Fib. Rate to use for SL:', type=input.float )
target01_ew = f_last_fib( target01_ew_rate )
target01_sl = f_last_fib( target01_sl_rate )
buy_patterns_00 = isABCD(1) or isBat(1) or isAltBat(1) or isButterfly(1) or isGartley(1) or isCrab(1) or isShark(1) or is5o(1) or isWolf(1) or isHnS(1) or isConTria(1) or isExpTria(1)
buy_patterns_01 = isAntiBat(1) or isAntiButterfly(1) or isAntiGartley(1) or isAntiCrab(1) or isAntiShark(1)
sel_patterns_00 = isABCD(-1) or isBat(-1) or isAltBat(-1) or isButterfly(-1) or isGartley(-1) or isCrab(-1) or isShark(-1) or is5o(-1) or isWolf(-1) or isHnS(-1) or isConTria(-1) or isExpTria(-1)
sel_patterns_01 = isAntiBat(-1) or isAntiButterfly(-1) or isAntiGartley(-1) or isAntiCrab(-1) or isAntiShark(-1)
if isNewPivot and ( buy_patterns_00 or buy_patterns_01 ) and close <= target01_ew
strategy.entry( 'L1_target01', long=strategy.long, qty=amount, comment='L1' )
strategy.exit( "exit-L1" ,"L1_target01" ,stop=target01_sl ,limit=f_last_fib( target01_tp_rate ) ,comment="exit-L1" )
isNewPivot := false
if isNewPivot and ( sel_patterns_00 or sel_patterns_01 ) and close >= target01_ew
strategy.entry( 'S1_target01', long=strategy.short, qty=amount, comment='S1' )
strategy.exit( "exit-S1" ,"S1_target01" ,stop=target01_sl ,limit=f_last_fib( target01_tp_rate ) ,comment="exit-S1" )
isNewPivot := false
=====
Security関数なしで、上位足のZigZagを表示するバックテストをする上で、
Security関数は使わないようにしています。
理由はいくつかあります。
・Pythonで再現するのに不都合がある
("なし" で作成しておいた方がPythonに書き換えやすい)
・予期しない挙動が起こることがある
(先物の週明けに上位足の価格が正常に取得できない等)
しかし、やはりコードは長くなります。
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
=====
//@version=4
strategy( title='ZigZag PA Strategy 勉強中', shorttitle='S', overlay=true, pyramiding=0, initial_capital=100000 )
altTimeframe = input( title="Alt Timeframe" ,defval='60' )
is_open = change( time( altTimeframe ) ) != 0
bgcolor( is_open ? color.gray : color.white ,title='aot timeframe open' )
// 上位足の高値を過去2本分保有しておく
float cnt02_high = na
float cnt01_high = na
float cnt00_high = na
cnt02_high := is_open ? cnt01_high[1] : cnt02_high[1]
cnt01_high := is_open ? cnt00_high[1] : cnt01_high[1]
cnt00_high := is_open ? high : high > cnt00_high[1] ? high : cnt00_high[1]
// plot( cnt02_high ,color=color.color.red )
// plot( cnt01_high ,color=color.color.red )
// plot( cnt00_high ,color=color.color.red )
// 上位足の安値を過去2本分保有しておく
float cnt02_low = na
float cnt01_low = na
float cnt00_low = na
cnt02_low := is_open ? cnt01_low[1] : cnt02_low[1]
cnt01_low := is_open ? cnt00_low[1] : cnt01_low[1]
cnt00_low := is_open ? low : low < cnt00_low[1] ? low : cnt00_low[1]
// plot( cnt02_low )
// plot( cnt01_low )
// plot( cnt00_low )
// 上位足の始値を過去2本分保有しておく
float cnt02_open = na
float cnt01_open = na
float cnt00_open = na
cnt02_open := is_open ? cnt01_open[1] : cnt02_open[1]
cnt01_open := is_open ? cnt00_open[1] : cnt01_open[1]
cnt00_open := is_open ? open : cnt00_open[1]
// 上位足の終値を過去2本分保有しておく
float cnt02_close = na
float cnt01_close = na
cnt02_close := is_open ? cnt01_close[1] : cnt02_close[1]
cnt01_close := is_open ? close[1] : cnt01_close[1]
// zigzagを確認
isUp_02 = cnt02_close >= cnt02_open
isUp_01 = cnt01_close >= cnt01_open
isDown_02 = cnt02_close <= cnt02_open
isDown_01 = cnt01_close <= cnt01_open
int direction_02 = na
int direction_01 = na
direction_02 := is_open ? direction_01[1] : direction_02[1]
direction_01 := not is_open ? direction_01[1] : isUp_02 and isDown_01 ? -1
: isDown_02 and isUp_01 ? 1
: direction_01[1]
zigzag = not is_open ? na : isUp_02 and isDown_01 and direction_02 != -1 ? max( cnt01_high ,cnt02_high )
: isDown_02 and isUp_01 and direction_02 != 1 ? min( cnt01_low ,cnt02_low )
: na
plot( zigzag ,color=color.red ,linewidth=3 ,title='zigzag' )
// ジグザグが発生したときのジグザグの値を取得
float x = na
float a = na
float b = na
float c = na
float d = na
exist_zigzag = not na( zigzag )
x := exist_zigzag ? a[1] : x[1]
a := exist_zigzag ? b[1] : a[1]
b := exist_zigzag ? c[1] : b[1]
c := exist_zigzag ? d[1] : c[1]
d := exist_zigzag ? zigzag : d[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 )
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 ,color=fib_0000 != fib_0000[1] ? na : color.black)
plot(title='Fib 0.236', series=fib_0236 ,color=fib_0236 != fib_0236[1] ? na : color.red)
plot(title='Fib 0.382', series=fib_0382 ,color=fib_0382 != fib_0382[1] ? na : color.olive)
plot(title='Fib 0.500', series=fib_0500 ,color=fib_0500 != fib_0500[1] ? na : color.lime)
plot(title='Fib 0.618', series=fib_0618 ,color=fib_0618 != fib_0618[1] ? na : color.teal)
plot(title='Fib 0.764', series=fib_0764 ,color=fib_0764 != fib_0764[1] ? na : color.blue)
plot(title='Fib 1.000', series=fib_1000 ,color=fib_1000 != fib_1000[1] ? na : color.black)
xab = ( abs( b - a ) / abs( x - a ) )
xad = ( abs( a - d ) / abs( x - a ) )
abc = ( abs( b - c ) / abs( a - b ) )
bcd = ( abs( c - d ) / abs( b - c ) )
// 5つの点の比率からパターンを判断する関数
isBat(_mode)=>
_xab = xab >= 0.382 and xab <= 0.5
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad <= 0.618 and xad <= 1.000 // 0.886
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiBat(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618
_abc = abc >= 1.000 and abc <= 2.618 // 1.13 --> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 2.0 --> 2.618
_xad = xad >= 0.886 and xad <= 1.000 // 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAltBat(_mode)=>
_xab = xab <= 0.382
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.0 and bcd <= 3.618
_xad = xad <= 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isButterfly(_mode)=>
_xab = xab <= 0.786
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.618 and bcd <= 2.618
_xad = xad >= 1.27 and xad <= 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiButterfly(_mode)=>
_xab = xab >= 0.236 and xab <= 0.886 // 0.382 - 0.618
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 - 2.618
_bcd = bcd >= 1.000 and bcd <= 1.382 // 1.27
_xad = xad >= 0.500 and xad <= 0.886 // 0.618 - 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isABCD(_mode)=>
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_abc and _bcd and (_mode == 1 ? d < c : d > c)
isGartley(_mode)=>
_xab = xab >= 0.5 and xab <= 0.618 // 0.618
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 1.13 and bcd <= 2.618
_xad = xad >= 0.75 and xad <= 0.875 // 0.786
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiGartley(_mode)=>
_xab = xab >= 0.500 and xab <= 0.886 // 0.618 -> 0.786
_abc = abc >= 1.000 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.500 and bcd <= 5.000 // 1.618
_xad = xad >= 1.000 and xad <= 5.000 // 1.272
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isCrab(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.886
_abc = abc >= 0.382 and abc <= 0.886
_bcd = bcd >= 2.000 and bcd <= 5.000 // 3.618
_xad = xad >= 1.382 and xad <= 5.000 // 1.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiCrab(_mode)=>
_xab = xab >= 0.250 and xab <= 0.500 // 0.276 -> 0.446
_abc = abc >= 1.130 and abc <= 2.618 // 1.130 -> 2.618
_bcd = bcd >= 1.618 and bcd <= 2.618 // 1.618 -> 2.618
_xad = xad >= 0.500 and xad <= 0.750 // 0.618
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isShark(_mode)=>
_xab = xab >= 0.500 and xab <= 0.875 // 0.5 --> 0.886
_abc = abc >= 1.130 and abc <= 1.618 //
_bcd = bcd >= 1.270 and bcd <= 2.240 //
_xad = xad >= 0.886 and xad <= 1.130 // 0.886 --> 1.13
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isAntiShark(_mode)=>
_xab = xab >= 0.382 and xab <= 0.875 // 0.446 --> 0.618
_abc = abc >= 0.500 and abc <= 1.000 // 0.618 --> 0.886
_bcd = bcd >= 1.250 and bcd <= 2.618 // 1.618 --> 2.618
_xad = xad >= 0.500 and xad <= 1.250 // 1.130 --> 1.130
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
is5o(_mode)=>
_xab = xab >= 1.13 and xab <= 1.618
_abc = abc >= 1.618 and abc <= 2.24
_bcd = bcd >= 0.5 and bcd <= 0.625 // 0.5
_xad = xad >= 0.0 and xad <= 0.236 // negative?
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isWolf(_mode)=>
_xab = xab >= 1.27 and xab <= 1.618
_abc = abc >= 0 and abc <= 5
_bcd = bcd >= 1.27 and bcd <= 1.618
_xad = xad >= 0.0 and xad <= 5
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isHnS(_mode)=>
_xab = xab >= 2.0 and xab <= 10
_abc = abc >= 0.90 and abc <= 1.1
_bcd = bcd >= 0.236 and bcd <= 0.88
_xad = xad >= 0.90 and xad <= 1.1
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isConTria(_mode)=>
_xab = xab >= 0.382 and xab <= 0.618
_abc = abc >= 0.382 and abc <= 0.618
_bcd = bcd >= 0.382 and bcd <= 0.618
_xad = xad >= 0.236 and xad <= 0.764
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
isExpTria(_mode)=>
_xab = xab >= 1.236 and xab <= 1.618
_abc = abc >= 1.000 and abc <= 1.618
_bcd = bcd >= 1.236 and bcd <= 2.000
_xad = xad >= 2.000 and xad <= 2.236
_xab and _abc and _bcd and _xad and (_mode == 1 ? d < c : d > c)
// 売りパターンが出現したところに印を表示
plotshape(not showPatterns ? na : isABCD(-1) and not isABCD(-1)[1], text=" AB=CD", title='Bear ABCD', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2)
plotshape(not showPatterns ? na : isBat(-1) and not isBat(-1)[1], text="Bat", title='Bear Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2)
plotshape(not showPatterns ? na : isAntiBat(-1) and not isAntiBat(-1)[1], text="Anti Bat", title='Bear Anti Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0, offset=-2)
plotshape(not showPatterns ? na : isAltBat(-1) and not isAltBat(-1)[1], text="Alt Bat", title='Bear Alt Bat', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isButterfly(-1) and not isButterfly(-1)[1], text="Butterfly", title='Bear Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isAntiButterfly(-1) and not isAntiButterfly(-1)[1], text="Anti Butterfly", title='Bear Anti Butterfly', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isGartley(-1) and not isGartley(-1)[1], text="Gartley", title='Bear Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isAntiGartley(-1) and not isAntiGartley(-1)[1], text="Anti Gartley", title='Bear Anti Gartley', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isCrab(-1) and not isCrab(-1)[1], text="Crab", title='Bear Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isAntiCrab(-1) and not isAntiCrab(-1)[1], text="Anti Crab", title='Bear Anti Crab', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isShark(-1) and not isShark(-1)[1], text="Shark", title='Bear Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isAntiShark(-1) and not isAntiShark(-1)[1], text="Anti Shark", title='Bear Anti Shark', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : is5o(-1) and not is5o(-1)[1], text="5-O", title='Bear 5-O', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isWolf(-1) and not isWolf(-1)[1], text="Wolf Wave", title='Bear Wolf Wave', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isHnS(-1) and not isHnS(-1)[1], text="Head and Shoulders", title='Bear Head and Shoulders', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isConTria(-1) and not isConTria(-1)[1], text="Contracting Triangle", title='Bear Contracting triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
plotshape(not showPatterns ? na : isExpTria(-1) and not isExpTria(-1)[1], text="Expanding Triangle", title='Bear Expanding Triangle', style=shape.labeldown, color=color.maroon, textcolor=color.white, location=location.top, transp=0)
// 買いパターンが出現したところに印を表示
plotshape(not showPatterns ? na : isABCD(1) and not isABCD(1)[1], text="AB=CD ", title='Bull ABCD', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isBat(1) and not isBat(1)[1], text="Bat", title='Bull Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isAntiBat(1) and not isAntiBat(1)[1], text="Anti Bat", title='Bull Anti Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isAltBat(1) and not isAltBat(1)[1], text="Alt Bat", title='Bull Alt Bat', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isButterfly(1) and not isButterfly(1)[1], text="Butterfly", title='Bull Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isAntiButterfly(1) and not isAntiButterfly(1)[1], text="Anti Butterfly", title='Bull Anti Butterfly', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isGartley(1) and not isGartley(1)[1], text="Gartley", title='Bull Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isAntiGartley(1) and not isAntiGartley(1)[1], text="Anti Gartley", title='Bull Anti Gartley', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isCrab(1) and not isCrab(1)[1], text="Crab", title='Bull Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isAntiCrab(1) and not isAntiCrab(1)[1], text="Anti Crab", title='Bull Anti Crab', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isShark(1) and not isShark(1)[1], text="Shark", title='Bull Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isAntiShark(1) and not isAntiShark(1)[1], text="Anti Shark", title='Bull Anti Shark', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : is5o(1) and not is5o(1)[1], text="5-O", title='Bull 5-O', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isWolf(1) and not isWolf(1)[1], text="Wolf Wave", title='Bull Wolf Wave', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isHnS(1) and not isHnS(1)[1], text="Head and Shoulders", title='Bull Head and Shoulders', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isConTria(1) and not isConTria(1)[1], text="Contracting Triangle", title='Bull Contracting Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
plotshape(not showPatterns ? na : isExpTria(1) and not isExpTria(1)[1], text="Expanding Triangle", title='Bull Expanding Triangle', style=shape.labelup, color=color.green, textcolor=color.white, location=location.bottom, transp=0)
//
// 売買のロジック
////
//「fib_rangeに対する指定された比率の幅」を返す関数
f_last_fib( _rate ) => d > c ? d - ( fib_range * _rate ) : d + ( fib_range * _rate )
// ターゲット1の設定項目と初期値
////
// 上から
// 取引量
// エントリーの基準(0.236を超えていない)
// 利益確定幅
// ロスカット幅
target01_trade_size = input(title='Target 1 - Trade size:', type=input.float, defval=10000.00)
target01_ew_rate = input(title='Target 1 - Fib. Rate to use for Entry Window:', type=input.float, defval=0.236)
target01_tp_rate = input(title='Target 1 - Fib. Rate to use for TP:', type=input.float, defval=0.618)
target01_sl_rate = input(title='Target 1 - Fib. Rate to use for SL:', type=input.float, defval=-0.236)
// ターゲット2の設定
////
target02_active = input(title='Target 2 - Active?', type=input.bool, defval=false)
target02_trade_size = input(title='Target 2 - Trade size:', type=input.float, defval=10000.00)
target02_ew_rate = input(title='Target 2 - Fib. Rate to use for Entry Window:', type=input.float, defval=0.236)
target02_tp_rate = input(title='Target 2 - Fib. Rate to use for TP:', type=input.float, defval=1.618)
target02_sl_rate = input(title='Target 2 - Fib. Rate to use for SL:', type=input.float, defval=-0.236)
// 買いのパターン
buy_patterns_00 = isABCD(1) or isBat(1) or isAltBat(1) or isButterfly(1) or isGartley(1) or isCrab(1) or isShark(1) or is5o(1) or isWolf(1) or isHnS(1) or isConTria(1) or isExpTria(1)
buy_patterns_01 = isAntiBat(1) or isAntiButterfly(1) or isAntiGartley(1) or isAntiCrab(1) or isAntiShark(1)
// 売りのパターン
sel_patterns_00 = isABCD(-1) or isBat(-1) or isAltBat(-1) or isButterfly(-1) or isGartley(-1) or isCrab(-1) or isShark(-1) or is5o(-1) or isWolf(-1) or isHnS(-1) or isConTria(-1) or isExpTria(-1)
sel_patterns_01 = isAntiBat(-1) or isAntiButterfly(-1) or isAntiGartley(-1) or isAntiCrab(-1) or isAntiShark(-1)
// ターゲット1の売買
////
// 買いのパターン & エントリーの基準を満たす → 買いエントリー
// 利確・損切りを超える → 買いの決済
target01_buy_entry = (buy_patterns_00 or buy_patterns_01) and close <= f_last_fib(target01_ew_rate)
target01_buy_close = high >= f_last_fib(target01_tp_rate) or low <= f_last_fib(target01_sl_rate)
strategy.entry('target01_buy', long=strategy.long, qty=target01_trade_size, comment='buy 01', when=target01_buy_entry)
strategy.close('target01_buy', when=target01_buy_close)
// 売りのパターン & エントリーの基準を満たす → 売りエントリー
// 利確・損切りを超える → 売りの決済
target01_sel_entry = (sel_patterns_00 or sel_patterns_01) and close >= f_last_fib(target01_ew_rate)
target01_sel_close = low <= f_last_fib(target01_tp_rate) or high >= f_last_fib(target01_sl_rate)
strategy.entry('target01_sell', long=strategy.short, qty=target01_trade_size, comment='sell 01', when=target01_sel_entry)
strategy.close('target01_sell', when=target01_sel_close)
// ターゲット2の売買
////
target02_buy_entry = target02_active and (buy_patterns_00 or buy_patterns_01) and close <= f_last_fib(target02_ew_rate)
target02_buy_close = target02_active and high >= f_last_fib(target02_tp_rate) or low <= f_last_fib(target02_sl_rate)
strategy.entry('target02_buy', long=strategy.long, qty=target02_trade_size, comment='buy 02', when=target02_buy_entry)
strategy.close('target02_buy', when=target02_buy_close)
target02_sel_entry = target02_active and (sel_patterns_00 or sel_patterns_01) and close >= f_last_fib(target02_ew_rate)
target02_sel_close = target02_active and low <= f_last_fib(target02_tp_rate) or high >= f_last_fib(target02_sl_rate)
strategy.entry('target02_sell', long=strategy.short, qty=target02_trade_size, comment='sell 02', when=target02_sel_entry)
strategy.close('target02_sell', when=target02_sel_close)
=====
zigzagストラテジーをつくる④|インジケーターを改良する1以前みつけた高勝率の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)
=====
zigzagストラテジーをつくる③|インジケーターを理解する3以前みつけた高勝率のzigzagストラテジーを再現する試みです。
ストラテジーに必要な価格を
変数に格納してプロットすることもできました。
このzigzagは変動率をもとに頂点の判断を行っているので、
赤矢印のように頂点の位置がずれていきます。
元々のzigzagは、
この対処としてline.newで実装しているようです。
plotだとどうしても
(過去の値を修正することができないので)
まっすぐの線にすることはできません。
見た目はカッコ悪いですが、
ストラテジーにする上では全く問題ないので、
このまま進めていきたいと思います。
次回は、フィボナッチの比率で
横線を描画する機能を追加したいと思います。
=====
//@version=4
study("Zig Zag 勉強中", overlay=true)
// Deviation = 偏差
dev_threshold = input(title="Deviation (%)", type=input.float, defval=.1, minval=0.01, maxval=100)
// Depth = 深さ
depth = input(title="Depth", type=input.integer, defval=10, minval=1)
//**
//* depth -> length -> zero
//* lengthが最高値・最安値であるかを確認
//* trueならbar_indexと価格を返す
//*
pivots(src, length, isHigh) =>
p = nz(src[length])
if length == 0
[bar_index, p]
else
isFound = true
// length -> zeroの最高値・最安値を確認
for i = 0 to length - 1
if isHigh and src[i] > p
isFound := false
if not isHigh and src[i] < p
isFound := false
// depth -> lengthの最高値・最安値を確認
for i = length + 1 to 2 * length
if isHigh and src[i] >= p
isFound := false
if not isHigh and src[i] <= p
isFound := false
// lengthが最高値・最安値だった場合は値を返す
if isFound and length * 2 <= bar_index
[bar_index[length], p]
// そうでない場合はnaを返す
else
[int(na), float(na)]
[iH, pH] = pivots(high, floor(depth / 2), true)
[iL, pL] = pivots(low, floor(depth / 2), false)
// データ確認用
// plot( pH )
// plot( pL )
// plot( iH )
// plot( na(iH) ? 1 : 0 )
// plot( iL )
// 変化率を算出する関数
calc_dev(base_price, price) =>
100 * (price - base_price) / base_price
// 直近のpivotの情報を格納
var line lineLast = na // lineのid (実際はidではなく識別している何か)
var int iLast = 0 // bar_index
var float pLast = 0 // price
var bool isHighLast = true // High か Low か
// 描画したラインの数
var int linesCount = 0
// データ確認用
// plot( lineLast )
// plot( iLast )
// plot( pLast )
// plot( linesCount )
//**
//* Lineを描画する関数
//*
pivotFound(dev, isHigh, index, price) =>
// zigzagの頂点を更新する
if isHighLast == isHigh and not na(lineLast)
if isHighLast ? price > pLast : price < pLast
if linesCount <= 1
line.set_xy1(lineLast, index, price)
line.set_xy2(lineLast, index, price)
[lineLast, isHighLast, false]
else
[line(na), bool(na), false]
// zigzagの方向を変える(zigzagの頂点)
else
// 一番最初のLine
if na(lineLast)
id = line.new(index, price, index, price, color=color.red, width=2)
[id, isHigh, true]
else
// 変化率が設定値以上であることを確認
if abs(dev) >= dev_threshold
id = line.new(iLast, pLast, index, price, color=color.red, width=2)
[id, isHigh, true]
else
[line(na), bool(na), false]
//**
//* 描画処理
//*
// iH iL のデータある
// iH と iL の値(bar_index)が同じ
// 高値と安値の描画処理を行う
if not na(iH) and not na(iL) and iH == iL
dev1 = calc_dev(pLast, pH)
[id2, isHigh2, isNew2] = pivotFound(dev1, true, iH, pH)
if isNew2
linesCount := linesCount + 1
if not na(id2)
lineLast := id2
isHighLast := isHigh2
iLast := iH
pLast := pH
dev2 = calc_dev(pLast, pL)
[id1, isHigh1, isNew1] = pivotFound(dev2, false, iL, pL)
if isNew1
linesCount := linesCount + 1
if not na(id1)
lineLast := id1
isHighLast := isHigh1
iLast := iL
pLast := pL
else
// iH の値がある
if not na(iH)
dev1 = calc_dev(pLast, pH)
[id, isHigh, isNew] = pivotFound(dev1, true, iH, pH)
if isNew
linesCount := linesCount + 1
if not na(id)
lineLast := id
isHighLast := isHigh
iLast := iH
pLast := pH
// iL の値がある
else
if not na(iL)
dev2 = calc_dev(pLast, pL)
[id, isHigh, isNew] = pivotFound(dev2, false, iL, pL)
if isNew
linesCount := linesCount + 1
if not na(id)
lineLast := id
isHighLast := isHigh
iLast := iL
pLast := pL
// 追加箇所
zigzag = pLast[1]!=pLast ? pLast : na
plot( zigzag ,color=color.red ,offset=-1*floor(depth / 2) )
=====
zigzagストラテジーをつくる①|インジケーターを理解する1以前みつけた高勝率のzigzagストラテジーを再現する試みです。
まずは、zigzagインジケーターを作成します。
作成とは言っても、
すでにあるものを理解する作業。お勉強です。
モデルになるzigzagストラテジーは、
非常にシンプルなロジックのzigzagでした。
ただし、上の時間軸のzigzagを表示するというもの。
このアプローチでも良いのですが、
tradingViewやmt4で用いられているzigzagを
ちゃんと理解してすべてを検証できる状態をつくりたいと思います。
コツコツと地道にすすめていく予定です。
けっこう時間がかかると思いますが、気長にお付き合いください。
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
=====
//@version=4
study("Zig Zag 勉強中", overlay=true)
// Depth = 深さ
depth = input(title="Depth", type=input.integer, defval=10, minval=1)
//**
//* depth -> length -> zero
//* lengthが最高値・最安値であるかを確認
//* trueならbar_indexと価格を返す
//*
pivots(src, length, isHigh) =>
p = nz(src[length])
if length == 0
[bar_index, p]
else
isFound = true
// length -> zeroの最高値・最安値を確認
for i = 0 to length - 1
if isHigh and src[i] > p
isFound := false
if not isHigh and src[i] < p
isFound := false
// depth -> lengthの最高値・最安値を確認
for i = length + 1 to 2 * length
if isHigh and src[i] >= p
isFound := false
if not isHigh and src[i] <= p
isFound := false
// lengthが最高値・最安値だった場合は値を返す
if isFound and length * 2 <= bar_index
[bar_index[length], p]
// そうでない場合はnaを返す
else
[int(na), float(na)]
[iH, pH] = pivots(high, floor(depth / 2), true)
[iL, pL] = pivots(low, floor(depth / 2), false)
zigzag = pH>0 ? pH : pL>0 ? pL : na
plot( zigzag ,offset=-1*floor(depth / 2) ,color=color.red )
=====
教育 zigzagストラテジーをつくる②|インジケーターを理解する2以前みつけた高勝率のzigzagストラテジーを再現する試みです。
インジケーターは理解できました。
次回は、ストラテジーを作成するにあたって、
必要な情報を変数に格納するスキームを作成します。
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
=====
//@version=4
study("Zig Zag", overlay=true)
// Deviation = 偏差
dev_threshold = input(title="Deviation (%)", type=input.float, defval=.1, minval=0.01, maxval=100)
// Depth = 深さ
depth = input(title="Depth", type=input.integer, defval=10, minval=1)
//**
//* depth -> length -> zero
//* lengthが最高値・最安値であるかを確認
//* trueならbar_indexと価格を返す
//*
pivots(src, length, isHigh) =>
p = nz(src[length])
if length == 0
[bar_index, p]
else
isFound = true
// length -> zeroの最高値・最安値を確認
for i = 0 to length - 1
if isHigh and src[i] > p
isFound := false
if not isHigh and src[i] < p
isFound := false
// depth -> lengthの最高値・最安値を確認
for i = length + 1 to 2 * length
if isHigh and src[i] >= p
isFound := false
if not isHigh and src[i] <= p
isFound := false
// lengthが最高値・最安値だった場合は値を返す
if isFound and length * 2 <= bar_index
[bar_index[length], p]
// そうでない場合はnaを返す
else
[int(na), float(na)]
[iH, pH] = pivots(high, floor(depth / 2), true)
[iL, pL] = pivots(low, floor(depth / 2), false)
// データ確認用
// plot( pH )
// plot( pL )
plot( iH )
plot( na(iH) ? 1 : 0 )
plot( iL )
// 変化率を算出する関数
calc_dev(base_price, price) =>
100 * (price - base_price) / base_price
// 直近のpivotの情報を格納
var line lineLast = na // lineのid (実際はidではなく識別している何か)
var int iLast = 0 // bar_index
var float pLast = 0 // price
var bool isHighLast = true // High か Low か
// 描画したラインの数
var int linesCount = 0
// データ確認用
// plot( lineLast )
// plot( iLast )
// plot( pLast )
// plot( linesCount )
//**
//* Lineを描画する関数
//*
pivotFound(dev, isHigh, index, price) =>
// zigzagの頂点を更新する
if isHighLast == isHigh and not na(lineLast)
if isHighLast ? price > pLast : price < pLast
if linesCount <= 1
line.set_xy1(lineLast, index, price)
line.set_xy2(lineLast, index, price)
[lineLast, isHighLast, false]
else
[line(na), bool(na), false]
// zigzagの方向を変える(zigzagの頂点)
else
// 一番最初のLine
if na(lineLast)
id = line.new(index, price, index, price, color=color.red, width=2)
[id, isHigh, true]
else
// 変化率が設定値以上であることを確認
if abs(dev) >= dev_threshold
id = line.new(iLast, pLast, index, price, color=color.red, width=2)
[id, isHigh, true]
else
[line(na), bool(na), false]
//**
//* 描画処理
//*
// iH iL のデータある
// iH と iL の値(bar_index)が同じ
// 高値と安値の描画処理を行う
if not na(iH) and not na(iL) and iH == iL
dev1 = calc_dev(pLast, pH)
[id2, isHigh2, isNew2] = pivotFound(dev1, true, iH, pH)
if isNew2
linesCount := linesCount + 1
if not na(id2)
lineLast := id2
isHighLast := isHigh2
iLast := iH
pLast := pH
dev2 = calc_dev(pLast, pL)
[id1, isHigh1, isNew1] = pivotFound(dev2, false, iL, pL)
if isNew1
linesCount := linesCount + 1
if not na(id1)
lineLast := id1
isHighLast := isHigh1
iLast := iL
pLast := pL
else
// iH の値がある
if not na(iH)
dev1 = calc_dev(pLast, pH)
[id, isHigh, isNew] = pivotFound(dev1, true, iH, pH)
if isNew
linesCount := linesCount + 1
if not na(id)
lineLast := id
isHighLast := isHigh
iLast := iH
pLast := pH
// iL の値がある
else
if not na(iL)
dev2 = calc_dev(pLast, pL)
[id, isHigh, isNew] = pivotFound(dev2, false, iL, pL)
if isNew
linesCount := linesCount + 1
if not na(id)
lineLast := id
isHighLast := isHigh
iLast := iL
pLast := pL
=====
米国の総合景気先行指数を表示するFRBが発表する指数。
これも景気の参考指数として役に立ちます。
景気の山に対して平均約9ヵ月、
谷に対して平均約4ヵ月の先行性があると言わているようです。
以下の指標で構成されています。
1.週平均労働時間
2.週平均失業保険申請件数
3.消費財受注
4.入荷遅延比率
5.非国防資本財受注
6.新規建設許可
7.普通株500種株価
8.マネーサプライ(M2)
9.長短金利スプレッド
10.消費者期待度指数
=====
米総合景気先行指数
Leading Index for the United States
コード:FRED/USSLIND
=====
※ インジケーターは「Quandl」というものを使っています(検索で出てきます)
銅、アルミ、亜鉛の在庫情報を取得するインジケーターメジャーな貴金属の情報はありませんが、
Quandlの情報からこんなインジケーターを作成することもできます。
前日比(%)のヒストグラムです。
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
=====
//@version=3
study("ロンドン金属取引所の在庫情報を取得", overlay=false)
metal = input(defval='CU', title='Metal', options=['AL','CU','ZI'])
stBase = 'QUANDL:LME/ST_'
stSym = stBase + metal + '_ALL'
st = security( stSym,'D', close[0])
stChange = (( st[0] - st[1]) / st[1]) * 100
stCol = stChange > 0 ? red : green
plot( stChange ,title='Inventory Level Changes (In %)' , color=stCol ,linewidth=3 ,style=columns )
=====
Pine講座63 タートルズ流投資の魔術|ドンチャン・トレンドシステム「タートルズ流投資の魔術
カーティス・フェイス著」
で紹介されている手法の再現。
5つ目です。
これまでの手法に比べると
すこしスパンの短い手法。
取引回数が増えます。
この手法をこれまでの手法と比較すると
「取引回数の重要さ」が良く分かると思います。
(長期のトレンドフォロー
なので分散投資が必須です)
※ コピペする場合は以下の変更を行ってください
[](全角の角括弧)→(半角の角括弧)
(全角スペース)→(半角スペース)
=====
//@version=3
strategy("Strategy Turtle Donchian Trend System"
,default_qty_type=strategy.fixed
,default_qty_value=1
,pyramiding=4
,overlay=true)
src = close
len_dc_entry = input(20 ,minval=1 ,title="length of dc entry")
len_dc_exit = input(10 ,minval=1 ,title="length of dc exit")
len_ema_m = input(25 ,minval=1 ,title="length of middle ema")
len_ema_l = input(350 ,minval=1 ,title="length of long ema")
SO_bool = input(false,type=bool ,title="loss cut")
SO_len = input(20 ,type=integer ,minval=1 ,title="loss cut ATR length")
SO_N = input(2 ,type=float ,minval=0.5 ,title="loss cut ATR*N")
MAX_N = input(1 ,type=integer ,minval=1 ,maxval=4 ,title="maximun num of unit")
LO_len = input(20 ,type=integer ,minval=1 ,title="pyramiding ATR length")
LO_N = input(1 ,type=float ,minval=0.5 ,title="pyramiding ATR*N")
Tm_bool = input(false,type=bool ,title="timed exit")
Tm_len = input(80 ,type=integer ,minval=1 ,title="timed exit length")
fromYear = input(2005 ,type=integer ,minval=1900 ,title="test start")
endYear = input(2017 ,type=integer ,minval=1900 ,title="test end")
isWork = timestamp(fromYear ,1 ,1 ,00 ,00) <= time and time < timestamp(endYear+1 ,1 ,1 ,00 ,00)
upper_en = highest(high ,len_dc_entry)
upper_ex = highest(high ,len_dc_exit)
lower_en = lowest(low ,len_dc_entry)
lower_ex = lowest(low ,len_dc_exit)
ema_m = ema(src ,len_ema_m)
ema_l = ema(src ,len_ema_l)
atr_SO_ = ema(tr ,SO_len)
atr_LO_ = ema(tr ,LO_len)
atr_SO = atr_SO_*SO_N
atr_LO = atr_LO_*LO_N
countTradingDays = na
countNonTradingDays = na
countTradingDays := strategy.position_size==0 ? 0 : countTradingDays + 1
countNonTradingDays := strategy.position_size!=0 ? 0 : countNonTradingDays + 1
entry1 = close
entry2 = close
entry3 = close
entry4 = close
entry1 := strategy.position_size==0 ? na : entry1
entry2 := strategy.position_size==0 ? na : entry2
entry3 := strategy.position_size==0 ? na : entry3
entry4 := strategy.position_size==0 ? na : entry4
lo2 = close
lo3 = close
lo4 = close
lo2 := strategy.position_size==0 ? na : lo2
lo3 := strategy.position_size==0 ? na : lo3
lo4 := strategy.position_size==0 ? na : lo4
L_EntrySig = strategy.position_size==0 and high >= upper_en and ema_m >= ema_l
S_EntrySig = strategy.position_size==0 and low <= lower_en and ema_m <= ema_l
lo_sig2 = strategy.position_size>0 ? lo2 < high : strategy.position_size<0 ? lo2 > low : na
lo_sig3 = strategy.position_size>0 ? lo3 < high : strategy.position_size<0 ? lo3 > low : na
lo_sig4 = strategy.position_size>0 ? lo4 < high : strategy.position_size<0 ? lo4 > low : na
losscut = close
losscut := SO_bool==false ? na
: L_EntrySig ? close - atr_SO
: S_EntrySig ? close + atr_SO
: strategy.position_size>0 and (lo_sig2 or lo_sig3 or lo_sig4) ? close - atr_SO
: strategy.position_size<0 and (lo_sig2 or lo_sig3 or lo_sig4) ? close + atr_SO
: strategy.position_size!=0 ? losscut
: na
ExitPrice = close
ExitPrice := L_EntrySig or strategy.position_size>0 ? SO_bool ? max(losscut ,lower_ex) : lower_ex
: S_EntrySig or strategy.position_size<0 ? SO_bool ? min(losscut ,upper_ex) : upper_ex
: na
if(strategy.position_size != 0)
L_ExitSig = (low <= lower_ex or S_EntrySig) and strategy.position_size > 0
S_ExitSig = (high >= upper_ex or L_EntrySig) and strategy.position_size < 0
TimedSig = countTradingDays > Tm_len and Tm_bool
strategy.close_all(when = L_ExitSig or S_ExitSig or TimedSig)
if(L_ExitSig or S_ExitSig)
entry1 := na
entry2 := na
entry3 := na
entry4 := na
lo2 := na
lo3 := na
lo4 := na
losscut := na
if(strategy.position_size > 0)
strategy.exit("L-Entry1" ,stop=ExitPrice)
if(entry2!=na)
strategy.exit("L-Entry2" ,stop=ExitPrice)
if(entry3!=na)
strategy.exit("L-Entry3" ,stop=ExitPrice)
if(entry4!=na)
strategy.exit("L-Entry4" ,stop=ExitPrice)
if(lo_sig2 and MAX_N >= 2)
lo2 := na
if(SO_bool)
strategy.entry("L-Entry2" ,strategy.long ,stop=ExitPrice ,comment="L-Entry2")
strategy.exit("L-Entry1" ,stop=ExitPrice)
else
strategy.entry("L-Entry2" ,strategy.long ,comment="L-Entry2")
if(lo_sig3 and MAX_N >= 3)
lo3 := na
if(SO_bool)
strategy.entry("L-Entry3" ,strategy.long ,stop=ExitPrice ,comment="L-Entry3")
strategy.exit("L-Entry2" ,stop=ExitPrice)
strategy.exit("L-Entry1" ,stop=ExitPrice)
else
strategy.entry("L-Entry3" ,strategy.long ,comment="L-Entry3")
if(lo_sig4 and MAX_N >= 4)
lo4 := na
if(SO_bool)
strategy.entry("L-Entry4" ,strategy.long ,stop=ExitPrice ,comment="L-Entry4")
strategy.exit("L-Entry3" ,stop=ExitPrice)
strategy.exit("L-Entry2" ,stop=ExitPrice)
strategy.exit("L-Entry1" ,stop=ExitPrice)
else
strategy.entry("L-Entry4" ,strategy.long ,comment="L-Entry4")
if(strategy.position_size < 0)
strategy.exit("S-Entry1" ,stop=ExitPrice)
if(entry2!=na)
strategy.exit("S-Entry2" ,stop=ExitPrice)
if(entry3!=na)
strategy.exit("S-Entry3" ,stop=ExitPrice)
if(entry4!=na)
strategy.exit("S-Entry4" ,stop=ExitPrice)
if(lo_sig2 and MAX_N >= 2)
lo2 := na
if(SO_bool)
strategy.entry("S-Entry2" ,strategy.short ,stop=ExitPrice ,comment="S-Entry2")
strategy.exit("S-Entry1" ,stop=ExitPrice)
else
strategy.entry("S-Entry2" ,strategy.short ,comment="S-Entry2")
if(lo_sig3 and MAX_N >= 3)
lo3 := na
if(SO_bool)
strategy.entry("S-Entry3" ,strategy.short ,stop=ExitPrice ,comment="S-Entry3")
strategy.exit("S-Entry2" ,stop=ExitPrice)
strategy.exit("S-Entry1" ,stop=ExitPrice)
else
strategy.entry("S-Entry3" ,strategy.short ,comment="S-Entry3")
if(lo_sig4 and MAX_N >= 4)
lo4 := na
if(SO_bool)
strategy.entry("S-Entry4" ,strategy.short ,stop=ExitPrice ,comment="S-Entry4")
strategy.exit("S-Entry3" ,stop=ExitPrice)
strategy.exit("S-Entry2" ,stop=ExitPrice)
strategy.exit("S-Entry1" ,stop=ExitPrice)
else
strategy.entry("S-Entry4" ,strategy.short ,comment="S-Entry4")
if((L_EntrySig or S_EntrySig) and isWork)
countTradingDays := 0
entry1 := close
if(L_EntrySig)
if(SO_bool)
strategy.entry("L-Entry1" ,strategy.long ,stop=ExitPrice ,comment="L-Entry1")
else
strategy.entry("L-Entry1" ,strategy.long ,comment="L-Entry1")
lo2 := MAX_N >= 2 ? close + atr_LO : na
lo3 := MAX_N >= 3 ? close + atr_LO * 2 : na
lo4 := MAX_N >= 4 ? close + atr_LO * 3 : na
if(S_EntrySig)
if(SO_bool)
strategy.entry("S-Entry1" ,strategy.short ,stop=ExitPrice ,comment="S-Entry1")
else
strategy.entry("S-Entry1" ,strategy.short ,comment="S-Entry1")
lo2 := MAX_N >= 2 ? close - atr_LO : na
lo3 := MAX_N >= 3 ? close - atr_LO * 2 : na
lo4 := MAX_N >= 4 ? close - atr_LO * 3 : na
plot(strategy.position_size ,transp=0 ,title="保有ポジションの数")
plot(strategy.openprofit ,transp=0 ,title="未決済の損益")
plot(strategy.netprofit ,transp=0 ,title="決済済みの損益")
plot(strategy.closedtrades ,transp=0 ,title="決済済み取引数")
plot(countTradingDays ,transp=0 ,title="取引日数")
plot(countNonTradingDays ,transp=0 ,title="ノンポジ日数")
plot(entry1 ,title="entry1" ,color=blue ,transp=0 ,style=linebr)
plot(lo2 ,title="lo2" ,color=red ,transp=0 ,style=linebr)
plot(lo3 ,title="lo3" ,color=red ,transp=0 ,style=linebr)
plot(lo4 ,title="lo4" ,color=red ,transp=0 ,style=linebr)
plot(ExitPrice ,title="ExitPrice" ,color=red ,transp=0 ,style=linebr)
plot(atr_SO ,transp=0 ,title="ATR_SO")
plot(atr_LO ,transp=0 ,title="ATR_LO")
// plot(strategy.max_drawdown ,transp=50 ,title="最大DD")
// plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)
p1 = plot(ema_m ,color=#303F9F ,title="ema_m" ,style=line ,linewidth=1, transp=0)
p2 = plot(ema_l ,color=#4CAF50 ,title="ema_l" ,style=line ,linewidth=1, transp=0)
fill(p1 ,p2 ,color=#2196F3 ,title="fill" ,transp=80)
p3 = plot(lower_en ,color=gray ,title="lower_entry" ,style=linebr ,linewidth=1 ,transp=40)
p4 = plot(upper_en ,color=gray ,title="upper_entry" ,style=linebr ,linewidth=1 ,transp=40)
fill(p3 ,p4 ,color=gray ,title="fill" ,transp=90)
plot(strategy.position_size>0 ? lower_ex : na ,color=red ,title="lower_exit" ,style=linebr ,linewidth=1 ,transp=30)
plot(strategy.position_size<0 ? upper_ex : na ,color=red ,title="upper_exit" ,style=linebr ,linewidth=1 ,transp=30)
=====