指標となる質問

 

皆さん、こんにちは。

iFractalsを搭載したコードベースのインジケーターで配列に関する一般的なトピックをフォーラムで第一人者の方々に教えていただきながら勉強していました。


ということで、とりあえず

インジケータに足し算機能を 追加するための条件演算子やロジック演算を追加することが出来ず

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


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

//---- buffers
double v1[1000];
double v2[1000];
double v3[1000];
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 i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0)
         {        
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

という条件演算子やロジックを追加することができませんでした。通常、このようなアイデアはEAでは機能しますが、インジケータでは機能しません。

IEif(v1 > 0 && faster > slower) といった具合です。

というのがありますが、これではインジケータが消えてしまいます。

その他にも、if(他の条件)などで目的のインジケータを生成するはずだと考えた組み合わせはたくさんあります。
すべてprint文の出力を生成しません。

私はここでどのような点を逃しています。

アドバイスお願いします。
ありがとうございます。





 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar:


さて、最初はそうしていたのですが、その後、私がやりたかったバッファの値の印刷ができなくなりました まあ待ってください、これを言い直させてください。バッファの要素数を宣言しないと、v1[i]=High[i] のようにインジケータは動作しますが、Print (v1[i]); は出力しません。なぜなら、私の知る限り、要素数が宣言されていないと、非宣言の配列値を出力する方法がないので、常に0と出力されます そこでグローバル宣言しない場合、インジケータは動作します。ただし if(faster>slower) はまだインジケータを消しており、値もプリントされません。また、v1[i]=High[i]で再初期化すると印刷できるようになりますが、&& faster > slowerのような追加をすると、またインジケータが








消えます。なぜなのか、完全に理解できていません。ありがとうございました。
 

私はあなたのコードを取り、バッファの 宣言から値を取り出し、それはうまく動作します... ...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if


 
RaptorUK:

私はあなたのコードを取り、バッファの 宣言から値を取り出し、それはうまく動作します... ...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if <----High

------>この時、フラクタルは矛盾した高値は、以前の安値よりも低い <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if <----Low

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if<----High

------> この時、フラクタルは整合性のない高値は、以前の安値よりも低い <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if<----Lowの場合

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if<----High

------>この時、交互に現れるフラクタルは一貫して <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if <----Low
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if <----High


面白いですね、結果をthx Agent86V2です。フラクタルは 確かにそれらの興味をそそるが、取引に有益な方法の一つであることができます。

 
RaptorUK:

私はあなたのコードを取り、バッファの 宣言から値を取り出し、それはうまく動作します... ...

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if


私はまた、他のスレッドでそのケースではなかったゼロ値を生成することなく、コードを印刷することができます。
私はちょうどそれを得ることができない申し訳ありません。自分ではわかっているつもりだったのですが、まだ何か足りないようです。

int start()
   {
   double test[];
   
   test[39] = 45.6;
   Print("test[39]= ",test[39] );
   

      return(0);
   }
あなたは私に上記のように宣言するように指示しました。

そして、あなたはこのトピックを引用しました。

配列についての本を読んだとき、次のように書いてあるのを見ましたか?

「配列の宣言時には、データ型、配列名、各次元の要素 数を指定する必要があります。

このスクリプトのように、double test[40];を宣言しないと、一方ではこの配列をプリントできませんが、今は宣言なしでもプリントできるようになったようです。

つまり、宣言の有無にかかわらず、バッファの中の値を印刷することができるようです。

しかし、if(faster > slower) や && faster > slower のような通常望む結果を出すはずの条件を追加することができません。
EMAでも何でも良いのですが、なぜうまくいかないのか理解したいのです。
インジケーターの高値が消えてしまい、v1プリントの出力が終了してしまいます。条件通りに落ちて出力されると思っていたのですが。

このためにコード ブロックを追加してみましたが、同じ結果でした。

ありがとうございます。
 

また、こんなことも書いています ... ...

RaptorUK:

インジケータバッファは特別な配列です ... 配列とバッファを混同しないでください、それらは似ていますが違います。

元のコードではv1[]とv2[]はバッファで、最新のコードではArrayです。Arrayを宣言するときはサイズを指定する必要があり、例えばv1[50]はv1[0]からv1[49]まで50要素あります。バッファは、必要な要素数が増えると自動的にリサイズされ、バッファ内の値も自動的に移動します。現在形成されているバー、バー0を考えてみましょう。このバーが終了すると、そのバーに関連するインディケータの値はインデックス1にシフトしなければなりません ... これはバッファで自動的に行われます ... もし、配列で同様のことをしたい場合は可能ですが、自分でコーディングしなければなりません。

 
Agent86:

しかし、if(faster > slower) や && faster > slower など、通常であれば望ましい結果をもたらすはずの条件を追加することができないのです。
EMAであれば何でも良いのですが、なぜうまくいかないのかが知りたいのです。
インジケーターの高値が消えてしまい、v1プリントの出力が終了してしまいます。条件通りに落ちて出力されると思っていたのですが。

このためにコードブロックを追加してみましたが、同じ結果でした。

ありがとうございます。

コードを表示して、動作しないもの.私はテクニカル指標を 使用しません......これまで、だから私はあなたがEMAなどで何を意味するのか知っていると仮定しないでください;-) あなたは私にあなたのコードを示す必要があります。
 
RaptorUK:

また、こんなことも書いています ... ...

RaptorUK です。

インジケータバッファは特別な配列です ... 配列とバッファを混同しないでください、それらは似ていますが違います。

元のコードではv1[]とv2[]はバッファで、最新のコードではArrayです。Arrayを宣言するときはサイズを指定する必要があり、例えばv1[50]はv1[0]からv1[49]まで50要素あります。バッファは、必要な要素数が増えると自動的にリサイズされ、バッファ内の値も自動的に移動します。現在形成されているバー、バー0を考えてみましょう。このバーが完了すると、そのバーに関連する指標値はインデックス1にシフトしなければなりません。

そうですね、「似ているけれど違う」。これ以上の言葉はないでしょう。
 
OK, similar but different I get it, I initially had major problem even printing v1[i] at any point in the code, but now seems to print as I expected to originally.私は最初、コードのどの時点でもv1[i]を印刷することに大きな問題がありました。
私は最初のインジケータループ内で印刷することができなかったので、私は唯一の第二のループを作成しましたが、今それは印刷されている
とにかく、私はこれを蒸し返すつもりはありません私はそれを得たと思います。

だから、動作しないコードは、ここに示すいくつかの例です。

//+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#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 = 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 i=Bars;
//----
  
    for(i=Bars; i>=0; i--)
     {
      val1=iFractals(NULL, 0, MODE_UPPER,i);
      if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
          Print ("v1[", i, "]= ", v1[i], " if");
          }    
               
      else          
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2=iFractals(NULL, 0, MODE_LOWER,i);
      if (val2 > 0)
         {
          v2[i]=Low[i];
          
          Print ("v2[", i, "]= ", v2[i], " if");
         }
          
      else          
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+

ありがとうございます。

 
Agent86:

ということで、うまくいかないコードは、ここに示すいくつかの例です。

ありがとうございます。

OK、あなたの問題が何であるか、または私はあなたにいくつかの手がかりを与えることができます....もし、私に教えてほしいのであれば、そう言ってください。.

ループの中で、for(i=Bars; i>=0; i--) ...より速くより遅い ための値は何ですか?

理由: