Сохранить уровень цены позиции через клиринг (можно?)

 

 Добрый день! Собственно вопрос: возможно ли советника научить переносить позицию через клиринг сохраняя цену позиции, которая была до закрытия рынка на клиринг?

Сейчас получается так: после клиринга цена позиции смещается на уровень цены открытия рынка и в случае если уходили на клиринг в минусе то оказываемся на нуле и если уходим в плюс то срабатывает трейлинг или тейк, что приводит к убытку в этой сделке по факту (если до клиринга минус был больше чем заданный тейк или трал).

искал по разделу возможно похожие вопросы и наткнулся вот на это (сам не программирую по этому, код "прочитать" не могу), может это то что мне нужно?

Заранее спасибо за ответы! 

  

Получение "чистой" цены позиции, без учёта клирингов:

//+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice( const string aSymbol )
{
  double price_in = 0;
  double volume_in = 0;
  double price_out = 0;
  double volume_out = 0;
  double price = 0;
  double volume = 0;
  
  if ( PositionSelect( aSymbol ) )
  {
    ulong pos_id = ulong( PositionGetInteger( POSITION_IDENTIFIER ) );
    
    if ( pos_id > 0 )
    {
      if ( HistorySelectByPosition( 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 )
            {
              price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_in += price * volume;
              volume_in += volume;  
            }
            else
            if ( deal_entry == DEAL_ENTRY_OUT )
            {
              price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_out += price * volume;
              volume_out += volume;  
            }
          }
        }
        if ( volume_out > 0 )
        {
          if ( volume_in > 0 ) { price_in = price_in / volume_in; } else return( 0 );
          price_out = price_out / volume_out;
          price = ( price_in - price_out ) * ( volume_in - volume_out );
        }
        else
        {
          if ( volume_in > 0 ) { price = price_in / volume_in; } else return( 0 );
        }
        return( NormalizeDouble( price, _Digits ) );
      }
      else
      {
        Print( "GetPositionPrice: Невозможно получить историю позиции по символу ", aSymbol );
      }
    }
    else
    {
      Print( "GetPositionPrice: Невозможно определить идентификатор позиции по символу ", aSymbol );
    }
  }
  return( 0 );
} 
 

Запросите историю сделок по ID позиции функцией HistorySelectByPosition() (ID позиции не меняется при клиринге) и найдите в этой истории первую сделку позиции. Ну и получите цену этой сделки.

ЗЫ. Ответил, не прочитав ваш код. Сейчас прочитал - так правильно же всё, так и надо делать. Один нюанс: этот код вычисляет средневзвешенную цену позиции, т.е. ту, которая была бы, если бы у позиции были доливки и/или частичные закрытия. Если же нужна просто цена самого первого открытия позиции, то это цена её первой сделки. А если всё-таки нужна взвешенная цена без учёта клирингов, то эта функция именно её и считает.

 
Разработчики обещали подумать над этим, чтобы позиции не разрывались. А то согласен, не совсем удобно. В том числе эти разрывы на клирингах записываются как ложные сделки в историю сделок.
 
mr.plugged:

 Добрый день! Собственно вопрос: возможно ли советника научить переносить позицию через клиринг сохраняя цену позиции, которая была до закрытия рынка на клиринг?

Сейчас получается так: после клиринга цена позиции смещается на уровень цены открытия рынка и в случае если уходили на клиринг в минусе то оказываемся на нуле и если уходим в плюс то срабатывает трейлинг или тейк, что приводит к убытку в этой сделке по факту (если до клиринга минус был больше чем заданный тейк или трал).

искал по разделу возможно похожие вопросы и наткнулся вот на это (сам не программирую по этому, код "прочитать" не могу), может это то что мне нужно?

Заранее спасибо за ответы! 

  

Получение "чистой" цены позиции, без учёта клирингов:

Нет, нельзя.
 
ottenand:
Разработчики обещали подумать над этим, чтобы позиции не разрывались. А то согласен, не совсем удобно. В том числе эти разрывы на клирингах записываются как ложные сделки в историю сделок.

Это крайне не удобно как при использование советника так и при ручной торговле.

 
Бред какой-то. Это в мт5 так?
Явная недоботка MQ
 
Yuriy Asaulenko:
Бред какой-то. Это в мт5 так?
Нет, везде так (это особенность торговли на ФОРТС)
 
prostotrader:
Нет, везде так (это особенность торговли на ФОРТС)
Ну не надо. У меня, не в МТ, таких даже вопросов не возникало. Есть цена открытия,
Так сохраните ее и все дела. Если мт не удосужился.
 
Yuriy Asaulenko:
Ну не надо. У меня, не в МТ, таких даже вопросов не возникало. Есть цена открытия,
Так сохраните ее и все дела.
А что за НЕ МТ?
 
prostotrader:
А что за НЕ МТ?
Любой биржевой терминал. Имхо
 МТ к таковым не относится.)
 
Yuriy Asaulenko:
Любой биржевой терминал. Имхо
 МТ к таковым не относится.)
Был задан вопрос "КАКОЙ?"
Причина обращения: