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.
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.
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
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>
voidOnTick()
{
static CTrade Trade;
constdatetime 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
intOnInit( 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.
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( constint DealsNum = INT_MAX )
{
if ((DealsNum != INT_MAX) && ::HistorySelect(0, ::TimeCurrent()) && ::HistoryDealsTotal() > DealsNum)
::ExpertRemove();
return;
}
// Выгружает эксперт, если с момента запуска прошло AmountHours-часов.void ConditionStopExpert( constdouble AmountHours )
{
staticdatetime FirstTime = ::TimeCurrent();
if (::TimeCurrent() > FirstTime + (datetime)(AmountHours * 3600))
::ExpertRemove();
return;
}
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.
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?
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.
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.
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
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.
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?
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.
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
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.Cuando se depura (no necesariamente se depura), cuando se quiere reducir el intervalo de prueba rápidamente en el probador, uso las siguientes funciones
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