Características del lenguaje mql5, sutilezas y técnicas - página 9

 
fxsaber:
La solución llegó enseguida.
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired( const string Symb )
{
  MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick) ? Tick.ask * SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) * SymbolInfoDouble(Symb, SYMBOL_TRADE_CONTRACT_SIZE) *
         SymbolInfoDouble(Symb, SYMBOL_POINT) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}
Este es el cálculo para FOREX. El resto es similar.
Estupendo, lo único que queda es traer el margen en la moneda del depósito, porque el margen, por ejemplo, para AUDCAD con la moneda del depósito USD tiene que estar en USD.
 
Alexey Volchanskiy:
Genial, todo lo que tenemos que hacer es traer el margen en la moneda de depósito, porque el margen, por ejemplo, para AUDCAD con la moneda de depósito USD tiene que ser en USD.
Se ha hecho.
 
Alexey Volchanskiy:
Genial, lo único que queda es traer el margen en la moneda del depósito, porque para el AUDCAD por ejemplo la moneda del depósito debe ser en USD.
parece que SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE ) en la función es sólo para ello... para llevar lotes a la moneda de depósito
 
fxsaber:
Esto es lo que se ha hecho.

Todo funciona bien en forex, excepto la pregunta final: "¿por qué la mitad y cómo lo arreglo?".

 
Vitaly Muzichenko:

Todo funciona bien en forex, pero hay una última pregunta: "¿por qué se reduce a la mitad y cómo solucionarlo?"

He encontrado que el margen en SGDJPY es veces diferentes en FIBOGroup-MT5 Server y MetaQuotes-Demo servidores. Esto sugiere que la propia MT5 calcula el margen con errores. Pues bien, si este es el caso, no hay norma de comparación. Por lo tanto, no puedo decir con seguridad si se trata de un error de mi implementación o de los desarrolladores. Creo que hay un error en ambos casos. El problema es la falta de información correcta.
 
fxsaber:
He encontrado que en SGDJPY el margen es veces diferente en FIBOGroup-MT5 Server y MetaQuotes-Demo servidores. Esto sugiere que la propia MT5 calcula el margen con errores. Y como es así, no hay ninguna referencia para comparar. Por lo tanto, no puedo decir con seguridad si se trata de un error de mi implementación o de los desarrolladores. Creo que hay un error en ambos casos. El problema es la falta de información correcta.

Mis dos servidores se muestran correctamente, con una excepción - resaltada en rojo

¿Cómo puedo encontrar la propiedad resaltada en rojo?

Gracias.

 
Vitaly Muzichenko:

Tengo dos servidores que se muestran correctamente, con una excepción - resaltada en rojo

¿Cómo puedo averiguar la propiedad resaltada en rojo?

Gracias por el consejo. En la naturaleza, esSymbolInfoMarginRate. Así que ahora es así
// Размер свободных средств, необходимых для открытия 1 лота на покупку
double GetMarginRequired( const string Symb )
{
  MqlTick Tick;
  double MarginInit, MarginMain;

  return((SymbolInfoTick(Symb, Tick) && SymbolInfoMarginRate(Symb, ORDER_TYPE_BUY, MarginInit, MarginMain)) ? MarginInit * Tick.ask *
          SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}

Tiene que entender claramente que en MT5 puede haber requisitos de margen muy diferentes en distintas direcciones. Es decir, una sola variante de MT4 puede no funcionar. En Forex, por supuesto, no será así. Pero tienes que recordar. Por lo tanto, en general, se debe escribir así
// Альтернатива OrderCalcMargin
bool MyOrderCalcMargin( const ENUM_ORDER_TYPE action, const string symbol, const double volume, const double price, double &margin )
{
  double MarginInit, MarginMain;

  const bool Res = SymbolInfoMarginRate(symbol, action, MarginInit, MarginMain);
  
  margin = Res ? MarginInit * price * volume * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE) /
                 (SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0;
  
  return(Res);  
}
 
fxsaber:
Eso es lo que se hizo.
Sí, así es, así es.
 

Broma MT5 en el servidor FIBOGroup-MT5 SGDJPY

En esta situación, MyOrderCalcMargin cuenta correctamente, pero el OrderCalcMargin normal no.

 
fxsaber:

Broma MT5 en FIBOGroup-MT5 Server SGDJPY

En esta situación, MyOrderCalcMargin cuenta correctamente, pero el OrderCalcMargin normal no.

¿Hay alguna forma de calcular el margen cubierto?
Razón de la queja: