Discusión sobre el artículo "Los Asesores Expertos desde el Asistente MQL5 funcionan en MetaTrader 4"
Al autor ¡Gracias!
Los usuarios de MT4 instalarán MT5 al menos por el bien de Wizard - ¿un marketing inteligente? Sólo en parte.
Ahora el artículo satisface la curiosidad de los programadores - ¿cómo se implementa? Pero no a los usuarios.
El marketing requiere otro artículo de otro nivel, donde se describa paso a paso qué hay que pulsar para que Wizard funcione en MT4.
Entonces los usuarios empezarán a compartir su experiencia en este negocio con otros como ellos. O no entiendo nada de marketing.
Al autor ¡Gracias!
Los usuarios de MT4 instalarán MT5 al menos por el bien de Wizard - ¿un marketing inteligente? Sólo en parte.
Ahora el artículo satisface la curiosidad de los programadores - ¿cómo se implementa? Pero no a los usuarios.
El marketing requiere otro artículo de otro nivel, donde se describa paso a paso qué hay que pulsar para que Wizard funcione en MT4.
Entonces los usuarios empezarán a compartir su experiencia en este negocio con otros como ellos. O no entiendo nada de marketing.
Escribir no es un problema. Pero es poco probable que sea un artículo. De hecho, esta información ya está en el artículo y toma un par de párrafos.
En aras de la precisión, me gustaría señalar que el asistente NO funcionará en MT4, tal asistente sólo está disponible en MT5. Los Asesores Expertos generados deberían funcionar, pero probablemente no todos.
Para comparar sugiero probar Tick Data Suite (Compatible: MT4 build 940 - 1052).
En MT5-tester seleccione el modo "por ticks reales". Guárdalos y aliméntalos a MT4-tester vía TDS.
Entonces las cotizaciones en ambos testers coincidirán al 100%, lo que permitirá compararlas no sólo por operaciones, sino también por velocidad.
Así podríamos comparar la conversión/creación de EAs en ambas direcciones.
Existe el fenómeno de publicar EAs en kodobase como resultado de la conversión MT4 -> MT5 vía SB.
Parece que el artículo puede ser utilizado por tales autores para la auto-comprobación. Si la conversión es correcta, entonces la conversión inversa vía MT5Bridge debería dar un resultado idéntico al original MT4.
Existe el fenómeno de publicar EAs en kodobase como resultado de la conversión MT4 -> MT5 vía SB.
Parece que el artículo puede ser utilizado por tales autores para la auto-comprobación. Si la conversión es correcta, entonces una conversión inversa a través de MT5Bridge debe dar un resultado idéntico al original MT4.
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading
fxsaber, 2017.05.08 15:12
Convertido tu código a MT4 a través de MT5Bridge. MT4build1072
EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:07.645 (total time 0:00:08.362)
EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:03.744 (total time 0:00:04.493)
¡Los resultados después de la conversión son idénticos! La velocidad se redujo a la mitad.
¡Mi MT5 EA (generado, pero con su propia aplicación de CExpertSignal en lugar de indicadores estándar) con su incluye compilado y probado en MT4 sin problemas, gracias!
Pero ahora envié el Asesor Experto a real, y resultó que no opera en absoluto. No hay errores, no se muestra nada. Simplemente no opera. Pasé mucho tiempo indagando en el código y encontré la razón - la función bool CTrade::FillingCheck(const string symbol) en Trade.mqh.
Esta comprobación se activa para las órdenes de mercado.
// obtener posibles tipos de política de llenado por símbolo uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); // comprobar de nuevo el modo de ejecución if(exec == SYMBOL_TRADE_EXECUTION_MARKET) { // para el modo de ejecución MERCADO // analizar el orden if(m_request.action != TRADE_ACTION_PENDING) { // en caso de orden de ejecución instantánea // si se admite la política de llenado requerida, añádala a la solicitud if(m_type_filling == ORDER_FILLING_FOK && (filling & SYMBOL_FILLING_FOK) != 0) { m_request.type_filling = m_type_filling; return(true); } if(m_type_filling == ORDER_FILLING_IOC && (filling & SYMBOL_FILLING_IOC) != 0) { m_request.type_filling = m_type_filling; return(true); } // política de llenado errónea, establecer código de error m_result.retcode = TRADE_RETCODE_INVALID_FILL; return(false); } return(true); }
En mi caso tanto m_type_filling como filling son iguales a cero, por lo que la función devuelve false.
filling por la lógica del código no debería ser igual a cero, pero según la ayuda SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) no está soportado para MT4. Es por eso que en el probador la comprobación pasa por alguna razón, y tal vez en algunos corredores en el comercio real también. Pero a mi no me ha funcionado, de momento solo he cambiado la función para saltarme todo el código y devolver true desde la función.
Esta comprobación funciona para órdenes de mercado.
En mi caso tanto m_type_filling como filling son iguales a cero, por lo que la función devuelve false.
filling por la lógica del código no debería ser igual a cero, pero según la ayuda SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) no está soportado para MT4. Es por eso que en el probador la comprobación pasa por alguna razón, y tal vez en algunos corredores en el comercio real también. Pero a mi no me ha funcionado, de momento solo he cambiado la función para saltarme todo el código y devolver true desde la función.
Gracias por el mensaje. No me había encontrado con esto. Este método se deja sin cambios. Al parecer, es necesario establecer todas las variables de llenado a constantes específicas en función del tipo de orden y/o instrumento (probablemente, esto no se puede sacar a través de la API de ninguna manera, y el probador utiliza algunos valores predeterminados). Si alguien sabe como MT4 selecciona el llenado internamente, por favor que lo comparta.
Si alguien sabe cómo MT4 selecciona internamente relleno - compartir.
Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading.
Peculiaridades del lenguaje mql5, sutilezas y técnicas de trabajo
fxsaber, 2017.02.25 16:12
ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);
return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
(((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
(ENUM_ORDER_TYPE_FILLING)Type);
}
Gracias, se puede modificar ligeramente este código para obtener un análogo de SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) para MT4. La función no debería devolver ENUM_ORDER_TYPE_FILLING sino (SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC).
ORDER_FILLING_FOK = 0, ORDER_FILLING_IOC = 1, mientras que SYMBOL_FILLING_FOK = 1 y SYMBOL_FILLING_IOC = 2, por lo que sólo tienes que incrementar el resultado en 1.
//la función devuelve el modo de llenado del símbolo, también conocido como SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) para MT4. //Parámetro Tipo - tipo de llenado de la orden uint GetSymbolFilling( const string Symb, const uint Type = ORDER_FILLING_FOK ) { const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE); const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE); return ((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ? (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ? ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) : (ENUM_ORDER_TYPE_FILLING)Type) + 1; }
Y luego llamar al código en la función bool CTrade::FillingCheck(const string symbol)
uint filling = GetSymbolFilling(symbol, m_type_filling); //en lugar de //uint relleno = (uint)SymbolInfoInteger(símbolo, SYMBOL_FILLING_MODE);
Pero en realidad es sólo un ajuste de código para que funcione. Es mejor no hacer esto y encontrar una solución correcta.
Buenos días Sr. Stanislav Korotky, espero que le vaya bien.
He encontrado su artículo muy interesante y he tratado de seguir sus instrucciones sobre cómo hacer un EA MT5 listo para ser compatible para funcionar en MT4.
Pero me sale el siguiente error, ¿podría guiarme sobre cómo resolver el error?
Lo que hice después de seguir sus instrucciones fue: Acabo de copiar el archivo de origen MQL5 y el Programa MQL5 a continuación, siga por pegarlo en el directorio principal de la carpeta de Expertos
y tengo muchos errores.
¿Podría decirme cómo puedo proceder para hacer que el EA generado de MQL5 funcione en MT4?
A continuación se adjuntan las imágenes de error.

- 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
Artículo publicado Los Asesores Expertos desde el Asistente MQL5 funcionan en MetaTrader 4:
En este artículo se ofrece un emulador simple del entorno comercial de MetaTrader 5 para MetaTrader 4. Este emulador permite realizar el traspaso y adaptación de las clases de trading de la librería estándar. Como resultado, los Asesores Expertos generados en el Asistente para MetaTrader 5, pueden ser compilados y ejecutados en MetaTrader 4.
En el gráfico EURUSD M15, el trading de este EA parece estar bien, incluyendo, en particular, el establecimiento de los niveles Stop Loss y Take Profit.
Ventana del gráfico que muestra el trabajo del Asesor Experto del Asistente de MetaTrader 5 en MetaTrader 4
Autor: Stanislav Korotky