Asesores Expertos: Diferencia de dos medias móviles

 

Diferencia de dos medias móviles:

Asesor Experto basado en la diferencia de dos medias móviles.

Este Asesor Experto se ha desarrollado tras observar que cuando dos medias móviles divergen y convergen, típicamente existe una diferencia máxima entre sus valores instantáneos antes de que se produzca un cambio de tendencia.

Test results

Autor: Winston

 

Creo que el indicador necesita ArraySetSeries (mf, true) y (ms, true) en OnInit () para que funcione correctamente.

Todos los operadores

if (flg == 0) / / initialise on first pass
      {
       ArrayInitialize (ag, EMPTY_VALUE);
       ArrayInitialize (bg, EMPTY_VALUE);
       ArrayInitialize (cg, EMPTY_VALUE);
       hi = 0;
       I = 0;
       trend = 0;
       flg = 1;
       }

sería más eficaz en OnInit () y no tener que utilizar "flg"

EA con respecto a ... utilizando MACD creo que su algoritmo de la estrategia se simplifica así:

Abrir comprar: MACDcurrent>MACDprev && MACDcurrent<0; buyed = true.

Cerrar compra: buyed && MACDcurrent<MACDprev && MACDcurrent>0; buyed = false

Para acciones inversas de venta.

Si usamos SL y TP cuando no opera el EA puedo decir "comprar" o "vender" como tendencia (MA lento) y esperar nueva señal.

 

Hola, no se porque este indicador: madelta_inc.mq5, no dibuja nada cuando lo adjunto al gráfico. Aquí os adjunto una imagen para que veáis lo que digo. También pongo a continuación el código con el cambio que sugiere josemiguel1812 sobre no usar el flag: 'flg', y mover parte del código al evento OnInit(). No he usado ArraySetAsSeries (mf, true) y ArraySetAsSeries (ms, true) porque tanto 'mf' como 'ms' son arrays de un solo elemento y creo que este cambio no tendra efecto, ademas MT5 no permite usar esta funcion para arrays estaticos. Pero lo que me gustaria saber es por que no dibuja las lineas del indicador?. ¿Podrías probar el siguiente código y comprobarlo?

gracias de antemano, Cyberglassed.

//+------------------------------------------------------------------+
//|madelta_inc
//|Copyright 2013 Winston |
//+------------------------------------------------------------------+
#property copyright "Winston 2013"
#property version "1.10"
#property description "madelta_inc"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   3

#property  indicator_type1   DRAW_COLOR_LINE
#property  indicator_color1  White,Yellow,Red
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  2

#property  indicator_type2   DRAW_LINE
#property  indicator_color2  Yellow
#property  indicator_style2  STYLE_DOT
#property  indicator_width2  1

#property  indicator_type3   DRAW_LINE
#property  indicator_color3  Red
#property  indicator_style3  STYLE_DOT
#property  indicator_width3  1

input double d = 0.00195;                       //delta
input double m = 39.2;                          //mult

input int F = 26;                               //media móvil rápida
input ENUM_MA_METHOD FM = MODE_SMA;             //modo medio rápido
input ENUM_APPLIED_PRICE FP = PRICE_WEIGHTED;   //modo de precio rápido

input int S = 51;                                     /media móvil lenta
input ENUM_MA_METHOD SM = MODE_EMA;                 /modo medio lento
input ENUM_APPLIED_PRICE SP = PRICE_MEDIAN;        /modo de precio lento

int Ms, Mf, trend;
double px, hi, lo;
double ms[1], mf[1];
double ag[], bg[], cg[], ac[];

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnInit() {
        SetIndexBuffer(0, ag, INDICATOR_DATA);
        ArraySetAsSeries(ag, true);                    /señal

        SetIndexBuffer(1, ac, INDICATOR_COLOR_INDEX);
        ArraySetAsSeries(ac, true);                    /color de la tendencia de la señal

        SetIndexBuffer(2, bg, INDICATOR_DATA);
        ArraySetAsSeries(bg, true);                    //hi umbral

        SetIndexBuffer(3, cg, INDICATOR_DATA);
        ArraySetAsSeries(cg, true);                    //lo umbral

        ArrayInitialize(ag, EMPTY_VALUE);
        ArrayInitialize(bg, EMPTY_VALUE);
        ArrayInitialize(cg, EMPTY_VALUE);
        hi = 0;
        lo = 0;
        trend = 0;
        
        Mf = iMA(NULL, PERIOD_H1, F, 0, FM, FP);
        Ms = iMA(NULL, PERIOD_H1, S, 0, SM, SP);

}

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,           // tamaño de la matriz price[]
                                const int prev_calculated,               // barras tratadas en una llamada anterior
                                const int begin,                          // de dónde parten los datos significativos
                                const double &price[])              // matriz para calcular
{

        CopyBuffer(Mf, 0, 0, 1, mf);                   //valor medio móvil rápido

        CopyBuffer(Ms, 0, 0, 1, ms);                   /valor de la media móvil lenta

        px = pow(m * (mf[0] - ms[0]), 3);                //amplificar y cubicar la diferencia


        if (px > hi) {                               //identificar tendencia
                hi = px;
                lo = hi - d;
                trend = 1;
        }
        if (px < lo) {                               //con cambio de color
                lo = px;
                hi = lo + d;
                trend = 2;
        }

        ag[0] = px;
        bg[0] = hi;
        cg[0] = lo;
        ac[0] = trend;

        return (rates_total);
}

//+------------------------------------------------------------------+
Archivos adjuntos:
screenshot.png  103 kb
 
cyberglassed:

Hola, no se porque este indicador: madelta_inc.mq5, no dibuja nada cuando lo adjunto al gráfico. Aquí os adjunto una imagen para que veáis lo que digo. También pongo a continuación el código con el cambio que sugiere josemiguel1812 sobre no usar el flag: 'flg', y mover parte del código al evento OnInit(). No he usado ArraySetAsSeries (mf, true) y ArraySetAsSeries (ms, true) porque tanto 'mf' como 'ms' son arrays de un solo elemento y creo que este cambio no tendra efecto, ademas MT5 no permite usar esta funcion para arrays estaticos. Pero lo que me gustaria saber es por que no dibuja las lineas del indicador?. ¿Podrías probar el siguiente código y comprobarlo?

gracias de antemano, Cyberglassed.

¿Qué esperas? Sólo se fijan los valores del índice 0 de los buffers del indicador.
 
angevoyageur:
¿Qué espera? Sólo se establecen los valores de índice 0 de los buffers del indicador.

Me resultaba un poco confuso ver que siempre se asignaba el índice 0 de los buffers, así que esperaba que el ArraySetAsSeries tuviera alguna influencia para cambiar el comportamiento intuitivo de lo que uno podría pensar (inverso) o algo así, soy principiante en mql5. De todas formas he tenido que reiniciar el ordenador por otro motivo y he vuelto a probar el indicador y ahora dibuja las líneas como esperaba al principio. Adjunto una imagen.

Gracias Cyberglassed.

Archivos adjuntos:
screenshot.png  118 kb
 
cyberglassed:

Era un poco confuso para mi ver que siempre se asignaba el índice 0 de los buffers, por lo que esperaba que el ArraySetAsSeries tuviera alguna influencia para cambiar el comportamiento intuitivo de lo que uno podría pensar (inverso) o algo así, soy principiante en mql5. De todas formas he tenido que reiniciar el ordenador por otro motivo y he vuelto a probar el indicador y ahora dibuja las líneas como esperaba al principio. Adjunto una imagen.

Gracias Cyberglassed.

O bien el código que estás ejecutando no es el mismo que el que has publicado, o bien tu terminal dibuja datos procedentes de algunos buffers.

El código que has puesto no puede producir ese resultado.

 

Gracias por sus comentarios. El indicador es tal vez inusual en que está destinado a trabajar sólo con el Probador de Estrategias en el modo de Visulización.

En el Navegador, haga clic izquierdo en el ea y luego haga clic derecho en la prueba. En Probador de Estrategias EURUSD, H1 y marque la casilla Visulización y luego Iniciar, el indicador debe aparecer.

Déjame saber cómo te va.

Saludos cordiales

Winston

 

algo esta mal con este EA. Cuando trato de operar en un solo par de divisas esta EA no hizo nada a través de 2 días, indicador a veces muestran sel y comprar la señal al mismo tiempo.

Cuando trato de operar en varios pares de divisas hace lo mismo, pero observo que cuando cierro posiciones manualmente comienza a operar de nuevo, algo esta muy mal con este EA, algo esta bloqueando las operaciones en Meta Trader 5.

cuando lo he probado en el probador de estrategias todo va bien, pero cuando intento operar solo abre posiciones y no las cierra, necesito cerrarlas manualmente....

¿podría alguien arreglar esto?

 
Si necesita un marcador de marco de tiempo - (Ma1-Ma2) Y (indicador desconocido) será trabajar bien, ¿no?
 
Sólo que no estoy seguro de dónde ajustarlo para permitir que se seleccione un lote.
 
Buenas tardes! He averiguado como configurar el lote necesario, pero como hacer que este bot funcione simultáneamente en varios instrumentos.