Fehler, Irrtümer, Fragen - Seite 1697

 
Karputov Vladimir:
Print(MQLInfoString(MQL_PROGRAM_NAME)); gibt den kurzen Indikatornamen zurück. Wenn kein Kurzname angegeben wird, wird der vollständige Name zurückgegeben.
Ich danke Ihnen.
 
Vladimir Pastushak:

Ich danke Ihnen.

Alexey, Ihr Beispiel funktioniert nicht, die Methoden des Elternteils sind immer noch in den Erben, die nicht gedumpt werden sollte entsorgt.


Das sollte nicht so sein, können Sie den Code eingeben?

Die Daten, die in der Muttergesellschaft geschützt und öffentlich waren, werden bei protected-inheritance geschützt.

	          
 
  1. Wir setzen den Indikator auf einem NONE-Chart mit unseren Händen
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define  TOSTRING(A) #A + " = " + (string)A + "\n"
    
    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 (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. Nehmen Sie den Indikator mit der Hand aus dem Diagramm heraus.
  3. Im Protokoll sehen wir, dass der Indikator weiterläuft. Sie können alle Diagramme im Terminal schließen, aber der Vorgang wird trotzdem ausgeführt. Und das wird natürlich nicht helfen,
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. Ein Neustart des Terminals stoppt die Ausführung des Indikators.
  5. Wie viele Indikatoren können untätig sein und wir wissen nicht einmal davon? Es gibt überhaupt keine Kontrolle.
 
fxsaber:
  1. Manuelle Einstellung des NULL-Indikators auf dem Diagramm
  2. Nehmen Sie den Indikator mit der Hand aus dem Diagramm heraus.
  3. Im Protokoll sehen wir, dass der Indikator weiterläuft. Sie können alle Diagramme im Terminal schließen, aber es wird trotzdem ausgeführt.
  4. Ein Neustart des Terminals stoppt die Ausführung des Indikators.
  5. Wie viele Indikatoren können untätig sein und wir haben noch nicht einmal etwas von ihnen gehört? Es gibt überhaupt keine Kontrolle.

Es ist unmöglich, Codes mit#define und mit : zu lesen und zu durchschauen:

Bitte schreiben Sie die Codes im Stil des üblichen MQL5 um.

 
fxsaber:
  1. Manuelle Einstellung des NULL-Indikators auf dem Diagramm
  2. Nehmen Sie den Indikator mit der Hand aus dem Diagramm heraus.
  3. Im Protokoll sehen wir, dass der Indikator weiterläuft. Sie können alle Diagramme im Terminal schließen, aber es wird trotzdem ausgeführt.
  4. Ein Neustart des Terminals stoppt die Ausführung des Indikators.
  5. Wie viele Indikatoren können im Idle-Modus ausgeführt werden und wir haben noch nicht einmal von ihnen gehört? Es gibt überhaupt keine Kontrolle.
Das Hinzufügen der _StopFlag-Prüfung ist nicht hilfreich?
 
Karputov Vladimir:

Es ist unmöglich, die Codes mit#define und mit : zu lesen und zu beobachten:

Bitte schreiben Sie die Codes im üblichen MQL5-Stil um.

Dies ist der MQL5-Stil. Bitte studieren Sie, was #define ist und was :: ist.
 
Alexey Kozitsyn:
Das Hinzufügen einer _StopFlag-Prüfung hilft nicht?
Wo kann es hinzugefügt werden und wie kann es zumindest theoretisch helfen. Dies ist ein Fehler des Terminals. Und es ist ein schwerwiegender Fehler. Ich hatte Glück - ich sehe im Protokoll, dass der Indikator funktioniert. Es gibt jedoch eine Reihe von Indikatoren, die im Terminal funktionieren, ohne dass Informationen über sie vorliegen. Aber das Thema kommt auf, und warum ist meine CPU bei einem leeren Terminal so belastet?
 
fxsaber:
Dies ist der Stil von MQL5. Bitte studieren Sie, was #define ist und was :: ist.
Das ist nicht das, was ich meine. Das "::" wird in Ihren Beispielen überhaupt nicht gebraucht - vielleicht ist es Ihre Gewohnheit, aber es ist dort überhaupt nicht nötig. Der Code kann auch normal ohne #defane geschrieben werden. Versuchen Sie einfach, es neu zu schreiben und sehen Sie, ob etwas klarer wird.
 
Karputov Vladimir:
Das ist nicht das, was ich meine. "::" wird in Ihren Beispielen überhaupt nicht gebraucht - vielleicht ist es Ihre Gewohnheit, aber es wird dort überhaupt nicht gebraucht. Der Code kann auch ohne #defane geschrieben werden. Versuchen Sie einfach, es neu zu schreiben und sehen Sie, ob etwas klarer wird.

Ich hatte nur an einer Stelle "::". Und ich schreibe die Codes nicht von Grund auf neu. In der Regel nehme ich etwas aus meinen Codes heraus. Hier ist ::: es gab eine durch copy-paste. Ich habe nie darauf geachtet, aber ich habe es entfernt, weil man sich dadurch so viel besser fühlt.

Aber es ist keine Frage des Prinzips, #define nicht zu entfernen. 99 % des Codes können ohne ihn geschrieben werden. Dies ist kein Anlass, sie wegzunehmen.

Und es gibt (relativ) 1%, bei dem man auf #define nicht verzichten kann!

 
fxsaber:

Ich hatte nur an einer Stelle "::". Und ich schreibe die Codes nicht von Grund auf neu. In der Regel nehme ich etwas aus meinen Codes heraus. Hier ist ::: es gab eine durch copy-paste. Ich habe nie darauf geachtet, aber ich habe es entfernt, weil man sich dann so viel besser fühlt.

Aber es ist keine Frage des Prinzips, #define nicht zu entfernen. 99 % des Codes können ohne ihn geschrieben werden. Dies ist kein Anlass, sie wegzunehmen.

Und es gibt 1 % (bedingt), wo man auf #define nicht verzichten kann!

Wenn Sie den Puffer nicht kopieren:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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(handle!=INVALID_HANDLE)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      //if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
      //   Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

dann hat der Indikator seine Arbeit erfolgreich beendet

2016.09.23 12:11:12.655 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:14.794 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:15.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:16.936 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #4 OnDeinit
Grund der Beschwerde: