Fehler, Irrtümer, Fragen - Seite 3129

 
Alexey Viktorov #:

In Ihrem Fall ist dies nicht der Fall, da beide Bedingungen erfüllt sein müssen. Aber wenn Sie das

dann, ja. Wenn die Bedingung "a" erfüllt ist, wird die zweite Bedingung nicht geprüft. Sie haben viele Jahre lang dafür gekämpft, und jetzt schlagen Sie vor, ins vorige Jahrhundert zurückzukehren...

Seltsamerweise gibt es aber bei a=true nicht nur bei || sondern auch bei && keine Überprüfung des Rests. Wie lässt sich das sonst erklären (suchen Sie nicht in der Funktionsweise des Indikators, wir sprechen hier über den Code):

#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);
  }

Das Terminal ist still. Aber wenn Sie die

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

zu

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

der Programmierer ändert es und die berüchtigte Meldung 'array out of range' erscheint, weil der Programmierer im Gegensatz zum ersten Fall sofort über ein Array mit einem zu hohen Index stolpert.

 
x572intraday #:

Ich wage nicht, es einen Fehler zu nennen. Ich möchte nur sagen, dass mir eine Besonderheit der if-Anweisung aufgefallen ist. Ich vermute, dass dies auch für andere Sprachen gilt.

Wenn sich a als wahr herausstellt, springt check zu Array[over_index] und hier beginnt das Terminal durch den Teil'array out of range' abzustürzen, der durchaus wahr ist. Aber wenn sich a als falsch herausstellt, prüft das Terminal nicht auf die Array[over_index]-Bedingung und damit auf Index-Redundanz, und if überspringt weiter und der Programmierer weiß nicht, dass es ein Array mit einem nicht existierenden Index in seinem Programm gibt... oder vielmehr eine bestehende, aber überflüssige.

Vielleicht sollte es einen Fix dafür geben, so dass die Prüfung auf "array out of range" bis zum Ende der if-Schleife durchgeführt wird und die gleiche Meldung ausgegeben wird? Oder wird sie die Geschwindigkeit des Bedieners erheblich verringern?


In welcher Sprache ist die Syntax anders? "Syntax bedeutet wörtlich nicht nur komponieren, sondern auch arrangieren...".

Wenn Sie prüfen wollen, ob es ein "Array außerhalb des Bereichs" gibt, ändern Sie die Reihenfolge.

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

In welcher Sprache ist die Syntax anders?"Syntax bedeutet wörtlich übersetzt nicht nur Zusammensetzen, sondern auch Ordnen...".

Wenn Sie prüfen wollen, ob es ein "Array außerhalb des Bereichs" gibt, ändern Sie die Reihenfolge.

Die Bestellung ist wünschenswert, da Sie überprüfen müssen.

Wenn zum Beispiel "a" häufiger geändert wird, ist es besser, es als erstes Argument anzugeben.

 
Vitaly Muzichenko #:

Die Reihenfolge ist erwünscht, da Kontrollen notwendig sind.

Wenn sich zum Beispiel "a" häufiger ändert, ist es besser, es als erstes Argument anzugeben.

Nein, die erste hängt von den Hauptbedingungen ab, die anderen sind nur zusätzliche Bedingungen.

So ist es beispielsweise irrelevant, die Stunde der aktuellen Arbeitszeit zu überprüfen, wenn die Arbeitszeit noch nicht begonnen hat.
 

Tatsächlich bin ich zufällig auf diese Funktion gestoßen. Das ist nicht das, was ich wollte...

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

oder

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])

Das Problem ist, dass n ziemlich groß sein kann, deshalb wollte ich diese lange Kette von Bedingungen in ein kompaktes für zusammenfassen. Ich habe es auf diese Weise versucht:

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) {...}
   ...
}

aber es stellte sich heraus, dass es ein ziemliches Durcheinander war. Zumindest, weil h_plus mit diesem Algorithmus die gesamte Summe der geprüften Bedingungen nehmen muss, einschließlich der Bedingung mit redundanter Index-Array-Prüfung, was im ersten entpackten if, ohne for, nicht passiert. Und andere Anstriche verderben das Bild.

Ist das überhaupt eine Überlegung wert? Ist es möglich, dies zu tun?

 
Lilita Bogachkova #:

In welcher Sprache ist die Syntax anders? "Syntax bedeutet wörtlich übersetzt nicht nur Zusammensetzen, sondern auch Ordnen...".

Wenn Sie prüfen wollen, ob es ein "Array außerhalb des Bereichs" gibt, ändern Sie die Reihenfolge.

Man weiß nicht immer im Voraus, was man vor und was man nach dem Text einfügen soll.

 
Lilita Bogachkova #:

Nein, die erste legt die Grundbedingungen fest, die anderen sind nur zusätzliche Bedingungen.

So ist es beispielsweise irrelevant, die Stunde der aktuellen Arbeitszeit zu überprüfen, wenn die Arbeitszeit noch nicht begonnen hat.

Ja, zuerst prüfen wir die Signalbedingungen, gehen das Array durch und vergleichen, prüfen den aktuellen Preis, und dann stellt sich heraus, dass der Zeitpunkt nicht stimmt, aber vorher werden viele komplizierte Aktionen durchgeführt.

Oder?

 
Vitaly Muzichenko #:

Ja, zuerst prüfen wir die Signalbedingungen, gehen durch das Array und vergleichen, prüfen den aktuellen Preis, und dann stellt sich heraus, dass der Zeitpunkt nicht richtig ist, aber davor sind viele komplizierte Aktionen durchgeführt worden.

Oder?

Richtig, das sollten Sie nicht tun.
 
Vitaly Muzichenko #:

Siehe

Wer hat Ihnen gesagt, dass "a" aus der obigen Bedingung immer falsch sein würde?

 
x572intraday #:

Tatsächlich bin ich zufällig auf diese Funktion gestoßen. Das ist nicht das, was ich wollte...

oder

Das Problem ist, dass n ziemlich groß sein kann, deshalb wollte ich diese lange Kette von Bedingungen in ein kompaktes für zusammenfassen. Ich habe es auf diese Weise versucht:

aber es stellte sich heraus, dass es ein ziemliches Durcheinander war. Zumindest, weil h_plus mit diesem Algorithmus die gesamte Summe der geprüften Bedingungen nehmen muss, einschließlich der Bedingung mit redundanter Index-Array-Prüfung, was im ersten entpackten if, ohne for, nicht passiert. Und andere Anstriche verderben das Bild.

Ist das überhaupt eine Überlegung wert? Ist es möglich, zu viel zu kaufen?

Dieser Code ist mir völlig unverständlich

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) {...}
   ...
}

Was bedeutet das Zeichen & in diesem Code? Und in welcher Schleife soll if(h_plus) ausgeführt werden? Haben Sie keine gebogenen Klammern übersehen?