Se han actualizado la biblioteca y el ejemplo de uso.
Пример
Cuando se ejecuta un backtest sobre cruces, el comprobador no sólo extrae el símbolo principal, sino también un símbolo auxiliar, que permite convertir la divisa de beneficios del símbolo principal a la divisa de la cuenta. Extraer el símbolo auxiliar, generar sus ticks y sincronizarlos con el símbolo principal consume unos recursos informáticos (y un tiempo) muy valiosos en los modos de ejecución única y, sobre todo, de optimización.
Sin embargo, esta precisión es casi siempre innecesaria. Por lo tanto, me gustaría pasar por alto esta obsesión/imperfección del probador de MetaTrader 5. En MetaTrader 4 es fácil hacerlo - existe la posibilidad de cambiar la moneda de la cuenta directamente en el probador. MetaTrader 5 no tiene esa opción.
El script de demostración muestra una manera de eludir esta limitación del probador - para eliminar los cálculos innecesarios. Para ello, se crea una copia del símbolo para backtest, pero la moneda de beneficio / margen se establece igual a la moneda de la cuenta. Es decir, no habrá necesidad de reconvertir los resultados de la operación. Y el beneficio se calculará realmente en pips, lo que puede ser muy claro en algunas situaciones.
// Crear una copia del símbolo para acelerar el Probador#property script_show_inputs#include <Symbol.mqh>
voidOnStart()
{
const SYMBOL Symb("TESTER_" + _Symbol); // Creado un símboloif (Symb.IsExist()) // Si se crea el símbolo
{
Symb = _Symbol; // Copiar todas las propiedades y el historial de barras (+ historial de ticks si es personalizado) del símbolo principal - clonar// Hacer que la moneda del símbolo sea la moneda de la cuenta
Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));
if (Symb.On()) // Incluido en la vigilancia del mercadoChartOpen(Symb.Name, PERIOD_CURRENT); // Abrir un nuevo gráfico de símbolos
}
}
Resultado
De esta manera se logra una aceleración libre del Probador/Optimizador.
ZЫ Lo he medido a fondo en EURGBP. La ganancia de tiempo es ~2 veces. Las operaciones son totalmente coincidentes. ¡Gratis de hecho!
La siguiente observación se refiere no sólo a la biblioteca.
Si necesita cambiar algunas propiedades de un símbolo personalizado, en algunos casos debe hacerse ANTES de importar las comillas.
Por lo tanto, para la fiabilidad del resultado, recomiendo encarecidamente establecer todas las propiedades del símbolo en primer lugar, y sólo entonces importar.
Por ejemplo, si desea establecer SYMBOL_TRADE_TICK_VALUE y SYMBOL_TRADE_TICK_SIZE, debe hacerlo antes de importar los ticks/barras.
En MT5-tester, por regla general (forex, por ejemplo), las órdenes limitadas tienen deslizamiento positivo, lo que lleva al autoengaño (¡a veces incluso en forma de grails del tester sobre ticks reales!).
Pero hay una manera de eludir esta característica del Probador. A continuación se muestra una instrucción detallada sobre cómo hacerlo.
1. Si el símbolo original (gráfico abierto) no es personalizado o la cuenta está cubierta, ejecute este script en el gráfico del símbolo
#include <Symbol.mqh>
voidOnStart()
{
const SYMBOL Symb(_Symbol + "_Custom"); // Creado un símboloif (Symb.IsExist()) // Si se crea el símbolo
{
Symb = _Symbol; // Copiar todas las propiedades y el historial de barras (+ historial de ticks si es personalizado) del símbolo principal - clonarif (Symb.On()) // Incluido en la vigilancia del mercadoChartOpen(Symb.Name, PERIOD_CURRENT); // Abrir un nuevo gráfico de símbolos
}
}
Obtendrá esta imagen
2. Si la cuenta está cubierta (la palabra Hedge está presente en la barra de título de la ventana del Terminal), vaya a cualquier cuenta de compensación (por ejemplo, MetaQuotes-Demo) y vuelva a cargar el Terminal.
3. Ejecute este script en el gráfico actual
// Creación de una copia del símbolo para acelerar el Probador con la posibilidad de desactivar el deslizamiento de las órdenes limitadas.#property script_show_inputs#include <Symbol.mqh>
inputbool OrderLimitSlippage = false;
voidOnStart()
{
const SYMBOL Symb("TESTER_" + _Symbol); // Creado un símboloif (Symb.IsExist()) // Si se crea el símbolo
{
// https://www.mql5.com/ru/forum/212096/page2#comment_7017794// Símbolo = _Símbolo; // Copiar todas las propiedades e historial de barras (+ historial de ticks si es personalizado) del símbolo principal - clonar
Symb.CloneProperties(); // Copiar todas las propiedades del símbolo principal// Hacer que la moneda del símbolo sea la moneda de la cuenta
Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));
Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY));
int Answer = IDNO;
// Eliminar el deslizamiento de las órdenes limitadas// https://www.mql5.com/ru/forum/212096/page2#comment_7018318if (!OrderLimitSlippage &&
(((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE) != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) ||
((Answer = MessageBox("You will need to change the account type to netting.\nDo you agree to disable limit order slips?", __FILE__, MB_YESNOCANCEL | MB_ICONQUESTION)) == IDYES)))
{
Symb.SetProperty(SYMBOL_TRADE_EXEMODE, SYMBOL_TRADE_EXECUTION_EXCHANGE);
Symb.SetProperty(SYMBOL_TRADE_CALC_MODE, SYMBOL_CALC_MODE_EXCH_FUTURES);
// Para calcular el beneficio
Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);
Symb.SetProperty(SYMBOL_TRADE_TICK_SIZE, Symb.GetProperty(SYMBOL_POINT));
}
if ((Answer != IDCANCEL) && (Symb.CloneHistory() > 0) && Symb.On()) // Historial de barras copiado (+ historial de ticks si es personalizado) del símbolo principalChartOpen(Symb.Name, PERIOD_CURRENT); // Abrir un nuevo gráfico de símbolos
}
}
3. Seleccione el símbolo personalizado recibido en el Probador
Funcionando en MQ-Demo en algún símbolo de movimiento lento. Por ejemplo, EURHUF.
El script abre una posición de COMPRA con TP = Oferta. Es decir, la posición debería cerrarse inmediatamente. Pero el TP se comprobará para el cumplimiento de la condición de aceptación ¡sólo en el siguiente tick!
No se producirá el cierre instantáneo de la posición hasta el siguiente tick. Además, si el siguiente tick tiene Bid < TP, TP permanecerá sin aceptación.
Lo mismo ocurre con las órdenes limitadas (línea comentada). En Tester, la situación es similar.
Sobre lo destacado, hay que decirlo, porque en el post anterior hay esto
2. Si la cuenta está cubierta (la palabra Hedge está presente en la barra de título de la ventana del Terminal), vaya a cualquier cuenta de compensación (por ejemplo, MetaQuotes-Demo) y vuelva a cargar el Terminal.
y no todo el mundo se dará cuenta de que las órdenes limitadas al precio actual en los símbolos bursátiles de las cuentas de compensación se ejecutarán (y en el Probador) inmediatamente, sin esperar al siguiente tick.
Tenga en cuenta que no sólo es importante el símbolo bursátil, sino también la cuenta de compensación. Por ejemplo, puede tomar un símbolo MOEX en una Hedge-MQ-Demo, pero no se ejecutará de la misma manera (y en el Probador) que en la misma Netting-MQ-Demo.
Esta es una de las razones por las que los backtests en los mismos símbolos MOEX completamente idénticos pueden ser diferentes, dependiendo del tipo de cuenta.
Es una pena que para realizar la activación normal de las órdenes haya que bailar con panderetas.
He cambiado las instrucciones, simplificando considerablemente los bailes. Por ejemplo, en el netting todo se hace con un solo clic - lanzar el script.
He aplicado un filtro simple a los ticks reales, que desecha > 90% de la información en la variante más ligera. Cuanto más fuerte sea el filtro, más grueso será el resultado del backtest.
Pero fue interesante cómo el filtro más débil afecta el resultado y la velocidad.
Calidad.
Era
final balance 10007242.00 EUR
TESTER_Censored,M1: 6589567 ticks, 60353 bars generated. Environment synchronized in0:00:00.031. Test passed in0:00:05.101 (including ticks preprocessing 0:00:00.874).
TESTER_Censored,M1: total time from login to stop testing 0:00:05.132 (including 0:00:00.031for history data synchronization)
476 Mb memory used including 27 Mb of history data, 192 Mb of tick data
Se convirtió en
final balance 10007246.00 EUR
FILTER_Censored,M1: 402622 ticks, 50887 bars generated. Environment synchronized in0:00:00.030. Test passed in0:00:00.516 (including ticks preprocessing 0:00:00.078).
FILTER_Censored,M1: total time from login to stop testing 0:00:00.546 (including 0:00:00.030for history data synchronization)
314 Mb memory used including 27 Mb of history data, 64 Mb of tick data
Según los ticks reales, el número de ticks disminuyó 16 veces (el filtro más ligero), la velocidad de Optimización aumentó 14 veces, la calidad no sufrió en absoluto (el análisis que no se incluyó aquí). Por supuesto, esto sólo puede hacerse cuando se escribe el TS de una determinada manera. En particular, con la ausencia de análisis de barras.
La aceleración universal gratuita anterior sólo dio un aumento de dos veces. La actual también es gratuita (la calidad no se resiente), pero menos universal. Sin embargo, el rendimiento es de más de un orden de magnitud. Ahora optimizo TC sólo de esta manera. No me equivoco.
SZY
Al mismo tiempo, una breve comprobación de esta aplicación (sólo bar spread calculado de manera diferente).
Баровая история создается с учетом минимальных потерь качества при переходе от режима тестирования "Каждый тик на основе реальных тиков" к "Только цены открытия" - ТС на лимитных ордерах;
Se comparan dos modos: "Todos los ticks" y "OHLC M1".
Todos los ticks
final balance 10006150.00 EUR
TESTER4_Censored,M1: 6576734 ticks, 60353 bars generated. Test passed in 0:00:04.587 (including ticks preprocessing 0:00:00.343).
394 Mb memory used including 27 Mb of history data, 128 Mb of tick data
OHLC M1
final balance 10006119.00 EUR
TESTER_Censored,M1: 240366 ticks, 60353 bars generated. Test passed in 0:00:00.359 (including ticks preprocessing 0:00:00.031).
306 Mb memory used including 27 Mb of history data, 64 Mb of tick data
La calidad del backtest es la misma, el rendimiento de la segunda variante en una sola ejecución es 12 veces mejor.
¿Habrá tal aceleración cuando se optimice abriendo puntos?
Por desgracia, es muy difícil explicar todos los aspectos de este proceso. Probablemente haría falta un artículo. Por lo tanto, no será posible explicarlo de forma clara y breve.
Deberíamos añadir algo como:
De lo contrario, a veces sólo se necesitan propiedades y no barras.
Todos los métodos de la clase son públicos. Así que para clonar solo propiedades llama a CloneProperties().
Se han actualizado la biblioteca y el ejemplo de uso.
Пример
Cuando se ejecuta un backtest sobre cruces, el comprobador no sólo extrae el símbolo principal, sino también un símbolo auxiliar, que permite convertir la divisa de beneficios del símbolo principal a la divisa de la cuenta. Extraer el símbolo auxiliar, generar sus ticks y sincronizarlos con el símbolo principal consume unos recursos informáticos (y un tiempo) muy valiosos en los modos de ejecución única y, sobre todo, de optimización.
Sin embargo, esta precisión es casi siempre innecesaria. Por lo tanto, me gustaría pasar por alto esta obsesión/imperfección del probador de MetaTrader 5. En MetaTrader 4 es fácil hacerlo - existe la posibilidad de cambiar la moneda de la cuenta directamente en el probador. MetaTrader 5 no tiene esa opción.
El script de demostración muestra una manera de eludir esta limitación del probador - para eliminar los cálculos innecesarios. Para ello, se crea una copia del símbolo para backtest, pero la moneda de beneficio / margen se establece igual a la moneda de la cuenta. Es decir, no habrá necesidad de reconvertir los resultados de la operación. Y el beneficio se calculará realmente en pips, lo que puede ser muy claro en algunas situaciones.
Resultado
De esta manera se logra una aceleración libre del Probador/Optimizador.
ZЫ Lo he medido a fondo en EURGBP. La ganancia de tiempo es ~2 veces. Las operaciones son totalmente coincidentes. ¡Gratis de hecho!
La siguiente observación se refiere no sólo a la biblioteca.
Si necesita cambiar algunas propiedades de un símbolo personalizado, en algunos casos debe hacerse ANTES de importar las comillas.
Por lo tanto, para la fiabilidad del resultado, recomiendo encarecidamente establecer todas las propiedades del símbolo en primer lugar, y sólo entonces importar.
Por ejemplo, si desea establecer SYMBOL_TRADE_TICK_VALUE y SYMBOL_TRADE_TICK_SIZE, debe hacerlo antes de importar los ticks/barras.
En MT5-tester, por regla general (forex, por ejemplo), las órdenes limitadas tienen deslizamiento positivo, lo que lleva al autoengaño (¡a veces incluso en forma de grails del tester sobre ticks reales!).
Pero hay una manera de eludir esta característica del Probador. A continuación se muestra una instrucción detallada sobre cómo hacerlo.
1. Si el símbolo original (gráfico abierto) no es personalizado o la cuenta está cubierta, ejecute este script en el gráfico del símbolo
Obtendrá esta imagen
2. Si la cuenta está cubierta (la palabra Hedge está presente en la barra de título de la ventana del Terminal), vaya a cualquier cuenta de compensación (por ejemplo, MetaQuotes-Demo) y vuelva a cargar el Terminal.
3. Ejecute este script en el gráfico actual
3. Seleccione el símbolo personalizado recibido en el Probador
¡Ahora las órdenes limitadas no se deslizarán!
Foro sobre negociación, sistemas automatizados de negociación y ensayo de estrategias de negociación
Errores, fallos, preguntas
fxsaber, 2018.02.14 14:41 AM.
Error feo no Terminal, pero Plataforma MT5Funcionando en MQ-Demo en algún símbolo de movimiento lento. Por ejemplo, EURHUF.
El script abre una posición de COMPRA con TP = Oferta. Es decir, la posición debería cerrarse inmediatamente. Pero el TP se comprobará para el cumplimiento de la condición de aceptación ¡sólo en el siguiente tick!
No se producirá el cierre instantáneo de la posición hasta el siguiente tick. Además, si el siguiente tick tiene Bid < TP, TP permanecerá sin aceptación.
Lo mismo ocurre con las órdenes limitadas (línea comentada). En Tester, la situación es similar.
Sobre lo destacado, hay que decirlo, porque en el post anterior hay esto
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.
Bibliotecas: Símbolo
fxsaber, 2018.04.06 09:21 pm.
2. Si la cuenta está cubierta (la palabra Hedge está presente en la barra de título de la ventana del Terminal), vaya a cualquier cuenta de compensación (por ejemplo, MetaQuotes-Demo) y vuelva a cargar el Terminal.
y no todo el mundo se dará cuenta de que las órdenes limitadas al precio actual en los símbolos bursátiles de las cuentas de compensación se ejecutarán (y en el Probador) inmediatamente, sin esperar al siguiente tick.
Tenga en cuenta que no sólo es importante el símbolo bursátil, sino también la cuenta de compensación. Por ejemplo, puede tomar un símbolo MOEX en una Hedge-MQ-Demo, pero no se ejecutará de la misma manera (y en el Probador) que en la misma Netting-MQ-Demo.
Esta es una de las razones por las que los backtests en los mismos símbolos MOEX completamente idénticos pueden ser diferentes, dependiendo del tipo de cuenta.
ZЫ Estoy hablando solo....
ZY estoy hablando solo...
No, es que no tengo nada que añadir.
Es una pena que para realizar la activación normal de las órdenes haya que bailar con panderetas.
Es una pena que para realizar la activación normal de las órdenes haya que bailar con panderetas.
He cambiado las instrucciones, simplificando considerablemente los bailes. Por ejemplo, en el netting todo se hace con un solo clic - lanzar el script.
He aplicado un filtro simple a los ticks reales, que desecha > 90% de la información en la variante más ligera. Cuanto más fuerte sea el filtro, más grueso será el resultado del backtest.
Pero fue interesante cómo el filtro más débil afecta el resultado y la velocidad.
Calidad.
Era
Se convirtió en
Velocidad
Era
Era
Resultado
Según los ticks reales, el número de ticks disminuyó 16 veces (el filtro más ligero), la velocidad de Optimización aumentó 14 veces, la calidad no sufrió en absoluto (el análisis que no se incluyó aquí). Por supuesto, esto sólo puede hacerse cuando se escribe el TS de una determinada manera. En particular, con la ausencia de análisis de barras.
La aceleración universal gratuita anterior sólo dio un aumento de dos veces. La actual también es gratuita (la calidad no se resiente), pero menos universal. Sin embargo, el rendimiento es de más de un orden de magnitud. Ahora optimizo TC sólo de esta manera. No me equivoco.
SZY
Al mismo tiempo, una breve comprobación de esta aplicación (sólo bar spread calculado de manera diferente).
Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading.
Scripts: ThirdPartyTicks
Automated-Trading, 2018.03.16 09:35 pm.
Баровая история создается с учетом минимальных потерь качества при переходе от режима тестирования "Каждый тик на основе реальных тиков" к "Только цены открытия" - ТС на лимитных ордерах;
Se comparan dos modos: "Todos los ticks" y "OHLC M1".
Todos los ticks
OHLC M1
La calidad del backtest es la misma, el rendimiento de la segunda variante en una sola ejecución es 12 veces mejor.
Para un no-programador, ¿es necesario escribir estos scripts en un programa de Asesor Experto?
Es muy tentador acelerar la optimización 12 veces.
¿Habrá tal aceleración al optimizar por puntos de apertura?
Para un no programador, ¿es necesario escribir estos guiones en un programa de EA?
Es muy tentador acelerar la optimización 12 veces.
¿Habrá tal aceleración cuando se optimice abriendo puntos?
Por desgracia, es muy difícil explicar todos los aspectos de este proceso. Probablemente haría falta un artículo. Por lo tanto, no será posible explicarlo de forma clara y breve.