Discusión sobre el artículo "Sobre nuevos raíles: Indicadores personalizados en MQL5"

 

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: Андрей

 

Ahora no entiendo algo, ¿tengo que hacer 2 buffers para que tengan High & Low de otro periodo en el indicador????


y en el articulo

CopyHigh


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.



 
Rosh   :

¿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));
  }
//+------------------------------------------------------------------+
 
zfs   :


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)

Archivos adjuntos:
 
Rosh   :


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)



Sí, funciona bien. Al parecer, es mi culpa, me refiero a la dirección de las matrices. Pero por qué me dieron datos diferentes durante la prueba seguirá siendo un secreto para mí. Gracias por su atención. Cuando empiezas algo nuevo, siempre tienes dudas.
 

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

 
Rosh:

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

 
Los archivos de código fuente adjuntos y los insertos de código fuente en código HTML están ahora completamente traducidos al portugués para su comodidad.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
Hola y gracias por este gran artículo, una pregunta :
¿nunca has experimentado una anomalía en la que si defines más de un buffer marcado como INDICATOR_DATA en consecuencia en tu código de clase derivada iCustom siempre obtienes un mal -1 cuando intentas recuperar datos (con CopyBuffer/GetData) de todos los buffer marcados como INDICATOR_DATA excepto del primero?

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.