Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 567

 
PolarSeaman:

Todavía está pateando.

tienes[i+1], necesitas comprobar +2 más

En general, debería hacer algo así

limit=(rates_total<cb || cb<=0) ? rates_total-1 : cb;
if (limit<=0) return(0);
 
Ihor Herasko:

Porque el cheque es fundamentalmente erróneo. Digamos que Bars devuelve 1000 y cb también devuelve 1000. Entonces en el bucle en la primera iteración i obtiene el valor 1000. En la primera condición del cuerpo del bucle:

dos salidas fuera de la matriz a la vez : acceder a una barra con índice 1000 y otra con índice 1001. Pues si el gráfico tiene 1000 barras, la primera barra tiene el índice 0 y la última el índice 999.

Más adelante, en el cuerpo del bucle, hay una referencia a barras aún más lejanas en la historia:

Todo esto debe tenerse en cuenta en la comprobación inicial.

Para una comprobación adecuada, consulte el ejemplo de la función IndicatorCounted() en MQL4 Reference. Sólo que ahora, IndicatorCounted() debe ser reemplazado por compartir rates_total (esto es Bars) y prev_calculated (esto es IndicatorCounted()).

Gracias, lo encontré,

 int counted_bars=IndicatorCounted(); 
     if(counted_bars>0) counted_bars--;

¿Con qué debo compararlo? en el ejemplo comienza conlímite

 limit=Bars-counted_bars;

¿Con qué debo comparar este "cb"?

 
PolarSeaman:

Gracias, lo encontré,

En el ejemplo, comienza conlímite.

¿con qué debo comparar este "cb"?

Si quiere limitar el número de barras en las que se muestran los datos del indicador, es mejor que lo haga de esta manera:

int GetRecalcIndex(int& total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin(cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1)                     
   {       
      InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
      return (total);
   }
   
   return (MathMin(ratesTotal - prevCalculated, total));                            
}

Utilícelo de la siguiente manera:

int total;   
int limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for (int i = limit; i >= 0; --i)
{
  ...
}
El valor total es el índice de la barra más profunda del historial, al que se puede acceder en función de los valores de la configuración del indicador.
 
Taras Slobodyanik:

tienes[i+1], necesitas comprobar +2 más

En general, debería hacer algo así

Lo hice así, pero dice ...array out of range in 'HiLo.mq4' (122,15)

¿qué debo comprobar con +2 más?


 
Ihor Herasko:

Si quiere limitar el número de barras en las que se muestran los datos del indicador, es mejor hacerlo:

Utilícelo de la siguiente manera:

El valor del total es el índice de la barra más profunda del historial, que puede llamarse en función de los valores de la configuración del indicador.

El compilador jura.

'InitializeBuffers' - función no definida HiLo.mq4 161 7

y no hay nada sobre esta función en la ayuda
 
PolarSeaman:

El compilador se queja de

'InitializeBuffers' - función no definida HiLo.mq4 161 7

Y no hay nada sobre esta función en la ayuda

Escribí en el comentario que esta es una función que debe inicializar todos los buffers de los indicadores. Es una función personalizada. Lo tengo así:

void InitializeBuffers()
{
   ArrayInitialize(g_indValues, EMPTY_VALUE);
   ArrayInitialize(g_tempBuffer, EMPTY_VALUE);
}

Tendrás uno diferente ya que los topes son diferentes. En caso de que el indicador trabaje con objetos gráficos, es necesario eliminar todos ellos aquí, ya que el dibujo inicial de las lecturas debe realizarse.

 
Ihor Herasko:

Escribí en el comentario que esta es la función que debe inicializar todos los buffers de los indicadores. Es una función personalizada. Lo tengo así:

Tendrá uno diferente, ya que los topes son diferentes. En el caso de que el indicadortrabaje con objetos gráficos, hay que borrarlos todos aquí, ya que se va a realizar el dibujo inicial de las lecturas.

Gracias, pero nada ha cambiado ...array fuera de rango en 'HiLo.mq4' (130,15)

. ¿Qué ocurre?

#property copyright "Copyright ©  november 2015"
#property strict 

#property indicator_chart_window
#property indicator_buffers 6

#property indicator_color1 RoyalBlue       //DodgerBlue
#property indicator_color2 Crimson         //OrangeRed
#property indicator_color3 Black  //White
#property indicator_color4 Black  //White
#property indicator_color5 Black            //White
#property indicator_color6 Black         //Red

#property indicator_width1 2
#property indicator_width2 2

#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT

input int    p        = 10;    // Период
input int    s        = 5;     // Угол наклона
input double distance = 2.0;   // Ширина канала
input bool   showBb   = false;  // Границы канала
input bool   showCl   = true;  // Центральная линия
input int    barsig   = 1;     // Сигнальная свеча (номер)
input int    arrots   = 0;    // Стрелка (отступ)
input int    arrsz    = 0;     // Стрелка (размер)
input int    ATR      = 1000;  // Период ATR
input int    cb       = 1000;  // Сколько свечей в истории

double fx1[],fx2[],hp[];
double z1,z2,ki;
int fs;

double upper[],lower[];
double upar[],dnar[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
IndicatorBuffers(7);
SetIndexBuffer(0,fx1);
SetIndexBuffer(1,fx2);
SetIndexBuffer(2,lower);
SetIndexBuffer(3,upper);
SetIndexBuffer(4,upar);
SetIndexBuffer(5,dnar);
SetIndexBuffer(6,hp);


SetIndexStyle (4,DRAW_ARROW,0,arrsz);
SetIndexArrow (4,233);
SetIndexStyle (5,DRAW_ARROW,0,arrsz);
SetIndexArrow (5,234);

   if(showBb)
   {SetIndexStyle(2,DRAW_LINE);
    SetIndexStyle(3,DRAW_LINE);
   }
   else
   {SetIndexStyle(2,DRAW_NONE);
    SetIndexStyle(3,DRAW_NONE);
   }
   
    if(showCl)
   {SetIndexStyle(0,DRAW_LINE);
    SetIndexStyle(1,DRAW_LINE);
   }
   else
   {SetIndexStyle(0,DRAW_NONE);
    SetIndexStyle(1,DRAW_NONE);
   }

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 i,limit;
//   limit=(rates_total<cb || cb<=0) ? rates_total-2 : cb;
//if (limit<=0) return(0);
 int total;   
 limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for (int i = limit; i >= 0; --i)
{ 
  
  
   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

double avg;

ki=2.0/(p+1);

for (i=cb; i>=0; i--) {fx1[i]=Close[i];}

for (int m=0; m<=s; m++)
{
z1=fx1[0];
for (i=0; i<=cb; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

z2=fx1[cb];
for (i=cb; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
}

fs=0;
for (i=cb; i>=0; i--)
{
if (fx1[i]>fx1[i+1]) fs=1;
if (fx1[i]<fx1[i+1]) {if (fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
if (fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

avg = iATR(NULL,0,ATR, i+10);
upper[i] = hp[i] + distance*avg;
lower[i] = hp[i] - distance*avg;

if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
 dnar[i] = High[i]+arrots*Point; else dnar[i] = EMPTY_VALUE;
 
if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
 upar[i] = Low[i]-arrots*Point; else upar[i] = EMPTY_VALUE; 
}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  

int GetRecalcIndex(int& total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin(cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1)                     
   {       
      InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
      return (total);
   }
   
   return (MathMin(ratesTotal - prevCalculated, total));                            
}

void InitializeBuffers()
{
   ArrayInitialize(fx1, EMPTY_VALUE);
   ArrayInitialize(fx2, EMPTY_VALUE);
   ArrayInitialize(lower, EMPTY_VALUE);
   ArrayInitialize(upper, EMPTY_VALUE);
   ArrayInitialize(upar, EMPTY_VALUE);
   ArrayInitialize(dnar, EMPTY_VALUE);
   ArrayInitialize(hp, EMPTY_VALUE);
}
 
PolarSeaman:

Gracias, pero nada ha cambiado. ¿Qué pasa?

Por supuesto, el resultado no cambiará. Al fin y al cabo, no has eliminado la razón principal (el bucle cb). Este bucle está organizado incorrectamente:

for (i=cb; i>=0; i--)

Debe ser eliminado y sustituido por el bucle de límite. En ambos lugares.

 
Ihor Herasko:

Por supuesto, el resultado no cambiará. Al fin y al cabo, no has eliminado la razón principal (el bucle cb). Este bucle está organizado incorrectamente:

Debe ser eliminado y sustituido por el bucle de límite. En ambos lugares.

Hay 3 bucles de este tipo. Los sustituí y el terminal se colgó.

 

Lo he hecho, no se congela ni se bloquea, pero hay 3 valores en el primer buffer (fx2): precio, 0,0 y 164874239,218492.

sell_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,1),Digits);

Si el valor sell_1_B!=EMPTY_VALUE y sell_1_B!=0 no significa que haya un precio.

¿Cómo puedo obtener una señal?

Razón de la queja: