Errores, fallos, preguntas - página 3151
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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.
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.
-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
O
Ni siquiera preguntaste qué hacer... ¿Han vuelto los telépatas de las vacaciones? ;)
Código correcto.
i>=0 para cada tic
i>0 para una nueva barra
Esto es mejor moverlo a OnInit()
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...
:)
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? :)
Tal vez decidió ganar algo de dinero para su Bentley invirtiendo en un tutor, mediante un duro trabajo como programador. :)
¿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.
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.
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.