Как получить программно "Процент маржи" - страница 7

 
K-2SO:

Тесты показывают, что когда процент маржи равен 1 плечо не учитывается! А вот от 100 и выше, уже учитывается. Жаль не могу найти брокера с процентом маржи от 2 до 99 включительно.

Что-то не то. Плечо используется когда считаешь этот процент из маржи на 1 стандартный лот, а там плечо учитывается.

Скомпилируй этот скрипт и если есть открытые ордера запусти его на любую пару.

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));
}/********************************************************************/
У меня всего 2 ордера открыто, по ним показывает правильно.
 
Alexey Viktorov:

Что-то не то. Плечо используется когда считаешь этот процент из маржи на 1 стандартный лот, а там плечо учитывается.

Скомпилируй этот скрипт и если есть открытые ордера запусти его на любую пару.

У меня всего 2 ордера открыто, по ним показывает правильно.

Сделал. Сейчас у меня на демках пока рынок закрыт только по золоту ордера открыты. Мои слова подтверждает инста (процент маржи:1) ваш скрипт космос какой-то показывает... 

 У метаквотов и у робо, там где процент маржи 100 и 200 - все корректно.

 
Renat Akhtyamov:
откройте демо-счет на 5 баксов с плечом 100 и посмотрите чему будет равна маржа в %-тах, к примеру по тому же золоту или еще прикольнее - по рублю...
Вычисление процента маржи еще не освоил, логику вычислений вроде уже осознал, но код еще не писал. Если у вас есть свой, давайте - проверим о чем вы )
 
K-2SO:

Сделал. Сейчас у меня на демках пока рынок закрыт только по золоту ордера открыты. Мои слова подтверждает инста (процент маржи:1) ваш скрипт космос какой-то показывает... впрочем как и SYMBOL_CURRENCY_MARGIN

 У метаквотов и у робо, там где процент маржи 100 и 200 - все корректно.

Ну я не понимаю что не так показывает. Вот открыл ещё 2 ордера по нефти где процент маржи =1 и размер контракта всего 1000, а не 100 000 как на валютах.

Вот что печатает

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

Вот снимок


почему-то показывает с точностью до копейки.

Так-что кроме слов выкладывай снимки...

 
Alexey Viktorov:

Так-что кроме слов выкладывай снимки...


Где то так (лот 0.05, плечо 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:


Где то так (лот 0.05, плечо 300):

Понятно. Обрати внимание на валюту маржи. В моём варианте XAU а в твоём USD и тогда надо что-то делать с этой строкой

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

чтобы в расчёте была учтена котировка. Может добавить путь к символу.

А для повторной проверки измени эту строку так

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

Но тогда на валютах будет неправильно считать.

В общем для универсальности надо учитывать все варианты пути к инструменту и варианты валюты маржи.

 
Alexey Viktorov:

Понятно. Обрати внимание на валюту маржи. В моём варианте XAU а в твоём USD и тогда надо что-то делать с этой строкой

чтобы в расчёте была учтена котировка. Может добавить путь к символу.

А для повторной проверки измени эту строку так


Всё равно неправильно, ордер тот же, результат:

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:

В общем для универсальности надо учитывать все варианты пути к инструменту и варианты валюты маржи. 

С валютой маржи понятно, а о каких вариантах пути к инструменту речь?


p.s. По формуле без учета плеча считается все точно:

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

Всё равно неправильно, ордер тот же, результат:

С валютой маржи понятно, а о каких вариантах пути к инструменту речь?


p.s. По формуле без учета плеча считается все точно:

Ага, накосячил я чуток... Размер лота совсем не учитывается. У меня правильно показывает потому, что ордера по 1 стандартному лоту... Надо дополнить эту строку

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

Путь к символу определяется так

SymbolInfoString(symbol, SYMBOL_PATH);

но увы, нет однозначности в названиях, поэтому не так просто поставить условие.

У робо, на демке ecn такой путь,


а на центовом

У других может быть похоже, но не однозначно. Конечно можно сравнивать с подстрокой, но для уверенности в универсальности надо проверить много ДЦ как у них указан путь.

Хотя... можно попробовать проверить на способ расчёта залоговых средств.

Сейчас проверю.

 
Alexey Viktorov:

Ага, накосячил я чуток... Размер лота совсем не учитывается. У меня правильно показывает потому, что ордера по 1 стандартному лоту... Надо дополнить эту строку

Дополнил и все равно результат неправильный )

Alexey Viktorov:

Путь к символу определяется так

Я про то, как, где и зачем нужно использовать этот путь?
 

Ну и гемор... Проверь как у тебя считает.

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));
}/********************************************************************/
Этот я сделал чтобы считал и отложенные ордера, но в общую сумму маржи не включает.
Причина обращения: