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

 
Ihor Herasko:

Simple:

da un error

 
Aleksandr Lishchenko:

mensaje de error

¿Dónde está el error? ¿Qué tipo de error?

 

Hola. Tengo una tarea para comprobar que el parámetro de volumen de negociación de entrada especificado por el usuario es correcto, es decir, el lote especificado debe ser un múltiplo del paso de cambio de lote. Para ello, encuentro un resto real de la división y lo comparo con un cero o un valor muy cercano a cero (por ejemplo, 0,000000001)

void OnStart()
{
   double volume = 0.03;
   Alert("Результат деления ", volume/MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Шаг изменения лота ", MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Вешественный остаток ", fmod(volume, MarketInfo(Symbol(), MODE_LOTSTEP)));
}

Resultado:

/*
   Вещественный остаток 0,009999999999999998
   Шаг изменения лота 0,01
   Результат деления 3,0
*/

También adjunto una captura de pantalla.

Creo que el resto debería ser cero o un número muy pequeño, pero el resultado es casi 0,01 por alguna razón? Entonces, ¿cómo puedo comprobar el parámetro de entrada si, por ejemplo, el usuario pone 0,001 por error?

Archivos adjuntos:
4npm6qh.png  8 kb
 
Aleksandr Teleguz:

Hola. Tengo una tarea para comprobar que el parámetro de volumen de negociación de entrada especificado por el usuario es correcto, es decir, el lote especificado debe ser un múltiplo del paso de cambio de lote. Para ello, encuentra un resto real de la división y compáralo con un cero o un valor muy cercano a cero (por ejemplo, 0,000000001)

Resultado:

También adjunto una captura de pantalla.

Creo que el resto debería ser cero o un número muy pequeño, pero el resultado es casi 0,01 por alguna razón? Entonces, ¿cómo puedo comprobar el parámetro de entrada si, por ejemplo, el usuario pone 0,001 por error?

Está un poco mal. Lo primero que hay que hacer es calcular el valor correcto más cercano (basado en el valor establecido), y luego comprobar la diferencia entre los valores obtenidos. Si es igual a cero (o no más que DBL_EPSILON), entonces todo está bien:

void OnStart()
{
   double volume = 0.03;

   double fVolumeMin = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);   
   double fVolumeMax = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);   
   double fVolumeStep = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); 

   double fNearestCorrectVolume = VolumeCast(volume, fVolumeMin, fVolumeMax, fVolumeStep);
   if (fabs(fNearestCorrectVolume - volume) > DBL_EPSILON)
      Alert("Ошибка");
   else
      Alert("Все ОК");
}

La función VolumeCast se puede tomar desde aquí.

 
Ihor Herasko:

¿En qué se equivoca? ¿Qué tipo de error da?

1 error(es), 0 advertencia(s) 2 1
Las expresiones 'if' no están permitidas en un global

 

¡¡¡Buenas tardes!!!

Chicos, podéis decirme el código de cómo vincular un EA a una cuenta (para la última actualización de MT4).

Muchas gracias.

 
Aleksandr Lishchenko:

¡¡Tarde!!

Chicos, me podéis decir el código para vincular un EA a una cuenta (para la última actualización de MT4).

Muchas gracias.

Ya se le ha dado el código.

El error lo has cometido tú mismo - está escrito en la descripción del error que has introducido el código en el área de variables globales y no dentro de OnTick() o OnInit():

'if' - expressions are not allowed on a global scope

¿Y con ese conocimiento sigue tratando de proteger su código de alguien más?
 
Artyom Trishkin:

Ya se le ha comunicado el código.

El error lo cometiste tú mismo - en la descripción del error está escrito que has introducido código en el área de variables globales, no dentro de OnTick() o OnInit():

'if' - expressions are not allowed on a global scope

¿Y con ese conocimiento sigues tratando de proteger tu código de alguien más?

Sólo estoy aprendiendo.

No juzgues. ;)

 
Aleksandr Lishchenko:

1 error(es), 0 advertencia(s) 2 1
Las expresiones 'if' no están permitidas en un global

Muéstrame cómo has aplicado el código. ¿Acabas de copiar lo que he escrito?

 
Ihor Herasko:

Muéstrame cómo has aplicado el código. ¿Acabas de copiar lo que he escrito?

Lo hice :)))

Razón de la queja: