Librerías: Symbol - página 2

 
Stanislav Korotky:

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.

// Crear una copia del símbolo para acelerar el Probador
#property script_show_inputs

#include <Symbol.mqh>

void OnStart()
{
  const SYMBOL Symb("TESTER_" + _Symbol); // Creado un símbolo

  if (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 mercado
      ChartOpen(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>

void OnStart()
{
  const SYMBOL Symb(_Symbol + "_Custom"); // Creado un símbolo

  if (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

    if (Symb.On())    // Incluido en la vigilancia del mercado
      ChartOpen(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>

input bool OrderLimitSlippage = false;

void OnStart()
{
  const SYMBOL Symb("TESTER_" + _Symbol); // Creado un símbolo

  if (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_7018318
    if (!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 principal
      ChartOpen(Symb.Name, PERIOD_CURRENT); // Abrir un nuevo gráfico de símbolos 
  }
}



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 MT5
#include <MT4Orders.mqh> // https://www.mql5.com/es/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, Bid);
  
// OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 100, 0, 0);
}

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

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....

 
fxsaber:

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.

 
Andrey Khatimlianskii:

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 in 0:00:00.031. Test passed in 0: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.031 for 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 in 0:00:00.030. Test passed in 0: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.030 for history data synchronization)
314 Mb memory used including 27 Mb of history data, 64 Mb of tick data


Velocidad

Era

OnTesterInit
i = 0 Pass = 0 OnTester = 3.881 s.: Count = 6589567, 1697904.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 1 Pass = 1 OnTester = 3.893 s.: Count = 6589567, 1692670.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 2 Pass = 2 OnTester = 3.898 s.: Count = 6589567, 1690499.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 3 Pass = 3 OnTester = 3.842 s.: Count = 6589567, 1715139.8 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 4 Pass = 4 OnTester = 3.912 s.: Count = 6589567, 1684449.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
iMin = 3 Results[iMin] = 3.842 s.
iMax = 4 Results[iMax] = 3.912 s.
Amount = 5 Mean = 3.885 s. - 84.80%
OnTesterDeinit


Era

OnTesterInit
i = 0 Pass = 0 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 1 Pass = 1 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 2 Pass = 2 OnTester = 0.264 s.: Count = 402622, 1525083.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 3 Pass = 3 OnTester = 0.266 s.: Count = 402622, 1513616.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
i = 4 Pass = 4 OnTester = 0.306 s.: Count = 402622, 1315758.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1795
iMin = 0 Results[iMin] = 0.264 s.
iMax = 4 Results[iMax] = 0.306 s.
Amount = 5 Mean = 0.273 s. - 29.28%
OnTesterDeinit


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

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.

 

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?

 
Aleksey Panfilov:

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.