Способ расчитать суммарный лот перекрытых поз.

 

Как?

*

Требует пояснения того что ищу.

К примеру имеем 5 открытых позиций по одому инструменту:

1 лот бай

2 лота селл

2 лота бай

1 лот селл

1 лот селл

*

т.е. из всего имеем 1 лот селл практически,

3х3 перекрытые, (1+2=2+1), или = 3 лота перекрытых.

вот их то и требуется вычислить средствами мкл.

*

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

с учётом цен открытия каждого ордера в ней а так-же особенностей хеджированой маржи...

*

Рассчитать по каждой позиции (только для пар: валюта/валюта_депо) не сложно.

for(i=0; i<OrdersTotal(); i++)
{
OrderSelect(i,SELECT_BY_POS);
if(OrderSymbol()==sy)
   {
      b=(MarketInfo(sy,MODE_LOTSIZE)/AccountLeverage())*OrderOpenPrice()*OrderLots();
   }
}


 
Сложить отдельно лоты БАЙ и СЕЛЛ. Минимальная величина из двух значений и будет ОНО.
 

Дак, вроде бы, видел в ветке И.Кима такую функцию -

Функция GetAmountLotFromOpenPos(). Стр.16

Данная функция возвращает сумму лотов открытых позиций. Более точный отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент. 
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию. 
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает сумму лотов открытых позиций                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              l+=OrderLots();
            }
          }
        }
      }
    }
  }
  return(l);
}



 
Talex >>:
Сложить отдельно лоты БАЙ и СЕЛЛ. Минимальная величина из двух значений и будет ОНО.

Если бы...

*

Простые вычисленя не проблема! и уже решены.

Однако возникает погрешность ввиду того что влияет цена инструмента для таких расчётов.

Именно поэтому выше, как основа, принята фомула расчёта а не значения возвращаемые готовой функцией

MarketInfo(Symbols(),MODE_MARGINREQUIRED);

*

Насколько велика погрешность сложно судить...

Посмотреть что и как можно использовав этот индикатор.

Желательно что-бы позы были как можно дальше по цене от текущей.

(и не важно в какую сторону...)

*

Общий смысл расчёта таков:

- вычисляется маржа каждой позы по отдельности

а затем уже с учётом особенностей корректируются перекрытые из них.

MarketInfo(Symbols(),MODE_MARGINHEDGED);

*

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

Так вот из этой общей надо вычленить "свою" по инструментам...

 
rid >>:

Дак, вроде бы, видел в ветке И.Кима такую функцию -

Спасибо конечно за функцию...

Ветку Игоря вдоль и поперек уже наверное облазил.

;) но это не то что надо, увы...

*

Ох чую без массивов мне не обойтись.

 

Мне, почему-то казалось, что это очень просто.

Из Вашего примера

int by=1+2=3;

int sl=2+1+1=4;

if(sl>by) marga=(sl-by)*маржа на чистую сделку+by*маржа на перекрытую сделку;

else marga=(by-sl)*маржа на чистую сделку+sl*маржа на перекрытую сделку;

 
ЛЮди, помогите пожалуйста. Я понеимаю, что на странице написано уже все, но не получается. КАК ПОСЧИТАТЬ СУММУ ОТКРЫТЫХ ЛОТОВ???
 
Дмитрий Карпов:
ЛЮди, помогите пожалуйста. Я понеимаю, что на странице написано уже все, но не получается. КАК ПОСЧИТАТЬ СУММУ ОТКРЫТЫХ ЛОТОВ???


Так, выше функция, рабочая.

Скрипт, пробуем.

#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
Alert(GetAmountLotFromOpenPos());
   
  }
//+------------------------------------------------------------------+
/*
Данная функция возвращает сумму лотов открытых позиций. Более точный отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент. 
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию. 
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
*/
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает сумму лотов открытых позиций                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              l+=OrderLots();
            }
          }
        }
      }
    }
  }
  return(l);
}