organizar grafica custom indicator

 

Hola a todos. Soy nuevo en mql. He tratado, con base a varios aritculos de mql, hacer un custom indicator que me ayude a averiguar tendencia. la cosa es que para la grafica de la linea de promedios, se me muestra una linea plana. La pregunta es: ¿cómo puedo organizar dicha linea?

Aqui esta el codigo que he usado 


#property copyright "Copyright 2018, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_plots   3

#property indicator_label1  "Clup"

#property indicator_label2  "Cldw"

#property indicator_label3  "Prom"

#property indicator_type1   DRAW_LINE

#property indicator_type2   DRAW_HISTOGRAM

#property indicator_type3   DRAW_HISTOGRAM

#property indicator_color1  clrLimeGreen

#property indicator_color2  clrSteelBlue

#property indicator_color3  clrRed

#property indicator_style1  STYLE_DASH

#property indicator_style2  STYLE_SOLID

#property indicator_style3  STYLE_SOLID



#property indicator_width1  1

#property indicator_width2  1

#property indicator_width3  1



#define DIRECTION_NONE 0

#define DIRECTION_UP 1

#define DIRECTION_DOWN -1



//--- indicator buffers

double         PromBuffer[], ClupBuffer[], CldwBuffer[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,PromBuffer,INDICATOR_DATA);

   SetIndexBuffer(1,ClupBuffer,INDICATOR_DATA);

   SetIndexBuffer(2,CldwBuffer,INDICATOR_DATA);  

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

//---

      double counted_bars = prev_calculated;

      int  bars = Bars(_Symbol,PERIOD_CURRENT);

      int limit = MathMax(1,MathMin(bars - 1,bars - prev_calculated + 1));

      double k = bars - counted_bars - 1;

      for(int i = 0; i < k + counted_bars + 1; i++)

      {

        PromBuffer[i] = open[i];

      }

      while ( limit >= 0) 

      {

         ClupBuffer[limit] = MathMax(0,GetCandleDirection(limit,open,close));

         CldwBuffer[limit] = MathMin(0,GetCandleDirection(limit,open,close));

         limit--;

      }

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+

double GetCandleDirection(int shift, const double &open[], const double &close[]) {

   double diff=close[shift]-open[shift];

   if (diff>0.0) {

      return (DIRECTION_UP);

   }

   else if (diff<0.0) {

      return (DIRECTION_DOWN);

   }

   else /*if (diff==0.0)*/ {

      return (DIRECTION_NONE);

   }

}
Descubra las nuevas posibilidades de MetaTrader 5 con la comunidad y los servicios MQL5
Descubra las nuevas posibilidades de MetaTrader 5 con la comunidad y los servicios MQL5
  • www.mql5.com
Formule preguntas sobre análisis técnico, discuta sobre sistemas comerciales y mejore sus hablidades de programación de estrategias comerciales en el lenguaje MQL5. Contacte con tráders de todo el mundo en el foro e intercambie experiencias, también podrá ayudar a los principiantes con sus propias respuestas: nuestra comunidad se desarrolla...
 
seria mas facil ayudarte si nos explicas un poco mas del indicador y si nos puedes añadir unas imagenes de como funciona actualmente y como deberia de ser
 
Andres Sigala:
seria mas facil ayudarte si nos explicas un poco mas del indicador y si nos puedes añadir unas imagenes de como funciona actualmente y como deberia de ser

Claro!

La idea del indicador es usarlo para tener una manera de predecir tendencia (https://www.mql5.com/es/articles/1374). Para ello, he estado tratando de pasar el indicador CandleColor ( esta adjunto en el articulo) que muestra las direcciones de las velas junto con el promedio de las mismas de mql4 a mql5. Funciona mediante una función que indica la dirección de las velas y las grafica como histogramas y también calcula el promedio de las velas. Quisiera que me quede como en la primera figura del articulo adjunto, pero me aparece esto

https://charts.mql5.com/20/347/eurusd-m1-metaquotes-software-corp.png

La linea verde es la del problema.

Cuando trabajo solo con el buffer del promedio todo sale ok, pero cuando trabajo con este y otro buffer de direcciones, es cuando aparece el problema 
Métodos sencillos para predecir las direcciones de las velas japonesas
Métodos sencillos para predecir las direcciones de las velas japonesas
  • www.mql5.com
Las velas japonesas son una de las formas de representación de la información de los precios a lo largo de un intervalo de tiempo concreto mostrando la relación entre los precios de apertura, cierre, el mínimo y el máximo. Se usan las velas japonesas principalmente en el análisis técnico y se interpretan mediante modelos muy conocidos. Después...
 

Mira lo que sucede es lo siguiente:

for(int i = 0; i < k + counted_bars + 1; i++)

{
    PromBuffer[i] = open[i];

}

En esta parte al Buffer de la linea verde siempre le estas poniendo el precio de apertura,

cuando solo dibujas esa linea verde cuyo precio oscila en un rango de 1.13000 a 1.15000 que es el precio de las cotizaciones, el grafico de abajo se ajusta a ese minimo y a por eso puedes ver la oscilación.

Sin embargo si añades otros buffers con precios de rango +1.00000 y -1.00000 el grafico de abajo debe ajustarse automaticamente para llegar del 1.15000 de maximo que teniamos antes hasta el  -1.00000 que le hemos puesto ahora.

El resultado es que todo se representa bien, pero la linea de precios de apertura como su oscilación son apenas unos decimales y el grafico esta tan minimizado en la escala vertical, queda dibujado como un plano.

Por otro lado veo que estas usando un ciclo for(..) en positivo y la indexación de los buffers como veo en los otros dos, es en negativo, deberías usar la misma indexación para los 3 buffers (indice limit).

Asi que elimina ese ciclo for(...) y resumelo todo en el while(...) que ya tienes.

La solución que yo te propondria seria que promedies con los otros dos buffers en lugar de poner precio de apertura, haciendo una especie de media movil de 2 o 3 o 4 velas hacia atras (en codigo):

while ( limit >= 0) 
{
   ClupBuffer[limit] = MathMax(0,GetCandleDirection(limit,open,close));

   CldwBuffer[limit] = MathMin(0,GetCandleDirection(limit,open,close));

   PromBuffer[limit] = (ClupBuffer[limit] + CldwBuffer[limit] 
                       + ClupBuffer[limit + 1] + CldwBuffer[limit + 1]
                       + ClupBuffer[limit + 2] + CldwBuffer[limit + 2]) / 6;

   limit--;
}