Mi indicador no se traza en el gráfico mql5

 
na:
Mi indicador no se traza en el gráfico mql5


Hola amigos, trato de crear un indicador sar parabólico, y debería dibujar una línea, el problema es que el código no me da errores pero tampoco muestra nada en el gráfico, uso velas durante 1 a 5 minutos.

¿Me pueden ayudar y decirme dónde estoy fallando, por favor?

Buenos dias na:


Yo con codigo no te puedo ayudar


Pero seguramente alguno de estos dos codigos fuente te pueden sacar de alguna duda


https://www.mql5.com/es/code/16743

https://www.mql5.com/es/code/43


Un saludo

Parabolic SAR - indicador parabólico.
Parabolic SAR - indicador parabólico.
  • www.mql5.com
Parabolic SAR que resuelve algunos problemas de los indicadores PSAR existentes y calcula correctamente los valores. Muestra dos colores para facilitar la identificación de la tendencia actual y a diferencia del PSAR original, permite elegir el precio distinto de high y low para realizar el cálculo.
 

Bueno, hay varias cosas ... pero vamos a ello.

Primero, no has invocado formalmente los buffers del indicador y los plots del indicador, lo cual es el principio de toda la magia para que dibuje:

#property indicator_buffers 1
#property indicator_plots 1

Luego, por como has hecho la cuenta, osea de la variable limit a 0, se ve que estas tomando los datos recientes como 0, y eso por defecto en los arrays no es así, asi que se lo tienes que decir:

ArraySetAsSeries(SarBuffer,true); // Para que los datos recientes sean 0
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, NULL); // Para que los valores nulos no se pinte nada

De paso para que en la ultima vela no se pinte una raya hasta el infinito hay que decirle que el valor nulo no se pinte con la funcion PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,NULL);

El valor de limit no debe ser menor ni igual que 0 porque es el valor de los datos que querremos copiar:

   if(limit <= 0) limit= 1;
   if(BarsCalculated(handle1) <= 0) return(prev_calculated);
   if(limit > BarsCalculated(handle1)) limit= BarsCalculated(handle1);

Tambien debemos comprobar que el indicador sar ha calculado almenos alguna barra para pedir copiar sus datos, si no es asi pues salimos con un return y esperamos que para la proxima ejecucion ya si que este el indicador calculado.
También decir que si el valor limit es mayor que los datos del indicador sar por lo que sea, que solo copie los datos del indicador sar, de ahi esa ultima comprobación.

Hay que decir también al buffer temporal que se organize con el indice al reves como el buffer del indicador, para hacer la cuenta de limit a 0 de la misma forma:

double temp_buffer1[]; ArraySetAsSeries(temp_buffer1,true);

Para copiar los datos, copiamos solo el numero limit, no el numero limit + 1 como tenias tu, porque sino pedimos mas datos de los que existen al indicador:

CopyBuffer(handle1,0,0,limit,temp_buffer1); 

Mi ultima sugerencia es que cojas el handle del indicador en el bloque OnInit y no en cada tick para hacer el funcionamiento mas eficiente, y el codigo final con mi toque personal quedaría así:

//+------------------------------------------------------------------+
//|                                                          sar.mq5 |
//|                                                      Imanol SAGA |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Imanol SAGA"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

//--- plot Sar
#property indicator_buffers 1
#property indicator_plots 1

#property indicator_label1  "Sar"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         SarBuffer[];
int handle1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,SarBuffer,INDICATOR_DATA);
   
   ArraySetAsSeries(SarBuffer,true);
   
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, NULL);
   
   handle1=iSAR(_Symbol,_Period,0.02,0.2);
//---
   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 <= 0) limit= 1;
   
   if(BarsCalculated(handle1) <= 0) return(prev_calculated);
   
   if(limit > BarsCalculated(handle1)) limit= BarsCalculated(handle1);
   
   double temp_buffer1[]; ArraySetAsSeries(temp_buffer1,true);
   
   CopyBuffer(handle1,0,0,limit,temp_buffer1); 
   
   for(int i=limit-1; i>=0; i--) SarBuffer[i]=temp_buffer1[i];  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Y se vería tal que así:

Espero haber sido de ayuda, mucha suerte con la programación.

 

Solo cambiando esto al original...

//+------------------------------------------------------------------+
//|                                                 ParabolicSAR.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  DodgerBlue
//--- External parametrs
input double         InpSARStep=0.02;    // Step
input double         InpSARMaximum=0.2;  // Maximum
//---- buffers
double               ExtSARBuffer[];
double               ExtEPBuffer[];
double               ExtAFBuffer[];
//--- global variables
int                  ExtLastRevPos;
bool                 ExtDirectionLong;
double               ExtSarStep;
double               ExtSarMaximum;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- checking input data
   if(InpSARStep<0.0)
     {
      ExtSarStep=0.02;
      Print("Input parametr InpSARStep has incorrect value. Indicator will use value",
            ExtSarStep,"for calculations.");
     }
   else ExtSarStep=InpSARStep;
   if(InpSARMaximum<0.0)
     {
      ExtSarMaximum=0.2;
      Print("Input parametr InpSARMaximum has incorrect value. Indicator will use value",
            ExtSarMaximum,"for calculations.");
     }
   else ExtSarMaximum=InpSARMaximum;
//---- indicator buffers
   SetIndexBuffer(0,ExtSARBuffer);
   SetIndexBuffer(1,ExtEPBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,ExtAFBuffer,INDICATOR_CALCULATIONS);
//--- set arrow symbol
   PlotIndexSetInteger(0,PLOT_ARROW,159);
//--- set indicator digits
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set label name
   PlotIndexSetString(0,PLOT_LABEL,"SAR("+
                      DoubleToString(ExtSarStep,2)+","+
                      DoubleToString(ExtSarMaximum,2)+")");
//--- set global variables
   ExtLastRevPos=0;
   ExtDirectionLong=false;
//----
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- check for minimum rates count
   if(rates_total<3)
      return(0);
//--- detect current position 
   int pos=prev_calculated-1;
//--- correct position
   if(pos<1)
     {
      //--- first pass, set as SHORT
      pos=1;
      ExtAFBuffer[0]=ExtSarStep;
      ExtAFBuffer[1]=ExtSarStep;
      ExtSARBuffer[0]=high[0];
      ExtLastRevPos=0;
      ExtDirectionLong=false;
      ExtSARBuffer[1]=GetHigh(pos,ExtLastRevPos,high);
      ExtEPBuffer[0]=low[pos];
      ExtEPBuffer[1]=low[pos];
     }
//---main cycle
   for(int i=pos;i<rates_total-1 && !IsStopped();i++)
     {
      //--- check for reverse
      if(ExtDirectionLong)
        {
         if(ExtSARBuffer[i]>low[i])
           {
            //--- switch to SHORT
            ExtDirectionLong=false;
            ExtSARBuffer[i]=GetHigh(i,ExtLastRevPos,high);
            ExtEPBuffer[i]=low[i];
            ExtLastRevPos=i;
            ExtAFBuffer[i]=ExtSarStep;
           }
        }
      else
        {
         if(ExtSARBuffer[i]<high[i])
           {
            //--- switch to LONG
            ExtDirectionLong=true;
            ExtSARBuffer[i]=GetLow(i,ExtLastRevPos,low);
            ExtEPBuffer[i]=high[i];
            ExtLastRevPos=i;
            ExtAFBuffer[i]=ExtSarStep;
           }
        }
      //--- continue calculations
      if(ExtDirectionLong)
        {
         //--- check for new High
         if(high[i]>ExtEPBuffer[i-1] && i!=ExtLastRevPos)
           {
            ExtEPBuffer[i]=high[i];
            ExtAFBuffer[i]=ExtAFBuffer[i-1]+ExtSarStep;
            if(ExtAFBuffer[i]>ExtSarMaximum)
               ExtAFBuffer[i]=ExtSarMaximum;
           }
         else
           {
            //--- when we haven't reversed
            if(i!=ExtLastRevPos)
              {
               ExtAFBuffer[i]=ExtAFBuffer[i-1];
               ExtEPBuffer[i]=ExtEPBuffer[i-1];
              }
           }
         //--- calculate SAR for tomorrow
         ExtSARBuffer[i+1]=ExtSARBuffer[i]+ExtAFBuffer[i]*(ExtEPBuffer[i]-ExtSARBuffer[i]);
         //--- check for SAR
         if(ExtSARBuffer[i+1]>low[i] || ExtSARBuffer[i+1]>low[i-1])
            ExtSARBuffer[i+1]=MathMin(low[i],low[i-1]);
        }
      else
        {
         //--- check for new Low
         if(low[i]<ExtEPBuffer[i-1] && i!=ExtLastRevPos)
           {
            ExtEPBuffer[i]=low[i];
            ExtAFBuffer[i]=ExtAFBuffer[i-1]+ExtSarStep;
            if(ExtAFBuffer[i]>ExtSarMaximum)
               ExtAFBuffer[i]=ExtSarMaximum;
           }
         else
           {
            //--- when we haven't reversed
            if(i!=ExtLastRevPos)
              {
               ExtAFBuffer[i]=ExtAFBuffer[i-1];
               ExtEPBuffer[i]=ExtEPBuffer[i-1];
              }
           }
         //--- calculate SAR for tomorrow
         ExtSARBuffer[i+1]=ExtSARBuffer[i]+ExtAFBuffer[i]*(ExtEPBuffer[i]-ExtSARBuffer[i]);
         //--- check for SAR
         if(ExtSARBuffer[i+1]<high[i] || ExtSARBuffer[i+1]<high[i-1])
            ExtSARBuffer[i+1]=MathMax(high[i],high[i-1]);
        }
     }
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Find highest price from start to current position                |
//+------------------------------------------------------------------+
double GetHigh(int nPosition,int nStartPeriod,const double &HiData[])
  {
//--- calculate
   double result=HiData[nStartPeriod];
   for(int i=nStartPeriod;i<=nPosition;i++) if(result<HiData[i]) result=HiData[i];
   return(result);
  }
//+------------------------------------------------------------------+
//| Find lowest price from start to current position                 |
//+------------------------------------------------------------------+
double GetLow(int nPosition,int nStartPeriod,const double &LoData[])
  {
//--- calculate
   double result=LoData[nStartPeriod];
   for(int i=nStartPeriod;i<=nPosition;i++) if(result>LoData[i]) result=LoData[i];
   return(result);
  }
//+------------------------------------------------------------------+
 
Hermogenes Vidal Rodriguez:

Buenos dias na:


Yo con codigo no te puedo ayudar


Pero seguramente alguno de estos dos codigos fuente te pueden sacar de alguna duda


https://www.mql5.com/es/code/16743

https://www.mql5.com/es/code/43


Un saludo

Gracias por tu ayuda, lo revisare.
 

您的信号疑似违反规则条例,已经禁止该信号的新订阅。遵照您现有订阅责任,您当前的订阅者可以继续接收交易信号,进行正常交易。

信号禁用的可能因素如下:

  • 用户投诉
  • 可疑的交易历史
  • 授权问题,可能是不实的交易统计数据和/或无法持续监控交易账户

 
Miguel Angel Vico Alba:

Solo cambiando esto al original...

Gracias por tu ayuda, me ha sido muy útil.
 

Miguel eres un troll ...

Supongo que uno de esos mensajes de agradecimiento es para mi ... pero te ha dedicado a ti los 2 últimos ... que maquina de tío este chico, que bien se le dan las tecnolgias de la computación.

 
Imanol Salazar Garcia:

Miguel eres un troll ...

Supongo que uno de esos mensajes de agradecimiento es para mi ... pero te ha dedicado a ti los 2 últimos ... que maquina de tío este chico, que bien se le dan las tecnolgias de la computación.

Las "tecnolgias" estupendamente, ya lo sabes.

Es de suponer que el comentario #5 es para ti, o en su defecto te lo regalo para que no te sientas mal. ;)

Mi indicador no se traza en el gráfico mql5
Mi indicador no se traza en el gráfico mql5
  • 2020.06.01
  • www.mql5.com
Mi indicador no se traza en el gráfico mql5 Hola amigos, trato de crear un indicador sar parabólico, y debería dibujar una línea, el problema es qu...
 

jajajaja tecnolgias que bueno.

gracias por el regalo pero recuerda, santa rita rita ...