Fehler, Irrtümer, Fragen - Seite 1390

 

Warten Sie nicht im Indikator Init, um den Indikator vollständig zu erstellen.

Erstellen Sie den Indikator und das Rückgabesteuerelement. Die gesamte Umgebung und die Historie werden später vorbereitet und Ihr Neuberechnungscode wird aufgerufen.

 
Renat Fatkhullin:

Warten Sie in der Initia nicht auf die vollständige Erstellung des Indikators.

Erstellen Sie den Indikator und das Rückgabesteuerelement. Die gesamte Umgebung und die Historie werden später vorbereitet und Ihr Neuberechnungscode wird aufgerufen.

Danke, d.h. die Prüfung auf 4806 sollte jedes Mal durchgeführt werden, wenn Daten bereits nach der Rückkehr von OnInit() empfangen werden?
 
Bei jedem Datenlesepunkt
 

Hier wird der Indikator aufgerufen und seine Werte werden im Rahmen von OnCalculate berechnet. Sie können unbegrenzt warten, es findet keine Neuberechnung statt. Zur Ausführung im Periodenplan D1

int i_ich=INVALID_HANDLE;
double ind_buf[];

int OnInit(){
   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);
}


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[]){
   double temp[];
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied<=0){
      datetime now=TimeLocal();
      while(BarsCalculated(i_ich)<=0 && !IsStopped()){  
         Comment("Ждем пересчета индикатора Ишимоку... ",int(TimeLocal()-now));
      }
      if(BarsCalculated(i_ich)>0){
         Print("Расчитано ", BarsCalculated(i_ich), " баров за ",int(TimeLocal()-now)," секунд");
      }
      Comment("");
   } 

   return(rates_total);
}

Bitte erklären Sie, warum der Ishimoku-Wert nicht berechnet wird.

 
Ilya Malev:

Hier wird der Indikator aufgerufen und seine Werte werden im Rahmen von OnCalculate berechnet. Sie können unbegrenzt warten, es findet keine Neuberechnung statt. Zur Ausführung im Periodenplan D1

Bitte erklären Sie, warum der Ishimoku-Wert nicht berechnet wird.

Wie wäre es damit:

//+------------------------------------------------------------------+
//|                                                      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()
  {
   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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
   Print(count);
   double temp[];
   datetime now=TimeLocal();
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied>0)
      Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+
?
 

Sie sollten die Erwartung im Code des Indikators niemals in einer Schleife wiederholen. In Skripten und Expert Advisors können Sie das, aber in Indikatoren können Sie das absolut nicht.

Die Strategie für Berechnungen und Anforderungen von externen Daten in Indikatoren sollte wie folgt aussehen: Wenn die Datenanforderung nicht erfolgreich war, wird sofort abgebrochen und die Berechnungen werden auf den nächsten Tick verschoben. Beim nächsten Tick/Aufruf werden wir erneut versuchen, die erforderlichen Daten abzufragen.

 
Karputov Vladimir:

Und wenn ja:

?
Gibt "0" aus (da es Sonntag ist, gibt es keinen Neustart von OnCalculate )
 
Renat Fatkhullin:

Sie sollten die Erwartung im Indikatorcode niemals in einer Schleife wiederholen. In Skripten und Expert Advisors können Sie das, aber in Indikatoren können Sie das absolut nicht.

Die Strategie für die Berechnungen und die Abfrage von Fremddaten in den Indikatoren sollte wie folgt aussehen: Wenn die Datenabfrage nicht erfolgreich war, wird sofort abgebrochen und die Berechnungen auf den nächsten Tick verschoben. Beim nächsten Tick/Aufruf werden wir erneut versuchen, die erforderlichen Daten abzufragen.

Ok, aber was ist, wenn die Indikatorwerte während eines Laufs berechnet werden sollen, ohne auf den nächsten Tick zu warten? Zum Beispiel, wenn es ein Wochenende oder nur eine Periode mit geringer Liquidität gibt, wenn der Tick außerhalb einer Minute liegt? OnTimer anstelle von OnCalculate verwenden?
 
Ilya Malev:
Gibt "0" aus (da es Sonntag ist, kein erneuter OnCalculate-Lauf )
Im Prüfgerät, im Prüfgerät! Und am Wochenende müssen Sie mit der rechten Maustaste auf das Diagramm klicken und "Aktualisieren" wählen.
 

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 trotz einiger Vorteile des MT5 bei ihm bleiben.