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

 
Candid もう大丈夫です。
Klot、面白いオプションですね。

ジグザグのバリエーションが興味深い結果を示した場合、私の開発で適用することは可能ですか?

もちろんできますよ。私は興味深くこの開発を追っていますし、あなたの作品がとても好きです。
 
ありがとうございます。
 
2ねん
オプション」に関しても。現在、エクストリームスイッチングの条件の1つは、現在のローが現在のローよりExtDeviationポイント以上高いことです(ハイについても同様)。必要であれば、他のオプションも簡単に実装できるコードになっています。
さて、klot さんに続いて、私が今、ジグザグに興味を持っているのは、ひとえに先生のデザインに興味を持ったからだということを付け加えておきたいと思います。
 
ソースコードを再度修正しました。昨日、分単位で最初の有効なバーのルールが尊重されないことがあることがわかりました。それを確認するために、1時間半しかオンライン時間がなかったのですが、2倍と0倍を比較すればいいということだったようです。
 
もう一つのバグ:Extremesはバーの終端でしか切り替えられないので、そうしないとリアルタイムとヒストリーに差異が生じる。修理は難しくありません。まだブランチのソースコードは修正していません。新しいバージョンは分単位で実行させてください。
 
キャンディッド、ZUPインジケーターの45バージョンを作りましたhttp://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=117997
ジグザグを外付けジグザグとして収録しました。安定的に動作するバージョンが登場したら、すぐに変更します。
 
今のところ問題はないようです。以下は修正版のコードです。
//+------------------------------------------------------------------+
//|                                                      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 Navy

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

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

//---- 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("ZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  int fBar;
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
    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;
    BarTime = 0;
    FirstRun = false;
  }


//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (BarTime!=Time[shift]) {
      BarTime=Time[shift];
      if (res > hPoint ) {
        MaxDist = Bars-CurMaxBar-shift+1;
        MinDist = Bars-CurMinBar-shift+1;
        if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
          if (AfterMax) {
            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;
          } else {  //  if (AfterMax)
            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;
          }  //  else if (AfterMax)    
        }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
      }  //  if (res > hPoint )
    }  //  if (BarTime!=Time[0])
    if (AfterMax) {
      res = Low[shift]-CurMin;
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      }  //  if (res < mhPoint)
    }  //  if (AfterMax) 
    if (AfterMin) {
      res = CurMax-High[shift];
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      }  //  if (res < mhPoint)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


ジグザグの違いのクセについて。このジグザグの最大の特徴は、すべてを一度に行うこと、過去のデータの再調査は極値が確定したときのみ、その極値以降のデータに対してのみ行うことである。つまり、相当なスピードが必要なのです。もちろん、描画の詳細は極限固定の基準によりますが、ここでは様々なオプションを簡単に実装することができます。例えば、私はすでに、直前の動きに対するパーセンテージで、Highが最小値から(それぞれLowが最大値から)離れることによって切り替えるバリアントを作り、切り替えを平均バーサイズに縛り付けることにしました。

 
ここでインジケーターのもう一つの問題点、ジグザグにねじれを発見しました(写真ではカーソルの十字)。キンクの時刻は端末の電源を切った時刻に対応し、価格は電源を入れ直した時刻に対応する。


疑いを晴らすために、コードにPrintを挿入してみました。
if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift]=",High[shift],", Low[shift]=",Low[shift]) とする。


その後、端末を終了し、数分後に再起動した。そして、ログの断片を紹介します。 。

2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.30 23:57:56 CZZ1 EURUSD,M3: shift=1, Bars=38233, Time(shift)=2006.10.31 23:5410.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=1, Bars=38233, Time[shift]=2006.10.31 22:50, High[shift]=1.2763, Low[shift]=1.2762 2006.10.31.31 23:58:26 CZZ2 EURUSD,M1: shift=2, Bars=38233, Time[shift]=2006.10.31 22:49, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=3, Bars=38233, Time[shift]=2006.10.30 (注1) 2006.10.31は、2006年10月1日から2006年12月31日までの期間です。10.31 22:47, High[shift]=1.2763, Low[shift]=1.2762 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=4, Bars=38233, Time[shift]=2006.10.31 22:45, High[shift]=1.2763.2763, Low[shift]=1.2762 2006.10.31 23:58:25 CZZ2 EURUSD,M1: shift=0, Bars=38230, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763 2006.10.31 22:51.31 23:58:25 CZZ2 EURUSD,M1: shift=1, Bars=38230, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762 2006.10.31 23:58:23 CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.30 CZZ 2 EURUSD:M2: shift=1, Bars=1.2762, Time(shift=1)2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762 2006.10.31 23:58:22 CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762


23時58分23秒にはまだ履歴がポンピングされておらず、23時58分25秒には最後の 1バールがポンピングされていることが分かります。そして、2006.10.31 23:58:26にだけ、すべての中間バーをポンピングしたのです。開発者に質問:これは通常のページングシーケンスなのでしょうか?また、そうであれば、何のために?明らかに、現在の価格値を早期に把握することが望ましい。しかし、しばらくの間、歴史に穴が開くことが予定されているということは、本質的に今回の指標の失敗が保証されていることを意味します。履歴が完全に入れ替わるまで
指標の計算を 先延ばしにした方がユーザーにとって安全ではないでしょうか?それともせめてフルスワップ後に再初期化?

 
再初期化」というのは間違いで、本来はトレイルブレイザーになるのですが...... :)
 
私はこのような歴史のページングを熟知しています。最初の5つのジグザグブレイクのチェックとZUPインジケーターの再計算を行いました。