Errores, fallos, preguntas - página 101

 
Urain:

De cualquier manera.

if(a==0){expresión} significa que si a es 0 entonces es verdadero, así que ejecuta {expresión}.

if(a=0){expresión} es equivalente a if(a){a=0;expresión} si a es verdadero, {a=0;expresión}.

La segunda está mal, debería escribirse así

if(a=x) { expresión } asigna el valor de x a la variable a, y si a no es 0 después, entonces ejecuta la expresión

if(a=0) { } después de la optimización sólo habrá a=0

 
mql5:

La segunda es incorrecta, la forma correcta de escribirla es

if(a=x) { expresión } asigna el valor de x a la variable a, y si a no es 0 después, ejecuta la expresión

if(a=0) { } después de la optimización sólo habrá a=0

Lo siento, es cierto, las expresiones se ejecutan de izquierda a derecha.

Por eso empezamos con la asignación, y luego comprobamos la verdad.

 
Renat:

Esto es más o menos así:

Este código no sólo calcula el volumen máximo, sino que lo ajusta exactamente a las limitaciones de la configuración del símbolo.

Lo calcula pero se olvida de por qué lo calcula cuando lo inserta:

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

El valor del lote en este punto se calcula de forma que se consuma todo el margen disponible con un margen mínimo.

Si este valor se incrementa en al menos un paso de volumen, no habrá suficiente dinero para abrir una posición.

Pero la segunda línea del código citado REALIZA el valor del lote en caso de que se cumpla la condición bajo if, y puede aumentarlo en mucho más que el valor del paso de volumen, porque en realidad hay volumen min = 0,1 y paso de volumen = 0,01.

Y en este código de abajo, puede ocurrir una división por cero, contra la cual no hay protección:

   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

Si SymbolInfoDouble() devuelve 0, ya está. Los programas MQL5 terminan con la división por 0, ¿verdad? ¿No puede devolver 0? La gente se queja aquí de que las funciones informativas devuelven muy a menudo 0. No se puede recurrir a "no devolverá 0" porque, en primer lugar, puede hacerlo, y en segundo lugar, la división por 0 es fatal.

Hay algunas observaciones menores sobre la "exactitud de la entrada", pero realmente no son demasiado significativas, es decir, no tienen consecuencias tan graves, puedes ignorarlas.

Anticipándome a los posibles argumentos de que el código es "aproximado", apunto: ¿cuántos usuarios del producto son capaces de encontrar y arreglar de forma competente esos "lugares malos"?

Para ellos, esto es "código de los desarrolladores". Un ejemplo a seguir.

 

¿Por qué no se activa el botón "Siguiente" cuando se rellenan todos los campos obligatorios?

 
EvgeTrofi:

¿Por qué no se activa el botón "Siguiente" cuando se rellenan todos los campos obligatorios?

Tiene que dar su permiso para recibir el boletín por correo.
 
simpleton:

Calcula, pero luego se olvida de lo que estaba calculando:

Anticipándome a los posibles argumentos de que el código es "aproximado", quiero señalar: ¿cuántos usuarios del producto pueden arreglar correctamente esos "malos lugares"?

El código era aproximado (copiado de dos piezas), pero tus comentarios son correctos.

Aquí está la versión corregida:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
     {
      double newlot=stepvol*NormalizeDouble(lot/stepvol,0);
      if(newlot>lot) lot=NormalizeDouble(newlot-stepvol,2);
      else           lot=newlot;
     }

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=0.0;   // 

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
 
gumgum:

Y por qué session_index++; cuando session_index=1 ya es falso:

No podemos saber de antemano cuál es el número de sesiones por herramienta. Así que consultamos cada sesión por número. Si es verdad

session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);

nos interesa el momento de su comienzo y de su fin. Si obtenemos falso - ya está, no hay sesión con este número.

 
Rosh:

No podemos saber de antemano cuál es el número de sesiones de un instrumento. Por lo tanto, solicitamos cada sesión por número. Si es verdad

analizamos el momento de su inicio y de su fin. Si obtenemos falso - ya está, no hay sesión con este número.

A...... ¿Por qué entonces el viernes todo termina a las 24:00, pero en realidad a las 23:00?
 
gumgum:
A...... entonces ¿por qué todo termina el viernes a las 24:00 y en realidad a las 23:00?
Porque eso es lo que dice el servidor. Lo comprobaremos, gracias.
 
¿Tengo entendido que ahora puedes cambiar tu correo electrónico en tu perfil? En el campo de correo electrónico ahora puede hacer cambios, pero no se guardan.
Razón de la queja: