エラー、バグ、質問 - ページ 3129

 
Alexey Viktorov #:

あなたの場合は、両方の条件を満たす必要があるため、この限りではありません。しかし、これを置くと

となると、そうですね。a "の条件が満たされた場合、2つ目の条件はチェックされない。長年争ってきたのに、前世紀に戻ろうというのか...。

不思議なことに、||だけでなく&&でもa=trueを指定すると、それ以外のチェックが行われないのです。そうでなければ、どのようにこれを説明するのですか(インジケータの動作に意味を求めないでください、ここではコードのことを話しているのです)。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_ARROW
#property indicator_color1  Gray
#property indicator_label1  "Fractal Up"
//--- indicator buffers
double ExtUpperBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;

void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
//--- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
//--- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
  }

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(rates_total<5)
      return(0);

   int start;
//--- clean up arrays
   if(prev_calculated<7)
     {
      start=2;
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
     }
   else
      start=rates_total-5;

   for(int i=start; i<rates_total-3 && !IsStopped(); i++)
     {
      //--- Upper Fractal
      if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+4])
         ExtUpperBuffer[i]=high[i];
      else
         ExtUpperBuffer[i]=EMPTY_VALUE;
     }

   return(rates_total);
  }

端末は無音です。しかし、変更した場合

if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+4])

まで

if(high[i]>high[i+4] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+1])

という メッセージが表示されます。これは、最初のケースとは異なり プログラマが過剰なインデックスを持つ配列にすぐに遭遇してしまうためです。

 
x572intraday #:

あえてバグとは言いません。そこで、if 文の特殊性に一つ気がついたことを述べておく。これは他の言語にも当てはまるのではないでしょうか。

a が真であることが判明した場合、チェックは Array[over_index] に飛び、ここでターミナルは'array out of range' の部分でクラッシュし始めますが、これは全くその通りです。しかし、もしaがfalseになったら、端末はArray[over_index]の条件をチェックしないので、インデックスの冗長性をチェックせず、ifは さらにスキップして、コーダーは自分のプログラム中に存在しないインデックスを持つ配列があることに気がつかないでしょう...。というか、既存のものだけど冗長なもの。

もしかしたら、'array out of range' のチェックがif ループの最後まで行われ、同じメッセージが出力されるように修正する必要があるのでは?それとも、オペレーターのスピードが大幅に低下するのでしょうか?


シンタックスとは、文字通り、構成することだけでなく、整える ことも意味する...」ということです。

もし、範囲外の配列」が あるかどうかを調べたい場合は、順序を変えてください。

if(Array[over_index]>val && a) {...}
 
Lilita Bogachkova #:

構文が異なる言語とは?「構文とは文字通り、構成するだけでなく、順序を 決める...」という意味です。

もし、範囲外の配列」が あるかどうかを確認したい場合は、順序を変えてください。

確認が必要なため、発注が望まれる。

例えば、'a'が頻繁に変更される場合は、第1引数に置いた方が良い。

 
Vitaly Muzichenko #:

チェックが必要なため、順番が望ましい。

例えば、"a "が頻繁に変更される場合は、それを第1引数にした方が良い。

いいえ、1つ目は主な条件によるもので、他はあくまで追加的な条件です。

例えば、まだ作業時間が始まっていない場合、現在の作業時間の時間を確認することは無意味である。
 

実は、この機能には偶然にも出会いました。それは私が望んだことではない...。

if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && ... && high[i]>high[i+n])

または

if(high[i]>high[i+1])
   if(high[i]>high[i+2])
      if(high[i]>high[i+3])
         if(...)
            if(high[i]>high[i+n])

nはかなり大きくなってしまうのが難点で、この長い条件の連鎖をコンパクトにまとめてforに したいと思いました。こんな風にやってみました。

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
      h_plus&=high[i]>high[i+increment];
   if(h_plus) {...}
   ...
}

が、ちょっと残念な結果になってしまいました。少なくとも、このアルゴリズムでh_plusは、冗長なインデックス配列のチェックを含む、チェックされた条件の全体の合計を取らなければならないので、最初のラップされていないiffor なしには起こりませんでした。また、他のニスは絵を台無しにします。

これは検討する価値があるのでしょうか?このようなことは可能でしょうか?

 
Lilita Bogachkova #:

構文が異なる言語とは? 「構文とは文字通り、構成するだけでなく、順序を 決める...」という意味です。

範囲外の配列」が あるかどうかを確認したい場合は、順序を変更します。

何を前に置いて、何を後に置くか、事前に分からないこともあります。

 
Lilita Bogachkova #:

いや、1つ目は基本的な条件を決めるもので、他はあくまで追加的な条件です。

例えば、まだ作業時間が始まっていない場合、現在の作業時間の時間を確認することは無意味である。

そう、まずシグナルの条件を確認し、配列を調べて比較し、現在の価格を確認し、時間が正しくないことが判明するのだが、その前に多くの複雑なアクションが実行されるのだ。

そうだろ?

 
Vitaly Muzichenko #:

そうですね、まずシグナルの条件を確認し、配列を調べて比較し、現在の価格を確認し、時間が合わないことが判明しますが、その前に多くの複雑なアクションが行われています。

そうだろ?

そうですね、それはやめたほうがいいです。
 
Vitaly Muzichenko #:

チェック

上の条件の "a "が必ず偽になると言ったのは誰ですか?

 
x572intraday #:

実は、この機能には偶然にも出会いました。それは私が望んだことではない...。

または

nはかなり大きくなってしまうのが難点で、この長い条件の連鎖をコンパクトにまとめてforに したいと思いました。こんな風にやってみました。

が、ちょっと残念な結果になってしまいました。少なくとも、このアルゴリズムでh_plusは、冗長なインデックス配列のチェックを含む、チェックされた条件の全体の合計を取らなければならないので、最初のラップされていないiffor なしには起こりませんでした。また、他のニスは絵を台無しにします。

これは検討する価値があるのでしょうか?オーバーフォーは可能ですか?

以下は、私が全く理解していないこのコードです。

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
      h_plus&=high[i]>high[i+increment];
   if(h_plus) {...}
   ...
}

このコードにある「&」は何を意味しているのでしょうか?また、if(h_plus)はどのループで実行されるべきでしょうか?カーブブラケットを見逃しませんでしたか?