Comment obtenir le "Pourcentage de la marge" de manière programmatique ? - page 7

 
K-2SO:

Les tests montrent que lorsque le pourcentage de marge est égal à 1, l'effet de levier n'est pas pris en compte ! Mais lorsqu'il est de 100 et plus, il est déjà pris en compte. J'aimerais pouvoir trouver un courtier dont le pourcentage de marge se situe entre 2 et 99 inclus.

Quelque chose ne va pas. Lorsque vous calculez ce pourcentage à partir de la marge sur un lot standard, l'effet de levier est pris en compte.

Compilez ce script et s'il y a des ordres ouverts, exécutez-le sur n'importe quelle paire.

void OnStart()
{
 double size = 0, percentage = 0, orderMargin = 0, accountMargin = 0;
 long leverage = 0;
 for(int i = 0; i < OrdersTotal(); i++)
  {
   int tupe = -1;
   if(OrderSelect(i, SELECT_BY_POS) && (tupe=OrderType()) < OP_BUYLIMIT)
    {
     string symbol = OrderSymbol();
     string symbolCurencyMargin = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
     double orderOpenPrice = OrderOpenPrice();
     double margin = MarketInfo(symbol, MODE_MARGINREQUIRED);
     double ask = MarketInfo(symbol, MODE_ASK);
     double bid = MarketInfo(symbol, MODE_BID);
     double price = symbolCurencyMargin == "USD" ? 1 : tupe == OP_BUY ? bid : ask;
      size = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
      leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
      percentage = NormalizeDouble(margin/(size*price/100)*leverage, 0);
      orderMargin = (size*orderOpenPrice*percentage/100)/leverage;
      accountMargin += orderMargin;
      Print(symbolCurencyMargin, " ******** Маржа ", symbol, " = ", orderMargin);
    }
  }
 Print(AccountInfoString(ACCOUNT_CURRENCY), " ******** AccountMargin = ", DoubleToString(accountMargin, 2));
}/********************************************************************/
Je n'ai que 2 commandes ouvertes, elles s'affichent correctement.
 
Alexey Viktorov:

Quelque chose ne va pas. L'effet de levier est utilisé lorsque vous comptez ce pourcentage de la marge sur 1 lot standard, et l'effet de levier est pris en compte à ce niveau.

Compilez ce script et s'il y a des ordres ouverts, exécutez-le sur n'importe quelle paire.

Je n'ai que 2 ordres ouverts, il s'affiche correctement.

Je l'ai fait. Actuellement, le marché est fermé en mode démo et seuls les ordres sur l'or sont ouverts. Mes mots sont confirmés par insta (pourcentage de marge:1) votre script montre une sorte d'espace...

Je ne sais pas quoi en faire, mais je dois calculer correctement le pourcentage de marge dans les méta-citations et celles du robot avec 100 et 200.

 
Renat Akhtyamov:
Ouvrez un compte de démonstration avec 5 livres et un effet de levier de 100 et voyez quel sera le pourcentage de marge, par exemple, la même chose pour l'or ou, encore plus drôle, le rouble...
Je ne maîtrise pas le calcul de la marge en pourcentage, la logique des calculs semble avoir été comprise, mais je n'ai pas encore écrit le code. Si vous avez le vôtre, vérifions ce que vous dites).
 
K-2SO:

C'est fait. Maintenant, sur mes démos, lorsque le marché est fermé, seuls les ordres sur l'or sont ouverts. Mes mots sont confirmés par insta (pourcentage de marge:1) votre script montre une sorte d'espace... de même queSYMBOL_CURRENCY_MARGIN

MetaQuotes et RoboQuotes où le pourcentage de marge est de 100 et 200, tout est correct.

Je ne comprends pas ce qu'il montre de mal. J'ai ouvert 2 autres ordres pour le pétrole où le pourcentage de marge = 1 et la taille du contrat est seulement de 1000 et non de 100 000 comme pour les devises.

Voici ce qui est imprimé

2017.06.05 08:40:04.978 test EURUSD.e,H1: USD ******** AccountMargin = 2207.23
2017.06.05 08:40:03.360 test EURUSD.e,H1: US_ ******** Маржа BRENT = 508.0
2017.06.05 08:39:34.326 test EURUSD.e,H1: US_ ******** Маржа WTI = 484.9
2017.06.05 08:39:25.185 test EURUSD.e,H1: XAU ******** Маржа XAUUSD.e = 840.4333333333334
2017.06.05 08:39:19.651 test EURUSD.e,H1: EUR ******** Маржа EURUSD.e = 373.8933333333333

Voici une capture d'écran


Pour une raison quelconque, il l'affiche au centime près.

Donc, en dehors des mots, mettez des images...

 
Alexey Viktorov:

Donc, en plus des mots, postez des photos...


Quelque chose comme ça (lot 0.05, effet de levier 300) :

2017.06.05 12:06:11.968 Script gold_test_vik XAUUSD,H1: removed
2017.06.05 12:06:11.953 gold_test_vik XAUUSD,H1: uninit reason 0
2017.06.05 12:06:11.953 gold_test_vik XAUUSD,H1: USD ******** AccountMargin = 8193395.74
2017.06.05 12:06:11.953 gold_test_vik XAUUSD,H1: USD ******** Маржа XAUUSD = 8193395.736
2017.06.05 12:06:11.953 gold_test_vik XAUUSD,H1: initialized
2017.06.05 12:06:11.937 Script gold_test_vik XAUUSD,H1: loaded successfully

 
K-2SO:


Quelque chose comme ça (lot 0.05, effet de levier 300) :

Je vois. Faites attention à la devise de la marge. Le mien est XAU et le vôtre est USD et ensuite vous devez faire quelque chose avec cette ligne.

double price = symbolCurencyMargin == "USD" ? 1 : tupe == OP_BUY ? bid : ask;

afin que le devis soit inclus dans le calcul. Peut-être ajouter un chemin au symbole.

Et pour la double vérification, changez cette ligne comme ceci

double price = tupe == OP_BUY ? bid : ask;

Mais dans ce cas, cela ne fonctionnera pas correctement pour les devises.

En général, nous devrions considérer toutes les variantes du chemin vers le symbole et toutes les variantes des monnaies de marge pour l'universalité.

 
Alexey Viktorov:

Je vois. Faites attention à la devise de la marge. Le mien est XAU et le vôtre est USD et ensuite vous devez faire quelque chose avec cette ligne.

afin que le devis soit inclus dans le calcul. Vous devriez peut-être ajouter un chemin au symbole.

Pour le vérifier à nouveau, changez cette ligne comme ceci


C'est pareil, ce n'est pas correct, l'ordre est le même, le résultat est le même :

2017.06.05 12:47:50.984 gold_test_vik XAUUSD,H1: USD ******** AccountMargin = 6392.70
2017.06.05 12:47:50.984 gold_test_vik XAUUSD,H1: USD ******** Маржа XAUUSD = 6392.7
Alexey Viktorov:

En règle générale, toutes les variantes de chemin vers le symbole et la monnaie de marge doivent être prises en compte dans un souci d'universalité.

La devise de la marge est claire, mais de quelles variantes de chemin vers le symbole parlons-nous ?


p.s. La formule sans effet de levier compte tout avec précision :

margin=(OrderLots()*contract*OrderOpenPrice())/100*Percentage; // инста - процент маржи 1% 
 
K-2SO:

Toujours faux, même ordre, même résultat :

La devise de la marge est claire, mais de quels chemins vers l'instrument parlons-nous ?


p.s. Selon la formule sans effet de levier, tout est calculé avec précision :

Ouais, j'ai un peu foiré... La taille du lot n'est pas du tout prise en compte. Il s'affiche correctement car mes commandes sont d'un lot standard... Je devrais ajouter cette ligne

orderMargin = (OrderLots()* size*orderOpenPrice*percentage/100)/leverage;

Le chemin vers le symbole est défini comme suit

SymbolInfoString(symbol, SYMBOL_PATH);

mais hélas, il n'existe pas de dénomination univoque, il n'est donc pas si facile de définir la condition.

Robo, la démo de l'ECN a un tel chemin,


et sur un centime.

D'autres peuvent être similaires, mais pas sans ambiguïté. Bien sûr, nous pouvons comparer avec la sous-chaîne, mais pour être sûrs de l'universalité, nous devons vérifier de nombreuses sociétés de courtage.

Bien que... vous pouvez essayer de vérifier la façon dont la garantie est calculée.

Je vais le vérifier maintenant.

 
Alexey Viktorov:

Ouais, j'ai un peu foiré... La taille du lot n'est pas du tout prise en compte. Je comprends bien que les commandes sont d'un lot standard chacune... Je devrais ajouter cette ligne.

Je l'ai fait, mais le résultat est toujours faux)

Alexey Viktorov:

Le chemin vers le symbole est défini comme suit

Je veux dire, comment, où et pourquoi ai-je besoin d'utiliser ce chemin ?
 

Quel emmerdeur... Vérifiez comment cela compte pour vous.

void OnStart()
{
 double contractSize = 0, orderMargin = 0, accountMargin = 0; double percentage = 0;
 long leverage = 0;
 for(int i = 0; i < OrdersTotal(); i++)
  {
   int type = -1;
   if(OrderSelect(i, SELECT_BY_POS))
    {
      type = OrderType();
     string symbol = OrderSymbol();
     string symbolCurencyMargin = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
     double orderLots = OrderLots();
      leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
     double margin = MarketInfo(symbol, MODE_MARGINREQUIRED);
     double ask = MarketInfo(symbol, MODE_ASK);
     double bid = MarketInfo(symbol, MODE_BID);
     int calcMode = int(SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE));
     int stringFind = StringFind(symbol, "USD");
     double price = stringFind == 0 ? 1 : type%2 == OP_BUY ? bid : ask;
     double orderOpenPrice = stringFind == 0 ? 1 : OrderOpenPrice();
      contractSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
      percentage = NormalizeDouble(margin/(contractSize*price/100)*(calcMode == 0 ? leverage : 1), 0);
      orderMargin = (orderLots*contractSize*orderOpenPrice*percentage/100)/(calcMode == 0 ? leverage : 1);
       Print("******** Процент маржи ", int(percentage), " Маржа ордера ", symbol, " ", orderLots, " = ", orderMargin);
      if(type < OP_BUYLIMIT)
       accountMargin += orderMargin;
    }
  }
 Print("******** AccountMargin = ", DoubleToString(accountMargin, 2)," ", AccountInfoString(ACCOUNT_CURRENCY));
}/********************************************************************/
J'ai créé celui-ci pour compter également les commandes en cours, mais il n'inclut pas la marge totale.
Raison: