Come ottenere la "Percentuale di margine" programmaticamente - pagina 7

 
K-2SO:

I test mostrano che quando la percentuale di margine è uguale a 1, la leva non viene presa in considerazione! Ma quando è 100 e più, è già preso in considerazione. Vorrei poter trovare un broker con una percentuale di margine tra 2 e 99 incluso.

C'è qualcosa che non va. La leva è usata quando si calcola questa percentuale dal margine su 1 lotto standard, e la leva è presa in considerazione lì.

Compila questo script e se ci sono ordini aperti eseguilo su qualsiasi coppia.

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));
}/********************************************************************/
Ho solo 2 ordini aperti, si vede correttamente per loro.
 
Alexey Viktorov:

C'è qualcosa che non va. La leva viene utilizzata quando si conta quella percentuale dal margine su 1 lotto standard, e la leva viene presa in considerazione lì.

Compila questo script e se ci sono ordini aperti eseguilo su qualsiasi coppia.

Ho solo 2 ordini aperti, si vede correttamente.

L'ho fatto. Al momento il mercato è chiuso in modalità demo e sono aperti solo gli ordini sull'oro. Le mie parole sono confermate da insta (percentuale di margine:1) il tuo script mostra una specie di spazio...

Non so cosa farci, ma devo calcolare correttamente la percentuale di margine in metaquote e quelle del robot con 100 e 200.

 
Renat Akhtyamov:
Apri un conto demo con 5 sterline e una leva di 100 e vedi quale sarà la percentuale di margine, per esempio, lo stesso per l'oro o ancora più divertente - il rublo...
Non ho padroneggiato il calcolo del margine percentuale, la logica dei calcoli sembra essere stata capita, ma non ho ancora scritto il codice. Se ne hai uno tuo, controlliamo quello che stai dicendo)
 
K-2SO:

Fatto. Ora sui miei demo mentre il mercato è chiuso solo gli ordini sull'oro sono aperti. Le mie parole sono confermate da insta (percentuale di margine:1) il tuo script mostra una specie di spazio... così faSYMBOL_CURRENCY_MARGIN

MetaQuotes e RoboQuotes dove la percentuale di margine è 100 e 200, tutto è corretto.

Non capisco cosa mostra di sbagliato. Ho aperto altri 2 ordini per il petrolio dove la percentuale di margine = 1 e la dimensione del contratto è solo 1000 e non 100.000 come per le valute.

Questo è ciò che viene stampato

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

Ecco uno screenshot


Per qualche ragione, mostra il centesimo esatto.

Quindi, oltre alle parole, mettete delle immagini...

 
Alexey Viktorov:

Quindi, oltre alle parole, pubblicate delle foto...


Da qualche parte così (lotto 0,05, leva 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:


Da qualche parte così (lotto 0,05, leva 300):

Capisco. Fate attenzione alla valuta del margine. Il mio è XAU e il tuo è USD e poi devi fare qualcosa con questa linea

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

in modo che la citazione sia inclusa nel calcolo. Forse aggiungere un percorso al simbolo.

E per il doppio controllo cambiate questa linea in questo modo

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

Ma in questo caso non funzionerà correttamente per le valute.

In generale, dovremmo considerare tutte le varianti di percorso verso il simbolo e tutte le varianti di valute di margine per l'universalità.

 
Alexey Viktorov:

Capisco. Fate attenzione alla valuta del margine. Il mio è XAU e il tuo è USD e poi devi fare qualcosa con questa linea

in modo che la citazione sia inclusa nel calcolo. Forse dovresti aggiungere un percorso al simbolo.

Per controllarlo di nuovo, cambiate questa linea in questo modo


Tutto uguale, non è corretto, l'ordine è lo stesso, il risultato è lo stesso:

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:

In generale, tutte le varianti di percorso verso il simbolo e la valuta del margine dovrebbero essere prese in considerazione per il bene dell'universalità.

Vedo la valuta del margine, ma di quali varianti di percorso al simbolo stiamo parlando?


p.s. La formula senza leva conta tutto con precisione:

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

Ancora sbagliato, stesso ordine, stesso risultato:

Il margine di valuta è chiaro, ma di quali percorsi verso lo strumento stiamo parlando?


p.s. La formula senza leva conta tutto con precisione:

Sì, ho fatto un po' di confusione... La dimensione del lotto non è affatto considerata. È mostrato correttamente perché i miei ordini sono di 1 lotto standard... Dovrei aggiungere questa linea

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

Il percorso del simbolo è definito come segue

SymbolInfoString(symbol, SYMBOL_PATH);

ma ahimè, non c'è una denominazione univoca, quindi non è così facile impostare la condizione.

Robo, la demo ecn ha un tale percorso,


ma su un centesimo

Altri possono essere simili, ma non univoci. Naturalmente possiamo confrontare con la sottostringa, ma per essere sicuri dell'universalità dovremmo controllare molte società di intermediazione.

Anche se... potreste provare a controllare il modo in cui viene calcolata la garanzia.

Lo controllerò ora.

 
Alexey Viktorov:

Sì, ho fatto un po' di confusione... La dimensione del lotto non è affatto presa in considerazione. Ho capito bene perché gli ordini sono 1 lotto standard ciascuno... Dovrei aggiungere questa linea.

L'ho fatto, ma il risultato è ancora sbagliato)

Alexey Viktorov:

Il percorso del simbolo è definito come segue

Cioè, come, dove e perché devo usare questo percorso?
 

Che rottura di palle... Controlla come conta per te.

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));
}/********************************************************************/
Ho fatto questo per contare anche gli ordini in sospeso, ma non include il margine totale.
Motivazione: