Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 165

 
fxsaber:

Ja, ich habe Geschichte zum Lesen dabei.

Sie schrieben damals, mein Indikator sei langsam.
Ich habe den Grund für genau diese Sache gefunden. Als ich das Konto mit 30.000 Geschäften aufgeladen habe.
Es gelang mir, die Bremsen zu reduzieren. Ich habe das Lesen der Historie ein wenig umgestaltet und den Code optimiert. Aber es gibt sie noch. Der Grund dafür ist, dass es Filter gibt und alles neu berechnet wird, wenn ich auf einen Filter klicke.
Obwohl alles aus Arrays gelesen wird.
Bei Konten mit 5000 Geschäften ist alles in Ordnung. Aber es ist ein Problem, wenn sie groß sind.
Es geht nicht nur um diesen Indikator.

Ich habe ein sauberes Geschichtsleseprojekt gemacht.
Vielleicht liegt es ja auch am Internet. Schließlich ist die gesamte Geschichte eine Menge von Daten.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: Easy Canvas

Nikolai Semko, 2020.02.17 05:15

Ich möchte einen wichtigen Punkt für interessierte Programmierer klären, wenn sie den Kanvas im Tester-Modus betreiben.
Ein bekannter Programmierer in dieser Gemeinschaft kam mit dieser Frage zu mir:

- Warum wird im Testmodus mein auf Objekten erstelltes Panel viel schneller neu gezeichnet als auf der Leinwand, während im normalen Modus mein Panel mit normaler Geschwindigkeit auf der Leinwand gezeichnet wird?

Ich habe den Grund dafür verstanden und habe die Lösung für das Problem gefunden.

Das Problem ist, dass das Neuzeichnen von Objekten mit dem Neuzeichnen des gesamten Bildschirms einhergeht, während der Bildschirm im Testgerät nicht häufiger als 30 Bilder pro Sekunde neu gezeichnet wird.

Objekte sind letztlich die gleiche Leinwand (intern), aber wenn Sie die Eigenschaften des Objekts zu ändern, ist das Objekt Leinwand nicht generiert (nicht neu berechnet), sondern nur dann, wenn der Bildschirm aktualisiert wird (ChartRedraw), die in der Tester (und im normalen Modus, auch) nicht öfter als unser Auge kann Änderungen unterscheiden, dh nicht öfter als ~ 32 Frames pro Sekunde auftritt.

Angenommen, das Panel ändert sich bei jedem Tick. Dann wird auch die Standard-Leinwand bei jedem Tick neu gezeichnet, aber das Neuzeichnen ist im Testgerät immer noch nicht häufiger als ~30 ms (~30 fps).

Mit anderen Worten: Die Leinwand wird viel häufiger neu berechnet, als sie tatsächlich auf dem Bildschirm angezeigt wird, was zu einem unverhältnismäßig hohen Ressourcenverbrauch führt.

Die Lösung für dieses Problem wäre, sicherzustellen, dass die Leinwand nicht öfter als alle 15-30 Millisekunden neu berechnet und gezeichnet wird, so dass es keine unnötigen Zyklen leerer Neuberechnungen gibt.

Zum Beispiel so:

void OnTick()
  {
  static uint lastCalc=0;
  uint cur=GetTickCount();
  if (cur-lastCalc>15) {
    ReDrawMyCanvas();
    lastCalc=cur;
   }
  }

 
Wenn Sie z.B. eine Datei "EURUSD.txt" (große Zeichen) erstellen wollen und bereits "eurusd.txt" (kleine Zeichen) auf der Festplatte haben, wird die Datei den gleichen Namen wie zuvor haben.
 
fxsaber:
Wenn ich zum Beispiel die Datei "EURUSD.txt" (große Symbole) erstellen möchte und auf der Festplatte bereits die Datei "eurusd.txt" (kleine Symbole) vorhanden ist, wird die Datei denselben Namen wie zuvor haben.

Wenn ich außerdem EURUSD TicksLongOpt.set speichere, wird eurusd tickslongopt.set gespeichert. Ich muss sie anschließend umbenennen. Es gibt eine Menge lästiger Kleinigkeiten wie diese.

 
Edgar Akhmadeev:

Wenn ich außerdem EURUSD TicksLongOpt.set speichere, wird eurusd tickslongopt.set gespeichert. Ich muss sie anschließend umbenennen. Ich muss sie anschließend umbenennen. Es gibt viele solcher lästigen Kleinigkeiten.

Ich denke, wenn ich sie erst lösche und dann neu erstelle, wird alles gut gehen.

 
fxsaber:

Ich denke, wenn Sie erst löschen und dann erstellen, wird das kein Problem sein.

Nein, ich spreche von der Erstellung einer neuen Datei, insbesondere beim Speichern aus dem Terminal-Dialog. Wenn es nicht bei allen funktioniert, dann hängt es von etwas anderem ab. Ich habe Win7, wenn überhaupt.

 
Edgar Akhmadeev:

Nein, ich meine das Erstellen einer neuen Datei, und zwar genau dann, wenn Sie im Terminaldialog speichern. Wenn es nicht bei allen funktioniert, dann hängt es von etwas anderem ab. Ich habe Win7, wenn überhaupt.

Ich meinte die Funktionen FileOpen und FileSave.

 
fxsaber:

Ich meinte die Funktionen FileOpen und FileSave.

Ja, erst jetzt habe ich gemerkt, dass es fehl am Platz ist, das Thema handelt von Sprache...

 
fxsaber:
Einfaches Sortieren einer Reihe von Strukturen


Anmeldung


Ergebnis

Es funktioniert nicht, können Sie es aktualisieren? Sets Template-Deklarationen sind in lokalen Klassen nicht erlaubt TestarrSort.mq5 81 3

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define  ArraySortStruct(ARRAY, FIELD)                                            \
{                                                                                \
  class SORT                                                                     \
  {                                                                              \
  private:                                                                       \
    template <typename T>                                                        \
    static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
      const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
      int Marker = Start;                                                        \
                                                                                 \          
      for (int i = Start; i <= End; i++)                                         \
        if (Array[i].##FIELD <= Array[End].##FIELD)                              \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return(Marker - 1);                                                       \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
      if (Start < End)                                                           \
      {                                                                          \
        const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1);                                \
        SORT::QuickSort(Array, Pivot + 1, End);                                  \
      }                                                                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
  public:                                                                        \
    template <typename T>                                                        \ 
    static void Sort( T &Array[], int Count = WHOLE_ARRAY, const int Start = 0 ) \
    {                                                                            \
      if (Count == WHOLE_ARRAY)                                                  \
        Count = ::ArraySize(Array)- Start; ;                                     \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1);                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}                                                                                \


void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}

 
Vladimir Pastushak:

Funktioniert nicht, können Sie es aktualisieren? Schreibvorlagen-Deklarationen sind in lokalen Klassen nicht erlaubt TestarrSort.mq5 81 3

Leider wurde die Sprache abgeschnitten. Dieser Code funktioniert nicht.

void OnStart()
{
  class A
  {
    template <typename T> // template declarations are not allowed in local classes
    void f() {}
  };
}


Sie können aber auch eine andere Variante ausprobieren.

template <typename T>                                       
void ArrayReindex( T &Array[], const double &TmpSort[][2] )
{                         
  T TmpArray[];
  
  for (int i = ::ArrayResize(TmpArray, ::ArrayRange(TmpSort, 0)) - 1; i >= 0; i--)
    TmpArray[i] = Array[(int)(TmpSort[i][1] + 0.1)];
    
  ::ArraySwap(Array, TmpArray);
              
  return;     
}             

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define  ArraySortStruct(ARRAY, FIELD)                                      \
{                                                                          \
  double TmpSort[][2];                                                     \
                                                                           \
  for (int i =::ArrayResize(TmpSort, ::ArraySize(ARRAY)) - 1; i >= 0; i--) \
  {                                                                        \
    TmpSort[i][0] = (double)ARRAY[i].FIELD;                                \
    TmpSort[i][1] = i;                                                     \
  }                                                                        \
                                                                           \
  ::ArraySort(TmpSort);                                                    \
  ::ArrayReindex(ARRAY, TmpSort);                                          \
}                                         

void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}


SZZ Hier ein weiteres Beispiel für die Verwendung.