Errores, fallos, preguntas - página 3148

 
Roman #:

Eso es porque IndBuff no está asignado a rates_total + 1
Y ArrayResize no es aplicable a él.
Rompieron el para construir. ¿Tenemos que usar ahora if-arses?

for(int i=limit - 1;....

al menos...

 
Roman #:

Esto se debe a que el IndBuff no está asignado a rates_total + 1
y ArrayResize no es aplicable a él.


Aquí es donde necesitas el menos 1 :))
La impresión muestra que las dimensiones son correctas.
Usa la lógica:
Si límite = 0, entonces es un nuevo tick.
Si limit = 1, significa una nueva barra (el último elemento del buffer rates_total es -1 y tienes rates_total - de ahí el desbordamiento)
Si el límite > 1, es mejor recalcular todo el indicador
 
Maxim Kuznetsov #:

for(int i=limit - 1;....

como mínimo...

¿Sabes qué es lo más molesto? Que cualquier comportamiento sea engañado silenciosamente, sin avisar.
Y entonces la gente sale herida. Estoy harto de este metatrader.

 
Roman #:

¿Sabes qué es lo más molesto? Que cualquier comportamiento sea engañado silenciosamente, sin avisar.
Y entonces la gente sale herida. Estoy harto de este metatrader.

Todo está como antes.
La culpa es tuya.
Consejo - aprende a usar el depurador y no tendrás que hacer correcciones, verás todos tus fallos de una vez.
 
Roman #:

¿Sabes qué es lo más molesto? Que cualquier comportamiento sea engañado silenciosamente, sin avisar.
Y entonces la gente sale herida. Estoy harto de este metatrader.

No he notado ningún cambio en el cálculo de los indicadores. Como has visto arriba, Nikolay ha explicado correctamente lo que significan los valores límite calculados como rates_total-prev_calculated.

Y lleva años funcionando, desde el cuarto terminal.

 
Nikolai Semko #:
Aquí es donde necesitas el menos uno :))
La impresión muestra que las dimensiones son correctas.
Usa la lógica:
Si límite = 0, entonces un nuevo tick
Si limit = 1, significa una nueva barra (el último elemento del buffer rates_total es -1, y tienes rates_total, de ahí el desbordamiento)
Si el límite > 1, es mejor recalcular todo el indicador

Nikolay conozco las construcciones si y para una,
pero siempre trabajé con for, simplemente me acostumbré, es más conveniente.
Pero he notado algunas cosas extrañas con durante mucho tiempo y he estado posponiendo el tratar de resolverlo.
Antes funcionaba bien

para i>=0 ticks
para i>0 bars

Y no se necesitaba ningún "si".

 
Roman #:



Paso 1: Crear una plantilla utilizando el 'MQL5 Wizard':

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,INDICATOR_DATA);
   
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Paso 2: deletrear correctamente "límite" y UTILIZAR la matriz de cierre - ¡¡¡NO la llamada iClose!!!

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,INDICATOR_DATA);
//---
   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=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      CloseBuffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Resultado:

Y no hay errores.

Archivos adjuntos:
Simple.mq5  5 kb
 
Vladimir Karputov #:

Paso 1: Crear una plantilla utilizando el 'MQL5 Wizard':


Paso 2: deletrear correctamente "límite" y UTILIZAR la matriz de cierre - ¡¡¡NO la llamada iClose!!!


Resultado:

y no hay errores.

Gracias por el ejemplo directo de i++, por supuesto.
Pero el hecho de que tenga un bucle inverso, no lo has notado.
Y si se cita iClose como ejemplo, debe utilizarse para mostrar que el índice i se utilizará posteriormente en otras funciones.

 
Roman #:

Nikolai conozco las construcciones de si y para uno,

Si no, si

Nikolai Semko #:
Usa la lógica:
Si límite = 0, entonces un nuevo tick
Si limit = 1, significa una nueva barra (el último elemento del buffer rates_total es -1, y tienes rates_total, de ahí el desbordamiento)
Si el límite > 1, es mejor recalcular todo el indicador

aquí es donde
se equivoca - mejor usar
si limit != 1

Así que toda la lógica es más o menos lo que es:

limit = rates_total - prev_calculated;
if (limit == 0) {..} // новый тик
else if ( limit == 1) {..} // новый бар
else {..} // полный пересчет всего индикатора
Entiendo que algunos se indignen y digan que por qué tengo que recalcular todo si limit == 2,
pero cuando limit no es igual a 1 y no es igual a 0, significa que se trata de la primera inicialización del indicador o que algo ha ido mal (por ejemplo, fallo de conexión o del servidor)
Además, muchas veces me he encontrado con situaciones en las que prev_calculado era mayor que rates_total. Probablemente, antes era algún fallo y ahora se ha solucionado, pero desde entonces uso este diseño como medida de seguridad.
 
Nikolai Semko #:

si límite != 1

¿Qué diferencia hay? ¿Puede ser menor que cero?