Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 104

 
Andrey Khatimlianskii:

Wie viele Instrumente werden auf dem Markt überprüft?

61.

 
fxsaber:

In Build 1907 sind die Bugs auf wundersame Weise verschwunden. Ich weiß nicht einmal, ob ich zurückgehen soll, um sie zu finden, oder ob hier gerade etwas repariert worden ist...

 

Frage zur Konstruktion von Indikatoren

#property indicator_chart_window

#property indicator_buffers 12

#property indicator_plots   6

#property indicator_type1   DRAW_COLOR_LINE

#property indicator_type2   DRAW_COLOR_LINE

#property indicator_type3   DRAW_COLOR_LINE

#property indicator_type4   DRAW_COLOR_LINE

#property indicator_type5   DRAW_COLOR_LINE

#property indicator_type6   DRAW_COLOR_LINE 


SetIndexBuffer(0,upper_line,INDICATOR_DATA);

   SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX);


   PlotIndexSetString(0,PLOT_LABEL,"Upper Line");

   PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);

   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);

   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);

// ==========

   SetIndexBuffer(2,awera_line,INDICATOR_DATA);

   SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX);


   PlotIndexSetString(1,PLOT_LABEL,"Average Line");

   PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle);

   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth);

   PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);

   PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp);

   PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw);

// ==========

   SetIndexBuffer(4,lower_line,INDICATOR_DATA);

   SetIndexBuffer(5,lower_line_color,INDICATOR_COLOR_INDEX);


   PlotIndexSetString(2,PLOT_LABEL,"Lower Line");

   PlotIndexSetInteger(2,PLOT_LINE_STYLE,LowerStyle);

   PlotIndexSetInteger(2,PLOT_LINE_WIDTH,LowerWidth);

   PlotIndexSetInteger(2,PLOT_COLOR_INDEXES,2);

   PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,LowerTrendUp);

   PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,LowerTrendDw);

Wie viele Farbpuffer können verwendet werden?

Wie sind die Puffer miteinander verbunden?

#property indicator_buffers 12 // Insgesamt 12 Puffer deklarieren

#property indicator_plots 6 // grafische Konstruktionen

Verstehe ich das richtig, dass der Indikator bei Angabe von indicator_type 1 bis 6 versteht, dass farbige Linien für 6 grafische Darstellungen gezeichnet werden sollen?

#property indicator_type1 DRAW_COLOR_LINE

#property indicator_type2 DRAW_COLOR_LINE

#property indicator_type3 DRAW_COLOR_LINE

#property indicator_type4 DRAW_COLOR_LINE

#property indicator_type5 DRAW_COLOR_LINE

#property indicator_type6 DRAW_COLOR_LINE


// =====

SetIndexBuffer(0,upper_line,INDICATOR_DATA); // Erster Puffer für Daten

SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX); // Zweiter Puffer für Farbdaten


PlotIndexSetString(0,PLOT_LABEL, "Upper Line"); // Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);// Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);//Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);// Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);// Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);// Eigenschaften des ersten Puffers ändern


SetIndexBuffer(2,awera_line,INDICATOR_DATA); // Dritter Puffer

SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX); // Vierter Puffer für Farben


PlotIndexSetString(1,PLOT_LABEL, "Durchschnittslinie"); // Puffereigenschaften für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

 
Wladimir Pastuschak:

Frage zur Konstruktion von Indikatoren

#property indicator_chart_window

#property indicator_buffers 12

#property indicator_plots   6

#property indicator_type1   DRAW_COLOR_LINE

#property indicator_type2   DRAW_COLOR_LINE

#property indicator_type3   DRAW_COLOR_LINE

#property indicator_type4   DRAW_COLOR_LINE

#property indicator_type5   DRAW_COLOR_LINE

#property indicator_type6   DRAW_COLOR_LINE 


SetIndexBuffer(0,upper_line,INDICATOR_DATA);

   SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX);


   PlotIndexSetString(0,PLOT_LABEL,"Upper Line");

   PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);

   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);

   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);

// ==========

   SetIndexBuffer(2,awera_line,INDICATOR_DATA);

   SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX);


   PlotIndexSetString(1,PLOT_LABEL,"Average Line");

   PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle);

   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth);

   PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2);

   PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp);

   PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw);

// ==========

   SetIndexBuffer(4,lower_line,INDICATOR_DATA);

   SetIndexBuffer(5,lower_line_color,INDICATOR_COLOR_INDEX);


   PlotIndexSetString(2,PLOT_LABEL,"Lower Line");

   PlotIndexSetInteger(2,PLOT_LINE_STYLE,LowerStyle);

   PlotIndexSetInteger(2,PLOT_LINE_WIDTH,LowerWidth);

   PlotIndexSetInteger(2,PLOT_COLOR_INDEXES,2);

   PlotIndexSetInteger(2,PLOT_LINE_COLOR,0,LowerTrendUp);

   PlotIndexSetInteger(2,PLOT_LINE_COLOR,1,LowerTrendDw);

Wie viele Farbpuffer können verwendet werden?

Wie sind die Puffer miteinander verbunden?

#property indicator_buffers 12 // Insgesamt 12 Puffer deklarieren

#property indicator_plots 6 // grafische Konstruktionen

Verstehe ich das richtig, dass der Indikator bei Angabe von indicator_type 1 bis 6 versteht, dass farbige Linien für 6 grafische Darstellungen gezeichnet werden sollen?

#property indicator_type1 DRAW_COLOR_LINE

#property indicator_type2 DRAW_COLOR_LINE

#property indicator_type3 DRAW_COLOR_LINE

#property indicator_type4 DRAW_COLOR_LINE

#property indicator_type5 DRAW_COLOR_LINE

#property indicator_type6 DRAW_COLOR_LINE


// =====

SetIndexBuffer(0,upper_line,INDICATOR_DATA); // Erster Puffer für Daten

SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX); // Zweiter Puffer für Farbdaten


PlotIndexSetString(0,PLOT_LABEL, "Upper Line"); // Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);// Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);//Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);// Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);// Eigenschaften des ersten Puffers ändern

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);// Eigenschaften des ersten Puffers ändern


SetIndexBuffer(2,awera_line,INDICATOR_DATA); // Dritter Puffer

SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX); // Vierter Puffer für Farben


PlotIndexSetString(1,PLOT_LABEL, "Durchschnittslinie"); // Puffereigenschaften für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw); // Eigenschaften des Puffers für SetIndexBuffer(2,awera_line,INDICATOR_DATA) ändern;

Für Ihre Frage sollten Sie besser einen eigenen Zweig anlegen. In diesem Zweig geht es um Funktionen, hier sollte es keine Diskussionen geben.

Um das Prinzip des Zeichnens besser zu verstehen, implementieren Sie die Funktionalität schrittweise. Sie haben eine Linie gebaut - überprüfen Sie ihre Funktionalität, fügen Sie die nächste hinzu.

Jede grafische Reihe (in diesem Fall eine Farblinie) kann nur einen Farbpuffer haben. Jeder Puffer kann viele Farben enthalten.

 
Andrey Khatimlianskii:

In der Version 1907 sind die Bugs auf wundersame Weise verschwunden. Ich weiß nicht einmal, ob ich zurückgehen soll, um sie zu finden, oder ob hier gerade etwas repariert worden ist...

Die Fehler sind verschwunden, die Probleme mit der Ereigniswarteschlange jedoch nicht. Nach einigen Stunden beginnt das Terminal, die CPU bis zu 95 % zu belasten. Und irgendetwas sagt mir, dass Zecken übersprungen werden.

2018.10.11 23:56:54.069 Terminal        MetaTrader 5 x64 build 1907 started (MetaQuotes Software Corp.)
2018.10.11 23:56:54.139 Terminal        Windows 8.1 (build 9600) x64, IE 11, UAC, Intel Core i5-3570  @ 3.40 GHz, Memory: 11580 / 16346 Mb, Disk: 401 / 499 Gb, GMT+2

@Slava, hat sich an ChartEvent in den 19xx-Builds etwas geändert? Wird das Problem in Ihren Builds reproduziert?

 
Andrey Khatimlianskii:

Die Fehler sind verschwunden, nicht aber die Probleme mit der Ereigniswarteschlange. Nach einigen Betriebsstunden beginnt das Terminal, die CPU zu 95 % auszulasten. Und irgendetwas sagt mir, dass die Zecken fehlen.

@Slava, hat sich an ChartEvent in den 19xx-Builds etwas geändert? Ist Ihr Problem reproduzierbar?

So sieht die Überwachung der Ressourcen nach 15 Stunden Arbeit des Terminals aus (die minimale Häufigkeit, mit der der Spion Ereignisse sendet, beträgt 500 ms):

Obwohl die CPU-Last nach dem Start mehrere Stunden lang nahe bei 0 liegt.

 
Andrey Khatimlianskii:

So sieht die Ressourcenüberwachung nach 15 Stunden Betrieb des Terminals aus (die Mindestübertragungsrate von Spyware-Ereignissen beträgt 500 ms):

Obwohl die CPU-Belastung nach dem Start einige Stunden lang nahe bei 0 liegt.

Bild 1908 - keine Änderung.

 

Die Möglichkeit, die Operatoren der Basistypstruktur zu ersetzen, bietet in einigen Situationen mehr Flexibilität.

Hier ist ein Beispiel für eine der Techniken zur benutzerdefinierten Sortierung eines Arrays von Strukturen

// Основная структура
struct A
{
  int a;
  int b;
  
  // Правило сортировки
  bool operator > ( const A& Value ) const 
  {
    return(this.a > Value.a);
  }
};

// Вспомогательная структура для изменения правила сортировки
struct B : A
{
  // Перегрузка правила сортировки
  bool operator > ( const A& Value ) const 
  {
    return(this.b > Value.b);
  }
};

// Простая сортировка
template <typename T1, typename T2> // T2 - по какому правилу сортируем
void Sort( T1 &Array[] )
{
  const int Size = ArraySize(Array);
  
  for (int i = 0; i < Size - 1; i++)
  {
    T2 Min = Array[i];
    int Pos = i;
    
    for (int j = i + 1; j < Size; j++)
      if (Min > Array[j])
      {
        Min = Array[j];
        Pos = j;        
      }
      
    if (Pos != i)
    {
      Array[Pos] = Array[i];
      Array[i] = Min;
    }
  }
}

void OnStart()
{
  A Array[3] = {{2, 2}, {3,1}, {1, 3}};
  
  ArrayPrint(Array);
  
  // Сортировка по правилу A
  Sort<A, A>(Array); 
  ArrayPrint(Array);
  
  // Сортировка по правилу B
  Sort<A, B>(Array);  
  ArrayPrint(Array);
}


Ergebnis

    [a] [b]
[0]   2   2
[1]   3   1
[2]   1   3
    [a] [b]
[0]   1   3
[1]   2   2
[2]   3   1
    [a] [b]
[0]   3   1
[1]   2   2
[2]   1   3


Dies ist wahrscheinlich ein altes Fahrrad.

 
fxsaber:

Die Möglichkeit, Operatoren von Basistyp-Strukturen zu ersetzen, ermöglicht in einigen Situationen Flexibilität.

Es gibt ein paar Punkte. In Mql muss der <-Operator unbedingt eine Methode der Klasse/Struktur sein.

Dies bedeutet, dass sie nicht für eingebettete oder unveränderliche Strukturen gesetzt werden kann.

Dies kann ein wenig verbessert werden, indem man eine Vergleichsfunktion in der Vorlage hinzufügt, die standardmäßig den <-Operator aufruft

UPD: Ich schreibe überall < als Operator, weil er in der Regel überladen ist und nicht >, das ist nicht streng, aber allgemein akzeptiert.
 
TheXpert:

Es gibt ein paar Punkte. In Mql muss der <-Operator eine Methode der Klasse/Struktur sein.

Das bedeutet, dass er nicht für eingebettete Strukturen oder für unveränderliche Strukturen gesetzt werden kann.

// Вспомогательная структура для изменения правила сортировки
struct MQLTICK_BID : MqlTick
{
  // Сортировка по времени
  bool operator <( const MqlTick& Value ) const 
  {
    return(this.bid < Value.bid);
  }
};

// Простая сортировка
template <typename T1, typename T2> // T2 - по какому правилу сортируем
void Sort( T1 &Array[] )
{
  const int Size = ArraySize(Array);
  
  for (int i = 0; i < Size - 1; i++)
  {
    T2 Min = Array[i];
    int Pos = i;
    
    for (int j = i + 1; j < Size; j++)
      if (Min < Array[j])
      {
        Min = Array[j];
        Pos = j;        
      }
      
    if (Pos != i)
    {
      Array[Pos] = Array[i];
      Array[i] = Min;
    }
  }
}

void OnStart()
{
  MqlTick Ticks[];
  
  CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 5);
  
  ArrayPrint(Ticks);
  
  // Сортировка по правилу MQLTICK_BID
  Sort<MqlTick, MQLTICK_BID>(Ticks); 
  ArrayPrint(Ticks);
}


Ergebnis

                 [time]   [bid]   [ask]  [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2018.10.11 23:59:55 1.09115 1.09354 0.00000        0 1539302395303       6       0.00000
[1] 2018.10.11 23:59:56 1.09132 1.09348 0.00000        0 1539302396037       6       0.00000
[2] 2018.10.11 23:59:56 1.09131 1.09353 0.00000        0 1539302396302       6       0.00000
[3] 2018.10.11 23:59:59 1.09135 1.09354 0.00000        0 1539302399458       6       0.00000
[4] 2018.10.11 23:59:59 1.09139 1.09378 1.09260        0 1539302399989      14       0.00000
                 [time]   [bid]   [ask]  [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2018.10.11 23:59:59 1.09139 1.09378 1.09260        0 1539302399989      14       0.00000
[1] 2018.10.11 23:59:59 1.09135 1.09354 0.00000        0 1539302399458       6       0.00000
[2] 2018.10.11 23:59:56 1.09132 1.09348 0.00000        0 1539302396037       6       0.00000
[3] 2018.10.11 23:59:56 1.09131 1.09353 0.00000        0 1539302396302       6       0.00000
[4] 2018.10.11 23:59:55 1.09115 1.09354 0.00000        0 1539302395303       6       0.00000


Dieser Weg kann noch etwas verbessert werden, indem man eine Vergleichsfunktion in der Vorlage hinzufügt, die standardmäßig den <-Operator aufruft

Wenn Sie typedef verwenden, dann müssen Sie eine Sortierfunktion nicht nur für Strukturen, sondern auch für numerische Standardtypen definieren. Oder vielleicht verstehe ich nicht, wovon Sie sprechen.