Lowest関数とHighest関数が返すもの

 
メタトレーダー開発者の皆様へ

Lowest関数とHighest関数は何を返すのですか?
なぜ、そんな質問をするのだろう。これらの機能の説明はわかりにくい。MetaTraderに搭載されたZigZagがなぜ正常に動作しないかを分析したところ、上記の関数が何を返すのかが不明であることに直面しました。それとも、わかりにくい記述のために、誤用されているのでしょうか?この問題については、このフォーラムの77ページ「エリオット波動理論に基づく取引戦略」の項で説明しました。私は、ZigZagのアルゴリズムが間違っているのではと思い、理解しようとしています。しかし、これらの機能がどのように機能するかによって、すべてが変わってきます。

また、他のインジケーターでもこれらの機能に問題があることが確認されています。しかし、現時点ではZigZagにあります。

明確にしてください。
 
現在のバーからヒストリーの後ろまでのN本のバーのうち、最も高いバーと最も低いバーの番号を返します。この場合、2つの値が等しい(このサンプルでは2つのバーが極値である)場合、常に先に来た(古い)バーの番号が返されます。

ジグザグアルゴリズム(MT4に標準搭載)は、1本のバーが最大値と最小値を同時にとる場合(アウターバー)を考慮しません。
 
ロッシュ それは理解できる。 波動解析スレッドであげた線をジグザグテキストに挿入してみてください。そして、何が出てくるか見てみましょう。そして、ゴミが出る。という疑問が湧いたわけです。

理論と実践が乖離し始めるまでは、すべてがクリアになる。ミスが発生しても、最後までやり遂げなければならない。そして、その間違いがどこから来ているのかを突き止める。
 
ロッシュ それは理解できる。 波動解析スレッドであげた線をジグザグテキストに挿入してみてください。そして、何が出てくるか見てみましょう。そして、ゴミが出る。そのため、このような質問をさせていただきました。<br /> translate="no">。


オニキスのそのページを見て、標準のジグザグを開いて比較しました。コードも違うし、ジグザグのバリエーションを探して、徹底的に分解して、初めて言えることがあるんです。だから、答えられないんです。

しかし、そうですね、コードに記録される値に違いがあり、それがあなたのページに表示されるのですが、もしかしたらそのようにすべきなのかもしれません、何とも言えませんね。クロール値でこのような指標をやっていると、チャンネルに見えるが、少なくとも履歴に嘘はない。
 
Rosh、以下はcodebase.mql.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;
}


============================

アスタリスクは、私が波動解析の枝の77ページで引用した場所を示しています。このコードは、私が引用したコードとどう違うのですか?これは標準的なコードです。

さて、このスレッドの2番目の投稿からあなたの言葉を引用します。

ロッシュ 18.10.06 10:14

ヒストリーの深さで、現在のバーからN本以内の最高値と最安値のバーの番号を返します。この場合、2つの値が等しい(2つのバーがそのサンプルで極値である)場合、常に最初に来た(最も古い)バーの番号を返します。

ジグザグアルゴリズム(MT4に標準搭載)は、1本のバーが最大値と最小値を同時にとる場合(アウターバー)を考慮しません。
======================
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)] という一行があります。
角括弧内はバー番号...さて、このバー・ナンバーが何であるかは、あなたの答えに書いてあります。

そして、ExtMapBuffer[shift]=val; という行で、何があるでしょうか。これ以上説明する必要はないでしょう。

まず、インジケータ・バッファのインデックスがバーのインデックスと同じでなければならず、そこからvalの値を取得します。そうでない場合は、矛盾が生じます。実際にあるのは、ジグザグに切れ目があるのを見たときです。

ロッシュ、脱線するなよ。あなたの脳内はジグザグです。その真相に迫ろう。コードに間違いが多い。私が書いたものを注意深く解析すれば、明らかな誤りがあることがわかるはずです。

でも、それもメインではありません。これらのエラーについてだけであれば、このスレッドのタイトルである質問はしなかったでしょう。
 
もう一度、LowestとHighestの機能について。

前回の記事で、ジグザグコードのエラーについて書きました。

主なエラー

ExtDepthバーのストレッチの中で、最高値または最安値を持つバーが検索されます。SHIFTバーから検索を行います。Rocheは次のような関数の定義を示しました。それは、履歴セクションの現在のバーからN本以内の最高値と最低値のバーの番号を返すものです。しかし、現在のバーが何であるかの定義はない。現在のバーは、ゼロバーまたはシフト番号を持つバーです。ジグザグのコードから判断して、現在のバーはシフト番号を持つバーと理解されるはずである。

小節のExtDepthセクションで、シフト番号のある小節から数えて小節番号を見つけたとします。そして、そのバーには、必ずしもシフト番号があるわけではありません。しかし、見つけたバーの極値でシフト番号のバーと異なる値は、シフト番号のインジケーターバッファに 置かれます:ExtMapBuffer[shift]=val.それゆえ、空中に垂れ下がっているジグザグに切れ目が入るのです。MTからジグザグに取り組もうとした人なら、誰もが見たことがあるはずです。

これは大きな間違いです。しかし、この間違いは簡単に正すことができます。そして、そのことを持ち出すのは無駄だった。

この誤差を解消するために、「最下位関数と最上位関数が、どの番号のバーで、探している極値を見つけたか?ここでは理屈は通用しない。このバーの番号をいくら考えても、うまくいかないのです。

そのため、開発者に向けての質問となった。

でも、その質問にロッシュが答えてくれたのは嬉しかった。MTに付属するジグザグをずっと使い続けてきたのは、彼の編集のおかげなんです。

開発者の皆様、質問事項にご注意ください。質問は真剣です。多くのインジケータはMTに含まれるジグザグを使用しています。ジグザグの作業に対する不満は数え切れないほどです。
エラーの説明をさせていただきました。それなりに、エラーは修正する必要があります。エラー訂正を無視すると、会社の評判が落ちる。そして、それは良くないことです。誰もそんなこと望んでいない。
 
...ここで、最低値関数と最高値関数が、どのバーで私たちが探している極限を見つけたのか、という疑問が生じます。ここでは理屈は通用しない。どんなに頑張ってもバーの数を計算してもうまくいきませんでした。理
論上は、バーのインデックス = Highest(NULL,0,MODE_HIGH,ExtDepth,shift)

つまり、ExtMapBuffer2[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]=valとなるはずです。
 
nenさん、標準的なZig-Zagアルゴリズムについて調べてみました。

、あなたがあげたものとは別のアルゴリズムがあります。
//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtLowBuffer[];
double ExtHighBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtLowBuffer);
   SetIndexBuffer(2,ExtHighBuffer);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos,index;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;
//----
   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      index=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      val=Low[index];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtLowBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtLowBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtLowBuffer[shift]=0.0;
      if(val!=0.0) ExtLowBuffer[index]=val;
      //--- high
      index=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      val=High[index];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtHighBuffer[shift+back];
               if((res!=0)&&(res<val)) ExtHighBuffer[shift+back]=0.0; 
              } 
           }
        }
      ExtHighBuffer[shift]=0.0;
      if(val!=0.0) ExtHighBuffer[index]=val;
     }
//---- final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtLowBuffer[shift];
      curhigh=ExtHighBuffer[shift];
      if(curlow==0 && curhigh==0) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtHighBuffer[lasthighpos]=0;
            else ExtHighBuffer[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtLowBuffer[lastlowpos]=0;
            else ExtLowBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
//---- merge 2 buffers
   lasthighpos=-1;
   lastlowpos=-1;
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         curlow=ExtLowBuffer[shift];
         curhigh=ExtHighBuffer[shift];
         //----
         res=0;
         if(curlow!=0)
           {
            if(lastlowpos==-1)
              {
               res=curlow;
               lastlowpos=shift;
              }
            else
              {
               if(lasthighpos!=-1 && lastlowpos>lasthighpos)
                 {
                  res=curlow;
                  lastlowpos=shift;
                 }
              }
           }
         if(curhigh!=0)
           {
            if(lasthighpos==-1)
              {
               res=curhigh;
               lasthighpos=shift;
              }
            else
              {
               if(lastlowpos!=-1 && lasthighpos>lastlowpos)
                 {
                  res=curhigh;
                  lasthighpos=shift;
                 }
              }
           }
         //----
         ExtMapBuffer[shift]=res;
        }
     }
  }
//+------------------------------------------------------------------+



インデックスが保存され、値が目的の配列要素に 書き込まれるなど、すべてが正しく行われているように思われます。このアルゴリズムから始めてみましょう。

 
nen さん、失礼ですが、これらのLowestとHighestを見つける短いコードを書く方が簡単ではないでしょうか?私は、これらの関数を使ったことがないだけで、正確には、extremaに必要なデータは簡単なショートコードで得られ、標準関数よりも確実に速く動作するからです。別の時間軸のデータを取得する必要がある場合にのみ使用することに意味があるように思います。
 
komposterさん、そうなんです。そして、どこに書き込まれているかを確認します。どのインデックスを持つインジケーターバッファーに
Vladislav, codebase.mql.comのコードですが、全く同じものです。あなたのコードを入れてみます。何が起こるかわからない。
Candid、よりシンプルになるかもしれないというのは同感です。しかし、私はこれらの機能を別の時間枠で動作させる必要があります。