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

 
Alexey Navoykov:

Otra variante conveniente sería la herencia protegida, cuando la clase base tiene todos los métodos, y en una clase heredada se muestra sólo Get.Y cuando se necesita, se lleva a la clase base.

He utilizado la herencia protegida, pero me he equivocado con la seleccionada. Gracias.

Pero el Metaeditor aún no ha corregido el error, que todos estos métodos se vuelcan a la lista aunque no estén disponibles.

No lo he comprobado ahora, pero cuando estaba experimentando, se almacenaba en la memoria y no se caía.

 

Antes de modificar o eliminar una orden hay que hacer una comprobación

OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED 

SB no tiene esto, así que tienes que hacerlo tú mismo.


No tiene sentido hacer esta comprobación en el Comprobador - todos los pedidos actuales tienen siempre este estado.

 

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

Mercado cerrado

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
  static ulong StartTime = GetMicrosecondCount();
  static long PrevTime = 0;
  
  const long TmpTime = GetMarketWatchTime();
  
  if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount();
  }
  
  return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000));
}

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string TimeToString( const long Value )
{
  return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0'));
}

void OnBookEvent( const string& )
{
  Comment(TimeToString(GetCurrenTime()));
}
 

POSITION_TIME_UPDATE sólo se refiere al cambio del lote de posición. Por ejemplo, un cierre parcial de una posición en cualquier tipo de cuenta o una compensación de una posición.

Los cambios en los niveles de SL/TP no afectan a POSITION_TIME_UPDATE.

Parafraseando, POSITION_TIME_UPDATE sólo se ve afectado por las modificaciones reflejadas en el Historial de operaciones - operaciones. Los niveles SL/TP no se aplican a estas modificaciones, por lo que no les afectan.

 

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

Reiniciar un EA

fxsaber, 2017.09.26 11:35

// Перезапуск себя
bool ExpertReopen()
{
  return(ChartSaveTemplate(0, __FILE__) && ChartApplyTemplate(0, __FILE__));
}
 

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

Bichos, errores, preguntas

fxsaber, 2017.09.08 11:11

struct A
{
  int i;
};

struct B : public A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = (B)a; // cannot cast 'A' to 'B'
  
  b = a;    // так без проблем
}
Del BOD

Todo está aquí.

En el primer caso es un reparto, en el segundo es una asignación.

La derivación del progenitor al descendiente es inadmisible

La asignación a un objeto es una llamada al operador de copia correspondiente, en este caso implícito A::operator=(const A &)

Gracias, por lo que el operador de copia de los padres sigue estando disponible fuerasólo en el caso de la herencia pública. Lo he comprobado, es cierto.

struct A
{
  int i;
};

struct B : protected A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a;    // 'A::operator=' - cannot access protected member function
}

¿Es bueno?

Con esta construcción necesitamos declarar un constructor de copia adicional B::operator=(const A&) y "lanzar" la llamada a A::operator= en él

 

Opciones para el cálculo de indicadores estándar sobre datos personalizados (sin crear indicadores adicionales).

Базовые индикаторы, применяемые к кастомному инструменту
Базовые индикаторы, применяемые к кастомному инструменту
  • 2017.09.27
  • www.mql5.com
Здравствуйте. Задавал этот вопрос на английском форуме...
 

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

Mercado cerrado

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

Hay que tirar los símbolos personalizados del bucle, porque en Market Watch se pueden poner en cualquier momento, incluso en 3000 años.

 
En MQL5 es posible escribirlo así
void OnTick()
{  
  double Buffer[];
  
  CopyBuffer(iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE), 0, 0, 1, Buffer);
}

Es decir, "crear" un asa en cada tic. No se crearán nuevas entidades de indicadores, el tiempo se perderá sólo en la comparación de los parámetros de entrada de iMA con aquellos indicadores que se han ejecutado en ticks anteriores. Es decir, exactamente lo mismo que se hace en MT4.

 
fxsaber:
En MQL5 es bastante aceptable escribirlo así

Es decir, "crear" un asa en cada tic. No se crearán nuevas entidades de indicadores, el tiempo se perderá sólo en la comparación de los parámetros de entrada de iMA con aquellos indicadores que se iniciaron en ticks anteriores. Es decir, exactamente lo mismo que se hace en MT4.

¿Ha medido el rendimiento? Tengo curiosidad por saber cuánto se ralentizará el rendimiento. Especialmente en el caso de los indicadores personalizados.

Razón de la queja: