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

 
Vladislav Andruschenko:

Ahora me he encontrado con un problema cuando el historial contiene más de 1000 operaciones y cuando llamo a la función de procesamiento del historial, por ejemplo, para calcular el beneficio del mismo. + La información del gráfico empieza a ralentizarse y el terminal se cuelga. Es decir, los presupuestos vienen con retraso.

Sin el código sólo se pueden hacer conjeturas.

 

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

Peculiaridades de mql5, consejos y trucos

Alexey Navoykov, 2017.07.21 17:04

Es decepcionante que no haya herencia múltiple en MQL. Sin embargo, podemos hacer que funcione de cualquier manera posible - con plantillas y macros - ¿cómo podemos evitarlas?)

Esto es lo que he hecho.Todas las clases fuente deben ser declaradas como plantillas que definen la clase padre.

class CBase { };  // базовый класс

// Макросы, задающие список наследования:

#define  INHERIT1(T)  T<CBase>

#define  INHERIT2(T1, T2)  T2<INHERIT1(T1)>

#define  INHERIT3(T1, T2, T3)  T3<INHERIT2(T1,T2)>

#define  INHERIT4(T1, T2, T3, T4)  T4<INHERIT3(T1,T2,T3)>


// Различные пользовательские классы:

template<typename TParent>
class A : public TParent { public: void a() { Print("A"); } };

template<typename TParent>
class B : public TParent { public: void b() { Print("B"); } };

template<typename TParent>
class C : public TParent { public: void c() { Print("C"); } };


class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C


template<typename T>
void SomeFunc(B<T>& obj)  { obj.b(); }   // Проверочная функция, принимающая класс B


void OnInit()
{
  X x;
  x.a();
  x.b();
  x.c();
  
  SomeFunc(x);
}

Por supuesto, hay algunas sutilezas, relacionadas con el hecho de que las clases se heredan secuencialmente (en el orden que hemos establecido), en lugar de concurrentemente (como en la verdadera herencia múltiple). En particular, tendrán diferentes prioridades cuando se produzca una sobrecarga. Además, si una misma clase de plantilla participa varias veces en la cadena de herencia, serán clases completamente diferentes, no relacionadas entre sí de ninguna manera. Así que tenemos que tener cuidado aquí. Pero no hay problemas con las interfaces, se puede heredar sin restricciones.

Pero, ¿qué pasa sin la declaración en forma de plantillas?

Por ejemplo, tenemos dos bibliotecas listas para ser autosuficientes:

clase CLib1 : public CClass1 { };y
class CLib2 : public CClass2 { };

Tenemos que hacer que exista esa herencia en la clase del programa:

CLib1--> CLib2 --> CProgram para que ambas bibliotecas estén disponibles en la clase CProgram. Y la biblioteca CLib1 estará disponible en CLib2.

El código de ambas bibliotecas no puede ser modificado de ninguna manera.

¿Es posible?

Con la herencia múltiple probablemente sería así
class CProgram : public CLib1,CLib2 { };

 
Artyom Trishkin:

¿Qué tal sin una declaración de plantilla?

Por ejemplo, tenemos dos bibliotecas listas para ser autosuficientes:

clase CLib1 : public CClass1 { };y
class CLib2 : public CClass2 { };

Necesitamos hacer tal herencia en la clase de programa:

CLib1--> CLib2 --> CProgram para que ambas bibliotecas estén disponibles en la clase CProgram. Y la biblioteca CLib1 estará disponible en CLib2.

El código de ambas bibliotecas no puede ser modificado de ninguna manera.

¿Es esto posible?

Con la herencia múltiple probablemente sería así
class CProgram : public CLib1,CLib2 { };


No perderás nada si haces esto:

class CProgram
{
  CLib1 lib1;
  CLib2 lib2;
};
 
Koldun Zloy:

No perderás nada por hacerlo:

Sí, lo hice. Sólo quería evitar objetos innecesarios.
 

Probablemente la mejor manera de obtener datos de las funciones asíncronas de copia (CopyRates, CopyTicks, etc.) es a través de EventChartCustom.

Especialmente relevante para los indicadores.

 

Es posible saber que el servidor de operaciones ha cambiado, no sólo la cuenta -AccountInfoString (ACCOUNT_SERVER) en OnDeinit (EA, no indicador) devolverá el nuevo servidor de operaciones.

 

Memo

Acción/tipo de programaCambio de TF o símboloCambio de cuenta
IndicadorEjecutar OnDeinit y OnInit, los cambios globales del objeto de clase (reinicio completo).No ocurre nada, excepto que prev_calculado se pone a cero.
EAEjecuta OnDeinit y OnInit, el objeto de clase global no cambia.Ejecutar OnDeinit y OnInit, los cambios globales del objeto de clase (recarga completa).
 
Compresión de archivos y medición del tiempo de ejecución universal

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

Mi descontento con los probadores de estrategias. con los desarrolladores de MQL

fxsaber, 2017.12.04 09:11

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
} 

void OnStart()
{
  uchar Data[];
  uchar Key[1];
  uchar Result[];
  
  FileLoad("thousands_rubies_galaxy.bmp", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
  
  ArrayFree(Data);
  
  FileLoad("space_wind.wav", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
}

Resultado

826534
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 53334
306648
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 29029
 

Hay toda una clase de indicadores que superponen los gráficos de precios de otros símbolos en el gráfico de precios. Se hacen de la misma manera: a través de topes indicadores.

Sin embargo, en MT5 existe un maravilloso OBJ_CHART, que permite realizar esta tarea de forma mucho más bonita y sin búferes de indicadores.

Por ejemplo, puede poner cualquier indicador y ver inmediatamente cómo se ve en otro símbolo.

Esquema esclavo: se muestran varios gráficos como fondo del gráfico principal.

 
fxsaber:

Por ejemplo, puede lanzar cualquier indicador y ver inmediatamente cómo se ve en otro símbolo.

Esquema esclavo: se muestran varios gráficos como fondo del gráfico principal.

¿Hay alguna imagen de cómo sería esto? No está muy claro, todavía no he utilizadoOBJ_CHART