- Atención al cliente (Service Desk)
- Indicador de volume BUY/Sell por vela, Sin Grafico
- Necesito arreglar el error 131 en mi EA
¿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

- www.mql5.com
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); } //+------------------------------------------------------------------+
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
Solo cambiando esto al original...
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.
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. ;)

- 2020.06.01
- www.mql5.com
jajajaja tecnolgias que bueno.
gracias por el regalo pero recuerda, santa rita rita ...

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso