MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 893

 
Seric29:

こんな疑問があります。つまり、ループがある

1回目のブレークは、ループの最初の括弧ではなく、ループの内側に入れられた括弧の中にあります。 2回目のブレークは、さらに内側の括弧の中に入れられた深い位置にあります。この場合、breakが 効かないだけだと理解していましたが、正直なところ、効くのか効かないのかよくわからないまま、プログラムがハングアップして不要な反復を繰り返していました。条件の多いループを終了させるために、ループに終了フラグを追加してみました。たぶん、私にはそれがうまくいかないと思えたのですが、この問題で考える人はいますか?

コードが普通にスタイリングされていれば、ゴミを作ったとすぐにわかります。

for(...........)
  {
   if(.........)
     {
      //что-то делаем
     }
   else
      if(.........)
        {
         break
        }
      else
        {
         break;
        }
  } 

全く同じです。

for(...........)
  {
   if(.........)
     {
      //что-то делаем
     }
   else
      break;
  } 
 

ローソク足の更新とティックの追加ができない。

以下は、インジケーターのコードです。

 long  id_;  
 const  SYMBOL SYMB (  _Symbol  +  "Tick_exp2"  );  
 int  OnInit  ()  
   {  

     if  (SYMB.IsExist ())  
      {  
       SYMB.CloneProperties ();  
                              
       int  rates_total = candles;  

       MqlRates  Rates [], Replace [];  

       int  total_candles =  0  ;  
       for  (  int  i =  CopyRates  (  _Symbol  ,  PERIOD_M1  ,  0  , rates_total, Rates) -  1  ; i> =  0  &&!  IsStopped ();  i--)  
         {  
         MqlTick  Ticks [], ReplaceTicks [];  
         int  vv =  CopyTicksRange  (  _Symbol  , Ticks,  COPY_TICKS_ALL  ,  ulong  (Rates [i] .time) *  1000  ,  ulong  (Rates [i] .time +  61  ) *  1000  );  
          total_candles + = vv;  
         ArrayResize  (Replace, vv-  1  );  ArrayResize  (ReplaceTicks, vv-  1  );  
         for  (  int  ii =  0  ; ii <vv-  1  &&!  IsStopped ();  ii ++)  
            {  
             ReplaceTicks [ii] .bid = Ticks [ii] .bid;  
             ReplaceTicks [ii] .ask = Ticks [ii] .ask;  
             ReplaceTicks [ii] .flags =  TICK_FLAG_BID  ;  
             ReplaceTicks [ii] .last = Ticks [ii +  1  ] .bid;  
             ReplaceTicks [ii] .time = Ticks [ii] .time;  
             ReplaceTicks [ii] .time_msc = Ticks [ii] .time_msc;  

             ReplaceTicks [ii] .volume = Ticks [ii] .volume;  
             ReplaceTicks [ii] .volume_real = Ticks [ii] .volume_real;  

             Replace [ii] .time = Ticks [ii] .time;   
             Replace [ii] .open = Ticks [ii] .bid;  
             Replace [ii] .close = Ticks [ii +  1  ] .bid;  
             if  (Ticks [ii] .bid> Ticks [ii +  1  ] .bid) {Replace [ii] .high = Ticks [ii] .bid;  Replace [ii] .low = Ticks [ii +  1  ] .bid;}  
             else  {Replace [ii] .high = Ticks [ii +  1  ].  bid;  Replace [ii] .low = Ticks [ii] .bid;}  
             Replace [ii] .tick_volume =  long  (Ticks [ii] .volume);  
             Replace [ii] .real_volume =  long  (Ticks [ii] .volume_real);  
             Replace [ii] .spread =  int  (  fabs  (Ticks [ii] .bid-Ticks [ii + 1  ] .bid) *  100000  );  

            }  
        
         CustomTicksAdd  (SYMB.Name, ReplaceTicks);  
         CustomRatesUpdate  (SYMB.Name, Replace);  

         }  
       if  (SYMB.On ()) 
         {  
          id_ =  ChartOpen  (SYMB.Name,  PERIOD_CURRENT  );  
         ChartSetInteger  (id_,  CHART_AUTOSCROLL  ,  1  );  
         ChartSetInteger  (id_,  CHART_MODE  ,  2  );  
         ChartSetInteger  (id_,  CHART_COLOR_CHART_LINE  ,  clrYellow  ); 
         ChartSetInteger  (id_,  CHART_SHIFT  ,  0  ,  ChartGetInteger  (  ChartID  (),  CHART_SHIFT  ));  
         } 
          Print("Всего свечей обновлено :=> ",total_candles); 
      }  
   return  (  INIT_SUCCEEDED  );  
   } 

そして、その指標をベットのチェックに応用しています。

 int  OnInit  ()  
   {  

   return  (  INIT_SUCCEEDED  );  
   }  

 Int  OnCalculate  (  const  int  rates_total,  
                 const  int  prev_calculated,  
                 const  datetime  & time [],  
                 const  double  & open [],  
                 const  double  & high [],  
                 const  double  & low [],  
                 const  double  & close [],  
                 const  long  & tick_volume [],  
                 const  long  & volume [],  
                 const  int  & spread [])  
   {  

   if (newbar.IsNewBar (  "EURUSD"  ,  PERIOD_M1  ))  
    {  
       Print("Цены доступны от индикатора :=> ", rates_total);
    }  
   return  (rates_total);  
   } 

退出する。

ローソク足が完全に更新されるなら、なぜrate_totalはローソク足の50%しか表示しないのですか?

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


ファイル:
 
Artyom Trishkin:

通常のコードスタイリングであれば、すぐにデタラメであることがわかる。

だから私の場合、正しく動作しないかもしれないし、本当にループを終了しないかもしれないし、とにかく条件がある本体の中で最も近いループを終了するのでしょうか?

 
Seric29:

つまり、私の場合、正しく動作せず、実際にはループを終了しないかもしれませんし、いずれにせよボディに条件がある最も近いループを終了するのでしょうか?

ループの条件がわからないのですが、そこにダッシュがありますよね。

for(...........)
 
Artyom Trishkin:

ループの条件が見えません。

ループの条件ではなく、ifの中にさらにifがある可能性があり、そのifのどれかがexitを生成しなければならないので、条件の深さがループが抜けるかどうかに影響するかどうかということです。

     for(...........)
     {
     if(........)
       {if(.....)break; else
        if(.....)
           {
           if(....)break;}}else break;
     }  
 
Seric29:

そこで質問ですが、条件の深さはループが抜けるかどうかに影響するのでしょうか?

そうでない場合、break は最も近いループ本体、つまり現在実行されているループ本体を破壊します。また、if() を何回使っても、iF() の数や深さは関係ありません。

さて、文の一部ですが、ループ本体を異なる条件で区切りたい場合、このようにwhile()とループ割り込みフラグを使う方がはるかに簡単な場合があります。

int i=Bars-1;
bool calc = true;
while(i>=0 && calc)
{
    if(...) calc = false;
        else
        {
        ....            
                if(...) calc = false;
        }

   i--;
}
 
Igor Makanu:

は影響を与えず、break は最も近いループ本体、つまり現在実行されているループ本体をブレークさせます。また、if() を何回使ったかは関係なく、iF() の数もその深さも関係ありません。

さて、文の一部ですが、ループ本体を異なる条件で区切りたい場合、while()とループ割り込みフラグを使った方がはるかに楽な場合があります、こんな感じです。

なるほど、そういうことだったのか。そうですね......複雑なこともありますし、フラッグを使ったほうがいい場合もありますね。ハングを探しながら実験しています、無限に回転するのかもしれないと思いました、回答ありがとうございました。

 
Seric29:

こんな疑問があります。つまり、ループがある

1回目のブレークは、ループの最初の括弧ではなく、ループの内側に入れられた括弧の中にあります。 2回目のブレークは、さらに内側の括弧の中に入れられた深い位置にあります。この場合、breakが 効かないだけだと理解していましたが、正直なところ、効くのか効かないのかよくわからないまま、プログラムがハングアップして不要な反復を繰り返していました。条件の多いループを終了させるために、ループに終了フラグを追加してみました。たぶん、私にはそれがうまくいかないように思えたのですが、この問題については誰が考えているのでしょうか?

     for(...........)              
     {
          if(.........)
          {
               /* что-то делаем */
          }
          else
          {
               // Непонятно зачем? Если при любом варианте выходим из цикла
               if(.........) break;
               else break;
          }
     }
私ならこうする
     for(...........)              
     {
          if(/* не соответствует условие */) break;
          /* что-то делаем */
     }
しかし、私はあなたのアイデアのポイントをよく理解していなかったかもしれません。
 
Konstantin Nikitin:
私ならこうする
でも、もしかしたら、あなたのアイデアの意味がよくわからないかもしれませんね。

大事なのは、混乱しないことです。ループの中で別のループを開いて、両方のループを一度に抜ける必要がある場合がありますが、mql4ではフラグでしかこれを実現できません、C++にはgoto演算子がありますが、どうなんでしょう。

 
Seric29:

大事なのは、混乱しないことです。ループの中で別のループを開いて、両方のループを一度に抜ける必要がある場合がありますが、mql4ではフラグでしかこれを実現できません、C++にはgoto演算子がありますが、どうなんでしょう。

ループはすべて関数の中で行い、入れ子になったものを終了させる必要がある場合は、たとえ300回目であっても、リターンします。