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

 
Nikolay Ivanov #:

Tu código imprime 0, no -1...

Tal vez -1 se imprima en otro lugar, lo más probable es que todo el código esté en las impresoras...

Sí, tienes razón, cada paso está preimpreso para ver dónde se "estancó".

El ejemplo es incorrecto, lo siento, el código en sí es grande.

¡Pero, la solución de Konstantin resolvió el problema! Realmente cambié i-- y la comprobación de cero en todas partes, y ahora la lógica funciona como debería, en lugar de -1 sale 0 o 1. (antes de 0 o -1, siendo este último un error inmediato).

 
Nikolay Ivanov #:

Tu código imprime 0, no -1...

Es posible que -1 se imprima en otro lugar, lo más probable es que todo el código esté en las impresoras...

Antes de intentar resolver el problema, hay que identificarlo... Asegúrate de que está ahí y localízalo antes de resolverlo...

Coge un bolígrafo y un papel. Y anota cómo cuenta el bucle. En este código.

void OnStart()
  {
int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

Print(i);
  }

comprobación de

if (i==0) break;

nunca funcionará en este código. A no ser que se haya configurado inicialmente

int i=11;

un valor impar. Si es par, este código

int i=10;
for (i; i>0; i--)
{
i--;
if (i==0) break;
}

a

if (i==0) break;

vendrá con un valor impar.

 
Nikolay Ivanov #:

Antes de intentar resolver un problema, hay que identificarlo... Asegúrate de que está ahí y localízalo, y luego resuélvelo...

Entiendo lo que quieres decir.

 
Konstantin Nikitin #:

Coge un bolígrafo y un papel. Y anota cómo se cuenta el ciclo. En este código.

Por qué iba a coger papel y bolígrafo si la condición dice que se imprime =-1, pero en realidad (lo he comprobado) se imprime como 0, es decir, el ejemplo está mal puesto. Y es imposible dar una respuesta correcta a un ejemplo incorrecto...

 
Nikolay Ivanov #:

Por qué iba a coger lápiz y papel si la condición dice que se imprime =-1, pero de hecho (lo he comprobado) se imprime como 0, por lo que el ejemplo es incorrecto. Y es imposible dar una respuesta correcta a un ejemplo incorrecto...

El cero se imprime a partir de esta línea

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

y no de la salida de comprobación y ruptura.

En general, es más correcto escribir

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

porque las matrices comienzan con un índice cero

 
Konstantin Nikitin #:

El cero se imprime a partir de esta línea

no de la comprobación de la ruptura y la salida.

El 0 se imprime desde esta línea, para ese código que se dio...

Print(i);

La pregunta no era por qué no funciona el break, la pregunta era por qué la impresora imprimía -1... eso es todo. Y no importa si el inicio de la i es par o impar, nunca imprime -1...

 
¿Podríais decirme cómo calcular los ticks o velas durante un largo periodo de tiempo? (Un año, por ejemplo).

Probando con Close[], pero el índice no da más de 5000.
 
Ivan Butko #:
¿Podríais decirme cómo calcular los ticks o las velas en un periodo de tiempo largo? (Un año, por ejemplo).

He probado con Close[], pero el índice no da más de 5000.

Las garrapatas o las velas marcan una diferencia tan grande que da miedo, como mínimo...

 
Alexey Viktorov #:

Hay tanta diferencia entre las garrapatas y las velas que da miedo decirlo...

Por ejemplo, un EA, si le especificas cualquier periodo, en el tester irá por ticks o por barras M1, todos lo tendrán en cuenta.

Pero si coges un EA que va al histórico largo en tiempo real y toma datos de ahí, no entiendo cómo organizarlo. El terminal no da más de 5000 velas.


UPD
Voy a tratar de usar esta cosa, el código está en la red

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
Strange. De repente, funciona. Incluso se comprueba la barra del millón. No hice nada, leí la documentación, bebí té. Acabo de ejecutarlo de nuevo y ha funcionado. Tuve el error durante todo el día, aunque había descargado el historial y cambiado la configuración ayer.
Así que tampoco hubo necesidad de comprobar el código adicional (arriba).
MT4 es algo temperamental. O tal vez forex chif tenga esa función. Tendré que poner la estándar en lugar de la del corredor.

 
Ivan Butko #:

Por ejemplo, un Asesor Experto, si se le especifica cualquier período, pasará por el probador por ticks o por barras M1, todos lo tendrán en cuenta.

Pero si se toma un Asesor Experto, que en el modo de tiempo real va al historial largo y toma datos de allí, no entiendo cómo organizarlo. El terminal no da más de 5000 velas.


UPD
Voy a tratar de usar esta cosa, el código está en la red

MqlRates rates[];

   int copied=CopyRates(NULL,0,0,100,rates);

   if(copied<=0)

      Print("Ошибка копирования ценовых данных ",GetLastError());

   else Print("Скопировано ",ArraySize(rates)," баров");


UPD
Strange. De repente, funciona. Incluso se comprueba la barra del millón. No hice nada, leí la documentación, bebí té. Acabo de ejecutarlo de nuevo y ha funcionado. Tuve el error durante todo el día, aunque había descargado el historial y cambiado la configuración ayer.
Así que tampoco hubo necesidad de comprobar el código adicional (arriba).
MT4 es algo temperamental. O tal vez forex chif tenga esa función. Tendré que poner la estándar, no la de corretaje.

La primera llamada a CopyRates() ha iniciado el bombeo de datos históricos (no lo ejecutes durante una semana y volverás a tener lo mismo, bueno, quizás no una semana, pero sí algún tiempo).
Sólo tiene que comprobar cuántos datos hay en el servidor y comparar la cantidad disponible con el Asesor Experto. Si es menos de lo que se requiere - deje el EA hasta el siguiente tick. En el siguiente tic, comprueba de nuevo. Si por alguna cantidad de intentos no pudimos obtener la cantidad requerida de historia - en este caso manejaremos este error como se requiere.

Razón de la queja: