Ahora no entiendo algo, ¿tengo que hacer 2 buffers para que tengan High & Low de otro periodo en el indicador????
y en el articulo
porque las funciones trabajan incorrectamente, por ejemplo
//+------------------------------------------------------------------+
//| Obtener High para un número de barra dado|
//+------------------------------------------------------------------+
doubleiHigh(stringsymbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
intcopied=CopyHigh(símbolo,timeframe,0,Bars(símbolo,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
¿Qué significa "malo"? Deberías dar ejemplos concretos en lugar de afirmaciones generales "todo es malo".
Intenta ejecutar el ejemplo de la sección CopyHigh():
//+------------------------------------------------------------------+
//|HighAndLow.mq5
//| Copyright 2009, MetaQuotes Software Corp. | |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property description "Ejemplo de salida de los valores Alto[i] y Bajo[i]"
#property description "para bares seleccionados al azar".
double High[],Low[];
//+------------------------------------------------------------------+
//|| Obtener el mínimo para un número de barra dado ||
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+------------------------------------------------------------------+
//| Obtener el máximo para un número de barra dado |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
{
//--- muestra los valores Alto y Bajo de la barra con el índice en cada tick,
//--- igual al segundo de llegada del tick
datetime t=TimeCurrent();
int sec=t%60;
printf("High[%d] =%G Low[%d] =%G",
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}
//+------------------------------------------------------------------+
Esto es lo que obtuve, muestra todo correctamente.
¿Qué significa "malo"? Deberías dar ejemplos concretos en lugar de afirmaciones generales "todo es malo".
Intenta ejecutar el ejemplo de la sección CopyHigh():
Esto es lo que obtuve, muestra todo correctamente.
Pido disculpas por la inespecificidad de las afirmaciones.
Me parece que si se escribe una función, se da a entender que funciona bajo diferentes parámetros. Si no, no tienen sentido.
Añadamos el parámetro TimeFrame. Y probemos el programa bajo un parámetro diferente, por ejemplo, igual al actual, es decir, por ejemplo, pongámoslo igual a PERIOD_D1 en un gráfico diario.
//+------------------------------------------------------------------+ //|HighAndLow.mq5 //| Copyright 2009, MetaQuotes Software Corp. | | //| https://www.mql5.com //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property description "Ejemplo de salida de los valores Alto[i] y Bajo[i]" #property description "para bares seleccionados al azar". double High[],Low[]; input ENUM_TIMEFRAMES TimeFrame; //+------------------------------------------------------------------+ //|| Obtener el mínimo para un número de barra dado || //+------------------------------------------------------------------+ double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double low=0; ArraySetAsSeries(Low,true); int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low); if(copied>0 && index<copied) low=Low[index]; return(low); } //+------------------------------------------------------------------+ //| Obtener el máximo para un número de barra dado | //+------------------------------------------------------------------+ double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index) { double high=0; ArraySetAsSeries(High,true); int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High); if(copied>0 && index<copied) high=High[index]; return(high); } //+------------------------------------------------------------------+ //| Función tick experto| //+------------------------------------------------------------------+ void OnTick() { //--- muestra los valores Alto y Bajo de la barra con el índice en cada tick, //--- igual al segundo de llegada del tick datetime t=TimeCurrent(); int sec=t%60; printf("High[%d] =%G Low[%d] =%G", sec,iHigh(Symbol(),TimeFrame,sec), sec,iLow(Symbol(),TimeFrame,sec)); } //+------------------------------------------------------------------+
Pido disculpas por la falta de especificidad de las afirmaciones.
Me parece que si escribes una función, está implícito que funciona bajo diferentes parámetros. De lo contrario, simplemente no tienen sentido.
Añadamos el parámetro TimeFrame. Y probemos el programa bajo otro parámetro, por ejemplo, igual al actual, es decir, por ejemplo, pongámoslo igual a PERIOD_D1 en un gráfico diario.
He comprobado su variante - también funciona correctamente. Lo ejecuté como un script en el marco de tiempo D1 con los parámetros H1 y D1. Los valores eran correctos (he comprobado las tres últimas barras)
He comprobado su variante - también funciona correctamente. Lo ejecuté como un script en el marco de tiempo D1 con los parámetros H1 y D1. Los valores eran correctos (he comprobado las tres últimas barras)
Acabo de empezar a aprender. descargado, lo puso en D:/\MetaTrader 5/ MQL5/Indicators carpeta.
Lo compilé y lo puse en el gráfico. Algunos indicadores no muestran nada ((.
¿Se supone que tiene que ser así o he hecho algo mal?
los indicadores CrossMa.mq5, Toned_WPR.mq5 y HistogramSample.mq5 no se muestran.
los otros funcionan
¿Qué significa "malo"? Deberías dar ejemplos concretos en lugar de afirmaciones generales "todo es malo".
Intenta ejecutar el ejemplo de la sección CopyHigh():
Esto es lo que obtuve, muestra todo correctamente.
¿Copiar todo el array de datos?
Creo que es muy poco económico copiar 1 elemento.
Prival:
¿Se supone que debe ser así? ¿O hice algo mal?
Hola, Sergei. Este artículo se escribió en caliente, para las primeras versiones públicas. Han cambiado muchas cosas desde entonces, quizá haya que mejorar algunos indicadores.
Lo revisaré en cuanto tenga tiempo.

- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com
He podido solucionar este problema definiendo sólo un buffer marcado como INDICATOR_DATA y moviendo todos los demás a INDICATOR_CALCULATIONS, de esta manera CopyBuffer/GetData devuelve los elementos copiados correctos en las matrices de destino.

- 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 Sobre nuevos raíles: Indicadores personalizados en MQL5:
No voy a enumerar todas las posibilidades y características de la nueva terminal y el lenguaje. Son numerosas y algunas de ellas merecen ser tratadas en un artículo separado. Tampoco hay aquí código escrito en lenguaje de programación orientado a objeto. Es un tema demasiado importante como para ser tan solo mencionado como ventaja adicional para los programadores. En este artículo vamos a ver los indicadores, su estructura, diseño, tipos y detalles de su programación al compararlos con MQL4. Espero que este artículo sea de utilidad tanto para principiantes como para programadores experimentados. Puede que algunos de estos últimos encuentren algo nuevo.
Autor: Андрей