Buenas tardes amigos!!!!
aquí estamos de nuevo, el compañero Ciclo hizo la punta proponiendo un indicador como generador de señales para nuestro EA.
Como El no ha podido subirlo al foro lo hago yo en este post:
Archivo adjunto 28529
Estuve analizando el código del indicador. Este indicador genera una alerta a partir del cruce de 3 medias móviles, que en sus valores por defecto son:
media1 = periodo 4
media2 = periodo 18
media3 = periodo 40
El algoritmo que emplea el indicador para generar la alerta es el siguiente:
1- Si las 3 medias estan una por encima de la otra, es decir media1 > media2 > media3, entonces la tendencia es alcista.
2- Si las 3 medias estan una por debajo de la otra, es decir media1 < media2 < media3, entonces la tendencia es bajista.
3- Si no se cumple ninguna de las condiciones previas, la tendencia es indeterminada.
- El indicador genera una alerta de compra cuando la tendencia pasa de bajista (2) o indeterminada (3) a alcista (1).
- El indicador genera una alerta de venta cuando la tendencia pasa de alcista (1) o indeterminada (3) a bajista (2).
- El indicador genera una alerta para salir de la posición de compra cuando la tendencia cambia de alcista (1) a bajista (2) o indeterminada (3)
- El indicador genera una alerta para salir de la posición de venta cuando la tendencia cambia de bajista (2) a alcista (1) o indeterminada (3)
Este es el indicador en el terminal, el mismo solo muestra las flechas para abrir posiciones, y las cruces para indicar el cierre, yo agregue por mi cuenta las medias para observar en que se basa en indicador:
Archivo adjunto 28532
Aunque parezca complejo, el codigo es bastante sencillo, por eso decidí incluir la logica en el EA, y no hacer una llamada al indicador.
Como les comente unos renglones mas arriba, la alerta se genera por un cambio de tendencia. Para detectar un cambio de tendencia, o hablando mas genericamente un CAMBIO en cualquier condicion (cambio de un valor, cruce de medias, etc), necesitamos comparar la condición actual con la condición previa.
En el codigo del EA, las 3 medias se calculan para el tick actual que esta corriendo y para la vela previa, es decir, 2 valores por cada media, el valor actual y el valor previo (de la vela previa). Esto nos permite tener los valores de la condicion actual y la condicion previa para comparar.
Adjunto el EA mas abajo, pero lo unico en que se diferencia con el template en blanco es el calculo de las medias actual y previa:
Código:
// --------------------------------------
// Calcular indicadores
// --------------------------------------
//
// ######################################################
// aqui se calculan los indicadores necesarios para la estrategia
// En este caso, calculamos 3 medias moviles de tipo Exponencial sobre el precio de cierre.
// Calculamos 6 valores, porque para detectar los cruces necesitamos el valor de cada media
// en el instante actual y de la misma media sobre la berra anterior a la actual.
// Valor de ma1 en el tick actual
double ma1_actual = iMA(Symbol(), 0, periodo_ma1, 0, MODE_EMA, PRICE_CLOSE, 0);
// valor de ma1 en la barra o vela previa (ver el parametro 1 al final de la
// funcion, si fuese 10 por ejemplo, seria el valor de la media sobre la decima
// vela anterior a la actual)
double ma1_previa = iMA(Symbol(), 0, periodo_ma1, 0, MODE_EMA, PRICE_CLOSE, 1);
double ma2_actual = iMA(Symbol(), 0, periodo_ma2, 0, MODE_EMA, PRICE_CLOSE, 0);
double ma2_previa = iMA(Symbol(), 0, periodo_ma2, 0, MODE_EMA, PRICE_CLOSE, 1);
double ma3_actual = iMA(Symbol(), 0, periodo_ma3, 0, MODE_EMA, PRICE_CLOSE, 0);
double ma3_previa = iMA(Symbol(), 0, periodo_ma3, 0, MODE_EMA, PRICE_CLOSE, 1);
// ######################################################
iMA es la funcion de MQL que nos permite calcular una media movil obre el precio. Tiene como parametros: El simbolo sobre el que se calcula (en este caso se emplea Symbol(), que indica calcular sobre el simbolo del chart en el que se encuentra corriendo el EA), el timeframe sobre le cual calcular el indicador (en este caso 0, para denotar el timeframe del chart actual), el periodo (se ha dejado como variable input del EA para luego optimizar los valores de las medias), el desplazamiento (se dejo en 0), em modo de calculo (en este caso se fijo en MODE_EMA, es una media Exponencial, aunque se podría haber dejado tambien como variable del EA para optimizar y ver que da mejores resultados), el precio sobre el cual se aplica el calculo (en este caso PRICE_CLOSE es sobre el precio de cierre de cada vela), y el ultima parametro de la funcion iMA, le indica cual es el punto del indicador que queremos que nos calcule. Si el ultimo parametro es 0, la funcion nos retorna la media movil calculada sobre el precio actual en este tick, mientras que si el parametro es 1, retorna el valor del indicador calculado sobre la vela previa, 2, sobre la anterior y asi sucesivamente.
En este caso estamos calculando cada media sobre el tick actual (iMA con parametro final = 0), y sobre la vela previa (parametro=1).
Los resultados de los indicadores los guardamos en variables, entonces tendremos 6 variables, 2 para cada media, una conteniendo el valor de la media para el tick actual y otra para la vela previa.
Ya que tenemos los calculos de las medias en el instante actual y en la vela previa, resta comprobar las condiciones y disparar las señales:
Código:
// --------------------------------------
// Generar señales de compra y venta
// --------------------------------------
// Verificar condiciones de compra
// -------------------
// Verificar si se dan las condiciones de compra de acuerdo a la
// estrategia(indicadores, tiempo, etc).
// Si las condiciones se cumplen, se setea la señal senal_abrir_buy
// ######################################################
// En este caso, el EA determina la tendencia actual del precio y la
// compara con la tendencia previa. Si la tendencia ha cambiado a
// alcista, dispara una señal de compra, y de lo contrario, una señal de
// venta.
double tendencia_previa;
double tendencia_ahora;
// setear tendencia actual y previa en 0 (indeterminada)
tendencia_previa = 0;
tendencia_ahora = 0;
// las variables tendencia_previa y tendencia_actual contendran el estado de
// la tendencia en la vela previa y en la vela actual respectivamente.
// cada una de las dos variables puede contener:
// valor 1: tendencia alcista
// valor 0: tendencia indeterminada
// valor -1: tendencia bajista
// para determinar la tendencia se realiza la siguiente comprobación:
// si ma1 > ma2 > ma3 se considera tendencia alcista
// si ma1 < ma2 < ma3 se considera tendencia bajista
// si no se cumple ninguna de las condiciones anteriores, la tendencia es
// indeterminada.
// verificar la tendencia en el tick actual ( barra 0).
// si las tres medias estan una arriba de la otra, la tendencia es alcista (1)
if ( ma1_actual > ma2_actual && ma2_actual > ma3_actual)
// ma1 > ma2 > ma3 en el tick actual (0)
tendencia_ahora = 1;
// verificar la tendencia en la barra previa (barra + 1)
if ( ma1_previa > ma2_previa && ma2_previa > ma3_previa)
tendencia_previa = 1;
// si las tres medias estan una debajo de la otra, la tendencia es bajista (-1)
if ( ma1_actual < ma2_actual && ma2_actual < ma3_actual)
tendencia_ahora = -1;
// verificar la tendencia en la barra previa
if ( ma1_previa < ma2_previa && ma2_previa < ma3_previa)
tendencia_previa = -1;
// al comienzo del bloque de comparaciones, se habian seteado tendencia_previa
// y tendencia_actual en 0.
// si la tendencia actual es positiva (1) y la tendencia previa es distinta de 1
// (0 indeterminada y -1 negativa), significa que la tendencia paso de bajista o
// indeterminada a ser alcista, entonces es una señal de compra
if ( tendencia_ahora == 1 && tendencia_previa != 1)
senal_abrir_buy = 1;
// ######################################################
// Verificar condiciones de venta
// -------------------
// Verificar si se dan las condiciones de venta de acuerdo a la
// estrategia(indicadores, tiempo, etc).
// Si las condiciones se cumplen, se setea la señal senal_abrir_buy
// ######################################################
// si por el contrario, la tendencia actual es negativa (-1) y la tendencia previa
// no era negativa, se genera una señal de venta
if ( tendencia_ahora == -1 && tendencia_previa != -1)
senal_abrir_sell = 1;
// ######################################################
// --------------------------------------
Nota: En el codigo he dejado los delimitadores ######### que habia puesto para que se observe como se ha completado el código sobre el template en blanco.
Creo que los comentarios son bastante explicativos, aún asi, cualquier duda que tengan será respondida con gusto.
Con las comprobaciones realizadas generamos las señales de compra (senal_abrir_buy=1) y de venta (senal_abrir_sell=1).
Ahora solo restan las comproaciones para cerrar posiciones:
Código:
// --------------------------------------
// Generar señales de cierre
// --------------------------------------
// Verificar cierre de compras
// -------------------
// Verificar si se dan las condiciones para cerrar las operaciones
// de compra abiertas (cambio de tendencia alcista a bajista por ejemplo)
// si se determina que las condiciones indican cerrar las posiciones buy,
// setear la señal senal_cerrar_buy
// ######################################################
// la señal de cierre de operaciones de compra se da cuando la
// tendencia pasa de alcista a indeterminada o bajista
if ( tendencia_previa == 1 && tendencia_ahora != 1 )
senal_cerrar_buy = 1;
// ######################################################
// Verificar cierre de ventas
// -------------------
// Verificar si se dan las condiciones para cerrar las operaciones
// de venta abiertas (cambio de tendencia bajista a alcista por ejemplo)
// si se determina que las condiciones indican cerrar las posiciones sell,
// setear la señal senal_cerrar_sell
// ######################################################
// la señal de cierre de operaciones de venta se da cuando la
// tendencia pasa de bajista a indeterminada o alcista
if ( tendencia_previa == -1 && tendencia_ahora != -1 )
senal_cerrar_sell = 1;
// ######################################################
// --------------------------------------
Este es el código completo del EA:
Archivo adjunto 28529
Desde ya voy adelantando que el resultado por defecto no es muy satisfactorio, este es un backtesting entre 01/01/2012 y 01/01/2014 (2 años):
Archivo adjunto 28530
He obtenido mejores resultando eliminando los bloques de cierre de operaciones y la generacion de señales de venta, e decir, solo dejando la generacion de señales de compra, y dejando que las operaciones se cierren por stop o por profit (el trailing stop esta activado), se obtiene un resultado mejor:
Archivo adjunto 28534
Este es el EA que solo genera señales de compra (no genera señales de venta ni de cierre):
Archivo adjunto 28533
Aunque la curva del balance no se vea muy alentadora,
el reporte del test indica 79% de operaciones ganadoras. Pregunto a los traders experimentados: con ese porcentaje de operaciones ganadoras, este EA tiene esperanzas de llegar a ser beneficioso?
Bueno amigos, espero vuestros comentarios, me gustaría que prueben el código, lo optimicen y propongamos entre todos que mejoras se pueden hacer para tratar de que este EA de beneficios.
Saludos!!!!!