Errores, fallos, preguntas - página 4

 
Interesting:

MarketInfo(Symbol(),MODE_MARGININIT) = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL)

¿Qué corresponde entonces a MODE_MARGINREQUIRED? O de lo contrario, ¿cómo puedo saber cuánto dinero libre necesito para abrir 1 lote para comprar?

En Moving Average.mq5 Expert Advisor de los creadores de mql5, los lotes se calculan así

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift
//---
int   ExtHandle=0;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
//--- select lot size
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

¿Por qué el riesgo máximo es tan pequeño (0,02%) y se divide por 1000 al calcular los lotes? ¿Qué representan estos 1000? ¿Quizás 1000 = fondos disponibles necesarios para comprar 1 lote multiplicados por 100% (para convertir el 0,02% en una fracción de 0,0002)? Es decir, los fondos disponibles para la compra de 1 lote son 10 dólares (10x100%=1000). ¿Cree que está en la dirección correcta?

Y una pregunta más. ¿Existe un límite en el número máximo de órdenes abiertas?

 
gpwr:

¿Qué corresponde entonces a MODE_MARGINREQUIRED? O de lo contrario, ¿cómo puedo saber la cantidad de fondos disponibles necesarios para abrir 1 lote para comprar?

Y una pregunta más. ¿Existe un límite en el número máximo de órdenes abiertas?


Me hice esta pregunta.


Esta es la respuesta de los desarrolladores:

Rashid Umarov:

Ver

SÍMBOLO_COMERCIO_TAMAÑO_DE_CONTRATO

Tamaño del contrato comercial

doble

и

SÍMBOLO_MARGEN_DIVISA

Moneda en la que se calcula el margen

cadena


Según tengo entendido, tendrás que calcularlo tú mismo

 

gpwr:

En Moving Average.mq5 Expert Advisor de los creadores de mql5, los lotes se calculan así

¿Por qué el riesgo máximo es tan pequeño (0,02%) y se divide por 1000 al calcular los lotes? ¿Qué representan estos 1000? ¿Quizás 1000 = fondos disponibles necesarios para comprar 1 lote multiplicados por 100% (para convertir el 0,02% en una fracción de 0,0002)? Es decir, los fondos disponibles para la compra de 1 lote son 10 dólares (10x100%=1000). ¿Cree que está en la dirección correcta?

Y una pregunta más. ¿Existe un límite en el número máximo de órdenes abiertas?


AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk

Esta línea calcula el riesgo como el 2% de los fondos disponibles, si he entendido bien. ¿Por qué dividen esta cantidad por 1000?


Pero si entiendo bien, entonces con un depósito (fondos libres) de 20.000 dólares, el Asesor Experto recomienda abrir no más del 2% de esta cantidad (400 dólares).

Dividiendo esta cantidad entre 1.000 obtendremos lógicamente 0,4 lote...

 

gpwr:

¿Existe un límite en el número máximo de órdenes abiertas?

Me preguntaba lo mismo. Hay una sugerencia que los desarrolladores todavía están pensando (para ellos, por cierto - aplicación 15802).
 
Interesting:

Esta línea calcula el riesgo como el 2% de la cantidad de fondos disponibles, si he entendido bien. El motivo por el que esta cantidad se divide entre 1.000 depende de los promotores.

Pero si entiendo bien, entonces con un depósito (fondos libres) de $ 20.000, el Asesor de Expertos recomienda abrir no más del 2% de esta cantidad ($ 400).

Dividiendo esta cantidad entre 1.000 obtendremos lógicamente 0,4 lote...

Ahora lo tengo. Hay un error en Moving Average.mq5. En lugar de

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

Debe ser

input double MaximumRisk        = 0.02;    // Maximum Risk as a fraction  of a free margin

Entonces la división por 1000 en el cálculo de los lotes es clara: 100.000 dólares (tamaño del lote)/100 (apalancamiento) = 1000. Sin embargo, los desarrolladores de mql5 no deben mostrar ese ejemplo de Asesor Experto. Debería cambiarse

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

A

double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(FreeMargin*MaximumRisk/LotRqdMgn,2);

O mejor aún

double Step       =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(MathFloor(FreeMargin*MaximumRisk/LotRqdMgn/Step)*Step,2);

Sin embargo, es una pena que se haya perdido MODE_MARGINREQUIRED. Tal vez los desarrolladores restauren este parámetro para reducir el número de cálculos.

 
Interesting:
estrangulamiento:
Los nombres cortos siempre se han utilizado únicamente para la visualización en la subventana del indicador
Entonces no aparece ahí, o es un error o no entiendo algo...
Encontré el error y lo arreglé, 16051 puede ser cerrado.
 

No sé si estoy poniendo mis informes de errores en el lugar correcto. Si no es así, por favor, corrígeme.

Al probar mi EA, creé a propósito una situación así para ver si el probador determina el margen correctamente. Entonces, el depósito de 100 dólares. Operamos con el EURUSD. El tamaño mínimo del lote es de 0,1. El siguiente código para el cálculo de los lotes está en el Asesor Experto

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);

El comprobador genera estos errores

2010.06.08 22:28:57 Core 1 no hay suficiente dinero [compra instantánea de 0,10 EURUSD a 1,19242]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.24, NewFreeMargin: -19.24
2010.06.08 22:28:57 Núcleo 1 1000 100
2010.06.08 22:28:57 Core 1 no hay suficiente dinero [compra instantánea de 0,10 EURUSD a 1,19180]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.18, NewFreeMargin: -19.18
2010.06.08 22:28:57 Núcleo 1 1000 100
2010.06.08 22:28:57 Core 1 no hay suficiente dinero [compra instantánea de 0,10 EURUSD a 1,19362]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.36, NewFreeMargin: -19.36
2010.06.08 22:28:57 Núcleo 1 1000 100

A juzgar por estos mensajes, el margen libre necesario para comprar 1 lote, LotRqdMgn, es igual a 1000, lo que parece ser correcto. Margen libre=100. Multiplique 0,1 lote por 1000 y obtendrá 100. Significa que tenemos fondos suficientes para abrir el primer lote. Pero el probador informa de que no tenemos fondos suficientes. ¿Dónde está el error?

 
gpwr:

Según estos mensajes, el margen libre necesario para comprar 1 lote, LotRqdMgn, es de 1000, lo que parece correcto. Margen libre=100. Multiplique 0,1 lote por 1000 y obtendrá 100. Significa que tenemos fondos suficientes para abrir el primer lote. Pero el probador informa de que no tenemos fondos suficientes. ¿Dónde está el error?

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

Por eso no se puede hacer una transacción: todo es correcto.

 
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 es posible hacer una transacción - todo es correcto.

Gracias Renat. He comprendido mi error. Se ha cambiado la fórmula de cálculo de LotRqdMgn y ahora todo funciona correctamente.

 

Una nueva palabra en biblioteconomía, o la sorprendente que le sigue...


Así que he creado un Asesor Experto que utiliza la biblioteca, lo he comprobado y todo funciona. He hecho un archivo con el Asesor Experto, esta biblioteca y algunos archivos MQL5 y MQH. Le he dado el archivo al aplicador/desarrollador para que lo pruebe.


Eso estaría bien, pero he decidido hacer las pruebas en otro terminal. Así que desempacé el archivo y decidí adjuntar el Asesor Experto al gráfico.


Y en el diario terminal se escriben estas dos líneas:

2010.06.10 09:54:51 PM Expertos MechanicalTrading-Infinity-2010 (EURUSD,Diario)
2010.06.10 09:54:51 Expertos Error en la carga de MechanicalTrading-Infinity-2010 (EURUSD,Daily)


Empecé a buscar qué y cómo funciona (o mejor dicho, no funciona) y encontré un hecho asombroso - La terminal ve la biblioteca compilada en el directorio (como *.ex5), pero la "hunde" persistentemente, lo que no es muy bueno, como comprenderás...

Después de probar muchas razones posibles para tal comportamiento, decidí colocar el archivo original (como *.mq5) en la carpeta con la biblioteca. Intenté añadir un EA al gráfico - oh dios mío, todo funciona.


En el proceso del juego, surgieron varias preguntas:

1. ¿Por qué no funciona el Asesor Experto, si la biblioteca se representa sólo como .ex5?

2. ¿Por qué el terminal se obstina en borrar este archivo del directorio?

3. ¿Por qué el registro de la terminal no tiene un comentario claro sobre todo lo anterior?

4. ¿Por qué la documentación no dice que este comportamiento es posible?


Y por último, la quinta y última pregunta: ¿cómo puedo hacer frente a todo esto y qué estoy haciendo mal (puede ser que al terminal le falte un archivo EX5 y busque algo, por ejemplo un archivo de cabecera o la propia biblioteca)?


PS

Por cierto, tengo el mismo error con Expert Advisors, el borrado obstinado del archivo *.ex5... :(