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

 
それは、スコープと最終設定値についてです。 グローバルに宣言されている場合は、その関数の 外にもスコープがあります。 ループの中で変数の値が3回変化した場合、ループの外のコードが実行されるまでに、その変数には3番目の値が設定されているので、ループの外から2番目の値を取得することはできません。
 
そして、val1をshift 3で宣言したとします
そして、ループはもちろんshift iです

ループの外でval1を参照する場合、val1 globalとval1 loopedのどちらを参照するのでしょうか?



私はここでちょっと行き詰まりましたが、ABCDスキームは少なくとも少し進歩しているようです

とにかく、ここにコードがあります 何かアイデアはありますか?

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                                    Unfinished POS |
//|                      my attempt at an ABCD scheme and fib retrace | 
//+------------------------------------------------------------------+
#property copyright "Unfinished POS by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;


//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
   
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;                
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 
  


for(i=0; val1==0 || val2==0; i++)
     {
     if(iFractals(NULL, 0, MODE_UPPER,i) > 0 && val1 == 0) 
     val1 = iFractals(NULL, 0, MODE_UPPER, i);
     if(iFractals(NULL, 0, MODE_LOWER, i) > 0 && val2 == 0)
     val2 = iFractals(NULL, 0, MODE_LOWER, i);
     double A = val2;
     if(A !=0) 
     Print (A, " A loop down");
     double a = val1;
     if(a !=0)
     Print (a, " a loop up");
      
     //Print (" Last UPPER Fractal at ", val1, " Last LOWER Fractal at ", val2);
         
     }   
                            
      if(val1 > 0)
         {
         //Print (val1, " val1");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val1 time");      
         //datetime b = Time[3];
         ////Print (A, " A if");
         double Z=(val1-A)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double C=A+Z; //using the calc above to get the retrace value at .50
         //Print (C, " C");
         if(Bid<=C && Bid > A) //C will be somewhere in between here
         Print (Low[0], " Low [0] ", C, " = C");
         // some other signal here to trade at retrace
         }        
         
         

      if(val2 < 0)
         {
         //Print (val2, " val2");
         //Print(TimeToStr(Time[3],TIME_DATE|TIME_MINUTES), " = val2 time");
         //datetime c = Time[3];
         //Print(a, " a");
         double z=(a-val2)/2; //my attempt at a .50 retrace in pips but can be any fib level
         double c=a+z; //using the calc above to get the retrace value at .50
         //Print (c, " c");
         if(Bid<=c && c < a) //c will be somewhere in between here
         Print (Low[0], " Low [0] ", c, " = c");
         //some other signal here to trade at retrace
         }
         
                   
                
   return(0);
  }    

//+------------------------------------------------------------------+


ということで、Aは前回の安値、val1は現在のシフト3、そしてaとval2も同様です

というのも、空の値を表示しないように !=0 ステートメントを追加したため、 A と a が正しい値を参照していることを確認するために、もう少し再テストする必要があります。
一見、大丈夫そうですが、再確認が必要です

とにかく、これを言い直します。
私のif(statement)のval1が正しい条件を参照しているのか、それともシフト3を参照するために全く別のiFractalが必要なのか
これが正しく機能しているかどうかがよくわかりません。機能しているように見えますが、何かが正しくないようで、それを指差して終了できません。

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

ありがとうございます

もう本当にインジケーターの話題ではなくなってしまいましたが、新しいトピックに移したほうがいいでしょうか?

 
Agent86:
もし私が次のようなものを使ったら

そして、val1 を shift 3 で宣言するとします。
を宣言し、ループはもちろんshift i

ループの外側でval1を参照する場合、val1はグローバルなのか、ループしたval1なのか?

というか、val3やval4などのif文のために別途グローバルフラクタルというのを追加したほうがいいのかなと思ったりしています。

val1 と val2 はグローバルスコープで宣言され、i は start() 内でローカルに宣言されています。

val1 と val2 はループの内側でも外側でも、最後に割り当てられた値を持ちます ... それはループの前に 起こり、その後ループの中で 値を変更することができます ... 一度ループを抜けると、値はそのままで、次に start() が呼ばれるまでその状態が続き、その後リセットされ、ループ内で変更することができます ... などなど.

 
RaptorUK:

val1 と val2 はグローバルスコープで宣言され、i は start() 内でローカルに宣言されます。

val1 と val2 はループの内側でも外側でも最後に代入された値を持ちます ... それはループの前に 起こり、その後ループの中で 値が変更されるかもしれません ... 一度ループを抜けると値はそのままで、次に start() が呼ばれるまでその状態が続き、その後リセットされて、ループ内で変更されるかもしれません ... などなどです.

うーん、どうしようかな。

ループの中で値を追いかけ、val1 と val2 =iFractal,,,3 を再び宣言することができます。しかし、A=val2 と a=val1 を宣言して、これらの値を持ってからでないと、物事をリセットすることはできません。

あるいは、ループの外でval1とval2を再宣言することもできますが、Aやaの値を失いたくないので、適切なタイミングでそれを解決しなければならないと思います。

私はまた、このすべての一緒に間違って行くことができますが、問題ではありません。どこかで始めなければならないので、今のところこれを選びました。

ありがとうございました。
 
ということは、これらはある意味無関係なのでしょうか?

val1=iFractals(NULL, 0, MODE_UPPER,3);
val2=iFractals(NULL, 0, MODE_LOWER,3);

 

実際のiFractalを取引に使うために、これらをval3やval4に変えて、(A)や(a)は以前のフラクタルを 参照するためだけに使うべきかと思います。


これからも頑張ります

ありがとうございます

 
OK

数日間考えて、ロジックを通して作業してみた結果、完璧ではないけれど、より良い動作のコードができたと思う。

//+------------------------------------------------------------------+
//|                                                  Agent86_5min.mq4 |
//|                                              Unfinished POS slate |
//|                                           See progress notes below |
//+------------------------------------------------------------------+
#property copyright "Unfinished POS slate by Agent86"


//---- input parameters
extern double    TakeProfit=20.0;
extern double    Lots=0.1;
extern double    StopLoss=10.0;
extern int MagicNumber=123486;

double val1;
double val2;
bool traded = false;

//++++ These are adjusted for 5 digit brokers.

int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits == 5 || Digits == 3)
   {    // Adjust for five (5) digit brokers.
      pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
   } 
   else 
    {    
      pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
    }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
     
   
    
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
    
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   
        
   int i=0;
   int ticket,total,result;
   total = OrdersTotal();                 
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 


     
     if(val1 > 0 && traded == false)
      { 
      // in the absence of an && indicator above I get continous print statements
      // with indicator added && indicator above, then it prints A and B once as it should ???
      // I need to work this out so it won't print all the time aka trade all the time
      // A and B first values seems to initialize the whole block
      // just a reminder that they time stamps coordinate after this FYI
      // now work on C retrace and possibly signals
      // add options for user to select some candle patterns
      // add options to select indicators
      // add bells and whistles to make things fun
      // alerts,sounds,maybe poppup video animation or something
      
      double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
     
                    
                
   return(0);
  }    

//+------------------------------------------------------------------+


      

AとBの値があって、最初のif(statements && indicators)にインジケータ文が置かれている間、例えばMACD faster > slowerのようなインジケータ文の値が一度印刷されます。

だから、私は私が望むようにAとBだけを取得します。

インジケーターのオプションがif(statements)から取り除かれると、なぜ複数回印刷されるのかよくわかりません。

いずれにせよ、このABCD方式はフラクタルだけでなく、他のインジケータにも使用できるので、今後の 参考にしたいと思います。

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

ありがとうございます。

 

これはあなたの助けになるかもしれません。最後のフラクタルとシフトにアクセスするためのインジケータで、ABCDを計算するのに使うことができます。

iCustom(Symbol(),0,"Fractal Store",0,"",0,0)

これで上のフラクタルが 得られます。"L "を "L "に変えると下位のフラクタルが表示されます。

iCustom(Symbol(),0,"Fractal Store",1,"",0,0)

直近のフラクタルより前のフラクタルが表示されます。

ファイル:
 
heelflip43:

これはあなたの助けになるかもしれません。最後のフラクタルとシフトにアクセスするためのインジケータで、ABCDを計算するのに使うことができます。

これで上のフラクタルが得られます。"L "を "L "に変えると下位のフラクタルが表示されます。

直近のフラクタルより前のフラクタルが表示されます。

なるほど

このスレッドの私の最新のコードの前に私はいくつかの助けを借りて、いくつかの様々な(for)ステートメントを解決していた、それは私がバッファに欲しいものを描くことができた指標でもあった、しかし、これは私が値を抽出し、使用または参照するために一度だけそれらの値を印刷しようとする別の問題が発生しました。

これらの様々なfor文は私にとって問題を引き起こし、それらはあなたが投稿したコードと同様であるので。
私は、値がtrueになるたびにその値を印刷し続けなければ、値を得ることができませんでした。
しかし、ある条件が真になったときに、それを停止させる方法はまだわかっていません。

あなたのコードでは、静的なdatetimeブロックが役に立ちそうです。これは、新しいバーと新しいバータイムが来たときだけ条件を参照するために、以前に一度だけ使用しました。
この部分は、私が取り組んでいることに役立つかもしれません。そして、私の現在のコードは、現在のフラクタルと前のフラクタルを現在生成していますが、それは動作している

私がほとんど持っている唯一の問題は、条件が真になると、それは大丈夫かもしれないが、これは私がそのポイントに到達すると、それはおそらく連続的に取引を配置することを意味します文を連続的にプリントアウトすることです。

おそらく、私はiCustomインディケータの 使用方法についてより多くの経験を必要とし、これは私の問題の多くを解決するかもしれませんが、私はまだ私の学習でそこまでではありません。

このコード、EMPTY_VALUEの部分をもう少し見直してみます。今、私はそれが使用されているのを見て、私もそれから学ぶことができます。以前から提案されていたのですが、使い方を理解していませんでした。

私はそれに取り組み続けるでしょう
ありがとうございました。
 
もう一つ最後に気づいたのですが、if(val1 > 0 && faster > slower && traded == false)

MACDを 追加すると、A low, B high, then and/or B low and A highをプリントするという、まさに私が欲しいものだけを出してくれます

しかし、これらのif文のfaster > slowerとfaster < slowerを取り除くと、A highは決してプリントされず、他のものも継続的にプリントされることに気がつき、混乱しています。


私は、EAに他の指標文がない状態で、一度だけその文を印刷するようにする必要があると確信しています。そうすれば、指標がコードのABCD部分に干渉しないことが分かります。 Back to the drawing board




 

VAL1とVAL2をリセットしていないことが問題だと思います。ですから、高値と安値を見つけたら、それらをリセットする必要があります。

double B = val1;
      Print(B, " B high");
         if(val2==0)
            {
            for (i=0; val2==0; i++)
               {
               //Print("i "+i);
               val2=iFractals(NULL, 0, MODE_LOWER, i);
               double A = val2;
                  if(A!=0)
                     {
                     Print(A, " A low");
                     }
               }
             }  
      traded=true;
      }
     
   val1=iFractals(NULL, 0, MODE_UPPER,3);
   val2=iFractals(NULL, 0, MODE_LOWER,3); 

     if(val2 > 0 && traded == true)
      {
      B = val2;
      Print(B, " B low");
         if(val1==0)
            {
            for (i=0; val1==0; i++)
               {
               val1=iFractals(NULL, 0, MODE_UPPER, i);
               A = val1;
                  if(A!=0)
                     {
                     Print(A, " A high");
                     }
               }
             }  
      traded=false;
      }
これで解決するといいのですが。