指標となる質問 - ページ 3

 
Agent86:
.

とにかく、iMACDのクロス、EMAのクロス、その他の指標のクロスなど、別の条件が発生したときにのみ、高いフラクタルが形成されるようにしようとしていたのです。
そうすれば、すべての条件が満たされたときにのみ、フラクタルがインジケータに表示されるようになります。


何をしようとしているのか正確にはわからないのですが、外部入力に注目して試してみてください。

#property indicator_chart_window      extern bool condition1 = true;
#property indicator_buffers 3         extern bool condition2 = true;
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");

   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A"); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), //MODE_MAIN
            slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL
           
            
   int bars = Bars;
//----
  
   for(int i=bars; i>=0; i--)
    {
     if(condition1)
       {
        val1=iFractals(NULL, 0, MODE_UPPER,i);
        if (val1 > 0) v1[i]=High[i];       
       }   
     if(condition2)
       {      
        val2=iFractals(NULL, 0, MODE_LOWER,i);
        if (val2 > 0) v2[i]=Low[i];
       }
     }    
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
WHRoeder:
その結論に至った経緯と、機能的な違いは何でしょうか?

そうですね、MQL4の場合はそうではないような気がします。 でも、いい練習になるかもしれませんね。



 

あるいは、このようなものでしょうか?

このようにすると、あなたのインジケータは、すべてのオブジェクトを一度に描画し、新しいバーが形成されたときに新しいオブジェクトを追加するのではなく、新しいティックごとにすべてのオブジェクトを再描画しているため、本当にIndicatorCounted()を使用 しなければならない。

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers(3);

   SetIndexArrow(0, 111);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DOT,1,Blue);
   SetIndexBuffer(0, v1);
   SetIndexLabel(0,"Resistance");

   SetIndexArrow(1, 111);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DOT,1,Red);
   SetIndexBuffer(1, v2);
   SetIndexLabel(1,"Support");

   SetIndexArrow(2, 111);
   SetIndexStyle(2,DRAW_ARROW,STYLE_DOT,1,White);
   SetIndexBuffer(2, v3);
   SetIndexLabel(2,"High A"); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double   faster=0;
   double   slower=0;         
   int      bars = Bars;
//----
  
   for(int i=bars; i>=0; i--)
    {
     faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i); //MODE_MAIN
     slower = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i); //MODE_SIGNAL
     val1=iFractals(NULL, 0, MODE_UPPER,i);
     val2=iFractals(NULL, 0, MODE_LOWER,i);
     
     if(faster > 0)
      {
       if (val1 > 0) v1[i]=High[i];
      }
      
     if(faster < 0)
      {
       if (val2 > 0) v2[i]=Low[i];
      }        
    }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
diostar:
この結論に至ったのは、おそらく私がOOPの観点から見ていたからでしょう。 しかし、これは良い練習になるのではないでしょうか?

スコープを限定することは常にグッドプラクティスであり、変数やオブジェクトを使う場所で定義し、その時点で初期化することは常にグッドプラクティスです。

ループの外側でオブジェクトを定義すると、デフォルトのコンストラクションに加え、N個の代入が行われます。ループの内側で定義した場合は、N個のコンストラクションに値が割り当てられ、通常はより速くなります。

最適化については、その変更が有効であることが証明されるまで、決して心配しないでください。

 
WHRoeder:

スコープを限定するのは常に良い習慣だ。変数やオブジェクトを使う場所で定義し、その時点で初期化するのは常に良い習慣だ。

ループの外側でオブジェクトを定義すると、デフォルトのコンストラクションに加え、N個の代入が行われます。ループの内側で定義すると、N個の構文と値が生成される - 通常はもっと速い。

最適化については、その違いが証明できるまで気にしないこと。

これは、そのイテレータにも適用されるはずです。
 
diostar:
これは、そのイテレータにも適用されるはずです。
私は同意するが、このコードを書いたのは私ではない。
 
OK、私は今、作業コードのいくつかのバリエーションを持っているようだありがとうございます。

しかし、私はなぜループの外側の変数の宣言(より速く、より遅い)がダメで、ループの内側ではOKなのか、少し混乱しています。

そして、まだint i = Barsは、ループの外側または内側で動作するのでしょうか?


とにかく、私が取り組んでいたアイデアのいくつかがすでにこのスレッドに投稿されているのを見るのは良いことです。これは、私がいつか自分で何かをコーディングできるように少し近づいていることを意味します。だから、少しの進歩は、ないよりはましです。ありがとうございます。

それで、今私はいくつかの指標時間を比較することに取り組むことができます、私は今これを把握しようとします。

こんな感じ。
このような比較は、「v1[i]とv2[i]の現在形成されている指標時間 && / || if(v1[i] time is > v2[i] time) 」と他の比較のようなものですね。

皆さん、たくさんのヒントをありがとうございました。
 
WHRoeder:

スコープを限定するのは常に良い習慣だ。変数やオブジェクトを使う場所で定義し、その時点で初期化するのは常に良い習慣だ。

ループの外側でオブジェクトを定義すると、デフォルトのコンストラクションに加え、N個の代入が行われます。ループの内側で定義すると、N個の構文と値が生成される - 通常はもっと速い。

最適化については、その違いが証明できるまで気にしないこと。

これは、インジケータやカスタムインジケータだけ でなく、すべてに当てはまると思うのですが?
 
Agent86:
OK、私は今、作業コードのいくつかのバリエーションを持っているようだありがとうございます。しかし、ループの内側では大丈夫なのに、なぜループの外側で変数(fasterとslower)を宣言するとダメなのか、少し混乱しています



また、int i = Barsは、ループの外でも内でも動作するのでしょうか?


インジケータを作成する場合、チャート上の各バーにコードを適用することになります。

元のコードではそうなっています。

double   faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1), 
最後のパラメータ1は、チャートのバー1(バー0としてインデックスされた現在のバーの前のバー)にあったmacdの値です

明らかに、ヒストリカルチャート全体の条件演算子で、その単一のmacdの値を使用したいわけではありません。

macdのインデックスを各バーと同じバーインデックスにする必要があり、例えば500バーでは次のようになります。

faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,500) 

この最後のパラメータは、インジケータがアルゴリズムを適用しているバーの番号に合わせて変更する必要があります。

そのため、ループの中でそれを行う必要があり、最後のパラメータにループサイクル・イテレータ(i)を使用することで、ヒストリカルチャートの各バーにあったmacd値を取得することができるのです。

faster = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i), 

これで少しはすっきりしたでしょうか。

 
WHRoeder:
この変更を試してください
なぜfor(int i = Bars-1 ?なのですか?

また、なぜfor(int i = Bars ?)よりも良いのでしょうか?

アドバイスお願いします。