¿Está seguro de que funciona? ????
Una simple compilación ya plantea la pregunta

y en segundo lugar ¡qué devolverá esta función!
CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,start,count));
copia los precios de cierre en el array Klose, copia desde la posición "start" y el número de "Counts" correctamente.
y devuelve el índice del elemento máximo del array Klose partiendo de la posición "start" y mirando sólo los elementos "count"......
cuál es tu herejía perdón por la franqueza.....
¿Está seguro de que funciona? ????
Sí, funciona.
//+------------------------------------------------------------------+
//|prueba.mq5
//|Copyright DC2008 |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "DC2008"
//--- Matrices de series temporales
double Close[];
double Open[];
double High[];
double Low[];
long Volume[];
datetime Time[];
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
{
//---
ArraySetAsSeries(Close,true);
ArraySetAsSeries(Open,true);
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
ArraySetAsSeries(Volume,true);
ArraySetAsSeries(Time,true);
ArraySetAsSeries(Low,true);
//---
return(0);
}
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
{
//---
Comment(
"\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,0)," Open",
"\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,0)," Low",
"\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,0)," High",
"\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,0)," Close",
"\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,0)," Volume",
"\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,0)," Time",
"\n",""
);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iLowest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMinimum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMinimum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMinimum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMinimum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMinimum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMinimum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iHighest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMaximum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMaximum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMaximum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMaximum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMaximum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMaximum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60: return(PERIOD_H1);
case 240: return(PERIOD_H4);
case 1440: return(PERIOD_D1);
case 10080: return(PERIOD_W1);
case 43200: return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
}
En las celdas de las tablas donde pone "Sin análogo" deberías dar una breve descripción de cómo se solucionan estas cosas en mql5 con referencias a una sección concreta de la documentación (algo así como, por ejemplo, esto: "no tiene sentido, porque en mql5 esto y lo otro").
Debe entenderse así: la implementación es demasiado complicada y no está justificada. Al fin y al cabo, el objetivo es abandonar por completo las funciones de MQL4.
Pero intentaré tenerlo en cuenta si pudiera proporcionar enlaces a esas funciones MQL5 que se pueden utilizar para hacer algo similar.
Estamos tomando esta del TF m2. Cierto, lo entiendo.
El TF migrate nos está dando
default: return(PERIOD_CURRENT);
desde 0 bar. Eso es raro.
Pero si probamos desde 20, por ejemplo.

Está intentando confundirnos otra vez.
y esas tonterías en cada función.
¿Y por qué hacer TF migrate???
si mql5 tiene todos los TFs que mql4 tiene aún más......
herejía completa =))))
¿Cómo se les escapó algo así a sus moderadores?
¡Querido Eugene! Espero que no hayas sido tú el que ha revisado este artículo.
herejía completa =))))
¿Cómo se les ha pasado esto por alto a sus moderadores?
¡Querido Eugene! Espero que no hayas revisado este artículo.
¡Estimado Vasily!
Gracias por sus comentarios, las funciones de la sección 18 han sido actualizadas. Por favor, compruebe la versión actual.
El autor ha hecho mucho trabajo, puede haber errores, los arreglaremos juntos.
La función TFMigrate(int tf) es necesaria para sustituir los valores correctos de los plazos de MQL5. Por ejemplo, en MQL4 el valor numérico de la constante PERIOD_H1 es 60, y en MQL5 el valor numérico de PERIOD_H1=16385, es decir, TFMigrate(60)=16385.
Creo que hay muchos más errores.
porque se producen incluso en los momentos más sencillos. Yo diría que incluso en los más sencillos.
En algunas secciones, las funciones se comparan entre sí.
en otros, se escribe un análogo.
no hay ni un solo ejemplo acertado de como aplicar el articulo,
por lo que tengo entendido, este artículo es un intento de transferir algo de µl4.....
Su actitud hacia la verificación es siempre admirable.
Creo que es el deseo desenfrenado del autor de echarte polvo en los ojos.
lo que sin duda ha conseguido.
ya que conozco su sensibilidad hacia el material verificado.
¿Y si lo intentas con 20, por ejemplo?
Estás intentando confundirme otra vez.
y esas tonterías en cada función.
Y por qué hacer TF migrate????
si mql5 tiene todos los TFs que tiene mql4 incluso más......
herejía completa =)))))
Gracias por encontrar el error. Había pasado por alto que la búsqueda se puede iniciar desde otro punto que no sea la barra de cero. Aquí están las funciones corregidas:
//+------------------------------------------------------------------+ //|prueba.mq5 //|Copyright DC2008 | //| http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "DC2008" //--- Matrices de series temporales double Close[]; double Open[]; double High[]; double Low[]; long Volume[]; datetime Time[]; //+------------------------------------------------------------------+ //| Función de inicialización experta| //+------------------------------------------------------------------+ int OnInit() { //--- ArraySetAsSeries(Close,true); ArraySetAsSeries(Open,true); ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); ArraySetAsSeries(Volume,true); ArraySetAsSeries(Time,true); ArraySetAsSeries(Low,true); //--- return(0); } //+------------------------------------------------------------------+ //| Función de desinicialización experta| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Función tick experto| //+------------------------------------------------------------------+ void OnTick() { //--- Comment(Open[0],Close[0],Open[1],Close[1], "\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,20)," Open", "\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,20)," Low", "\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,20)," High", "\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,20)," Close", "\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,20)," Volume", "\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,20)," Time", "\n","" ); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iLowest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMinimum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMinimum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMinimum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMinimum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMinimum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMinimum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iHighest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMaximum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMaximum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMaximum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMaximum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMaximum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ ENUM_TIMEFRAMES TFMigrate(int tf) { switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60: return(PERIOD_H1); case 240: return(PERIOD_H4); case 1440: return(PERIOD_D1); case 10080: return(PERIOD_W1); case 43200: return(PERIOD_MN1); default: return(PERIOD_CURRENT); } }
Creo que hay muchos más errores.
porque se producen incluso en los momentos más sencillos. Yo diría que incluso en los más sencillos.
En algunas secciones, las funciones se comparan entre sí.
en otros, se escribe un análogo.
no hay ni un solo ejemplo acertado de como aplicar el articulo,
por lo que tengo entendido, este artículo es un intento de transferir algo de µl4.....
Su actitud hacia la verificación es siempre admirable.
Creo que es el deseo desenfrenado del autor de echarte polvo en los ojos.
lo que sin duda ha conseguido.
ya que conozco su sensibilidad hacia el material verificado.
Puede haber errores, el material es bastante extenso.
El tema de portar (más precisamente, el tema de escribir una clase emuladora con los métodos de MQL4) fue abordado en otro artículo (esperamos que esté terminado). En el proceso de lectura del material, le pedimos al autor que escribiera un artículo en forma de libro de referencia para cubrir todas las funciones de MQL4 (excepto el trading - pronto verán una de las soluciones para ellas), que proporcionara un análogo para cada una de ellas en MQL5, en general, que pusiera todo junto para que los que reescriben programas MQL4 pudieran encontrar rápidamente un análogo. Sobre el deseo irrefrenable, si hablamos del número de secciones consideradas - insistimos en cubrir todas las funciones (resultaron ser más de 250).
En cuanto a la comparación de funciones en algunas secciones, no se trataba exactamente de una comparación. Era necesario dar un análogo, aunque sea el mismo. Para todas las funciones. Así que parece que hay una comparación, pero se puede decir de la comparación que, por ejemplo, las funciones matemáticas son los mismos. Por cierto, como recomendación, probablemente sería útil mencionar esto al principio de cada sección, que es algo en lo que hay que fijarse.
Por esta razón (arquitectura de funciones del emulador) el autor tenía algunas cosas no obvias en la implementación (por ejemplo, para iLowest/iHighest globales Open[]...High[]..., que antes se declaraban globalmente y se hacían AsSeries en OnInit), que estaban implícitas como en el emulador, naturalmente para universalidad en funciones es mejor usar arrays locales.
En cuanto al trabajo con indicadores técnicos, puede haber muchas preguntas, trabajar con ellos no debe ser como en MQL4 - es mejor crearlos manualmente en OnInit y hacer referencia a los descriptores, en lugar de crearlos cada vez en funciones locales. Pero el enfoque sugerido por el autor también funciona, porque el terminal no destruye inmediatamente los indicadores. Así que hay muchas sutilezas.
Lo importante es que ahora hay algo que discutir, si usted encuentra errores (incluidos los causados por la estructura propuesta de funciones) - ofrecer sus variantes.
- 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 Traslado de MQL4 a MQL5:
Muchos desarrolladores han acumulado muchos indicadores y estrategias de trading escritas en MQL4. Para usarlos en Metatrader 5, se deben convertir a MQL5. No es fácil reescribir todos los programas para MQL5. Sería mucho más fácil convertirlos si hubiera una referencia de traducción, y aún mejor con ejemplos.
Este artículo es una guía rápida a las funciones del lenguaje MQL4. Le ayudará a trasladar sus programas de MQL4 a MQL5. Para cada función MQL4 (excepto las funciones de trading), se presentará la descripción e implementación de MQL5 lo que le ayudará a reducir el tiempo de conversión significativamente. Para su conveniencia, las funciones MQL4 están divididas en grupos, de forma similar al material de Referencia de MQL4.
Autor: Sergey Pavlov