Lowest関数とHighest関数が返すもの - ページ 2

 

返信できなかった(留守にしていた)。1つのことを話すために解析する必要があるコードを掲載する。
ZS そのジグザグはエラーではなくタイポ(MT3のコードと比較)だったので、このタイポだけを見つけ、他は修正しなかった。
 
Vladislav、なぜかあなたのコードはすべてのタイムフレームで 動作しません。ある時間枠では機能するが、他の時間枠では機能しない。不思議なことに、うまくいくんです。
 
Rosh、以下はcodebase.mql4.comにあるコードです。私も同じものを持っています。それを全世界の人たちと一緒に乗り越えていくことができれば、とてもありがたいと思います。私だけではありませんよ。よろしくお願いします。

今、そのような編集を大量に蓄積しています。なかなかいい働きをしてくれます。しかし、最初の光線(ゼロバーまたは最初のバーのいずれかから始まる光線)は、極値を識別する関数に誤差があり、失敗します。そして、インジケーターの動作が不安定になる。

//+------------------------------------------------------------------+
//| カスタム移動平均.mq4
//| 著作権 © 2005, MetaQuotes Software Corp.
//|https://www.metaquotes.net/|
//+------------------------------------------------------------------+
#property copyright "著作権 © 2005, MetaQuotes Software Corp."
#プロパティーリンク "https://www.metaquotes.net/

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 レッド
//---- インジケータ・パラメータ
extern intDepth=12;
extern inttern ExtDeviation=5;
extern inttern ExtBackstep=3;
//---- インジケータ・バッファ
double ExtMapBuffer[];
double ExtMapBuffer2[]。

//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2)です。
//---- 描画設定
SetIndexStyle(0,DRAW_SECTION)を設定します。
//---- インジケータ・バッファのマッピング
SetIndexBuffer(0,ExtMapBuffer)を設定します。
SetIndexBuffer(1,ExtMapBuffer2)を設定します。
SetIndexEmptyValue(0,0.0);
//---- インジケータの略称
IndicatorShortName("ZigZag("+ExtDepth+", "+ExtDeviation+", "+ExtBackstep+")");
//---- 初期化完了
return(0)です。
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift,back,lasthighpos,lastlowpos。
double val,res;
ダブルカールロー、カールハイ、ラストハイ、ラストロー。

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
さもなくば
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
さもなくば
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[shift+back]です。
if((res!=0)&&(res>val))ExtMapBuffer[shift+back]=0.0。
}
}
}
ExtMapBuffer[shift]=val;
//---高
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh)val=0.0。
さもなくば
{
LASTHIGE=VAL。
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
さもなくば
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back]です。
if((res!=0)&&(res<val))ExtMapBuffer2[shift+back]=0.0。
}
}
}
ExtMapBuffer2[shift]=val.ExtMapBuffer2[shift]とする。
}

// 最終カット
lasthigh=-1; lasthighpos=-1。
lastlow=-1; lastlowpos=-1;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer[shift]です。
curhigh=ExtMapBuffer2[shift]です。
if((curlow==0)&&(curhigh==0)) continue;
//---
if(curhigh!=0)とする。
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
else ExtMapBuffer2[shift]=0;
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh。
lasthighpos=shift;
}
lastlow=-1です。
}
//----
if(curlow!=0)
{
if(lastlow>0)
{
if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
else ExtMapBuffer[shift]=0;
}
//---
if((curlow<lastlow)||(lastlow<0))
{
lastlow=curlowです。
lastlowpos=shift;
}
lasthigh=-1です。
}
}

for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
さもなくば
{
res=ExtMapBuffer2[shift]です。
if(res!=0.0) ExtMapBuffer[shift]=res;
}
}
}
 
Vladislav、なぜかあなたのコードはすべてのタイムフレームで動作しません。ある時間枠では機能するが、他の時間枠では機能しない。不思議なことに、うまくいくんです。<br /> translate="no">。


他のタイムフレームでは機能するが、他のタイムフレームでは機能しない。私には効果があるようです。はい、そしてそれは私のコードではありません - 標準供給からそうであるようです。少なくとも私は、MTのすべてのバージョンでそうでした。
 
Vladislav、これはあなたのコードでないことは明らかです。私が提供したコードは、私の配信にあります。
どのタイムフレームで表示されないか。BC - Brezan。
GBP-CHF
m1、m15には表示されません。他全てに表示されます。
EUR-USD
表示されません - m1, m5
AUD-USD - すべて表示されます。
なぜそう見えるのかはわかりません。

おそらく、Slavaが夏に手直ししたコードをお持ちなのでしょう。しかし、私は彼の手直しが好きではありませんでした。そこで解決できなかった問題もある。
================
GODZILLA(ニコライ)いい仕事してました。しかし、解決したのは2つの問題だけです。
1)1目盛り ごとに再計算する。劇的に減らした
2)こぶ取りアルゴリズムを追加した。ハンプは主に、1本の棒に最小値と最大値の両方が存在することによって現れる。ジグザグアルゴリズムは、高域のみを残す。その結果、何度も高値を更新することがよくあります。

GODZILLで修正されたインジケータ改良のいくつかのバリエーションがあります。ぶら下がったキンクが取り除かれた。しかし、最初の2つの光線では、極限探索の関数の誤った操作がまだ続いているのでしょう。このような問題があるからこそ、ここでこの話題を取り上げたのです。

しかし、もしかしたら、検索機能は正しく動作していても、この機能についての明確な記述がないのかもしれません。そのため、間違った使い方をされてしまうのです。
 
指定したペアの全TENFに表示させています。このコードがどこから来たのか覚えていないのですが、197のビルド配信にあったと思ったのですが、なぜかすべてのMTに搭載しています :) 。明日、確認します。
 
恥ずかしながら、今までジグザグに真剣に興味を持ったことがありませんでした :).nenさんの 投稿にあるコード 18.10.06 17:46
まだ解けないんです。というような感じになるようです・
・・ // val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]; highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); val=High[highpos]; if(MathAbs(val-lastlow) < ポイント) val=0.0; // if(val==lasthigh) val=0.0; else { lasthigh=val; if(highpos!=shift) val=0.0; // if((val-High[shift])>(ExtDeviation*Point)) val=0.0; else { ...


ここでは、「余分な」古いコードはコメントアウトされています。ジグザグの考え方はまだ完全に理解できていないかもしれませんが。いずれにせよ、このコードではダングリングエクストリームは発生しない。もし、このコードバリエーションが適合しても、私が考案したものでなければ :) 参考不足で申し訳ないです。

 
キャンディッド、ありがとうございます。様子を見てみます。しかし、スレッドタイトルの疑問は消えない。ジグザグに進むだけで、極値を探索する関数の「わけのわからない」働きの問題が明らかになりました。highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); という行は、極値を見つけるのに役立ちます。しかし、ジグザグコードで実行したときにHighest関数が返すハイポスインデックスは、ランダムなことが多いのです。真のバー位置との乖離がある。つまり、highposは例えば15となる。しかし、実際には、バーは13や16など、別のインデックスを持つことになります。だから、その差が出るんですね。したがって、小さなパラメータ値や「小さな」時間枠(1分、5分...)でのジグザグは、不安定な動作を開始します。

なるほど。ジグザグは気にしないでください。質問は、ジグザグについてではありません。問題は、MQ4言語の機能が 安定的かつ予測可能に動作することです。

そして、これが主な問題点です。検索機能は、ジグザグだけではありません。しかし、その他にも多くの指標で

ジグザグは特殊なケースです。しかし、問題点を浮き彫りにするのに役立ちます。多くの指標はジグザグを基にしています。ジグザグ動作が不安定。それは誰にも秘密ではありません。多くの人は、自分のニーズに合わせてジグザグを自分でプログラミングすることに時間を割かなければなりません。どれだけ時間を無駄にしたことか。むなしく。問題の根本を理解していないからです。
 
Candid, your words: Ashamed to say, ........................。nenさんの投稿18.10.06 17:46のコードは、まだ理解できていません。

これは金言です。あなたが最初に言うことではありません。とはいえ、ジグザグの背後にあるアイデアや、このコードで部分的に実装されているものは非常に優れています。これらのアイデアを実現させなければならない。
 
2nen:
指標の計算 中にウィンドウを移動(shift,shift+ExtDepth)させた場合、新しい極値が出現するのは、新しい価格と古い極値がウィンドウから出たことの両方が関係している可能性があります。この点については、対処が必要です。このため、私の挿入には、if(highpos!=shift) val=0.0; という行が含まれています。標準コードではどうなっているのか、理解できない。私のバージョンでは、ダングリングエクストリームの欠落から判断すると、間違って行われているか、全く行われていないかのどちらかです。
また、ジグザグの不安定さとは、具体的にどのようなものなのでしょうか?