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

 
fxsaber:

Es un buen truco. El truco está en aplicar el patrón a TParent. No he visto nada parecido antes.

Bueno, no es una herencia múltiple. En realidad es una cadena Base -> A -> B -> C -> X. ¿Quién te impide usarlo directamente si es suficiente?

 
Stanislav Korotky:

Bueno, no es una herencia múltiple. En realidad es una cadena Base -> A -> B -> C -> X. ¿Quién te impide usarlo directamente si es suficiente?

Brevedad.

 
fxsaber:

Brevedad.

No podría estar más de acuerdo. En mi opinión, prescribir directamente las cuatro clases sucesoras sería más breve y claro.

 
Stanislav Korotky:

No podría estar más de acuerdo. En mi opinión, prescribir directamente las cuatro clases sucesoras sería más breve y claro.

Si, de repente, se introduce la herencia plural, basta con hacer un pequeño cambio en una sola línea

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

Si, de repente, se introduce la herencia múltiple, bastaría con una pequeña sustitución en una sola línea

Lástima que el foro no tenga una forma de apostar además de las encuestas - como una encuesta con opciones, pero bloqueando unos "céntimos" en la cuenta para la respuesta. Los que eligieran la opción correcta se llevarían las apuestas de los perdedores después del evento ;-). No creo que lo introduzcan.

 
Stanislav Korotky:

Bueno, no es una herencia múltiple. En realidad es una cadena Base -> A -> B -> C -> X. ¿Quién te impide usarlo directamente si es suficiente?

Sí, pero la característica principal es que todas las clases de origen se definen y utilizan como plantillas. Por lo tanto, esta cadena puede establecerse en cualquier orden. En esencia, no hay ninguna diferencia fundamental con la herencia múltiple. Como ya he escrito, puede haber trampas con las clases. En cuanto a las interfaces, todo es idéntico. Lo único es que se verá un poco crujiente, pero aquí cada uno es libre de decidir si comprueba o conduce )
 

Una cosa más que me gustaría añadir. Una alternativa completa a la herencia múltiple (y con opciones más flexibles) podría implementarse mediante la sobrecarga del operador fantasma. Pero MQ por alguna razón no agrega esta característica de sobrecarga a pesar de que he estado pidiendo que lo hagan durante mucho tiempo. Y ni siquiera he escuchado una respuesta concreta de ellos, simplemente lo ignoran.

 

Hay situaciones como ésta

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

Bichos, errores, preguntas

fxsaber, 2017.07.24 09:27

El EA está compilado bajo 1641 donde se implementa el historial de operaciones rápidas.

¿Es posible que la optimización llegue a la compilación 1596 del Agente, donde el historial funciona MUY lentamente, y en consecuencia, se ralentiza la optimización muchas veces?

Como caso más general, la optimización en la nube a veces da resultados diferentes no sólo en términos de tiempo, sino también en términos de cálculos. A veces, el resultado de la optimización no coincide con una sola ejecución.

Esto puede deberse al hecho de que los Agentes que participan en la optimización y un Agente local que participa en una sola ejecución pueden tener un número de construcción diferente.

Y cada compilación contiene diferentes errores. Por ejemplo, aquí hay un error que es relevante ahora, pero que no estaba presente en las construcciones de hace unos años

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

Bichos, errores, preguntas

fxsaber, 2017.07.17 23:08

Una vez más el error de HistorySelect en el probador. Parece que no lo tenía en 1626. En 1629 hay.

#include <Trade\Trade.mqh>

void OnTick()
{
  static CTrade Trade;

  const datetime NowTime = TimeCurrent();
  
  if (Trade.Buy(1) && Trade.PositionClose(_Symbol) && HistorySelect(NowTime, NowTime))
  {
    Print(HistoryDealsTotal()); // 0 - это при том, что мы открыли и закрыли позицию в NowTime-время
      
    ExpertRemove();
  }
}

En consecuencia, si su EA llega al Agente b1626 durante la optimización, puede mostrar un resultado, pero cuando se ejecuta en el Agente local b1641 de una sola vez, uno completamente diferente.

De esto, podemos concluir que antes de la optimización, debes ser consciente de para qué builds quieres optimizar tu EA y para cuáles no.

Los desarrolladores han proporcionado un cortador para los Agentes no aptos - INIT_AGENT_NOT_SUITABLE.


Por lo tanto, recomendaría escribir una comprobación para que coincidaTerminalInfoInteger(TERMINAL_BUILD) con los valores deseados en OnInit para las optimizaciones basadas en la nube.

Pero es casi imposible conocer la lista de cheques que se ajustan a sus necesidades, así que lo más probable es que escriba esto

int OnInit( void )
{
  // Если Агент не совпадает с билдом компиляции, отказываемся от его услуг
  if (TerminalInfoInteger(TERMINAL_BUILD) != __MQLBUILD__)
    return(INIT_AGENT_NOT_SUITABLE);
//....

Pero también es una mala solución. Una solución más flexible es pasar su número de compilación a los Agentes durante la optimización.


En general, esté atento.


SZY. Es posible generar un informe comercial de la ejecución de cada Agente y obtenerlo de una vez durante la optimización. Esto puede ayudar a entender mejor por qué el resultado del Agente de la Nube es diferente del local durante una sola ejecución. La generación automática de estos informes durante la optimización y la ejecución única es posible con la ayuda de esta biblioteca.

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

Bichos, errores, preguntas

Renat Fatkhullin, 2017.07.25 08:26

Periódicamente cortamos las construcciones antiguas en el clouda, a la espera de que se actualicen, lo que pasa muy rápidamente y sin que se note.

Esto no se hace en cada versión, sino en función de la importancia de los cambios realizados.
Report
Report
  • votos: 12
  • 2017.07.19
  • fxsaber
  • www.mql5.com
Библиотека для MetaTrader 4/5, которая позволяет формировать отчеты по истории торгов.
 

Cuando se depura (no necesariamente se depura), cuando se quiere reducir el intervalo de prueba rápidamente en el probador, uso las siguientes funciones

// Выгружает эксперт, если количество сделок в истории больше DealsNum.
void ConditionStopExpert( const int DealsNum = INT_MAX )
{
  if ((DealsNum != INT_MAX) && ::HistorySelect(0, ::TimeCurrent()) && ::HistoryDealsTotal() > DealsNum)
    ::ExpertRemove();

  return;  
}

// Выгружает эксперт, если с момента запуска прошло AmountHours-часов.
void ConditionStopExpert( const double AmountHours )
{
  static datetime FirstTime = ::TimeCurrent();
  
  if (::TimeCurrent() > FirstTime + (datetime)(AmountHours * 3600))
    ::ExpertRemove();

  return;  
}
 
fxsaber:

En la depuración (no necesariamente en la depuración), cuando se necesita reducir rápidamente el intervalo de prueba en el probador, utilizo las siguientes funciones

Corrige el código, ahí tienes el número 5 en la primera función en lugar de DealsNum.