Características del lenguaje mql5, sutilezas y técnicas - página 165

 
fxsaber:

Sí, tengo presente la lectura de la historia.

Usted escribió entonces que mi indicador era lento.
Encontré la razón de eso mismo. Cuando cargué la cuenta con 30.000 operaciones.
Conseguí reducir los frenos . He rediseñado un poco la lectura del historial y he optimizado el código. Pero todavía los tiene. La razón es que hay filtros y todo se recalcula cuando hago clic en un filtro.
Aunque todo se lee desde arrays.
Todo está bien en las cuentas con 5000 operaciones. Pero es un problema en los grandes.
No se trata sólo de ese indicador.

He hecho un proyecto de lectura de historia limpia.
Tal vez, se deba a Internet. Al fin y al cabo, toda la historia son muchos datos.

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: Easy Canvas

Nikolai Semko, 2020.02.17 05:15

Quiero aclarar un punto importante para los programadores interesados en el funcionamiento del kanvas en modo tester.
Un conocido programador de esta comunidad se dirigió a mí con esta pregunta:

- ¿Por qué en el modo de prueba mi panel, creado en objetos, se redibuja mucho más rápido que en el lienzo, mientras que en el modo normal mi panel se dibuja a velocidad normal en el lienzo?

He comprendido la razón de ello y he encontrado la solución al problema.

El problema es que el redibujado de los objetos va acompañado del redibujado de toda la pantalla, mientras que la pantalla en el probador se redibuja con una frecuencia no superior a 30 fotogramas por segundo.

Los objetos son, en definitiva, el mismo lienzo (interno), pero cuando se cambian las propiedades del objeto, el lienzo del objeto no se genera (no se recalcula), sino que se genera sólo cuando se actualiza la pantalla (ChartRedraw), lo que ocurre en el probador (y en modo normal, también) no más a menudo de lo que nuestro ojo puede distinguir los cambios, es decir, no más a menudo que ~ 32 cuadros por segundo.

Supongamos que el panel cambia cada tick. Entonces el lienzo por defecto también se redibujará cada tick, pero el redibujado en el probador sigue siendo no más frecuente que ~30 mseg (~30 fps).

En otras palabras, el lienzo se volverá a calcular mucho más a menudo de lo que realmente se muestra en la pantalla, lo que resulta en un uso desproporcionado de recursos.

La solución a este problema sería asegurar que el lienzo se recalcule y redibuje no más a menudo que cada 15-30 milisegundos de tiempo de ordenador, y entonces no habrá ciclos innecesarios de recálculo vacío.

Por ejemplo, así:

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

 
Si, por ejemplo, quiere crear un archivo "EURUSD.txt" (caracteres grandes) y ya tiene "eurusd.txt" (caracteres pequeños) en el disco, el archivo tendrá el mismo nombre que antes.
 
fxsaber:
Si, por ejemplo, quiero crear el archivo "EURUSD.txt" (símbolos grandes) y ya existe "eurusd.txt" (símbolos pequeños) en el disco, el archivo tendrá el mismo nombre que antes.

Además, cuando guardo EURUSD TicksLongOpt.set, se guarda eurusd tickslongopt.set. Después tengo que cambiarle el nombre. Hay un montón de pequeñas cosas molestas como esa.

 
Edgar Akhmadeev:

Además, cuando guardo EURUSD TicksLongOpt.set, se guarda eurusd tickslongopt.set. Después tengo que cambiarle el nombre. Después tengo que cambiarle el nombre. Hay muchas cositas así de molestas.

Creo que si primero borro y luego creo, todo irá bien.

 
fxsaber:

Creo que si borras primero y luego creas, estarás bien.

No, me refiero a la creación de un nuevo archivo, específicamente al guardar desde el diálogo de la terminal. Si no funciona para todos, entonces depende de algo más. Tengo Win7, en todo caso.

 
Edgar Akhmadeev:

No, me refiero a la creación de un nuevo archivo, específicamente al guardar desde el diálogo de la terminal. Si no funciona para todos, entonces depende de algo más. Tengo Win7, en todo caso.

Me refería a las funciones FileOpen y FileSave.

 
fxsaber:

Me refería a las funciones FileOpen y FileSave.

Sí, recién ahora me di cuenta que está fuera de lugar, el tema es sobre el lenguaje...

 
fxsaber:
Ordenar fácilmente un conjunto de estructuras


Aplicación


Resultado

No funciona, ¿puede actualizarlo? Las declaraciones de plantillas no están permitidas en las clases 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:

No funciona, ¿puede actualizarlo? Las declaraciones de plantillas de escritura no están permitidas en las clases locales TestarrSort.mq5 81 3

Desgraciadamente, la lengua se ha cortado. Este código no funciona.

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


Pero puede probar una variante alternativa.

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 Este es otro ejemplo de uso.