Caractéristiques du langage mql5, subtilités et techniques - page 9

 
fxsaber:
La solution est venue tout de suite.
// Размер свободных средств, необходимых для открытия 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);
}
C'est le calcul pour le FOREX. Le reste est similaire.
Super, il ne reste plus qu'à apporter la marge dans la devise de dépôt, car la marge, par exemple, pour AUDCAD avec la devise de dépôt USD doit être en USD.
 
Alexey Volchanskiy:
Super, tout ce que nous avons à faire est d'apporter la marge dans la devise de dépôt, parce que la marge, par exemple, pour AUDCAD avec la devise de dépôt USD doit être en USD.
Cela a été fait.
 
Alexey Volchanskiy:
Super, maintenant nous devons apporter la marge dans la devise de dépôt, parce que la marge, par exemple pour AUDCAD avec la devise de dépôt USD devrait être en USD.
on dirait que SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE ) dans la fonction est juste pour ça... pour apporter des lots pour déposer la devise
 
fxsaber:
C'est ce qui a été fait.

Tout fonctionne bien dans le forex, sauf que la dernière question reste : " pourquoi deux fois moins, et comment y remédier ? ".

 
Vitaly Muzichenko:

Tout fonctionne bien en forex, mais il y a une dernière question : "pourquoi est-il divisé par deux et comment le réparer ?".

J'ai constaté que la marge sur SGDJPY est plusieurs fois différente sur le serveur FIBOGroup-MT5 et les serveurs MetaQuotes-Demo. Cela suggère que MT5 calcule lui-même la marge avec des erreurs. Eh bien, si c'est le cas, il n'y a pas de norme de comparaison. Par conséquent, je ne peux pas dire avec certitude s'il s'agit d'une erreur de mon implémentation ou des développeurs. Je pense qu'il y a une erreur dans les deux cas. Le problème est le manque d'informations correctes.
 
fxsaber:
J'ai constaté que sur SGDJPY la marge est plusieurs fois différente sur le serveur FIBOGroup-MT5 et les serveurs MetaQuotes-Demo. Cela suggère que MT5 calcule lui-même la marge avec des erreurs. Eh bien, si c'est le cas, il n'y a pas de norme de comparaison. Par conséquent, je ne peux pas dire avec certitude s'il s'agit d'une erreur de mon implémentation ou des développeurs. Je pense qu'il y a une erreur dans les deux cas. Le problème est le manque d'informations correctes.

J'ai deux serveurs qui s'affichent correctement, avec une exception - mise en évidence en rouge.

Comment trouver la propriété surlignée en rouge ?

Merci !

 
Vitaly Muzichenko:

J'ai deux serveurs qui s'affichent correctement, avec une exception - mise en évidence en rouge.

Comment puis-je trouver la propriété surlignée en rouge ?

Merci pour le conseil ! Dans la nature, c'estSymbolInfoMarginRate. Donc maintenant c'est comme ça
// Размер свободных средств, необходимых для открытия 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);
}

Vous devez bien comprendre que dans MT5, les exigences de marge peuvent être très différentes selon les directions. C'est-à-dire qu'une seule variante MT4 peut ne pas fonctionner. Sur le Forex, bien sûr, ce ne sera pas le cas. Mais tu dois te rappeler. Par conséquent, en général, vous devriez l'écrire comme ceci
// Альтернатива 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:
C'est ce qui a été fait.
Oui, c'est ça, c'est ça.
 

Blague MT5 sur le serveur FIBOGroup-MT5 SGDJPY

Dans cette situation, MyOrderCalcMargin compte correctement mais pas le OrderCalcMargin normal !

 
fxsaber:

Farce MT5 sur le serveur FIBOGroup-MT5 SGDJPY

Dans cette situation, MyOrderCalcMargin compte correctement mais pas le OrderCalcMargin normal !

Existe-t-il un moyen de calculer la marge couverte ?