Пример
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 en 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 un intento 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 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.
¡Funciona!
Y esta es la forma más fácil de hacer que el probador funcione más rápido y lógicamente.
ZЫ Me apresuré. La nueva cruz cuenta correctamente - no convierte el beneficio. Pero por alguna razón arrastra mayor con él cuando no se utiliza en ningún otro lugar
2017.09.04 14:46:43.062 Core 1 EURCHF_custom: generate 975389 ticks in 0:00:00.063, passed to tester 3210 ticks 2017.09.04 14:46:43.062 Core 1 EURUSD: generate 979976 ticks in 0:00:00.062, passed to tester 8696 ticks
Ligeramente editado el código del script. En las líneas :
const SYMBOL Symb(_Symbol + PostFix); // Creado un símbolo
Symb = _Symbol; // Copia todas las propiedades e historial de barras del símbolo principal - clon.
Sustituido _Symbol por "SBER".
Ejecuté el script en el gráfico de la acción VDSB.
Después de ejecutar el script, el gráfico SBER_custom se abrió, y en lugar de las barras SBER se mostraron las barras de la acción VDSB. Esto no es lógico. Yo esperaba ver las barras SBER..... en el gráfico.
Durante la ejecución de esta línea Symb = "SBER"; por alguna razón se crea un objeto con el valor Name="VDSB", es decir, con el nombre del símbolo sobre el que se ejecuta el script.
Lamentablemente, no he conseguido solucionar este error. ¿Podría por favor arreglar el código?
Lamentablemente no he podido solucionar este error. ¿Podría arreglar el código?
Incluso ejecutando el script sin cambios en "SBER" Metaquotes-Demo es suficiente para ver que el resultado no es el esperado.
Descubrí que CustomRatesReplace no funciona correctamente para algunos caracteres (parece ser para todos los caracteres no-Forex), así que los desarrolladores necesitan arreglar el error.
Incluso ejecutando el script sin cambios en "SBER" Metaquotes-Demo es suficiente para ver que el resultado no es el esperado.
Descubrí que CustomRatesReplace no funciona correctamente para algunos símbolos (parece ser para todos los símbolos no-Forex), por lo que los desarrolladores necesitan arreglar el error.
Lo ejecuté en una cuenta real de BCS. El script original en el gráfico SBER funciona. Se muestra el gráfico SBER_custom con las cotizaciones SBER. ¿Qué significa que la función CustomRatesReplace no funciona correctamente? Si es necesario puedo explicar cómo crear una cuenta real en BCS con saldo cero.
Lo ejecuté en una cuenta real de BCS. El script original funciona en el gráfico SBER. Se abre el gráfico SBER_custom con las cotizaciones SBER. ¿Qué significa que la función CustomRatesReplace no funciona correctamente? Si es necesario puedo explicar cómo crear una cuenta real en BCS con saldo cero.
Gracias, ¡y tengo un error! En Symbol.mqh línea 126
// return(this.CloneProperties() && (this.CloneHistory() != -1)); // Was return(this.CloneProperties(Symb) && (this.CloneHistory(Symb) != -1)); // Stahl
Otro escenario de uso de símbolos personalizados (no necesariamente con la ayuda de esta biblioteca).
Es posible automatizar completamente el backtest regular del Asesor Experto en datos históricos frescos y transferir los resultados de la prueba al Asesor Experto de combate para sincronizar la imagen real con el probador. Esto permite realizar dicha lógica de negociación sin escribir su propio probador.
tester de estrategias (MT4), a su trabajo en una cuenta real.
Mi razonamiento:
En el probador, el Asesor Experto funciona no sólo en condiciones ideales de negociación, sino, de hecho, en otro modo - en el modo de tiempo real, es decir, para un tick se las arregla para calcular el TS, enviar una orden y obtener una respuesta, pero cuando se utiliza realmente en una cuenta de operaciones no es así. Resulta que tenemos dos robots diferentes , uno en tiempo real y otro no. Enviar / modificar una orden (¡incluso una!) a una cuenta real = ping + tiempo de ejecución, etc. = en el mejor de los casos 100-500ms, y al mismo tiempo vienen ticks y hay que contarlos - y estamos parados, esperando.... y luego nos metemos en el flujo al azar (donde el precio ha ido durante este tiempo en relación con nuestros promedios de garrapatas , no lo sé. + debemos haber perdido algunos de los más rápidos y, por regla general, los ticks más importantes). Resulta que al final puede que no quede nada de nuestra estrategia, que hemos puesto en marcha en el tester.
Por eso, después de pensarlo, llegué a lo siguiente:
- En el modo de combate, la lógica de negociación en el Asesor Experto está desactivada, y funciona, de hecho, como una herramienta de copia.
- El sistema de trading se transfiere al indicador y éste genera órdenes de apertura y cierre, y no espera a que el Asesor Experto ejecute estas órdenes, sino que simplemente ejecuta la TS incorporada en él en condiciones ideales, casi como en un probador. Hasta donde yo sé, el indicador no debería perder ticks, aunque dudo que esto sea técnicamente posible, pero al menos debería perderlos menos que el Asesor Experto, que tiene esta característica de forma inherente y descrita en la documentación. + Incluso debido a la separación de errores de cálculo del TC debería haber menos errores porque no hay interrupciones por ninguna operación secundaria a la lógica del TC.
Otra posibilidad de utilizar este esquema:
Se toma una versión demo gratuita del Asesor Experto del Mercado y se persigue en el probador en cotizaciones frescas, el copiador toma los datos del resultado del probador. En consecuencia, la versión de pago no es necesaria.
Tal vez es necesario prohibir Mercado Asesor Experto backtest en símbolos personalizados....
En el código hay una línea como esta
const int Size = ::CopyRates(Symb, PERIOD_M1, 0, ::Bars(Symb, PERIOD_M1), Rates);
No he comprobado tu script, pero estoy escribiendo un script para la copia masiva de caracteres. La función CopyRates y la función Bars no pueden devolver más de lo especificado en "Settings->Graphics->Max. bars in window", así que la mayor parte del historial no se copiará.
¿Qué significan estos dos puntos en tu código?
No he comprobado tu script, pero estoy escribiendo un script para la copia masiva de caracteres. La función CopyRates y la función Bars no pueden devolver más de lo especificado en "Settings->Charts->Max. bars in window", por lo que la mayor parte del historial no se copiará.
Copio exactamente lo que ya está en los gráficos. Si no, tardaría mucho tiempo - paginando.
¿Qué significan estos dos puntos en su código?
Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading.
MQL5 ¿Cómo saber si una operación ha cerrado en stop loss o no?
fxsaber, 2017.02.14 20:00
A grandes rasgos, antes de los dos puntos se especifica el nombre de la clase, desde donde se llama al método correspondiente.
Si no hay nada antes de los dos puntos - la clase es global.
En este caso, se pueden borrar todos los dos puntos. Y es conveniente utilizarlos por la razón de que diferentes clases pueden tener los mismos métodos (incluyendo el virtual). Y para no equivocarse, se pueden utilizar dos puntos para indicar claramente a qué método se debe llamar.
Deberíamos añadir algo como:
bool Template(const string Symb = NULL) const { return(this.CloneProperties(Symb)); }
De lo contrario, a veces sólo se necesitan propiedades y no barras.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso

Symbol:
Autor: fxsaber