Indicador Personalizado

Comparte y analiza indicadores para la plataforma creada por MetaQuotes.

Indicador Personalizado

Notapor sandra_fx » 06 Dic 2010, 20:38

HOLA!!! Estoy aprendiendo a programar mis propios indicadores y me encantaria que alguien me ayudara y me heche una mano (si puede, claro, espero sea poco pedir). Estoy leyendo algunas guias, y a veces me cuesta un poco (esto de la programación es duro, pero igual he seguido aprendiendo :). Ya se programar mis propios Asesores Expertos, aunque tengo problemas entendiendo la parte de mis indicadores personalizados. En este momento quisiera, si es posible, que alguien que de algo de información sobre, por ejemplo, como sería el código completo de este indicador (es muy sencillo, a mi me cuesta pero se que alguien que sabe le va a ser muy sencillo... espero que sea asi y pueda ayudarme con esto que necesito)

Yo quisira ver en la ventana de precios el "average true range" dividido entre dos, por lo que pongo el siguiente cogido en mi asesor experto (lo coloco tal cual me aparece en el programa):

//+------------------------------------------------------------------+
//| ATR-2.mq4 |
//| Sandra Del Vecchio |
//| |
//+------------------------------------------------------------------+
#property copyright "Sandra Del Vecchio"
#property link ""

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----

//----
return(0);
}
//+------------------------------------------------------------------+


Para avisarle al EA que el indicador lo tenga en la ventana del precio debo decirle esto:#property indicator_chart_window (que ya está colocado).
El valor de el código o la operación que el programa va dibujar en a ventana sería este: double ATR=(iATR(NULL,0,14,0))/2. Aquí le esto pidiendo que me divida entre dos el atr del par donde esté colocado el indicador, en el pedíodo en que esté puesto en la ventana, atr de 14 ultimas varras, y sacado con el precio actual (ya que dice "0"). supongo que esto lo coloco en la función star. PAra poder ver su forma con facilidad, puedo restarselo al ATR/2 por ejemplo, porque si no me dará valores muy por debajo de los precios y no los podré ver con facilidad.

Si no es molestia, ¿Alguien me completa el código, enseñándome lo que significa cada parte de ese código que va colocando?

Espero sea poco pedir y puedan ayudarme. Desde ahora muchas gracias por su ayuda
Sandra_FX
sandra_fx
 
Mensajes: 11
Registrado: 06 Dic 2010, 20:16
Karma: 0

Re: Indicador Personalizado

Notapor cu6yu4 » 07 Dic 2010, 00:58

Me parece que te confundes...

http://docs.mql4.com/indicators/iATR

El iATR trabaja sólo y lo puedes colocar en un indicador o directamente en el EA...

Te devuelve el valor que correspona... Por ejemplo:
Código: Seleccionar todo
loquesea=iATR(NULL,0,12,0)

La variable "loquesea" tomará el valor correspondiente al atr de los últimos 12 períodos(timeframe acual), del par actual...

--------------------------------------

Y en general cada EA tiene internamente sus cálculos... y si en todo caso quieres tomar los valores de un indicador externo(compilado, que no adjunto a ninguna ventana) usa iCustom... podrás obtener el valor de uno de los buffers de dicho indicador.
http://docs.mql4.com/indicators/iCustom

---------------------------------------

Cuando busques info de otros pares ten en cuenta el gran problema del mql... que la numeración de las barras(para un mismo timeframe) no coincide entre hisoriales, debido a ciertos huecos... es decir en 1M las 20:00:00 en el historial GBPUSD puede corresponder a la barra 100, pero esa misma hora puede corresponder a la barra 101 en EURUSD. Esto ocurre porque las barras se empiezan a contar desde la última aparecida(la 0) hacia atrás... y si faltan los datos de algunas barras en un historial, la cuenta sigue sin respetar ese espacio.

Por lo que cuando busques los datos de la barra del tiempo x en otro historial... no conviene presuponer que esa bara tendrá el mismo número que la barra de tu historial correspondiente a dicho tiempo x(me encanta como me estoy liando :mrgreen: )... sino que debes buscar primero el número de barra que correspondiente al tiempo x en el otro historial; mediante iBarshift

http://docs.mql4.com/series/iBarShift

Si por ejemplo necesitas saber cual es el cierre de la barra que corresponde al tiempo x en GBPUSD:

Código: Seleccionar todo
double closeprice;
int Shift,I;
...
...
Shift=iBarShift("GBPUSD",0,Time[I]);
...
...
closeprice=iClose("GBPUSD",0,Shift);
Avatar de Usuario
cu6yu4
 
Mensajes: 156
Registrado: 10 Oct 2009, 15:04
Karma: 0

Re: Indicador Personalizado

Notapor sandra_fx » 07 Dic 2010, 03:32

ok. Gracias cu6yu4. Un poco complicado lo que colocaste (al menos para mi), por lo que reformularé la pregunta :)

Estoy escribiendo el código que está abajo en el indicador personalzado. Cuando lo selecciono para unirlo a la ventana principal (o ventana donde salen los precios), no se por que me abre una ventana aparte (y estoy colocando "#property indicator_chart_window"), y aparte de esto, en esa ventana que me abre (que no se por que) no se ve NADA!!!

¿alguien puede ayudarme? (explicándome de una manera mas sencilla. Ya coloqué un código).

cu6yu4, para mi tu explicación fue algo complicada :(
igual comienzo mejor colocando el código. Debí decir al principio que necesito una explicación mas asociada a este código que ya coloco (no lo pensé antes y no me imaginé que alguien con conocimientos en esto podía hablarme en esos términos). ¿Puedes enseñarme de nuevo? (partiendo de este código que coloco mas abajo).

Gracias a quien pueda ayudarme, lo agradezco mucho



En este código estoy tratando de hacer un indicador, que se muestre en la ventana donde aparece el precio, el atr de 14 períodos de la barra anterior dividido entre dos, sumado al alto de la barra anterior.

//+------------------------------------------------------------------+
//| pruebas.mq4 |
//| Sandra Del Vecchio |
//| |
//+------------------------------------------------------------------+
#property copyright "Sandra Del Vecchio"
#property link ""

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

double Buf_0 [];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexBuffer (0, Buf_0);
SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int i,
counted_bars;
//----
counted_bars=IndicatorCounted();
i= Bars-counted_bars-1;
while (i> 0) // Loop para incontables bares

Buf_0 [i] = iHigh(NULL,0,1)+(iATR(NULL,0,14,1)/2); // Valor de 0 a buffer i bar


//----
return(0);
}
//+------------------------------------------------------------------+
sandra_fx
 
Mensajes: 11
Registrado: 06 Dic 2010, 20:16
Karma: 0

Re: Indicador Personalizado

Notapor cu6yu4 » 07 Dic 2010, 04:56

En el adjunto te he escrito algunas cosas; a ver si vale...

Repasando la primera pregunta... quizás convenga aclarar que hay 3 tipos de programas, scripts o experts... y aquí los de metaquotes li lían un poco:

1- expert advisor (EA): lo que se entiende por robot... un programa con capacidad para operar... los de la carita sonriente... y los backtests.
2- indicadores: dibujan en pantalla o realizan otras operaciones... y se recalculan con cada nuevo tick.
3-scripts: como un indicador pero que no se recalcula... se ejecuta una vez y él solo se cierra.
Adjuntos
00_prueba.mq4
(2.72 KiB) 712 veces
Avatar de Usuario
cu6yu4
 
Mensajes: 156
Registrado: 10 Oct 2009, 15:04
Karma: 0

Re: Indicador Personalizado

Notapor cu6yu4 » 07 Dic 2010, 17:58

...el atr de 14 períodos de la barra anterior dividido entre dos, sumado al alto de la barra anterior...


Si es de la barra anterior no será iHigh[i] o iHigh(NULL,0,i)... sino iHigh[i+1] o iHigh(NULL,0,i+1)
Avatar de Usuario
cu6yu4
 
Mensajes: 156
Registrado: 10 Oct 2009, 15:04
Karma: 0

Re: Indicador Personalizado

Notapor sandra_fx » 07 Dic 2010, 23:17

gracias gracias gracias cu6yu4, muy amable de tu parte :) Me has facilitado muchísimo y ahora me diste mucho mas de lo que esperaba :)

Yo quisiera agarrar el código que me pusiste e ir paso a paso diciendo lo que yo creo que signifca cada parte (y como es corto el codigo), y si es posible que alguien me vaya confirmando o corrigiéndome (si es poco pedir, claro). Así voy a aprender más rápido al tiempo que me guía alguien que tiene los conocimientos.

cu6yu4, me pusiste en el mensaje anterior que si me quiero referir a la barra anterior en vez de iHigh[i] ó iHigh(NULL,0,i) coloque iHigh[i+1] o iHigh(NULL,0,i+1). Solo quiero confirmar algo para estar segura: cuando dice "i" se refiere al tick actual, y cuando dice i-1 se refiere al precio High de la barra anterior (en este caso claro que es iHigh)?

Y gracias de nuevo cu6yu4
Sandra
sandra_fx
 
Mensajes: 11
Registrado: 06 Dic 2010, 20:16
Karma: 0

Re: Indicador Personalizado

Notapor cu6yu4 » 08 Dic 2010, 04:02

Fíjate:
Código: Seleccionar todo
...
counted_bars=IndicatorCounted();
i=Bars-counted_bars-1;
...


A groso modo... la primera vez que se ejecuta el indicador, i es igual a las barras del chart(Bars) menos las barras que ya ha calculado el indicador(IndicatorCounted(); y que son 0) menos 1(eso se usa de cara a la barra en formación, podemos obviarlo para simplificar)... de modo que i será igual al total de barras en el chart...

Aquí entra el deber de conocer como se numeran las barras en mql4... la última en aparecer siempre es la 0, la penúltima la 1, etc. Lo que significa que con cada nueva barra las otras barras ya no tienen el mismo número, sino uno más...

Decíamos que i empieza siendo igual al número de barras del chart... si hay 5000 barras, pues i=5000(número entero, osea int)... pero en esa primera ejecuación llegamos a :

Código: Seleccionar todo
while (i>0)
      {
      ...
      Buffer[i]=loquesea;
      ...
      i--;
      ...
      }


Aquí lo que ocurre es que i>0 (decíamos que i=5000), por tanto entramos en éste ciclo y... Buffer[5000]=loquesea;... pues i=5000... lo que significa que hemos dado al metatrader el valor de ese buffer para la barra 5000. El metatrader ya sabe que ese Buffer ejecuta un tipo de dibujo, tan sólo necesita un valor para cada barra, lo que le hemos dado, y lo guarda.

Pero el programa no para, y no se necesitan nuevos ticks que lo reinicien... porque aún está en el primer proceso... A continuación el i--; convierte el i=5000 en i=4999... ahora hablamos de otra barra...

while es un ciclo con lo que se irá repitiendo(repito, dentro de esa primera ejecución) hasta que el i-- nos rebaje la i hasta i=0... en ese momento no se cumplirá el i>0, y el programa podrá finalizar... Pero en el proceso hemos dado valores del buffer en cerca de 5000 posiciones o barras. Ya se puede dibujar todo.

Debido a que hemos usado el IndicatorCounted() para definir la i... cuando el programa se reinicie por el siguiente tick, ya no tendremos i=5000, pues ya hemos trabajado con todas las barras... con lo cual ahora i será i=0... i no entraremos en el ciclo(con i>0 sólo se llega a dibujar la penúltima barra)... Si pusiéramos (i>=0), en este caso veríamos como va cambiando el dibujo de la barra 0 conforme cada tick la va modificando(cuando se cierre quedará estático claro).

Para cualquier duda sobre asuntos concretos y definidos postea o mándame un mensaje. Como ves en mi avatar pertenezco a la orden de caballería, en los dominios del condado de Barcelona; luego estoy obligado a atender a cualquier dama en apuros... y a algún que otro inocente.

Respuesta: i+1 es la barra anterior a la i(la barra que sea en su momento)... ojo, i-1 es la siguiente, no confundirse.

Y perdón por confundirte...
Si es de la barra anterior no será iHigh[i] o iHigh(NULL,0,i)... sino iHigh[i+1] o iHigh(NULL,0,i+1)

no es iHigh[i], sino High[i]; puesto que iHigh sirve para los High de otros historiales, pues permite que te refieras a ese historial... pero si es para el historial presente(par del chart) te vale High[i], es tontería lo del iHigh con el NULL y el 0...
Avatar de Usuario
cu6yu4
 
Mensajes: 156
Registrado: 10 Oct 2009, 15:04
Karma: 0

Re: Indicador Personalizado

Notapor trader201 » 10 Dic 2010, 22:21

Hola cu6yu4. Te comento que bajé el archivo en el adjunto (00_prueba.mq4) y desde ese momento el MT4 dejó de abrirme. He desinstalado e instalado varias veces el Mt4 y el problema persiste: al tratar de asociar a una ventana un indicador diseñado, el mt4 deja de trabajar (y no abre mas). A lo mejor pudiera tener algo el archivo, no se, pues esto está pasando desde que abrí el archivo "00_prueba.mq4".

saludos
trader201
trader201
 
Mensajes: 281
Registrado: 13 Feb 2010, 21:05
Karma: 0

Siguiente

Volver a Indicadores

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron