Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 9

 
fxsaber:
La soluzione è arrivata subito.
// Размер свободных средств, необходимых для открытия 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);
}
Questo è il calcolo per il FOREX. Il resto è simile.
Bene, tutto ciò che rimane è portare il margine nella valuta di deposito, perché il margine, per esempio, per AUDCAD con la valuta di deposito USD deve essere in USD.
 
Alexey Volchanskiy:
Bene, tutto quello che dobbiamo fare è portare il margine nella valuta di deposito, perché il margine, per esempio, per AUDCAD con valuta di deposito USD deve essere in USD.
È stato fatto.
 
Alexey Volchanskiy:
Bene, ora abbiamo bisogno di portare il margine nella valuta di deposito, perché il margine, per esempio per AUDCAD con valuta di deposito USD dovrebbe essere in USD.
sembra che SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE ) nella funzione sia solo per questo... per portare i lotti a depositare la valuta
 
fxsaber:
Questo è ciò che è stato fatto.

Tutto funziona bene in forex, tranne che la domanda finale rimane, "perché la metà, e come posso risolvere il problema?

 
Vitaly Muzichenko:

Tutto funziona bene in forex, ma c'è un'ultima domanda: "perché è dimezzato e come lo sistemiamo?

Ho riscontrato che il margine su SGDJPY è diverso sui server FIBOGroup-MT5 Server e MetaQuotes-Demo. Questo suggerisce che MT5 stesso calcola il margine con errori. E poiché è così, non c'è alcun riferimento per il confronto. Pertanto, non posso dire con certezza se questo è un errore della mia implementazione o degli sviluppatori. Credo che ci sia un errore in entrambi i casi. Il problema è la mancanza di informazioni corrette.
 
fxsaber:
Ho riscontrato che su SGDJPY il margine è diverso sui server FIBOGroup-MT5 Server e MetaQuotes-Demo. Questo suggerisce che MT5 stesso calcola il margine con errori. Beh, se questo è il caso, non c'è uno standard di confronto. Pertanto, non posso dire con certezza se questo è un errore della mia implementazione o degli sviluppatori. Credo che ci sia un errore in entrambi i casi. Il problema è la mancanza di informazioni corrette.

Ho due server che mostrano correttamente, con un'eccezione - evidenziata in rosso

Come faccio a trovare la proprietà evidenziata in rosso?

Grazie!

 
Vitaly Muzichenko:

Ho due server che mostrano correttamente, con un'eccezione - evidenziata in rosso

Come posso scoprire la proprietà evidenziata in rosso?

Grazie per il suggerimento! Nel deserto, èSymbolInfoMarginRate. Quindi ora è così
// Размер свободных средств, необходимых для открытия 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);
}

Devi capire chiaramente che in MT5 ci possono essere requisiti di margine molto diversi in diverse direzioni. Cioè una singola variante di MT4 potrebbe non funzionare. Sul Forex, ovviamente, questo non sarà il caso. Ma dovete ricordare. Quindi, in generale, si dovrebbe scrivere così
// Альтернатива 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:
Questo è quello che è stato fatto.
Sì, è vero, è vero.
 

Scherzo MT5 su FIBOGroup-MT5 Server SGDJPY

In questa situazione MyOrderCalcMargin conta correttamente ma il normale OrderCalcMargin no!

 
fxsaber:

Scherzo di MT5 su FIBOGroup-MT5 Server SGDJPY

In questa situazione MyOrderCalcMargin conta correttamente ma il normale OrderCalcMargin no!

C'è un modo per calcolare il margine coperto?
Motivazione: