Análisis Técnico y Codificación MQL4

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Análisis Técnico y Codificación MQL4

Mensaje por nstrader »

Introducción:

Voy a intentar plasmar en este hilo lo que he aprendido sobre análisis técnico y programación en mql4 durante estos años. Mi estudio se basa exclusivamente en la plataforma Metatrader, en su lenguaje de programación y el mercado Forex.

El objetivo de este hilo es el aprendizaje, sobre todo en análisis del mercado, y el estudio de nuevas ideas y planteamientos o alternativas, y luego trabajar la codificación de todo esto con este maravilloso lenguaje. Para conseguir esto se debe tener una mente abierta y creer que se puede hacer, eso de entrada, otras limitaciones serían las herramientas y la capacidad de imaginación y creatividad pero ahí no tengo ningún problema.

No me considero experto en Mql4 pero sí creo que lo domino porque he hecho con él todo lo que me he propuesto, pero seguro que todavía me queda mucho por aprender.

Sobre el análisis técnico, lo aprendido ha sido a través de este foro, y la infinita información de internet. La base de mis análisis son los Soportes y Resistencias y todo lo que ello conlleva y algún que otro indicador exótico o indicador-ayuda que invento como apoyo a la hora de programar o buscar ciertos datos.

Y ya para finalizar la introducción decir también que esto no es para aprender o enseñar a programar, si no para plasmar ideas con el lenguaje que es diferente, y también para mejorar por supuesto. Para aprender con la ayuda del Editor y ponerse a trabajar con el lenguaje es suficiente.
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Enlaces Interesantes

Mensaje por nstrader »

Introducción a MQL (Ciclo):
http://x-trader.net/phpBB2/viewtopic.php?t=9949

EA's (X-Trader):
http://x-trader.net/phpBB2/viewtopic.php?t=9896

Librería MQL del foro (Spirit):
http://x-trader.net/phpBB2/viewtopic.php?t=8860
(Spirit, eso hay que llenarlo, jejeje)

Blog (Mestize)
http://www.forexmq4.blogspot.com/

Foros sobre Indicadores y Expertos
http://www.forex-tsd.com/
http://www.strategybuilderfx.com/home.php
http://www.fxfisherman.com/forums/index.php

De momento estos enlaces estan bien para empezar con MQL4.
Avatar de Usuario
nostrasladamus
Mensajes: 313
Registrado: 09 Feb 2009 13:27
Ubicación: Sistema Referencia Inercial

Mensaje por nostrasladamus »

Hola,

Creo que las paginas de mql4 son tambien un "must":

Articulos:
http://articles.mql4.com/

Codigo de diferentes EA's:
http://codebase.mql4.com/experts

Indicadores:
http://codebase.mql4.com/indicators

Scripts:
http://codebase.mql4.com/scripts

Librerias:
http://codebase.mql4.com/libraries

Yo es aqui donde mas he aprendido, aunque fue antes de conocer X-Trader :-D
Si vis pacem, para bellum.
Dios me libre de los mansos, que de los fieros ya me libro yo.
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

Gracias nostrasladamus, no hay que dar porsupuesto nada
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Situación con MA

Mensaje por nstrader »

Entrando en materia, para uno de mis ea’s en este momento necesito saber la “situación” del mercado con el valor de una sola variable p ej. int MKT_SIT_EMA, entendiendo como situación la de donde está el precio, es decir, en una tendencia, alcista, bajista, lateral, alcista moderada, corrección, etc.

Advierto que el objetivo de este estudio concreto es solo para obtener la situación del mercado, no para dar señales.

Para el caso de la situación usaré medias móviles estándar ya que creo que se debería generalizar en gráficos con periodos mayores para luego concretar en periodos menores.

Usaremos la SMA 14 periodos y EMA 200 periodos junto con el valor del precio, en GBPJPY de 4 horas.

Imagen

Concepto Técnico sobre Medias:

En este caso interpretaremos que si el precio está encima de la media hay una tendencia alcista y si está por debajo hay una tendencia bajista, esto no siempre es así, pero partiremos de esa base. También se usaran las medias como soportes y resistencias dinámicos. El cruce de estas dos medias lo usaremos también para diferenciar situación, pero no como señal.
Bueno, planteando la programación de momento me salen 7 situaciones diferentes…

Luego sigo con este post, sorry

Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

Hola nstrader,

¿sabes si hay forma de acceder a las dimensiones de la ventana del chart? es decir, alto y ancho del chart en coordenadas gráficas (no tiempo-abcisas y precio-ordenadas, sino píxels o dpi o lo que sea ...).

Gracias

S2
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

No han creado funciones para eso concreto, puedes saberlo manualmente compilando un script con:

Código: Seleccionar todo

Comment("Expert dropped point x=",WindowXOnDropped()," y=",WindowYOnDropped());
y lanzar el script a la esquina inferior-derecha del chart, pero esto no te servirá para mucho

Depende de lo que quieras hacer con esos datos en pixeles, si es para introducir objetos en el chart tipo OBJ_LABEL y que se adapten al tamaño de la pantalla existe una propiedad de objetos llamada OBJPROP_CORNER donde puedes especificar la esquina del chart a partir de la cual empiezan a contar los pixeles de la posicion x-y del objeto.

Un ejemplo:

Código: Seleccionar todo

string str = "CORNER1";
   if(ObjectFind(str) == -1)
   {
      ObjectCreate(str,OBJ_LABEL,0,0,0);
   }
   ObjectSetText(str,"1",10,"",White);
   ObjectSet(str,OBJPROP_CORNER, 1);  
   ObjectSet(str,OBJPROP_XDISTANCE,10);
   ObjectSet(str,OBJPROP_YDISTANCE,10);
   
   str = "CORNER2";
   if(ObjectFind(str) == -1)
   {
      ObjectCreate(str,OBJ_LABEL,0,0,0);
   }
   ObjectSetText(str,"2",10,"",White);
   ObjectSet(str,OBJPROP_CORNER, 2);  
   ObjectSet(str,OBJPROP_XDISTANCE,10);
   ObjectSet(str,OBJPROP_YDISTANCE,10);
   
   str = "CORNER3";
   if(ObjectFind(str) == -1)
   {
      ObjectCreate(str,OBJ_LABEL,0,0,0);
   }
   ObjectSetText(str,"3",10,"",White);
   ObjectSet(str,OBJPROP_CORNER, 3);  
   ObjectSet(str,OBJPROP_XDISTANCE,10);
   ObjectSet(str,OBJPROP_YDISTANCE,10);
   
   str = "CORNER4";
   if(ObjectFind(str) == -1)
   {
      ObjectCreate(str,OBJ_LABEL,0,0,0);
   }
   ObjectSetText(str,"4",10,"",White);
   ObjectSet(str,OBJPROP_CORNER, 4);  
   ObjectSet(str,OBJPROP_XDISTANCE,10);
   ObjectSet(str,OBJPROP_YDISTANCE,10);
Si no es esto explicame para que quieres estos datos y buscaremos alternativas.

Un saludo
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Sitación MA

Mensaje por nstrader »

Este es un ejemplo de las situaciones que he visto de momento, si alguien ve alguna situación más que lo comente.

Imagen

Viendo esta imagen se me ocurren varias ideas como la de análisis de situaciones mediante una red neuronal por ejemplo, también la necesidad de confirmar la situación, y también muy importante el acceso al historial de situaciones. Estos dos últimos puntos habría que tenerlos en cuenta, por tanto tendríamos que guardar estos datos para que nuestros EA’s (Asesores Expertos) puedan analizar el mercado por este método cuando lo requieran.
Alguna alternativa a la hora de plantear situaciones?, entendiendo estas como zonas para determinar donde esta el precio.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

Sabiendo las coordenadas gráficas del chart puedes transformar los precios y los tiempos para expresar todo en las mismas unidades y poder así calcular pendientes verdaderas.

La pendiente puede servir para cuantificar las subidas y las bajadas. Saber cuánto está subiendo una media, o cuánto están subiendo los High del precio, etc.

En el ejemplo que estás poniendo, podrías calcular la recta de mínimos cuadrados de la media y calcular la pendiente de esa recta. Si el precio queda por encima y la pendiente es mayor que x, entonces movimiento alcista, etc.

S2
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

Jeje, intuía por donde ibas.
Yo he conseguido programar líneas de tendencias tal cual como las dibujarías manualmente. Esto es fácil, lo complejo es como validar esa línea y como clasificarlas, como buscar los puntos de apoyo, pullbacks etc. con un poco de imaginación lo puedes conseguir, pero vamos al problema que planteas.

Dices de calcular pendiente de una media, bueno aquí tienes el mismo problema que para calcular un tercer punto de una línea de tendencia cuando tienes dos puntos que dibujan esa línea y son como bien dices las coordenadas.

Las coordenadas que planteas en pixeles aparte de que de momento no las podemos calcular no las veo válidas porque la pendiente variará en función del tamaño de tu pantalla o tamaño de la ventana de tal forma que siempre deberías tener la ventana siempre en el mismo tamaño cuando haces test, y luego utilizas esos datos para comprobaciones futuras.

Con las coordenadas que tenemos nos vale, digamos que tenemos la coordenada X que es el tiempo y la coordenada Y que es el precio.

Con la coordenada Y (Precio) no hay ningún problema porque el intervalo es constante.

Pero con la coordenada X (Tiempo) que esta expresado en segundos el intervalo no es constante porque hay saltos en el intervalo, caso del Forex en fin de semana que el mercado está cerrado. Entonces si calculas una pendiente o línea de tendencia usando segundos y hay un fin de semana en medio nos dará un valor incorrecto.

Para la coordenada X hay una alternativa a los segundos y es el nº de barra, siendo la nº 0 la barra en formación y la nº 1 la anterior, ejemplo: 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4. Los negativos serían para cálculos del futuro. Esta escala es dinámica pero válida, y para concretar el número de una barra concreta aquí ya se puede utilizar el valor tiempo de la barra en cuestión (fecha de apertura)

Con esto ya tienes una coordenada X válida por tanto ya puedes calcular con funciones Trigonométricas.

Un Saludo
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

Lo de calcular la pendiente verdadera lo decía porque es la manera de simular el juicio que hace la mente humana para saber si algo sube o baja.
Haciendo zoom vertical u horizontal cambiarán las lecturas, pero lo harán tanto para el programa como para el ojo humano.

Entre las muchísimas utilidades que puede tener:
- Detectar pautas laterales (pendiente cero o muy próxima a cero de una media, las bollinger, etc).
- Filtrar cruces de indicadores. Por ejemplo un cruce de medias al alza tendrá más significancia si la pendinte de ambas curvas apunta hacia arriba.
- Comparar pendientes entre distintos activos,
etc.

S2
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

Quieres calcular la pendiente de esta tangente no?, la idea parece interesante, esta imagen vale más que mil palabras

Imagen
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

Sí eso mismo. Pero para la secante en vez de la tangente (la tangente es la derivada, primero tendrías que conocer la función de la curva ... complicado).

La secante la puedes aproximar como una recta de mínimos cuadrados.
Este es un ejemplo (en ninjatrader) de pendiente de la recta de regresión de cinco períodos aplicada al Close. El número es la inclinación o el ángulo de la recta con la horizontal. La medida es exacta, tal cual que si pones un porta-ángulos sobre la pantalla y lo mides.

Es una aproximación bastante real a cómo estimamos discrecionalmente si algo sube o baja, y cuánto lo hace.

Como comenté, la única dificultad para programarlo es acceder a las dimensiones gráficas (en pixels, dpi, ...) del chart.

S2



Imagen
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Mensaje por nstrader »

Hay una forma de obtener el angulo de una secante en pixeles, pero tiene que ser visual (Visual test) para que se dibuje la línea de tendencia con la propiedad OBJ_TRENDBYANGLE y obtener el angulo real, y este se adaptará a tu pantalla o tamaño de la ventana, por tanto será variable.

Tambien he sacado la relación Pips/Barras, que a simple vista no dice mucho pero a mi me vale mas ese dato porque es constante (no varia según tamaño de ventana) y a parte me sirve para hacer test en modo no visual.

Imagen

Código: Seleccionar todo

//+------------------------------------------------------------------+
//|                                              Temp_Ma_Secante.mq4 |
//|                                       Copyright © 2008, NsTrader |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, NsTrader"
#property link      ""

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Punto1 = 0;//Barra en formación
   int Punto2 = 2;//Barra histórico
   
   double MA0 = iMA(NULL,0,14,0,MODE_SMA,PRICE_CLOSE,Punto1);//MA barra en formación
   double MA1 = iMA(NULL,0,14,0,MODE_SMA,PRICE_CLOSE,Punto2);//MA barra hitórico
   
   OBJ_TREND_("TREND",MA1,Time[Punto2],MA0,Time[Punto1],Yellow,2);//Dibuja Línea secante
   OBJ_TREND_("HOR",MA1,Time[Punto2],MA1,Time[0]+Period()*10,Yellow,2);//Dibuja Línea horizontal

   double Pendiente =  (MA0-MA1) / (Punto2-Punto1);//Relación Precio/Barra
   double Ang = ObjectGet("TREND",OBJPROP_ANGLE);//Angulo Visual
   if(Ang-90 > 0) Ang = -1*(360-Ang);//adaptación a angulo negativo
   
   OBJ_LABEL_("PEND",StringConcatenate(DoubleToStr(Pendiente,Digits)," Pips/Bar"),20,20,Yellow,12);//Dibuja relacion Precio/Barra
   OBJ_LABEL_("ANG",StringConcatenate(DoubleToStr(Ang,1),"º"),20,70,White,12);//Dibuja Grados visuales
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

void OBJ_TREND_(string str="",double PRICE1=0,datetime TIME1=0,double PRICE2=0,datetime TIME2=0,color COLOR=Orange,int WIDTH=1,int STYLE=STYLE_SOLID)
{
   if(ObjectFind(str) == -1)
   {
      ObjectCreate(str, OBJ_TRENDBYANGLE, 0, TIME1, PRICE1, TIME2, PRICE2);        
      ObjectSet(str, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSet(str, OBJPROP_RAY, true);
      ObjectSet(str, OBJPROP_BACK, True);
   }
   else
   {
      ObjectSet(str,OBJPROP_PRICE1,PRICE1);
      ObjectSet(str,OBJPROP_TIME1,TIME1);
      ObjectSet(str,OBJPROP_PRICE2,PRICE2);
      ObjectSet(str,OBJPROP_TIME2,TIME2);
   }
      ObjectSet(str,OBJPROP_COLOR,COLOR);
      ObjectSet(str,OBJPROP_WIDTH,WIDTH);
      ObjectSet(str,OBJPROP_STYLE,STYLE);
}

void OBJ_LABEL_(string str="",string TEXT="",int X=0, int Y=0,color COLOR=Blue,int FONT_SIZE=10)
{
   if(ObjectFind(str) == -1)
   {
      ObjectCreate(str,OBJ_LABEL,0,0,0);
   }
   ObjectSetText(str,TEXT,FONT_SIZE,"",COLOR);
   ObjectSet(str,OBJPROP_CORNER, 1);  
   ObjectSet(str,OBJPROP_XDISTANCE,X);
   ObjectSet(str,OBJPROP_YDISTANCE,Y);
}
Avatar de Usuario
nstrader
Mensajes: 257
Registrado: 24 Mar 2007 19:33

Situacion MA

Mensaje por nstrader »

Ya para cerrar el tema que llamé Situación MA del mercado o también entorno del mercado o como se quiera llamar, pondré algunos ejemplos de cómo se puede utilizar en nuestros ea’s

Por ejemplo:
Tenemos una situación con un historial de situaciones confirmadas de la siguiente forma:
3,2,3,2,3,2,3,2 esto lo traduciría como que el mercado tiene posibilidades alcistas en una tendencia lateral por tanto tendría más probabilidades comprando en soportes y cerrando en resistencias.
-3,-2,1 la tendencia ha cambiado de bajista a alcista, cuando se confirme la situación 1 entonces las resistencias que se encuentre tiene más posibilidades de ser rebasadas
2,-1,2 en este caso el -1 supongamos que no ha confirmado, entonces el precio tiene más posibilidades de ir para arriba, ya que esto significa que se ha encontrado un fuerte soporte dinámico (EMA200)
Y así un sinfín de posibilidades que nos dan un par de medias móviles combinándolas con soportes y resistencias, líneas de tendencia etc.
Y a la hora de programar hay que tener acceso:
Al historial de situaciones,
Tiempo de permanencia de cada situación
Confirmación de situaciones.

-------------------
Un saludo
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”