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

 
Andrey Khatimlianskii:

Combien d'instruments sont passés en revue sur le marché ?

61.

 
fxsaber:

Dans la build 1907, les bugs ont miraculeusement disparu. Je ne sais même pas s'il faut revenir en arrière pour les trouver, ou si quelque chose dans cet endroit vient d'être corrigé...

 

Question sur la construction des indicateurs

#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);

Combien de tampons de couleur peuvent être utilisés ?

Comment les tampons sont-ils liés les uns aux autres ?

#property indicator_buffers 12 // Déclare un total de 12 tampons

#property indicator_plots 6 // constructions graphiques

Est-ce que je comprends bien qu'en spécifiant indicator_type 1 à 6, l'indicateur comprendra que des lignes de couleur doivent être tracées pour 6 graphiques ?

#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) ; // Premier tampon pour les données

SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX) ; // Deuxième tampon pour les données de couleur


PlotIndexSetString(0,PLOT_LABEL, "Upper Line") ; // Changement des propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);// changer les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);//change les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);// changer les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);// changer les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);// changer les propriétés du premier tampon


SetIndexBuffer(2,awera_line,INDICATOR_DATA) ; // Troisième tampon

SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX) ; // Quatrième tampon de couleurs


PlotIndexSetString(1,PLOT_LABEL, "Average Line") ; // Modifier les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

 
Vladimir Pastushak:

Question sur la construction des indicateurs

#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);

Combien de tampons de couleur peuvent être utilisés ?

Comment les tampons sont-ils liés les uns aux autres ?

#property indicator_buffers 12 // Déclare un total de 12 tampons

#property indicator_plots 6 // constructions graphiques

Est-ce que je comprends bien qu'en spécifiant indicator_type 1 à 6, l'indicateur comprendra que des lignes de couleur doivent être tracées pour 6 graphiques ?

#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) ; // Premier tampon pour les données

SetIndexBuffer(1,upper_line_color,INDICATOR_COLOR_INDEX) ; // Deuxième tampon pour les données de couleur


PlotIndexSetString(0,PLOT_LABEL, "Upper Line") ; // Changement des propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_STYLE,UpperStyle);// changer les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_WIDTH,UpperWidth);//change les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);// changer les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,UpperTrendUp);// changer les propriétés du premier tampon

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,UpperTrendDw);// changer les propriétés du premier tampon


SetIndexBuffer(2,awera_line,INDICATOR_DATA) ; // Troisième tampon

SetIndexBuffer(3,awera_line_color,INDICATOR_COLOR_INDEX) ; // Quatrième tampon de couleurs


PlotIndexSetString(1,PLOT_LABEL, "Average Line") ; // Modifier les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_STYLE,AverageStyle) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_WIDTH,AverageWidth) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,2) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,0,AverageTrendUp) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,AverageTrendDw) ; // Change les propriétés du tampon pour SetIndexBuffer(2,awera_line,INDICATOR_DATA) ;

Vous feriez mieux de créer une branche séparée pour votre question. Cette branche concerne les fonctionnalités, il ne devrait pas y avoir de discussions ici.

Pour mieux comprendre le principe du dessin, mettez en œuvre la fonctionnalité de manière incrémentielle. Vous avez construit une ligne - vérifiez sa fonctionnalité, ajoutez la suivante.

Chaque série graphique (dans ce cas, une ligne de couleur) ne peut avoir qu'un seul tampon de couleur. Chaque tampon peut contenir plusieurs couleurs.

 
Andrey Khatimlianskii:

Dans la version 1907, les bogues ont miraculeusement disparu. Je ne sais même pas s'il faut revenir en arrière pour les trouver, ou si quelque chose à cet endroit vient d'être corrigé...

Les erreurs ont disparu, mais pas les problèmes avec la file d'attente des événements. Après quelques heures, le terminal commence à charger le CPU jusqu'à 95%. Et quelque chose me dit que les tiques sont sautées.

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, est-ce que quelque chose a changé dans ChartEvent dans les builds 19xx ? Le problème est-il reproduit dans vos builds ?

 
Andrey Khatimlianskii:

Les erreurs ont disparu, mais pas les problèmes de la file d'attente des événements. Après quelques heures de fonctionnement, le terminal commence à charger le CPU à 95%. Et quelque chose me dit que les tiques sont manquantes.

@Slava, est-ce que quelque chose a changé dans ChartEvent dans les builds 19xx ? Votre problème est-il reproduit ?

Voici à quoi ressemble la surveillance des ressources après 15 heures de travail du terminal (la fréquence minimale d'envoi des événements de l'espion est de 500 ms) :

Bien que la charge du CPU soit proche de 0 pendant plusieurs heures après le démarrage.

 
Andrey Khatimlianskii:

Voici à quoi ressemble la surveillance des ressources après 15 heures de fonctionnement du terminal (la vitesse minimale d'envoi des événements du spyware est de 500ms) :

Bien que la charge du CPU soit proche de 0 pendant quelques heures après le démarrage.

Bild 1908 - pas de changement.

 

La possibilité de remplacer les opérateurs de la structure du type de base permet une certaine flexibilité dans certaines situations.

À titre d'exemple, voici l'une des techniques de tri personnalisé d'un tableau de structures

// Основная структура
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);
}


Résultat

    [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


C'est probablement un ancien vélo.

 
fxsaber:

La possibilité de remplacer les opérateurs des structures de type basique permet une certaine flexibilité dans certaines situations.

il y a quelques points. en mql, < opérateur doit nécessairement être une méthode de classe/structure.

Cela signifie qu'elle ne peut pas être définie pour les structures intégrées, ni pour les structures immuables.

Cela peut être amélioré un peu en ajoutant une fonction de comparaison de modèles, qui appellera par défaut l'opérateur <.

UPD : J'écris l'opérateur < partout parce qu'il est généralement surchargé plutôt que >, ce n'est pas strict, mais c'est généralement accepté.
 
LeXpert:

il y a quelques points. en mql, l'opérateur < doit être une méthode de la classe/structure.

Cela signifie qu'elle ne peut pas être définie pour les structures intégrées, ni pour les structures immuables.

// Вспомогательная структура для изменения правила сортировки
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);
}


Résultat

                 [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


Cette méthode peut être améliorée en ajoutant une fonction de comparaison de modèles qui, par défaut, fait appel à l'opérateur <.

Si vous utilisez typedef, vous devez alors définir une fonction de tri non seulement pour les structures, mais aussi pour les types numériques standard. Ou peut-être que je ne comprends pas ce dont vous parlez.