Errores, fallos, preguntas - página 3151

 
Artyom Trishkin #:

Siempre ha habido una comprobación: if(limit>1) limit= rates_total-1. Esto es para los casos en los que no hay i+algo en el cálculo. Si lo hay, entonces estos "cuántos-algo" deben incluirse en la construcción: limit=total_de_tasas-1-algo.

Sin ella, siempre habría un rebasamiento de la matriz. Porque rates_total no es otra cosa que Bars(). En consecuencia, si hay 5000 barras y nos dirigimos al índice 5000, quedaremos fuera de los límites del array (el cálculo de las barras empieza por cero).

En tu ejemplo, el cálculo del límite es erróneo:

Debería ser así:

Y después comprueba si hay límite>1

Y si el límite es mayor que uno, entonces límite = rates_total-1

¡Gracias Artem! Y perdón por el alboroto.
Cierto, debería haber una comprobación, sólo que me olvidé de ella.
Todavía tengo un comentario en el código
//Comprobar y calcular el número de barras calculadas.
Por lo visto, el copy-paste ha provocado mi malentendido.
Todo funciona como debería con el cheque. Gracias.

 
Roman #:

Gracias Artem!
Cierto, debería haber una comprobación, de la que me había olvidado.
Todo funciona correctamente con el cheque. Gracias.

De nada. Arregla el cálculo. No es correcto - lo he subrayado más arriba.

int limit = rates_total-1-prev_calculated;

-1 no debería estar aquí.

Si rates_total es 5000, y las barras calculadas en la llamada anterior de OnCalculate() son también 5000 (prev_calculated), entonces el límite será igual a -1. En consecuencia, el bucle no se ejecutará en absoluto.

Si desea seleccionar cómo leer el indicador (por ticks en la barra cero o sólo en la apertura de una nueva), entonces introduzca una variable, especificando cómo hacerlo:

int end = (every tick ? WRONG_VALUE : 0);

el bucle será el siguiente: for(int=limit; i>end; i--) { //... }

y el cálculo del límite será correcto, y el bucle será como tú quieres.

 

Código correcto.

i>=0 para cada tic

i>0 para la nueva barra

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])      
{
   ArraySetAsSeries(price, true);
   ArraySetAsSeries(IndBuff, true);
   
   //-------------------------------------------------------------------------
   //Расчёт и проверка количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if(limit>1) 
      limit = rates_total-1;
   

   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for(int i=limit; i>=0; i--)
   {

      IndBuff[i] = price[i]; 

   }
   

   return(rates_total);
}
 
Nikolai Semko #:
O

Ni siquiera preguntaste qué hacer... ¿Han vuelto los telépatas de las vacaciones? ;)

 
Roman #:

Código correcto.

i>=0 para cada tic

i>0 para una nueva barra

ArraySetAsSeries(IndBuff, true);

Esto es mejor moverlo a OnInit()

 
Artyom Trishkin #:

Ni siquiera preguntaste qué hacer... ¿Han vuelto los telépatas de las vacaciones? ;)

:)
Artem, no hace falta ser telépata para ver que el hombre se ha registrado hace unos minutos y lo primero que ha visto ha sido "Bichos, bichos, preguntas"
Claramente, está preguntando si puede conseguir algo de dinero gratis, y que no se haga mucho problema...

 
Nikolai Semko #:

:)
Artem, no hace falta ser telépata para ver que el hombre se ha registrado hace unos minutos y lo primero que ha visto ha sido "Errores, bichos, preguntas"
Claramente, está preguntando si puede conseguir algo de dinero gratis, y que no se esfuerce demasiado...

¿Tal vez decidió ganar algo de dinero extra en Bentley invirtiendo en un tutor? :)

 
Artyom Trishkin #:

Tal vez decidió ganar algo de dinero para su Bentley invirtiendo en un tutor, mediante un duro trabajo como programador. :)

No lo creo, Artem.
Si tuviera el potencial de un programador, no habría permitido la ambigüedad y la incertidumbre.
:)
 
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.

El diseño de un ciclo de indicadores es simplemente prestado de los viejos tiempos por el método de copiar y pegar (y autocompletar torcido) sin pensar.

todo es sencillo con la interfaz actual:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

el push con prev_calculated-1 en este caso es necesario si se necesita recalcular la última barra en cada llamada.

 
Maxim Kuznetsov #:

Es que el diseño del ciclo de indicadores está tomado de los viejos tiempos del copy-paste (y del autocompletado torcido) sin pensar.

todo es sencillo con la interfaz actual:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

la aglomeración con prev_calculated-1 en este caso es necesaria si se necesita recalcular la última barra en cada llamada.

Sí, me emocioné un poco con mi declaración.
Justo cuando algo funcionaba y ahora no lo hace, empiezan los tics nerviosos ))
Y empiezas a comprobarlo todo dos veces y a culpar infundadamente a la caída, olvidándote de alguna peculiaridad que seguro que no recuerdas.
Y la culpa la tiene el copypaste. Creo que muchos se han enfrentado a esto.

Quiero sugerir que los desarrolladores hagan plantillas personalizadas para los indicadores y EAs.
Podrán seleccionarlos en el asistente.

m

Algunos editores de C/C++ tienen esta función.
Es muy conveniente añadir las plantillas básicas, con las que se trabaja principalmente, y luego las cargas en el asistente.
Las plantillas estándar de MQL no son del todo iguales.
Obviamente, podemos decir que podemos escribir plantillas y luego copiarlas.
Y de nuevo volvemos a la insidiosa palabra "copiar-pegar". Y no se tiene en cuenta el hecho de que podemos automatizarlo y facilitar la vida del programador.