Расчет залоговых средств. В чем ошибка?

 

Валютная пара GBPUSD.

Открываю на демо счете ордер объемом 1 лот.  Получилась маржа - 127.11

Открываю ордер объемом 5 лотов. Маржа 635.5

Все правильно.

Открываю два ордера, каждый объемом 5 лотов. Маржа 1542.18. То есть на 1 лот получается маржа 154,2.

В чем проблема.

Столкнулся с этой проблемой при программном расчете размера ордера. Стал проверять вручную. Ошибка повторяется. Но более фигуристо. Расчетное значение отличается от реального. 

При расчете программно количество лотов умножаю на MarketInfo(Symbol(),MODE_MARGINREQUIRED).  

MarketInfo(Symbol(),MODE_MARGINREQUIRED)=127.11

Итого: программно рассчитать залоговую маржу не получается. И как проводить учет имеющихся средств?

В чем моя ошибка?

GBPUSD - Great Britain Pound vs US Dollar - Курс валют сегодня — Форекс курсы валют
GBPUSD - Great Britain Pound vs US Dollar - Курс валют сегодня — Форекс курсы валют
  • 2024.05.24
  • www.mql5.com
GBPUSD - Great Britain Pound vs US Dollar - Графики с курсом по самым популярным валютным парам. Используйте фильтр снизу, чтобы отбирать нужные вам курсы валют. Внутри каждого графика показываются цены спроса и предложения, а также прирост за день.
 
Eugeni Neumoin:

Валютная пара GBPUSD.

Открываю на демо счете ордер объемом 1 лот.  Получилась маржа - 127.11

Открываю ордер объемом 5 лотов. Маржа 635.5

Все правильно.

Открываю два ордера, каждый объемом 5 лотов. Маржа 1542.18. То есть на 1 лот получается маржа 154,2.

В чем проблема.

Столкнулся с этой проблемой при программном расчете размера ордера. Стал проверять вручную. Ошибка повторяется. Но более фигуристо. Расчетное значение отличается от реального. 

При расчете программно количество лотов умножаю на MarketInfo(Symbol(),MODE_MARGINREQUIRED).  

MarketInfo(Symbol(),MODE_MARGINREQUIRED)=127.11

Итого: программно рассчитать залоговую маржу не получается. И как проводить учет имеющихся средств?

В чем моя ошибка?

А что возвращает функция?

SymbolInfoDouble(symbol,SYMBOL_MARGIN_INITIAL);
SymbolInfoDouble(symbol,SYMBOL_MSRGIN_MINTENANCE);

На практике ДЦ может менять плечо в любой момень времени и это может влиять на маржу.

 
Alexander Sevastyanov #:
SymbolInfoDouble(symbol,SYMBOL_MARGIN_INITIAL);
SymbolInfoDouble(symbol,SYMBOL_MARGIN_INITIAL);

=100000.0

Похоже на то, что плечо меняется

 

Возвращает размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете.

double  AccountFreeMarginCheck(
   string  symbol,     // символ
   int     cmd,        // торговая операция
   double  volume      // количество лотов
   );

AccountEquity() — AccountFreeMarginCheck() разве не будет равна марже?

 
Alexey Viktorov #:

Возвращает размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете.


AccountEquity() — AccountFreeMarginCheck() разве не будет равна марже?

История такая. Решил в программе сделать тонкие настройки, чтобы аккуратно вся маржа учитывалась.

При открытии нескольких ордеров программно сделал расчет, сколько маржи уходит на каждую открываемую позицию.

Суммарно вышла странная сумма. Которая сильно отличается от реально взятой брокером при открытии ордеров.

-----------------------------

Для примера, открыл в районе 14 сделок по 5 лотов. Сделки открывались в цикле. На счете получилась сумма маржи, которая от расчетной отличалась в более чем 3 раза.

Сейчас точные цифры не скажу. Суммарная маржа получилась 28458. А расчетная получалась в районе 8400. Не важно, как рассчитывать. И  AccountFreeMarginCheck() , и 

MarketInfo(Symbol(),MODE_MARGINREQUIRED) результат в итоге дают один. Эти две функции в чем-то схожие. То есть  AccountFreeMarginCheck() =Баланс- MarketInfo(Symbol(),MODE_MARGINREQUIRED).

Стал искать, в чем проблема. Пока не нашел. Для себя сделал промежуточный вывод, возможно, в потоке меняется плечо.


==========================

      double MARGINREQUIRED=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
      if (MarketInfo(Symbol(),MODE_MARGINREQUIRED)<=0 && company()) MARGINREQUIRED=iClose(Symbol(),Period(),0)*0.005;

      // определяем возможность открытия встречных ордеров
      double margininit=MarketInfo(Symbol(),MODE_MARGININIT);
      double marginhedget=MarketInfo(Symbol(),MODE_MARGINHEDGED);
      double marginfree=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
      if (marginfree>0 && (margininit>marginhedget || (margininit==0 && marginhedget==0)))
        {
         double buy_margin=0;    // 
         double sell_margin=0;   //
         for (int i=0; i<OrdersTotal(); i++)
           {
            if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
              {
            if (OrderType()==OP_BUY)
              {
               buy_margin=buy_margin+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
              }
            else if (OrderType()==OP_SELL)
              {
               sell_margin=sell_margin+NormalizeDouble(OrderLots()*MARGINREQUIRED,2);
              }
              }
           }
        }

Этим кодом подсчитывал суммарную маржу открытых ордеров.

Сумма получилась отличная от реальной.

Строчка

 if (MarketInfo(Symbol(),MODE_MARGINREQUIRED)<=0 && company()) MARGINREQUIRED=iClose(Symbol(),Period(),0)*0.005;

Для расчета по крипте в форекс клубе. У ФК для крипты параметр 

MODE_MARGINHEDGED

равен 0.

Но расчет делал на фунте.

 
Eugeni Neumoin #:

История такая. Решил в программе сделать тонкие настройки, чтобы аккуратно вся маржа учитывалась.

При открытии нескольких ордеров программно сделал расчет, сколько маржи уходит на каждую открываемую позицию.

Суммарно вышла странная сумма. Которая сильно отличается от реально взятой брокером при открытии ордеров.

-----------------------------

Для примера, открыл в районе 14 сделок по 5 лотов. Сделки открывались в цикле. На счете получилась сумма маржи, которая от расчетной отличалась в более чем 3 раза.

Сейчас точные цифры не скажу. Суммарная маржа получилась 28458. А расчетная получалась в районе 8400. Не важно, как рассчитывать. И  AccountFreeMarginCheck() , и 

MarketInfo(Symbol(),MODE_MARGINREQUIRED) результат в итоге дают один. Эти две функции в чем-то схожие. То есть  AccountFreeMarginCheck() =Баланс- MarketInfo(Symbol(),MODE_MARGINREQUIRED).

Стал искать, в чем проблема. Пока не нашел. Для себя сделал промежуточный вывод, возможно, в потоке меняется плечо.


==========================

Этим кодом подсчитывал суммарную маржу открытых ордеров.

Сумма получилась отличная от реальной.

Строчка

Для расчета по крипте в форекс клубе. У ФК для крипты параметр 

равен 0.

Но расчет делал на фунте.

Откройте спецификацию инструмента и посмотрите коэффициент маржи. Если и меняется что-то в момент открытия, то никак не плечо, а скорее всего этот коэффициент.

 
Alexey Viktorov #:

Откройте спецификацию инструмента и посмотрите коэффициент маржи. Если и меняется что-то в момент открытия, то никак не плечо, а скорее всего этот коэффициент.

Где посмотреть этот коэффициент:


 
Eugeni Neumoin #:

Где посмотреть этот коэффициент:


Ну… что-то с памятью моей стало… Не коэффициент, а процент маржи.

 
Alexey Viktorov #:

Ну… что-то с памятью моей стало… Не коэффициент, а процент маржи.

И что он дает? 100%

Выше был код для подсчета суммарной маржи по открытым позициям.

Там количество лотов в открытом ордере умножается на MarketInfo(Symbol(),MODE_MARGINREQUIRED)

И подсчитывается сумма маржи по всем открытым позициям.

Сейчас проверил по 15 открытым позициям по 5 лотов каждая. При 

MarketInfo(Symbol(),MODE_MARGINREQUIRED)=127,43 на один лот суммарно по всем открытым позициям получаем значение маржи 9557.25. А реально задействовано 31782,88.

На одну позицию 637.15

А в реальности получаем 31782.88/(5*15)=423.78 - это на один лот, а не 127.43. На 5 лотов 2118.86, а не 637.15

.....

Но еще вот что интересно. Для открытия одной позиции необходимо маржи 2118.86. В реальности, даже если свободных средств на счете больше этой суммы, при попытке открытия позиции сервер отвечает - Недостаточно средств на счете. Это при программном открытии позиции. Руками, без участия советника, позицию открыть получается.

Это я тестирую программу при пограничных значениях, когда выявляются даже самые трудно выявляемые ошибки. То есть необходимо проверять программу в самых жестких условиях.  В предельных режимах... при торговле на всю котлету...

 

В спецификациях инструментов нашел:

Маржинальные требования:

Процент от номинальной стоимости сделки, выраженный в USD, который будет заблокирован на торговом счёте при открытии позиции.

Маржинальные требования могут меняться в зависимости от размера позиции.

=============================

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

 
Если есть противоположные позиции (локи), в расчетах придется учитывать MODE_MARGINHEDGED.