Wie man den "Prozentsatz der Marge" programmatisch abruft - Seite 7

 
K-2SO:

Tests zeigen, dass die Hebelwirkung nicht berücksichtigt wird, wenn der Prozentsatz der Marge gleich 1 ist! Aber wenn sie 100 und mehr beträgt, wird sie bereits berücksichtigt. Ich wünschte, ich könnte einen Broker mit einem Margenprozentsatz zwischen 2 und 99 einschließlich finden.

Hier stimmt etwas nicht. Die Hebelwirkung wird verwendet, wenn Sie diesen Prozentsatz aus der Marge für 1 Standardlot berechnen, und die Hebelwirkung wird dabei berücksichtigt.

Kompilieren Sie dieses Skript und führen Sie es für jedes beliebige Paar aus, wenn es offene Aufträge gibt.

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));
}/********************************************************************/
Ich habe nur 2 Aufträge offen, für die die Anzeige korrekt ist.
 
Alexey Viktorov:

Hier stimmt etwas nicht. Die Hebelwirkung wird verwendet, wenn Sie diesen Prozentsatz von der Marge für 1 Standardlot abziehen, und die Hebelwirkung wird dabei berücksichtigt.

Kompilieren Sie dieses Skript und führen Sie es für jedes beliebige Paar aus, wenn es offene Aufträge gibt.

Ich habe nur 2 Aufträge offen, es wird korrekt angezeigt.

Ich habe es getan. Zur Zeit ist der Markt im Demomodus geschlossen und nur die Aufträge auf Gold sind offen. Meine Worte werden von insta bestätigt (Marge Prozent:1) Ihr Skript zeigt eine Art von Raum...

Ich weiß nicht, was ich damit machen soll, aber ich muss den Prozentsatz der Marge in Metaquotes und Robotern mit 100 und 200 richtig berechnen.

 
Renat Akhtyamov:
Eröffnen Sie ein Demokonto mit 5 Pfund und einem Hebel von 100 und sehen Sie, wie hoch der Margenprozentsatz zum Beispiel für Gold oder - noch lustiger - für den Rubel sein wird...
Ich habe die Berechnung der prozentualen Marge nicht gemeistert, die Logik der Berechnungen scheine ich verstanden zu haben, aber ich habe den Code noch nicht geschrieben. Wenn Sie eine eigene haben, lassen Sie uns überprüfen, was Sie sagen)
 
K-2SO:

Erledigt. Jetzt auf meine Demos, während der Markt geschlossen ist nur auf Gold Aufträge sind offen. Meine Worte werden von insta bestätigt (Marge Prozent:1) Ihr Skript zeigt eine Art von Raum... dies gilt auch fürSYMBOL_CURRENCY_MARGIN

MetaQuotes und RoboQuotes, bei denen der Margenprozentsatz 100 und 200 beträgt, ist alles korrekt.

Ich verstehe nicht, was daran falsch sein soll. Ich habe 2 weitere Aufträge für Öl eröffnet, bei denen der Margin-Prozentsatz = 1 ist und die Kontraktgröße nur 1000 und nicht 100.000 wie bei den Währungen beträgt.

Dies ist der gedruckte Text

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

Hier ist ein Bildschirmfoto


Aus irgendeinem Grund wird der Betrag auf den nächsten Penny genau angezeigt.

Also, abgesehen von Worten, stellen Sie Bilder...

 
Alexey Viktorov:

Stellen Sie also zusätzlich zu den Worten auch Bilder ein...


Etwa so (Lot 0,05, Hebelwirkung 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:


Etwa so (Lot 0,05, Hebelwirkung 300):

Ich verstehe. Achten Sie auf die Währung der Marge. Bei mir ist es XAU und bei Ihnen USD und dann müssen Sie etwas mit dieser Zeile machen

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

damit das Angebot in die Berechnung einbezogen wird. Vielleicht einen Pfad zum Symbol hinzufügen.

Und für die doppelte Kontrolle ändern Sie diese Zeile wie folgt

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

Aber in diesem Fall wird es nicht korrekt für Währungen funktionieren.

Im Allgemeinen sollten wir alle Varianten des Weges zum Symbol und alle Varianten der Randwährungen für die Universalität berücksichtigen.

 
Alexey Viktorov:

Ich verstehe. Achten Sie auf die Währung der Marge. Bei mir ist es XAU und bei Ihnen USD und dann müssen Sie etwas mit dieser Zeile machen

damit das Angebot in die Berechnung einbezogen wird. Vielleicht sollten Sie dem Symbol einen Pfad hinzufügen.

Um dies erneut zu überprüfen, ändern Sie diese Zeile wie folgt


Trotzdem ist es nicht richtig, die Reihenfolge ist die gleiche, das Ergebnis ist das gleiche:

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:

Generell sollten im Sinne der Universalität alle Varianten des Weges zum Symbol und zur Randwährung berücksichtigt werden.

Ich sehe die Randwährung, aber von welchen Pfadvarianten zum Symbol ist die Rede?


p.s. Die Formel ohne Hebelwirkung zählt alles genau:

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

Immer noch falsch, gleiche Reihenfolge, gleiches Ergebnis:

Die Margenwährung ist klar, aber über welche Wege zum Instrument reden wir?


p.s. Nach der Formel ohne Hebelwirkung wird alles genau berechnet:

Ja, ich habe ein bisschen Mist gebaut... Die Losgröße wird überhaupt nicht berücksichtigt. Es wird korrekt angezeigt, weil meine Bestellungen 1 Standardlos umfassen... Ich sollte diese Zeile hinzufügen

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

Der Pfad zum Symbol ist wie folgt definiert

SymbolInfoString(symbol, SYMBOL_PATH);

aber leider gibt es keine eindeutige Benennung, so dass es nicht so einfach ist, die Bedingung festzulegen.

Robo, die ecn-Demo hat einen solchen Pfad,


und auf einen Cent.

Andere sind zwar ähnlich, aber nicht eindeutig. Natürlich können wir mit Teilstrings vergleichen, aber um sicher zu sein, dass sie universell einsetzbar sind, sollten wir viele Maklerunternehmen überprüfen.

Obwohl... Sie könnten versuchen, die Art und Weise der Berechnung der Sicherheiten zu überprüfen.

Ich werde es jetzt überprüfen.

 
Alexey Viktorov:

Ja, ich habe ein bisschen Mist gebaut... Die Losgröße wird überhaupt nicht berücksichtigt. Ich habe es richtig verstanden, denn die Aufträge sind jeweils 1 Standardlos... Ich sollte diese Zeile hinzufügen.

Das habe ich getan, aber das Ergebnis ist immer noch falsch)

Alexey Viktorov:

Der Pfad zum Symbol ist wie folgt definiert

Ich meine, wie, wo und warum muss ich diesen Weg benutzen?
 

Was für eine Nervensäge... Prüfen Sie, was das für Sie bedeutet.

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));
}/********************************************************************/
Ich habe diese Funktion erstellt, um auch die ausstehenden Aufträge zu zählen, aber sie enthält nicht die Gesamtspanne.
Grund der Beschwerde: