Caractéristiques du langage mql5, subtilités et techniques - page 165

 
fxsaber:

Oui, j'ai une lecture d'histoire présente.

Vous avez alors écrit que mon indicateur était lent.
J'ai trouvé la raison de cette chose. Quand j'ai chargé le compte avec 30 000 transactions.
J'ai réussi à réduire les freins. Par un facteur de 4. J'ai refait un peu la lecture de l'historique et optimisé le code. Mais il en a toujours. La raison en est qu'il y a des filtres et que tout est recalculé lorsque je clique sur un filtre.
Bien que tout soit lu dans des tableaux.
Tout est OK sur les comptes avec 5000 transactions. Mais c'est un problème sur les grandes.
Il ne s'agit pas seulement de cet indicateur.

J'ai fait un projet de lecture d'histoire propre.
C'est peut-être dû à Internet. Après tout, l'histoire entière représente beaucoup de données.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : Easy Canvas

Nikolai Semko, 2020.02.17 05:15

Je souhaite clarifier un point important pour les programmeurs intéressés par l'utilisation du kanvas en mode testeur.
Un programmeur bien connu dans cette communauté est venu me voir avec cette question :

- Pourquoi en mode Testeur mon panneau, créé sur des objets, est redessiné beaucoup plus rapidement que sur la toile, alors qu'en mode normal mon panneau est dessiné à une vitesse normale sur la toile ?

J'en ai compris la raison et j'ai trouvé la solution au problème.

Le problème est que le redécoupage des objets s'accompagne d'un redécoupage de l'ensemble de l'écran, alors que l'écran du testeur n'est redécoupé que 30 fois par seconde.

Les objets sont en fin de compte le même canevas (interne), mais lorsque vous modifiez les propriétés de l'objet, le canevas de l'objet n'est pas généré (pas recalculé), mais généré uniquement lorsque l'écran est mis à jour (ChartRedraw), ce qui se produit dans le testeur (et en mode normal, aussi) pas plus souvent que notre œil peut distinguer les changements, c'est-à-dire pas plus souvent que ~ 32 images par seconde.

Supposons que le panneau change à chaque tick. Ensuite, le canevas par défaut sera également redessiné à chaque tick, mais le redessin dans le testeur n'est toujours pas plus fréquent que ~30 msec (~30 fps).

En d'autres termes, le canevas sera recalculé beaucoup plus fréquemment qu'il n'est réellement affiché à l'écran, ce qui entraîne une utilisation disproportionnée des ressources.

La solution à ce problème serait de s'assurer que le canevas est recalculé et redessiné au maximum toutes les 15-30 millisecondes de temps informatique, et ainsi il n'y aura pas de cycles inutiles de recalcul à vide.

Par exemple, comme ceci :

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

 
Si, par exemple, vous voulez créer un fichier "EURUSD.txt" (grands caractères) et que vous avez déjà "eurusd.txt" (petits caractères) sur le disque, le fichier aura le même nom que précédemment.
 
fxsaber:
Si, par exemple, je veux créer le fichier "EURUSD.txt" (grands symboles) et qu'il y a déjà "eurusd.txt" (petits symboles) sur le disque, le fichier aura le même nom que précédemment.

De plus, lorsque je sauvegarde EURUSD TicksLongOpt.set, eurusd tickslongopt.set est sauvegardé. Je dois ensuite le renommer. Il y a beaucoup de petites choses ennuyeuses comme ça.

 
Edgar Akhmadeev:

De plus, lorsque je sauvegarde EURUSD TicksLongOpt.set, eurusd tickslongopt.set est sauvegardé. Je dois ensuite le renommer. Je dois ensuite le renommer. Il y a beaucoup de petites choses aussi ennuyeuses.

Je pense que si je supprime d'abord et crée ensuite, tout ira bien.

 
fxsaber:

Je pense que si vous supprimez d'abord et créez ensuite, tout ira bien.

Non, je veux dire la création d'un nouveau fichier, notamment lors de l'enregistrement à partir de la boîte de dialogue du terminal. Si ça ne marche pas pour tout le monde, alors ça dépend d'autre chose. J'ai Win7, le cas échéant.

 
Edgar Akhmadeev:

Non, je veux dire la création d'un nouveau fichier, exactement comme lors de l'enregistrement à partir du dialogue du terminal. Si ça ne marche pas pour tout le monde, alors ça dépend d'autre chose. J'ai Win7, le cas échéant.

Je voulais parler des fonctions FileOpen et FileSave.

 
fxsaber:

Je voulais parler des fonctions FileOpen et FileSave.

Oui, je viens de me rendre compte que c'est déplacé, le sujet porte sur la langue...

 
fxsaber:
Tri facile d'un tableau de structures


Application


Résultat

Il ne fonctionne pas, pouvez-vous le mettre à jour ? Les déclarations de modèles ne sont pas autorisées dans les classes locales 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:

Cela ne fonctionne pas, pouvez-vous mettre à jour ? Les déclarations de modèles ne sont pas autorisées dans les classes locales TestarrSort.mq5 81 3

Malheureusement, la langue a été coupée. Ce code ne fonctionne pas.

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


Mais vous pouvez essayer une autre variante.

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 Voici un autre exemple d'utilisation.

Raison: