Fehler, Irrtümer, Fragen - Seite 1391

 
Ilya Malev:

Nach dem Drücken von "Aktualisieren" wird alles berechnet. Es wäre bequemer, wenn die in der Inite erstellten Indikatordaten vor dem ersten Aufruf von OnCalculate/OnTimer usw. berechnet würden.

Es wäre nützlich, eine Möglichkeit zu haben, auf ihre Berechnung nach der Initialisierung in der Schleife innerhalb des Indikators zu warten.

Um den Indikator zu berechnen, muss der Benutzer mehrmals auf "Aktualisieren" im Diagramm drücken. Braucht er das? Er wird sich an den guten alten MT4 erinnern und bei ihm bleiben, trotz einiger Vorteile des MT5.

Alle Berechnungen in den Indikatoren MÜSSEN nur in OnCalculate() durchgeführt werden.
 
Karputov Vladimir:
Alle Berechnungen in Indikatoren MÜSSEN nur in OnCalculate() durchgeführt werden.
Ich spreche in diesem Fall von den Messwerten des Ishimoku-Indikators. Ich spreche von Indikatorwerten, die im aktuellen Indikator verwendet werden, d.h. in OnCalculate. Sie werden also vor dem Aufruf von OnCalculate berechnet, wie es in MT4 der Fall war. Oder es wäre möglich, auf ihre Berechnung in OnCalculate zu warten. Andernfalls müssen die Benutzer mehrmals auf Aktualisieren drücken, um einen Indikator zu erstellen. Da nicht alle Indikatoren auf der gesamten Historie in einer Sekunde aufgebaut sind, gibt es komplexe Indikatoren, deren Berechnung länger dauert. Die ganze Zeit über muss der Benutzer auf die Schaltfläche "Aktualisieren" warten, während man in MT4 nur darauf warten muss, dass sie gezeichnet wird.
 
Ilya Malev:
Ich spreche in diesem Fall von den Messwerten des Ishimoku-Indikators. Ich spreche von Indikatorwerten, die im aktuellen Indikator verwendet werden, d. h. OnCalculate. Sie werden also vor dem Aufruf von OnCalculate berechnet, wie es in MT4 der Fall war.
In OnInit() wird die Vorbereitung der Handelsumgebung für den Indikator durchgeführt. Und nur in OnCalculate() können Sie die Indikatordaten verwenden.
 
Ilya Malev:
Ich spreche in diesem Fall von den Messwerten des Ishimoku-Indikators. Ich spreche von Indikatorwerten, die in current, d.h. in OnCalculate verwendet werden. Sie werden also vor dem Aufruf von OnCalculate berechnet, wie es in MT4 der Fall war. Oder es wäre möglich, auf ihre Berechnung in OnCalculate zu warten. Andernfalls müssen die Benutzer mehrmals auf Aktualisieren drücken, um einen Indikator zu erstellen. Da nicht alle Indikatoren auf der gesamten Historie in einer Sekunde aufgebaut sind, gibt es komplexe Indikatoren, deren Berechnung länger dauert. Die ganze Zeit über muss der Benutzer auf die Schaltfläche "Aktualisieren" warten, während man in MT4 nur darauf warten muss, dass sie gezeichnet wird.

Dieses Problem taucht von Zeit zu Zeit im Forum auf. Leider löst der Aufruf von OnCalculate() in OnTimer() das Problem nicht.

Aber Sie können es versuchen. Ein Beispiel finden Sie in diesem Artikel: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Danach können Sie schreiben, ob es funktioniert hat oder nicht.

 
Karputov Vladimir:
OnInit() bereitet die Handelsumgebung für den Indikator vor. Und nur in OnCalculate() können Sie die Indikatordaten verwenden.
Es stellt sich heraus, dass es nicht möglich ist, ohne ein- oder mehrmaliges Drücken der Schaltfläche "Aktualisieren" auf dem Chart (oder Warten auf 1/number of ticks), wenn der Indikator andere Indikatoren von anderen Symbolen und/oder tf verwendet.
 
Anatoli Kazharski:

Dieses Problem taucht von Zeit zu Zeit im Forum auf. Leider löst der Aufruf von OnCalculate() in OnTimer() das Problem nicht.

Aber Sie können es versuchen. Ein Beispiel finden Sie in diesem Artikel: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Schreiben Sie anschließend, ob es funktioniert hat oder nicht, wenn es nicht zu viel Mühe macht.

Vielen Dank für den Link. Ich werde es versuchen und Ihnen Bescheid geben.
 
Ilya Malev:
Es stellt sich heraus, dass Sie nicht ohne Drücken der Schaltfläche "Aktualisieren" auf dem Diagramm einmal oder mehrmals (oder warten Sie für 1 / wenige Ticks), wenn der Indikator verwendet andere Indikatoren aus anderen Symbolen und / oder tf.

Und wenn Sie sich die Funktionsweise des von mir angegebenen Codes genauer ansehen? Und vor allem für die Experten? Nach der Wiederinbetriebnahme des Terminals am Wochenende:

2015.10.11 14:44:01.672 test (USDCAD,M5)        0
2015.10.11 14:44:01.681 test (USDCAD,M5)        1
2015.10.11 14:44:01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10.11 14:44:01.705 test (USDCAD,M5)        2
2015.10.11 14:44:01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

Es ist deutlich erkennbar, dass die Berechnung erst beim zweiten Aufruf von OnCaalculate() durchgeführt wurde. Niemand entbindet also den Programmierer von der Verantwortung für Überprüfungen: Überprüfen Sie das Ergebnis von CopyBuffer() in OnCalCulate() - wenn die Funktion nichts zurückgegeben hat, muss es bei der nächsten Eingabe in OnCalculate() überprüft werden.

 
Anatoli Kazharski:

Dieses Problem taucht von Zeit zu Zeit im Forum auf. Leider löst der Aufruf von OnCalculate() in OnTimer() das Problem nicht.

Aber Sie können es versuchen. Ein Beispiel finden Sie in diesem Artikel: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Bitte schreiben Sie später, wenn es nicht zu viel Mühe macht, ob es funktioniert hat oder nicht.

Ich habe den Artikel noch nicht gelesen, aber es funktioniert gut mit OnTimer

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer(){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate(0, 0, Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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[])
  {
   static int count=0;
   static datetime now=0;
   if(now==0)  now=TimeLocal();
   if(count>=0){
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0){
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
      }else
         count++;
   }
   if(rates_total==0)   return(0); // Если это вызов из OnTimer, то возврат
   
   // ...
   return(rates_total);
}

Ich habe ein seltsames Bild, das zeigt, dass der Aufruf von OnCalculate von OnTimer funktioniert) Ich muss die richtigen Werte in Zeitreihen hinzufügen

 
Ilya Malev:

Ich habe den Artikel noch nicht gelesen, aber der Empfang mit OnTimer funktioniert gut

Bei einfachen Indikatoren funktioniert es gut. Aber in komplexeren Fällen bleibt es aus irgendeinem Grund manchmal hängen. )
 
Ilya Malev:

Ich habe den Artikel noch nicht gelesen, aber der Empfang mit OnTimer funktioniert gut

Verwenden Sie den Styler - er ist besser geeignet, Fehler zu erkennen.

   if(count>=0)
     {
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0)
        {
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
        }
      else
         count++;
     }
Erhöhen Sie die Zählvariable vor dem Beenden von OnCalculate() - in diesem Fall wird diese Variable alle Läufe in OnCalculate korrekt zählen.