ORDER_POSITION_ID - страница 20

 
Mikalas:
У вас же есть интернет? Через интернет водятся :)
Nein. Только официальная статистика. Только законные налоговые отчёты, поэтому в нашей местности интернет не помощник. Низзя.
 
barabashkakvn:
Nein. Только официальная статистика. Только законные налоговые отчёты, поэтому в нашей местности интернет не помощник. Низзя.

В спавочнике же написано, что POSITION_IDENTIFIER не меняется на протяжении всей её жизни.

Этого не достаточно? 

 
Mikalas:

В спавочнике же написано, что POSITION_IDENTIFIER не меняется на протяжении всей её жизни.

Этого не достаточно? 

Справка - это я знаю: 2

Я просил примеры из жизни, с биржевых торгов:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ORDER_POSITION_ID

barabashkakvn, 2014.09.01 19:39

Жалко я свой счёт у брокера закрыл. Может есть у кого история торгов, на основании которой будет чётко видно, как происходит клиринг?

 
barabashkakvn:

Справка - это я знаю: 

Я просил примеры из жизни, с биржевых торгов:


Понятно....
 

Я специально разобрался в этом вопросе и прошу прощения за некорректные утверждения. Как оказалась истина была посередине. Действительно, позиция существует с самого начала и до конца ее закрытия, при этом ее идентификатор и основные свойства остаются неизменными, независимо от того, была ли она перенесена через клиринг или нет. Однако цена открытия позиции действительно меняется. Сам расчет позиций именно такой как показано у меня в предыдущем посте, т.е. от одного клиринга до другого рассчитывается накопленная прибыль/убыток от открытой позиции и этот результат начисляется на счет с помощью специальных брокерских операций (сделок). Эти сделки отмечены комментариями "[variation margin open]" и "[variation margin close]".

Привожу здесь комментарий сотрудника "Открытия", который весьма точно описывает этот процесс:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

МТ5 на бирже: ошибки, баги, вопросы.

OpenBroker, 2013.02.26 09:59

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

На ФОРТС дважды в день проходит клиринговый сеанс: Промежуточный (с 14:00 до 14:03 мск) и Основной (с 18:45 до 19:00 мск (или 19:10 в дни когда истекает срок обращения контрактов) ).

Для справки, клиринг - это учет взаиморасчетов, если по-русски, то это момент фиксации прибылей/убытков по открытым/закрытым позициям между клиринговыми сеансами.

Собственно, что важно. Важно, что в момент клиринга фиксируется Расчетная цена. То есть цена последней сделки прошедшего торгового периода. С точки зрения математики открытая позиция "как-бы" закрывается и открывается по Расчетной цене (разумеется, никакой дополнительной комиссии ни брокер ни биржа за это не берет).

Таким образом, если вы открыли позицию до очередного клиринга и остались с ней на момент его проведения, то у вас в МТ 5 изменяется цена открытия этой позиции. И если, скажем, у вас стоит "трейлинг-стоп" в пунктах, то отсчитываться он будет от цены клиринга, а не от цены заключения вами сделки.

Например, в 11:00 мск куплен контракт Si-03.13 по цене 30500 р. Выставлен трейлинг-стоп, равный, 50 пунктам. К 14:00 мск позиция не закрыта. Расчетная цена Промежуточного клиринга составила 30525. (то есть, в клиринг на ваш счет фактически перечислено (+25) рублей с каждого купленного контракта). Начиная с 14:03 мск МТ 5 будет рассчитывать трейлинг-стоп от цены 30525 (а не от фактической цены заключенной вами сделки - 30500 р.).

Кстати, такой ролловер позиции практикуется не только на ФОРТС но и в некоторых forex компаниях. При этом, как я понимаю, будет ли изменена лишь цена входа в позицию, либо создастся новая позиция зависит от правил в самой компании.

Скажите, пожалуйста как именно происходит перенос позиций через ночь?
Почему именно происходит переоткрытие позиции с новой ценой ордера, а не с той же ценой?
Насколько я понимаю, переоткрытие с новой ценой ордера это ролловер (rollover).
Перенос позиции через ночь с той же ценой это своп и как бы долго позиция не удерживалась, цена ордера останется той же. Верно ??
Если так, то в ВТБ своп не применяется?
Или я в чём то ошибаюсь, расскажите..

Валютный своп - операция, состоящая из двух противоположных конверсионных сделок на одинаковую сумму торгуемой валюты с разными датами валютирования и разными обменными курсами. Своп типа “tom/next“ (том/некст) означает проведение двух конверсионных сделок, расчеты по первой из которых осуществляются на дату валютирования “том“ (tom), то есть первый рабочий день после дня заключения сделки, не считая выходные и праздничные дни, а по противоположной ей - на дату “спот“. 
В случае, если до 01.00 ч. московского времени дня, следующего за датой заключения сделки, открытая Клиентом позиция не будет закрыта, то Банк самостоятельно переносит позицию на следующий рабочий день путем проведения валютного свопа типа “tom/next”. При этом он закрывает существующую позицию на дату валютирования и одновременно открывает ее вновь на следующую дату валютирования. 
Положения настоящего пункта рассматриваются Сторонами как безотзывная Заявка Клиента на совершение с Банком в случае, описанном в предыдущем абзаце, сделки валютный своп на следующих условиях:
-базовая валюта и контрвалюта свопа соответствуют базовой валюте и контрвалюте открытой позиции,
-курс первой сделки свопа равен текущему рыночному курсу на момент проведения свопа,
-курс второй сделки свопа равен курсу первой сделки свопа скорректировнному на величину текущих рыночных своп-пунктов (положительная или отрицательная разница между рыночным курсом «tom» и «spot»),
-дата валютирования по первой сделке свопа - дата «tom»,
-дата валютирования по второй сделка свопа - дата «spot». 


Перенос позиции через ночь, как это работает ?? : ВТБ24
  • www.onlinebroker.ru
Валютный своп - операция, состоящая из двух противоположных конверсионных сделок на одинаковую сумму торгуемой валюты с разными датами валютирования и разными обменными курсами. Своп типа “tom/next“ (том/некст) означает проведение двух конверсионных сделок, расчеты по первой из которых осуществляются на дату валютирования “том“ (tom), то есть...
 

С-4, очень приятно, что обсуждение пошло в конструктивном русле!

Так вот, "чистая" цена позиции мне нужна, чтобы знать (через месяц, например ), какой у меня профит.

По POSITION_IDENTIFIER (как сейчас у меня реализовано) можно посмотреть историю входящих сделок текущей позиции.

Но я хотел это реализовать через ордера (у меня бывает, что частично исполненый ордер "стоит" пару-тройку дней),

так как у ордера есть ORDER_POSITION_ID, что тоже самое что

и  POSITION_IDENTIFIER, только у ордера. 

В функции(использую сейчас):

//+------------------------------------------------------------------+
//| Expert Get history price function                                |
//+------------------------------------------------------------------+
double GetHistoryPrice( const string aSymbol )
{
  double price_in = 0;
  double volume_in = 0;
  
  if ( PositionSelect( aSymbol ) )
  {
    long pos_id = long( PositionGetInteger( POSITION_IDENTIFIER ) );
    
    if ( pos_id > 0 )
    {
      if ( HistorySelectByPosition( ulong( pos_id ) ) )
      {
        int deals = HistoryDealsTotal();
      
        for( int i = 0; i < deals; i++ )
        {
          ulong deal_ticket = HistoryDealGetTicket( i );
          ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) );
        
          if ( order_ticket > 0 )
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY( HistoryDealGetInteger( deal_ticket, DEAL_ENTRY ) );
              
            if ( deal_entry == DEAL_ENTRY_IN )
            {
              double price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              double volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_in = price_in + price * volume;
              volume_in = volume_in + volume;  
            }
          }  
        }
        if ( volume_in > 0 ) return( NormalizeDouble( price_in / volume_in, _Digits ) );
      }
      else
      {
        Print( "Не возможно получить историю позиции по символу ", aSymbol );
      }
    }
    else
    {
      Print( "Не возможно определить идентификатор позиции по символу ", aSymbol );
    }
  }
  return( 0 );
}

мы всё-равно обращаемся к билету ордера(order_ticket),

на основании которого была совершена сделка(т.е без билета ОРДЕРА не обойтись). 

Я думал, что даже при частичном исполнении

ордера ему присваевается ORDER_POSITION_ID, но я ошибался, ORDER_POSITION_ID

присваевается ТОЛЬКО полностью исполненному ордеру. 

 

Mikalas:

Я думал, что даже при частичном исполнении

ордера ему присваевается ORDER_POSITION_ID, но я ошибался, ORDER_POSITION_ID

присваевается ТОЛЬКО полностью исполненному ордеру. 

А если неисполненную часть ордера снять, то ID появляется?
 
Dima_S:
А если неисполненную часть ордера снять, то ID появляется?
Да, но уже в истории...
 
Mikalas:
Да, но уже в истории...
А если закрыть позицию, а неисполненную часть ордера не снимать и она откроет (или изменит) уже другую позицию?
 
Mikalas:

Но я хотел это реализовать через ордера (у меня бывает, что частично исполненый ордер "стоит" пару-тройку дней),

Да, такое бывает на бирже и эти ситуации надо учитывать. Это один из фундаментальных недостатков лимитных заявок. 

Mikalas:

...

мы всё-равно обращаемся к билету ордера(order_ticket),

на основании которого была совершена сделка(т.е без билета ОРДЕРА не обойтись). 

...

 В Вашем примере я думаю можно заменить:

ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) );

На:

int deals = HistoryDealsTotal();
for( int i = 0; i < deals; i++ )
{
   ulong deal_ticket = HistoryDealGetTicket(i);
   ENUM_DEAL_TYPE type = (ENUM_DEAL_TYPE)HistoryDealGetInteger(deal_ticket, DEAL_TYPE);
   ENUM_DEAL_ENTRY entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket, DEAL_ENTRY);
   if((type == DEAL_TYPE_BUY || type == DEAL_TYPE_SELL) && entry = DEAL_ENTRY_IN)
   {
      double price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
      double volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );                       
      price_in = price_in + price * volume;
      volume_in = volume_in + volume; 
   }
}

 Т.к. все сделки типа buy и sell инициированы каким-то ордером.