[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 29

 
hoz:

ジグザグインジケーターから値を抽出する方法を教えてください。一般的にはどのように実装されているのでしょうか?I.e.最後の1つだけでなく、ある極限を拾い上げたい場合。

例えば、このジグザグをExpert Advisorに付けたいとします。

iCustom 関数は通常カスタムインジケータのアドレスとして使用するので、それを使用する必要があることは理解しましたが、問題はノードの接続方法です...。

バッファは原則に従ってNEUTRAL(EMPTY_VALUE)値を探している。

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
とiCustom()経由でインジケーターバッファにアクセスすることができます。
 
TarasBY:

バッファは原則に従ってEMPTY_VALUEの値を探している。

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

で、インジケーターバッファはiCustom()でアクセスします。


理にかなっている。しかし、空でない値に 出会うまで、このように検索されます。そして、例えば、私が、実は、最後の空でない値、つまり、最後の極値でなく、別のものが欲しいとしたら...。例えば、こちらのスクリーンショットでは

 
hoz:


理にかなっている。しかし、この方法では、空でない 値に出会うまで検索することになる。そして、例えば、私が、実は、最後の空でない値、つまり、最後の極値でなく、別のものが欲しいとしたら...。例えば、こちらのスクリーンショットでは

ループの中に極値カウンタを導入し、極値(空でない値が連続する)の数でループを中断するのがよいだろう。
 
TarasBY:
ループ内に極値カウンタを入力し、極値(空でない値が連続している)の数でループを解除する。

了解です。ありがとうございます。あとは、それをすべて実践で活かすことです。大筋は分かるが、頭の中がフィルターだらけで、脳みそが沸騰しそうだ...。
 
hoz:

了解です。ありがとうございます。あとは、それを実際に応用していくことです。アイデアは浮かんだが、頭の中のフィルターが多すぎて、脳みそが沸騰している...。

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


ピークの小節番号が必要な場合は、関数の型を int に変更し、return(ind); の代わりに return(i) と記述してください。

また、コード中でiを使っている場合、特に検索(チュートリアルのように)の場合は、この関数のiを他の変数、例えばkに変更してください。

そして、インジケータ用の関数内部でiCustomを設定するようにしてください。

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


ピークの小節番号が必要な場合は、関数の型を int に変更し、return(ind); の代わりに return(i) と記述してください。

また、コード中でiを使っている場合、特に検索(チュートリアルのように)の場合は、この関数のiを他の変数、例えばkに変更してください。

そして、インジケータ用の関数内部でiCustomを設定することを確認してください。

ニコライ さん、面白いですね!もちろん、条件も書いて ありますよ。見ていて思うのは...

if(ind!=0) n--;

else

if(ind!=0) return(ind);

カスタムインジケーターの バッファがゼロの値を返した場合、n--、カスタムインジケーターのバッファがゼロの値を返した 場合、...ということが判明したのです。インジケータ・バッファの値を返します。

しかし、条件は同じです。そして、ゼロではないにしろ、そこそこ...。

 
hoz:

ニコライ さん、面白いですね!もちろん、条件も書いて ありますよ。見ていて思うのは...。

カスタムインジケータバッファが0という値を返した 場合はn--、カスタムインジケータバッファが0という値を返した 場合は......ということが判明したのです。インジケータ・バッファの値を返します。

しかし、条件は同じです。そして、ゼロではないにせよ、そこそこ...。

コードを正しく挿入しようとしたときに歯列矯正器が落ちてしまった。

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

n>1 {の場合

バッファが空でない場合,n から 1 を引く。

} その逆

バッファが空でない場合、その値を返します。

}

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


とか、もっと簡潔なこんな感じです。コードの速さと美しさにこだわっています、気にしないでください )
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


とか、もっと簡潔なこんな感じです。コードの速さと美しさにこだわっています、気にしないでください)


一般的には、どちらも問題ありません。私はちょっと違ったコードの書き方に慣れているだけで、あなたのは違うけどこっちの方が読みやすいよ。各コードの最初の括弧が動きません。EDITORに入れたら、全部がそんなふうに定位置になりました。

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


基本的にはどちらでも問題ありません。私はコードの書き方に慣れていて、こちらの方が読みやすいのですが、あなたの方は違いますね。各コードの最初の括弧が動きません。Editorに入れたら、この形で全てが定位置になりました。


1000行を超えると、コンパクトに書くようになる)。

また、MT4では、特にテストを実行するときにパフォーマンスが低下します。饒舌な方がパフォーマンスが速い。