Errores, fallos, preguntas - página 735

 
joo:

Encontré una "confusión".

¿Por qué al compilador no le gusta la definición de la segunda variable b?

Y en general, ¿cómo puedo manejar esta situación?

No le gusta la definición.

Sólo escribe otro error - tipo de variable incorrecto para la dimensión del array

Sólo se pueden especificar constantes en las dimensiones

 
sergeev:

no es la definición lo que no le gusta.

También escribe otro error - tipo de variable incorrecto para la dimensión del array

Sólo se pueden especificar constantes en las dimensiones

Las constantes tampoco funcionarán, habrá un error:

const int AA =11;
ArrWe m[AA];

Especificaciones de acceso

Los especificadores de acceso indican al compilador cómo acceder a las variables, los miembros de las estructuras o las clases.

El especificadorconst declara que una variable es una constante y no permite que el valor de esta variable cambie en el proceso de ejecución del programa. Se permite inicializar una variable una vez al declararla.

 

Me refería sólo a dos opciones

int Arr[100]

o

#define r 100
int Arr[r]


Para el resto ArrayResize

 
papaklass:
No lo entiendo. Pongo un EA en el gráfico y aparece este mensaje en la pestaña "Expertos". El Asesor Experto continúa su trabajo de todos modos. Esto no es un error, sino una advertencia. ¿Una advertencia sobre qué?
Es un error en tiempo de ejecución - significa una fuga de memoria. No se libera la memoria ocupada por una cadena en algún lugar. Lo más probable es que se trate de una estructura o clase que no se borre después de la nueva. Es necesario buscar en el código para ser más específico.
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
joo:

tampoco funcionará, habrá un error:

Especificaciones de acceso

Los especificadores de acceso indican al compilador cómo acceder a las variables, los miembros de las estructuras o las clases.

El especificadorconst declara que una variable es una constante, y no permite que el valor de esta variable sea cambiado en el proceso de ejecución del programa. Se permite inicializar una variable una vez al declararla.

Una variable constante no es una constante. Se puede inicializar una vez, es decir, es una variable para la que se asigna memoria.

La tarea de las constantes es calcularse e insertarse en el código sin ocupar la memoria en tiempo de ejecución.

La constante será const AA=11.

Por lo tanto, el compilador será jurado. Si const AA=11, no se quejará.

 

¿Puede decirme cuál es el problema?

En el último intervalo en ChannelPeriod = 100; hay un cambio brusco hacia arriba en las lecturas del indicador, yendo más allá de las últimas 100 barras todo se muestra normalmente.

¿Alguien sabe cómo solucionarlo?

//+------------------------------------------------------------------+
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[])
  {
  //--- variables of indicator
  int i;
    
  CopyClose(Symbol1_Name,PERIOD_M30,0,rates_total,close_1);
  CopyClose(Symbol2_Name,PERIOD_M30,0,rates_total,close_2);
  
  //--- main cycle
  for(i=prev_calculated; i<rates_total; i++)
  {
    Last[i] = (Symbol1_Vol*Symbol1_K*close_1[i] -  Symbol2_Vol*Symbol2_K*close_2[i]);
  }
  
    // Считаем положение эквити относительно канала удвоенного среднеквадратичного отклонения
  double StdDev;
  for(i=prev_calculated; i<rates_total; i++) 
  {
    StdDev=MyStdDev(Last,ChannelPeriod,i);
    if(StdDev>0.00001) // Защита от отсутствия данных
      ExtStdDevBuffer[i]=(Last[i]+2*StdDev-iMAOnArrayMQL4(Last,0,ChannelPeriod,0,MODE_SMA,i))/(4*StdDev);
  }
  
  return(rates_total);
}

//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
// Calculation StdDev -----------------------------------------------| 
// StdDev = SQRT (SUM [(S(i) - SMA(i))^2, N] / N)                    | 
double MyStdDev(double &array[], int BandsPeriod, int Index) 
{ 
  double ds, sum, center; 
    
  sum = 0; 
  center = iMAOnArrayMQL4(array,0,BandsPeriod,0,MODE_SMA,Index); 
  for(int i = 0; i < BandsPeriod; i++) 
  { 
    ds = array[Index+i] - center; 
    sum += ds * ds; 
  } 
  sum = MathSqrt (sum / BandsPeriod); 
  return (sum); 
}
//-----------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------
double iMAOnArrayMQL4(double &array[], int total, int period, int ma_shift, int ma_method, int shift)
{
  double buf[],arr[];
  if(total==0) total=ArraySize(array);
  if(total>0 && total<=period) return(0);
  if(shift>total-period-ma_shift) return(0);
  switch(ma_method)
  {
    case MODE_SMA :
    {
      total=ArrayCopy(arr,array,0,shift+ma_shift,period);
      if(ArrayResize(buf,total)<0) return(0);
      double sum=0;
      int    i,pos=total-1;
      for(i=1;i<period;i++,pos--)
      sum+=arr[pos];
      while(pos>=0)
      {
        sum+=arr[pos];
        buf[pos]=sum/period;
        sum-=arr[pos+period-1];
        pos--;
      }
      return(buf[0]);
    }
    case MODE_EMA :
    {
      if(ArrayResize(buf,total)<0) return(0);
      double pr=2.0/(period+1);
      int    pos=total-2;
      while(pos>=0)
      {
        if(pos==total-2) buf[pos+1]=array[pos+1];
        buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
        pos--;
      }
      return(buf[shift+ma_shift]);
    }
    case MODE_SMMA :
    {
      if(ArrayResize(buf,total)<0) return(0);
      double sum=0;
      int    i,k,pos;
      pos=total-period;
      while(pos>=0)
      {
        if(pos==total-period)
        {
          for(i=0,k=pos;i<period;i++,k++)
          {
            sum+=array[k];
            buf[k]=0;
          }
        }
        else sum=buf[pos+1]*(period-1)+array[pos];
        buf[pos]=sum/period;
        pos--;
      }
      return(buf[shift+ma_shift]);
    }
    case MODE_LWMA :
    {
      if(ArrayResize(buf,total)<0) return(0);
      double sum=0.0,lsum=0.0;
      double price;
      int    i,weight=0,pos=total-1;
      for(i=1;i<=period;i++,pos--)
      {
        price=array[pos];
        sum+=price*i;
        lsum+=price;
        weight+=i;
      }
      pos++;
      i=pos+period;
      while(pos>=0)
      {
        buf[pos]=sum/weight;
        if(pos==0) break;
        pos--;
        i--;
        price=array[pos];
        sum=sum-lsum+price*period;
        lsum-=array[i];
        lsum+=price;
      }
      return(buf[shift+ma_shift]);
    }
    default: return(0);
  }
  return(0);
}
//-----------------------------------------------------------------------------------------

 
indicador
Archivos adjuntos:
Spread_O.mq5  7 kb
 
Por qué, cuando pulso el botón "Inicio", el comprobador no realiza la prueba desde el nivel de depósito inicial, sino desde el nivel en el que terminó la última prueba. No existe ese problema en la 4. ¿Cómo empezar a probar desde el nivel de depósito inicial?
 
Por favor, denme un enlace directo para descargar los libros de texto en formato PDF porque el navegador de mi teléfono no puede ver todo lo que hay en la página web
 
Zeleniy:
Por favor, denme un enlace directo donde se puedan descargar los libros de texto en formato PDF porque el navegador de mi teléfono no puede ver todo lo que hay en la página web.
no hay libros de texto, sólo la ayuda.