High_Low v2 (ZigZag)のバーが出るタイミング

スポンサーリンク

こんばんは!キリンです。
今ドラマ見てたら良いセリフ聞きました。
単調な仕事をする町工場に社員として働き出した新社会人
先輩社員からこう言われます。
「周り見てて、こういう大人(町工場の大人たち)になるんだなって思ってたんだろう?」
「誰だってそう思うときがあるさ」
「安定した生活が一番さ」
「いや、違うな。ただ身ひとつでチャレンジするのが怖かっただけだ」
その後、もどかしさを感じた主人公は、辞表を提出しました。
「自分にあった仕事やりたくて・・・でも何があってるか分からないんですよね」
帝王ってドラマです・・・。
この主人公は色々あって「ホスト」になるみたいです。
このドラマを見てしまってた理由なのですが、なによりセリフがいいです。
その人のモチーフになった人が書いた本がこちら。
帝王の書/輝咲 翔

¥1,050
Amazon.co.jp
読んでみたいなぁと思った次第。
さっき買ってみました。
何もできなかった主人公が全力でホストの仕事に取り組んで成功していく本だそうです。
「ぜってー負けねぇ。」
なんかドラマ見てしまいそうです。
「帝王」がホストなら、「ミナミの帝王」もホストなんですかね・・・?
前書きが長くなっちゃいましたね。

いつも参考にさせてもらってます。
少し迷っていることがありまして
http://www.abysse.co.jp/mt4/indicators/High_Low%20v2%20(ZigZag)2.mq4
このラインの出るタイミングを解析中なのですがなかなかわかりません、ご指導お願いします。

というコメントを頂いたので、早速確認してみました。
1.バッファの確認
こういうときにまず確認するのが、
実際にグラフに表示される配列が何なのかを調べます。
今回のプログラムで言うと
SetIndexBuffer(0,ExtMapBuffer1);
この部分ですね。
2.バッファの計算をたどる
1でグラフに当てられた配列がExtMapBuffer1であることが分かりました。
その計算を追っていきます。
ExtMapBuffer1[mv]=Uzel[i][2];
こんな計算式が見つかりました。
どうやらこのグラフの計算するときの肝は
Uzel[i][2]
のようです。
次はUzelをたどっていきましょう。
if (Swing!=Swing_n && Swing_n!=0) {
if (Swing==2) {
Swing=-Swing_n;BH = High[shift];BL = Low[shift];
}
uzl=uzl+1;
if (Swing==1) {
Uzel[uzl][1]=zd;
Uzel[uzl][2]=BL;
}
if (Swing==-1) {
Uzel[uzl][1]=zu;
Uzel[uzl][2]=BH;
}
BH = High[shift];
BL = Low[shift];
}
ここでUzelに値が割り当てられてます。
ifの中でSwingという変数が頻出しています。
多分プログラムの肝なのでしょう。
さらにUzel割り当てられているものをたどると、

zd, BL
zu, BH

このあたりが重要なようです。
それに着目してみていきます。

if (Low[shift] < LL && High[shift] > HH){
Swing=2;
if (Swing_n==1) {zu=shift+1;}
if (Swing_n==-1) {zd=shift+1;}
} else {
if (Low[shift] < LL) {Swing=-1;} if (High[shift]>HH) {Swing=1;}
}

ここ重要です。
この部分が主要ロジック部ですね
for (i=shift+Length;i > =shift+1;i–) {
if (Low[i]< LL) {LL=Low[i];} if (High[i]>HH) {HH=High[i];}
}
LLとHHというのはここの計算で、Lengthの期間の最安値最高値を求めたその結果です。
さらに、LLやHHが更新されなければそのままの値をキープします。
それを踏まえたうえで見ていきましょう。
if (Low[shift] < LL && High[shift]>HH){
Swing=2;
if (Swing_n==1) {zu=shift+1;}
if (Swing_n==-1) {zd=shift+1;}
} else {
if (Low[shift]HH) {Swing=1;}
}
この部分で安値・高値の更新があったかを確認しています。
高値の更新があった場合は、Swingの値を1, -1, 2にして、
Swing_nの値によって、zuとzdの値を定め、
if (Swing!=Swing_n && Swing_n!=0) {
if (Swing==2) {
Swing=-Swing_n;BH = High[shift];BL = Low[shift];
}
uzl=uzl+1;
if (Swing==1) {
Uzel[uzl][1]=zd;
Uzel[uzl][2]=BL;
}
if (Swing==-1) {
Uzel[uzl][1]=zu;
Uzel[uzl][2]=BH;
}
BH = High[shift];
BL = Low[shift];
}
この条件文でBLとBHに値を割り振ります。
(Swing==2のif分の中でのBLとBHの計算いらないと思うんだよなぁ…)
これが実際にグラフを描写しているところ。
さて、次。
高値・安値が更新されたSwing==1,-1,2のときにBHやBLの値が変わるのは分かりました。
ここで気をつけていただきたいのが、Swing!=Swing_nのときのみ、
Uzelに値が割り振られているという点です。
Swing_nというのは、ひとつ前のローソク足でのSwingなので、
Swingの向きが変わったときのみ描写するということですね。
これが質問してくださった方への回答となります。
さらに続けます。
このプログラムの分かりにくいところは、
for文の中でそれぞれのローソク足のグラフの値を計算している点ではないところですね。
Uzel[uzl][1]=zd;
Uzel[uzl][2]=BL;
zdがローソク足の場所を表し、BLがそのローソク足のグラフの値をあらわします。
if (Low[shift] < LL && High[shift]>HH){
Swing=2;
if (Swing_n==1) {zu=shift+1;}
if (Swing_n==-1) {zd=shift+1;}
} else {
if (Low[shift]HH) {Swing=1;}
}
ここのelse分でSwingの値が割り振られ、Swingの値によって計算を進めていきます。
なんかここも分かりにくい・・・
if (Swing==1) {
if (High[shift]>=BH) {BH=High[shift];zu=shift;}}
if (Swing==-1) {
if (Low[shift] < =BL) {BL=Low[shift]; zd=shift;}} Swing_n=Swing; } ここの文章なんですけど、分かりやすく書くと if (Swing==1) {   if (High[shift]>=BH) {
    BH=High[shift];zu=shift;
  }
}
if (Swing==-1) {
  if (Low[shift] < =BL) {     BL=Low[shift]; zd=shift;   } } こうですね。 ここでSwingの値によってBHとBLの値が割り振られます。 Swing_n=Swingという式がfor文の最後にあることから、 Swingの値をフィードバックさせているみたいですね。 そして、 if (Swing!=Swing_n && Swing_n!=0) { ここで、Swingの値に変化があったときにだけ、グラフを書くようにする・・・ すっごく要約します。
読むのここだけでいいかもしれません。

Lengthの期間の間で高値・安値の更新が確認されたときに、
Swing!=Swing_nになっていれば新しい線を引きます。
同一方向への更新のみ(Swing==Swing_n)であれば、
ひとつ前の点を削除し上書きさせ、Swing!=Swing_nになるまで待ちます。
最後までお読みくださりありがとうございます。
頑張って書いてきましたが、かなり難しい内容に仕上がってしまいました。
精進します・・・。

コメント

タイトルとURLをコピーしました