Автоматическая инициализация и переинициализация эксперта из файла - страница 7

 
Fry_Антон:

Понятно.

Конкретика: завтра буду думать как ловить позицию "на лету" на ФОРТС. Мне по сути больше всего надо знать реальную цену открытия позиции, которая прошла клиринг (переоткрылась по цене клиринга).

Позиция на ФОРТС набирается суммой сделок по одному (или нескольким ордерам). На клиринге происходит техническая сделка без тикета, надо придумать, как определить цену POSITION_PRICE_OPEN, которая была до клиринга.

Ее можно хранить. Только определиться со сроком жизни нужно. Например, забывать, если советник вне рынка (позиций нет).
 
Dmitry Fedoseev:

Очевидно, что если:

То нужно продолжать долбить. Но по крайней мере, точно не блокировать эксперта. Может быть менее нагло долбить, по мере увеличения количества ошибок увеличивать паузу между попытками. Самое простое решение - несколько попыток и пауза до открытия следующего бара.

А как же быть со штрафами Биржи за превышение 2 000 транзакций? Допустим, у меня 50 советников, прошло 2 000 транзакций. Что делать дальше, получать денежные штрафы от Биржи? 
 
Fry_Антон:

Понятно.

Конкретика: завтра буду думать как ловить позицию "на лету" на ФОРТС. Мне по сути больше всего надо знать реальную цену открытия позиции, которая прошла клиринг (переоткрылась по цене клиринга).

Позиция на ФОРТС набирается суммой сделок по одному (или нескольким ордерам). На клиринге происходит техническая сделка без тикета, надо придумать, как определить цену POSITION_PRICE_OPEN, которая была до клиринга.

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

отлично! Завтра прикручу её.

Кучу времени Вы мне сэкономили. Спасибо.

 
Fry_Антон:

отлично! Завтра прикручу её.

Кучу времени Вы мне сэкономили. Спасибо.

Памятка:

Зта функция рассчитана ТОЛЬКО на входящие сделки!

(т. е уменьшения позиции не было) 

Если Вам нужно то, и другое, то добавьте в функцию DEAL_ENTRY_OUT

 

 

 
Михаил:

Памятка:

Зта функция рассчитана ТОЛЬКО на входящие сделки!

(т. е уменьшения позиции не было) 

Если Вам нужно то, и другое, то добавьте в функцию DEAL_ENTRY_OUT

 

 

это я сразу понял. Тут важен сам принцип: перебор по ID в истории и по сути это полный ответ на вопрос выше.


Честно говоря не понимаю логику разработчиков, почему они решили клиринговую техническую сделку оформить так "топорно".

И графические объекты на чартах, и свойства позиции в истории, и, тем более, свойства открытой позиции (доходность) - всё вводит в заблуждение не только простой код в советнике, но вообще любого трейдера.

 
kond777:
А как же быть со штрафами Биржи за превышение 2 000 транзакций? Допустим, у меня 50 советников, прошло 2 000 транзакций. Что делать дальше, получать денежные штрафы от Биржи? 

Вы не поучите ответ на свой вопрос.

Чтобы не получать штрафы, нужно останавливать работу эксперта (мы с Вами это давно обговаривали).

Если наш чудо-программер скажет, что надо останавливать, он тем

самым признает себя ....., ничего не смыляшем в программировании

экспертов для биржевой торговли.... 

 
Михаил:

Вы не поучите ответ на свой вопрос.

Чтобы не получать штрафы, нужно останавливать работу эксперта (мы с Вами это давно обговаривали).

Если наш чудо-программер скажет, что надо останавливать, он тем

самым признает себя ....., ничего не смыляшем в программировании

экспертов для биржевой торговли.... 

По моему мнению, Dmitry Fedoseev производит впечатление знающего человека, я полагаю, он наверняка сможет предложить решение этой проблемы.
 
Михаил:

Да потому, что Вы Дмитрий советуете человеку то, что хорошо для МТ4, и совершенно "фиалетово" в МТ5!

Из Ваших сообщений совершенно очевидно, то Вы совсем не представляете, как работает МТ5. 

А уж позорный принцип программирования экспертов или нет - это не Вам судить!

Вы, для меня, ВООБЩЕ не авторитет, а нахальный задиристый мальчишка! 

Завидуете? Ну и правильно,- лучше быть молодым щенком, чем старой райской птицей. 
 
Алексей Тарабанов:
Завидуете? Ну и правильно,- лучше быть молодым щенком, чем старой райской птицей. 
В луже газов прибавилось...