Fehler, Irrtümer, Fragen - Seite 561

 

ArrayInitialize funktioniert nicht Code beigefügt ist, wenn wir unkommentieren die Schleife, alles ist gut.

Und wenn Variablen in der Klasse und Indikatoren auf globaler Ebene mit demselben Namen deklariert werden, erscheint eine Warnung.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Am Wochenende, als es noch keine Ticks gab, habe ich den Indikator auf Demokonten getestet, indem ich ihn auf dem letzten Build von zwei Instanzen des MT5-Terminals laufen ließ, allerdings von verschiedenen Unternehmen: MetaQuotes und EGlobal. Die Einstellungen sind überall gleich. Um sicherzugehen, habe ich es offline überprüft, so dass der Tick-Faktor ausgeschlossen ist.

Das Problem ist, dass der einfachste Code des "Unterindikators" (ganz zu schweigen vom vollwertigen und komplexeren Indikator) auf den verschiedenen Terminals der verschiedenen Unternehmen eine unterschiedliche Anzahl von Ergebnissen anzeigt:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

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[])
  {
   Print(1);

   return(rates_total);
  }

1) EGlobal. 2. MetaQuotes.EGlobalMetaQuotes

Ich habe beide Terminals vollständig entladen (mit dem Task-Manager nach Speicherprozessen überprüft), sie wieder geladen und beide Codes vorsichtshalber neu kompiliert. Letztendlich gab es keine Änderungen.

 
Das ist nicht verwunderlich, so sollte es auch sein.
 

MathRound() funktioniert in 4 und 5 unterschiedlich, sollte aber gleich sein.

4p's Code:

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

5-Sekunden-Code:

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

MathRound() funktioniert in 4 und 5 unterschiedlich, sollte aber gleich sein.

4-Sekunden-Code:

5-Sekunden-Code:

Das Problem liegt hier:

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

Dieser Wert wird in 4 und 5 unterschiedlich gerundet.

 
Loky:
Das ist keine Überraschung, so sollte es auch sein.
Und ganz konkret?
 

Warum speichert MT5 die Orderhistorie usw. nicht, wenn der Test unterbrochen wird? In MT4 wurde es gespeichert.

Es gibt auch keine Positionierung in der Auftragshistorie des Testcharts - es war bequem, Aufträge im Bereich großer Drawdowns durch Anklicken des Charts anzuzeigen.

 

Guten Abend.

Können Sie mir bitte erklären, wie die Methode SLeep() funktioniert?

Es sollte den Expert Advisor für eine bestimmte Zeit unterbrechen, oder liege ich da falsch?


{for (int sleep=0;sleep<10000;sleep++)

wenn(BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; } else Sleep(100);}

Für diesen Code erwarte ich das Ergebnis - wenn die Anzahl der für einen bestimmten Indikator berechneten Balken größer als ein bestimmter Wert ist, wird die Schleife unterbrochen; andernfalls gibt es eine Verzögerung von 100 ms bei der weiteren Codeausführung. Die mögliche Gesamtverzögerung beträgt 100*10000ms....Das ist genug Zeit für die Berechnung des Indikators. Warum läuft der Code dann weiter? (der diesem Zyklus folgt) Oder im Tester funktioniert diese Funktion nicht, wie ich vermute. Vielen Dank im Voraus für die Klarstellung.

 
mi__x__an:

Guten Abend.

Können Sie mir bitte erklären, wie die Methode SLeep() funktioniert?

Es sollte den Expert Advisor für eine bestimmte Zeit unterbrechen, oder liege ich da falsch?


{for (int sleep=0;sleep<10000;sleep++)

wenn (BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; } else Sleep(100);}

Für diesen Code erwarte ich das Ergebnis - wenn die Anzahl der für einen bestimmten Indikator berechneten Balken größer als ein bestimmter Wert ist, wird die Schleife unterbrochen; andernfalls gibt es eine Verzögerung von 100 ms bei der weiteren Codeausführung. Die mögliche Gesamtverzögerung beträgt 100*10000ms....Das ist genug Zeit für die Berechnung des Indikators. Warum läuft der Code dann weiter? (der diesem Zyklus folgt) Oder im Tester funktioniert diese Funktion nicht, wie ich vermute. Vielen Dank im Voraus für die Klarstellung.

Schlaf funktioniert nicht in Indikatoren
 

Die Dokumentation z.B. von CopyBuffer sorgt für Kopfzerbrechen: "Wenn Sie ein teilweises Kopieren von Indikatorwerten in ein anderes Array (nicht den Indikatorpuffer) vornehmen wollen, sollten Sie zu diesem Zweck das Zwischenarray verwenden, in das die gewünschten Werte kopiert werden. Und schon von diesem Zwischenfeld aus wird Element für Element die erforderliche Anzahl von Werten an die richtigen Stellen des empfangenden Feldes kopiert. "

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

Wenn ausdrücklich aufbuffer_num verwiesen wird, ist die Notwendigkeit einer vorherigen Bindung des empfangenden Arrays an den Indikatorpuffer mit der einen oder anderen Sequenznummer durch SetIndexBuffer sicherlich impliziert. Aber,"wenn wir einige Werte des Indikators in ein anderes Array (nicht den Indikatorpuffer) kopieren wollen", können wir nicht überbuffer_num sprechen, weil es kein Indikator ist und wir ihn per Definition mit nichts verbunden haben.

Ein Widerspruch?

Zweideutigkeit?

Oder bin ich vielleicht komplett programmiert?

Ich habe versucht, eine eindeutige Definition eines Indikatorpuffers zu finden und bin gescheitert. Ist es wirklich jeder Puffer über SetIndexBuffer verknüpft oder ist es nicht genug und es sollte ein Array mit dem INDICATOR_DATA-Bezeichner sein ?