Características da linguagem mql5, subtilezas e técnicas - página 9

 
fxsaber:
A solução veio logo a seguir.
// Размер свободных средств, необходимых для открытия 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 é o cálculo para FOREX. O resto é semelhante.
Ótimo, só falta trazer a margem na moeda de depósito, pois a margem, por exemplo, para o AUDCAD com a moeda de depósito USD precisa ser em USD.
 
Alexey Volchanskiy:
Óptimo, tudo o que temos de fazer é trazer margem na moeda de depósito, porque a margem, por exemplo, para o AUDCAD com moeda de depósito USD precisa de estar em USD.
Já foi feito.
 
Alexey Volchanskiy:
Ótimo, a única coisa que resta é trazer margem em moeda de depósito, porque para o AUDCAD, por exemplo, a moeda de depósito deve ser em USD.
parece com SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE ) em função é apenas para... trazer lotes para depositar moeda
 
fxsaber:
Isto é o que tem sido feito.

Tudo está funcionando bem em forex, exceto a pergunta final, "por que a metade, e como eu conserto isso?".

 
Vitaly Muzichenko:

Tudo está funcionando bem em forex, mas há uma última pergunta: "por que foi reduzido pela metade e como consertar isso?"

Descobri que a margem no SGDJPY é por vezes diferente nos servidores FIBOGroup-MT5 Server e MetaQuotes-Demo. Isto sugere que a própria MT5 calcula a margem com erros. Bem, se este for o caso, não há um padrão para comparação. Portanto, não posso dizer com certeza se isto é um erro da minha implementação ou dos desenvolvedores. Eu acho que há um erro em ambos os casos. O problema é a falta de informação correcta.
 
fxsaber:
Descobri que no SGDJPY a margem é vezes diferente no FIBOGroup-MT5 Server e MetaQuotes-Demo servers. Isto sugere que a própria MT5 calcula a margem com erros. E como é assim, não há nenhuma referência para comparação. Portanto, não posso dizer com certeza se isto é um erro da minha implementação ou dos desenvolvedores. Eu acho que há um erro em ambos os casos. O problema é a falta de informação correcta.

Os meus dois servidores aparecem correctamente, com uma excepção - destacado a vermelho

Como é que eu descubro o imóvel destacado a vermelho?

Obrigado!

 
Vitaly Muzichenko:

Eu tenho dois servidores mostrando corretamente, com uma exceção - destacado em vermelho

Como posso descobrir o imóvel destacado em vermelho?

Obrigado pela dica! No deserto, éSymbolInfoMarginRate. Então agora é assim.
// Размер свободных средств, необходимых для открытия 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);
}

Você tem que entender claramente que na MT5 pode haver requisitos de margem muito diferentes em diferentes direções. Ou seja, uma única variante do MT4 pode não funcionar. No Forex, é claro, este não será o caso. Mas tens de te lembrar. Portanto, em geral, você deve escrevê-lo desta forma
// Альтернатива 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:
Isso foi o que foi feito.
Sim, é isso mesmo, é isso mesmo.
 

Piada MT5 no servidor FIBOGroup-MT5 SGDJPY

Nesta situação MyOrderCalcMargin conta corretamente, mas o normal OrderCalcMargin não conta!

 
fxsaber:

Truque MT5 no servidor FIBOGroup-MT5 SGDJPY

Nesta situação MyOrderCalcMargin conta corretamente, mas o normal OrderCalcMargin não conta!

Existe alguma forma de calcular a margem coberta?
Razão: