Descargar MetaTrader 5

AYUDA: SOBRE FILTRO PARA UN INDICADOR SENCILLO....

Para añadir comentario, por favor Autorícese o regístrese
carlosojbe
45
carlosojbe  

Buenos dias. Estoy aprendiendo poco a poco a programar en Metatrader 4, y las dudas que me van surjiendo, voy solucionandoles poco a poco, con muchas horas frente a la pantalla. Pero tengo una duda que no consigo solucionar. he realizado un indicador técnico MUY básico, siendo el siguiente:

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_level1 1.6634
#property indicator_level2 1.6517

//--- plot UpArrow
#property indicator_label1  "UpArrow"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrViolet
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- plot DownArrow
#property indicator_label2  "DownArrow"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrOrange
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//--- input parameters
input int      BarssToProcess=1000;

//--- indicator buffers
double         UpArrowBuffer[];
double         DownArrowBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,UpArrowBuffer);
   SetIndexBuffer(1,DownArrowBuffer);
  
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   SetIndexArrow(0,241);
   SetIndexArrow(1,242);
   SetIndexStyle(0,DRAW_ARROW,STYLE_DASHDOT,3,clrViolet);
   SetIndexStyle(1,DRAW_ARROW,STYLE_DASHDOT,3,clrOrange);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
  
//---
   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[])
  {
  
    int limit=rates_total-prev_calculated;
   
    if (limit>BarssToProcess)limit=BarssToProcess;
   
    for (int j=0; j<limit; j++)
   
    {     
      double indicador=iMA(NULL,0,50,0,MODE_EMA,PRICE_CLOSE,j);  
      
      if (indicador > indicator_level1) UpArrowBuffer[j]=High[j] + 100*Point;
      
      if (indicador < indicator_level2) DownArrowBuffer[j]=Low[j] - 100*Point; 
   
    }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Grafico con el indicador ejecutado


No tiene mayor complicación, pero cuando compilo y lo ejecuto en el terminal, lógicamente me llena la pantalla de flechas hacia arriba y hacia abajo, ya que las condiciones se cumplen en todas ellas (ver foto). La pregunta es: ¿Alguien podría decirme cómo realizar un filtro para que solo aparezca una flecha cuando la linea (indicador) cruza hacia arriba la linea horizontal morada (indicator_level1) o cuando la linea (indicador) cruza hacia abajo la linea horizontal morada (indicator_level2) y no todas las que salen?. Muchas gracias........

Miguel Angel Vico Alba
4411
Miguel Angel Vico Alba  
carlosojbe:

Buenos dias. Estoy aprendiendo poco a poco a programar en Metatrader 4, y las dudas que me van surjiendo, voy solucionandoles poco a poco, con muchas horas frente a la pantalla. Pero tengo una duda que no consigo solucionar. he realizado un indicador técnico MUY básico, siendo el siguiente:

1.- Usa el editor de código cuando pegues un código aquí en el foro. (SRC)

2.- Debería ser algo así;

if (indicador=indicator_level1) UpArrowBuffer[j]=High[j] + 100*Point;
if (indicador=indicator_level2) DownArrowBuffer[j]=Low[j] - 100*Point;

Es decir, que en vez de mayor (>) o menor (<)...que lo haga simplemente cuando sea igual (=). Debería funcionar.

Si es que hay veces que nos perdemos en lo mas tontuno...jeje

Saludos!

carlosojbe
45
carlosojbe  
Muchas Gracias Miguel Angel. Solucionado. Como bien dices, lo más tonto suele dar los mayores quebraderos de cabeza. Un saludo.
Axerouse Murillo
16
Axerouse Murillo  

tambien nos gustaria ver el robot ya modificado!!! un saludo 

Para añadir comentario, por favor Autorícese o regístrese