Errores, fallos, preguntas - página 9

 
DC2008:

No es correcto utilizar la condición == para variables de tipo double. Se recomienda comparar así:


Puedo añadir que, aunque con algo de retraso, todavía escribimos un artículo sobre este tema - Características del trabajo con números de tipo double en MQL4. Todo lo mencionado allí seguirá siendo relevante para cualquier lenguaje de programación cuando se trate de operaciones con números reales (double y float en MQL5).
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

No es correcto utilizar la condición == para variables de tipo double. Se recomienda comparar así:


Bastante razonable y, sobre todo, un enfoque sensato. Pero me parece que al menos la primera línea debería haber sido así:

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

De vez en cuando me aparecen estos mensajes en el registro

2010.06.15 14:48:09 MemoryException 4915200 bytes no disponibles

¿No sé qué hacer?

 
Prival:

De vez en cuando me aparecen estos mensajes en el registro

2010.06.15 14:48:09 MemoryException 4915200 bytes no disponibles

¿No sé qué hacer?

No hay suficiente RAM. Compruebe el tamaño de las matrices dinámicas, probablemente un intento de asignar más memoria de la disponible.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

No es correcto utilizar la condición == para variables de tipo double. Se recomienda comparar así:


Ese no es el punto de la pregunta, si entendí bien, siempre se debe poner el operador de retorno al final de una función de usuario
 
joo:
No hay suficiente memoria op. Compruebe el tamaño de las matrices dinámicas, lo más probable es que sea un intento de asignar más memoria de la disponible.
No, no es eso. Probablemente sea algo con los servidores. Probablemente haya un agujero en los datos. La conexión con el servidor se pierde a menudo. el historial no se descarga. esto probablemente ha causado el error.
 
sergey1294:
Ese no es el sentido de la pregunta. Si lo he entendido bien, el operador return debe colocarse siempre al final de la función de usuario

Creo que la respuesta sobre == era esencial. Realmente debería haber un return(...) en algún lugar de una función de tipo double. No necesariamente al final. El uso del operador == en if() return(); puede causar una salida falsa si tiene el tipo de paso de lote 0.100000000000001. En este caso ninguno de los retornos funcionará y la función no devolverá nada. Aunque en tu caso el retorno probablemente no le guste a NormalizeDouble dentro de él. En tu versión que funciona, arregla el final a return(NormilizeDouble(lot,2)) y mira si funciona. Yo también tengo curiosidad.

 
gpwr:

Creo que la respuesta sobre == era esencial. Realmente debería haber un return(...) en algún lugar de una función de tipo double. No necesariamente al final. El uso del operador == en if() return(); puede causar una salida falsa si tiene el tipo de paso de lote 0.100000000000001. En este caso ninguno de los retornos funcionará y la función no devolverá nada. Aunque en su caso el retorno probablemente no le gusta NormalizeDouble dentro. En tu versión que funciona, arregla el final a return(NormilizeDouble(lot,2)) y mira si funciona. Yo también tengo curiosidad.

Debe haber return(...) al final, pero puede que nunca llegue allí (si una de las condiciones If funciona)...
 
Interesting:
Debe haber return(...) al final, pero puede no llegar a él (si una de las condiciones If funciona)...
Eso es lo que me interesaba, en el 4 no era necesario ponerlo al final.
 

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);
Renat
:

El error es que te olvidaste de la moneda del margen en tus cálculos. Saldo = 100 USD y requisito de margen = 100 EUR (119 USD).

Por eso no se puede realizar la operación, todo es correcto.

Quiero volver a mi pregunta sobre el cálculo correcto del margen. Como Renat notó en mis cálculos, LotRqdMgn (margen requerido para comprar 1 lote) no toma en cuenta el precio de la divisa. Recuerdo haber visto esta mesa

Identificador

Descripción

Fórmula

SYMBOL_CALC_MODE_FOREX

Modo Forex - cálculo de beneficios y márgenes para Forex

Margen: Lotes*Tamaño_del_contrato/Levante

Beneficio: (precio_cerrado-precio_abierto)*Tamaño_del_contrato*Lotes

SYMBOL_CALC_MODE_FUTURES

Modo de futuros: cálculo del margen y del beneficio para los futuros

Margen: Lotes *MargenInicial*Porcentaje/100

Beneficio: (precio_cierre-precio_abierto)*PrecioTick/TamañoTick*Lotes

SYMBOL_CALC_MODE_CFD

Modo CFD: cálculo del margen y del beneficio para CFD

Margen: Lotes *Tamaño del contrato*Precio de mercado*Porcentaje/100

Beneficio: (precio_cerrado-precio_abierto)*Tamaño_del_contrato*Lotes

SYMBOL_CALC_MODE_CFDINDEX

Modo de índice CFD - cálculo de margen y beneficio para CFD por índices

Margen: (Lotes*Tamaño del contrato*Precio del mercado)*Precio del tick/Tamaño del tick

Beneficio: (precio_cerrado-precio_abierto)*Tamaño_del_contrato*Lotes

SYMBOL_CALC_MODE_CFDLEVERAGE

Modo de apalancamiento de CFDs - cálculo del margen y el beneficio para CFDs en operaciones de apalancamiento

Margen: (Lotes*Tamaño del contrato*Precio de mercado*Porcentaje)/Levante

Beneficio: (precio_cerrado-precio_abierto)*Tamaño_del_contrato*Lotes

Así que resulta que hay un error en la tabla: en lugar de Lotes*Tamaño_del_contrato/Levante, debe ser Precio*Lotes*Tamaño_del_contrato/Levante.