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

 
最初のページでcomposterさんがあげて いるコードで実験してみます。もしかしたら、何かうまくいくかもしれない。
 
nen:
正しくは、計算されています。セル番号が 判明する。このセル(時系列)からバーの最大値または最小値を取得する。このバーで最大値を見つけたと考えられる。この値は、見つかった番号と 一緒にインジケーターバッファーに置かれます。インジケーターの最大値は、バー上の最大値と一致させる必要があります。私のコードでは、同じ発見番号の配列(時系列)から最大値も取り出してvalの 値と比較しています。この番号のバッファにvalの値を入れて、正しい処理をしているかどうかをチェックします。また、バーの最大値と同じにする必要があります。同じ場所から採取した数字を比較するのは、まったく正しいことです。

比較...==val、はセル番号が刻々と変化する可能性があるため、危険だと思われます。特に小さなタイムフレームで、Lowと Highが 密接にマッチしているものが多くあります。しかし、よく考えてみると、もしかしたら私たちは違う瞬間を意味しているかもしれません。
 
nen さん、このジグザグをテストしてみませんか?実は、これはジグザグを使った経験があり、ジグザグに何を求めているかを知っている皆さんへのお願いなんです。このプロトタイプから何か役に立つものが作れるかも?
//+------------------------------------------------------------------+
//|                                                      CZigZag.mq4 |
//|                                         Copyright © 2006, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Candid"
#property link      "likh@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
//extern int ExtBackstep=3;

int    shift;
double res;
int i;
int fBar;
double CurMax,CurMin;
int CurMaxPos,CurMinPos;
int CurMaxBar,CurMinBar;
double hPoint;
double mhPoint;
double EDev;
int MaxDist,MinDist;
bool FirstRun;
bool AfterMax,AfterMin;

//---- indicator buffers
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZag);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("CZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
//    EDev = ExtDeviation*Point;
    EDev = (ExtDeviation+0.5)*Point;
    AfterMax = true;
    AfterMin = true;
    fBar = Bars-1;
    CurMax = High[fBar];
    CurMaxBar = 1;
    CurMin = Low[fBar];
    CurMinBar = 1;
    MaxDist = 0;
    MinDist = 0;
    FirstRun = false;
  }
//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (AfterMax) {
//      res = Low[shift]-CurMin-hPoint;
      res = Low[shift]-CurMin;
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            AfterMax = false;
            AfterMin = true;
            CurMaxBar = CurMinBar+1;
            CurMaxPos = Bars-CurMaxBar;
            CurMax = High[CurMaxPos];
            for (i=CurMaxPos-1;i>=shift;i--) {
              if (High[i] > CurMax+hPoint) {
                CurMaxBar = Bars-i;
                CurMax = High[i];
              }
            }  //  for (i=CurMaxPos-1;i>=shift;i--)
            ZigZag[Bars-CurMaxBar] = CurMax;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMax) 
    if (AfterMin) {
//      res = CurMax-High[shift]-hPoint;
      res = CurMax-High[shift];
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            AfterMin = false;
            AfterMax = true;
            CurMinBar = CurMaxBar+1;
            CurMinPos = Bars-CurMinBar;
            CurMin = Low[CurMinPos];
            for (i=CurMinPos-1;i>=shift;i--) {
              if (Low[i] < CurMin-hPoint) {
                CurMinBar = Bars-i;
                CurMin = Low[i];
              }
            }  //  for (i=CurMinPos-1;i>=shift;i--)
            ZigZag[Bars-CurMinBar] = CurMin;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


パラメータ名はそのままですが、動作が異なるのでご注意ください。


 
こちらも、私のZigZagをご覧ください、真相がわかるかもしれません.

//+------------------------------------------------------------------+
//|                                                        DT_ZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, klot."
#property link      "klot@mail.ru"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Red
//---- indicator parameters
extern int ExtDepth=12;
//---- indicator buffers
double zzL[];
double zzH[];
double zz[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
 //  IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexArrow(2,159);
   SetIndexArrow(1,159);
//---- indicator buffers mapping
   SetIndexBuffer(0,zz);
   SetIndexBuffer(1,zzH);
   SetIndexBuffer(2,zzL);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
     
//---- indicator short name
   IndicatorShortName("DT_ZZ("+ExtDepth+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    i,shift,pos,lasthighpos,lastlowpos,curhighpos,curlowpos;
   double curlow,curhigh,lasthigh,lastlow;
   double min, max;
   ArrayInitialize(zz,0.0);
   ArrayInitialize(zzL,0.0);
   ArrayInitialize(zzH,0.0);
   
   lasthighpos=Bars; lastlowpos=Bars;
   lastlow=Low[Bars];lasthigh=High[Bars];
  for(shift=Bars-ExtDepth; shift>=0; shift--)
    {
      curlowpos=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      curlow=Low[curlowpos];
      curhighpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      curhigh=High[curhighpos];
      //------------------------------------------------
      if( curlow>=lastlow ) { lastlow=curlow; }
      else
         { 
            //идем вниз
            if( lasthighpos>curlowpos  ) 
            { 
            zzL[curlowpos]=curlow;
              ///*
              min=100000; pos=lasthighpos;
               for(i=lasthighpos; i>=curlowpos; i--)
                  { 
                    if (zzL[i]==0.0) continue;
                    if (zzL[i]<min) { min=zzL[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=min;
               //*/
            } 
          lastlowpos=curlowpos;
          lastlow=curlow; 
         }
      //--- high
      if( curhigh<=lasthigh )  { lasthigh=curhigh;}
      else
         {  
            // идем вверх
            if( lastlowpos>curhighpos ) 
            {  
            zzH[curhighpos]=curhigh;
           ///*
               max=-100000; pos=lastlowpos;
               for(i=lastlowpos; i>=curhighpos; i--)
                  { 
                    if (zzH[i]==0.0) continue;
                    if (zzH[i]>max) { max=zzH[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=max;
           //*/     
            }  
         lasthighpos=curhighpos;
         lasthigh=curhigh;    
         }       
    //----------------------------------------------------------------------
    }
 return(0);
}
//+------------------------------------------------------------------+



 
nen このジグザグをテストしてみませんか?実は、これはジグザグの経験があり、ジグザグに何を求めているかを知っている人へのリクエストなんです。このプロトタイプから何か役に立つものが作れるかも?
パラメータの名前は同じですが、動作が異なるのでご注意ください。


キャンディッド 拝見させていただきます。初めてインストールしたとき、次のような観測がありました。
同じ高値のバーが何本か連続している。あなたのジグザグのバリエーションは、最後のバーでブレーク(トップ)を描画します。つまり、ゼロに一番近いバーです。理想的には、ゼロバーから最も遠い最初のバーでブレークを描くべきです。最初に現れる頂点は重要である。mtnemumsと同じです。引用が必要な場合は、複数の文献を引用することができる。
 
klotさん、 ありがとうございます。DT-ZigZagのアイデアに従って、私もハイタイムフレームのデータで動作するインジケータを作りました。しかし、私はアイデアを残してきただけです。自分なりのアルゴリズムを作りました。昨日はジグザグにさらに修正を加えました。現在、集団テストのためにアップロードしています。あなたのバリエーションは必ず試してみます。以下、今回の騒動の原因となったインジケーターの説明です。http://onix-trade.net/forum/index.php?showtopic=373。 なお、DT-ZigZagモードはインジケーターに付属している外部ジグザグを使用します。そして、この外付けのジグザグは、最初のビームで失敗することがあります。外付けジグザグの新バージョンをテスト中です。
 
klot ありがとうございます。DT-ZigZagのアイデアに従って、より高い時間枠のデータで動作するように私のインジケータを作りました。しかし、私はアイデアを残してきただけです。自分なりのアルゴリズムを作りました。昨日はジグザグにさらに修正を加えました。現在、集団テストのためにアップロードしています。あなたのバリエーションは必ず試してみます。以下、今回の騒動の原因となったインジケーターの説明です。http://onix-trade.net/forum/index.php?showtopic=373。 なお、DT-ZigZagモードはインジケーターに付属している外部ジグザグを使用します。そして、この外付けのジグザグは、最初のビームで失敗することがあります。外付けジグザグの新バージョンをテスト中です。

はい、気づきました :) 単なる思いつきです :) .今はZZを使いまわしています(上の投稿のコード)他のTFデータとの連携がより安定します。
 
nen:
最初のインストールで、すぐに次のような観察結果が出た。
同じ高値のバーが何本か連続している。ジグザグオプションは、最後のバーでブレイク(上)を描きます。
嗚呼、だから私は「選択肢」を間違えてしまったのか。これからソースの投稿のコードを編集します。変更の兆候は、間違った「オプション」の行をコメントアウトしたことです。
 
キャンディッド、もう大丈夫です。
Klot、面白いオプションですね。

ジグザグのバリエーションが興味深い結果を示した場合、私の開発で適用することは可能ですか?
 
ジグザグのバリエーションが面白い結果を示したら、デザインに応用できないか?は
い、もちろんです。テストの結果が良好であれば、Code Baseに追加してみることもあります。