ФОРТС: В помощь начинающим - страница 3

 

Часто используемые и полезные функции: 

Проверка цены на лимиты сессии:

//+------------------------------------------------------------------+
//| Expert Check price range function                                |
//+------------------------------------------------------------------+
bool CheckPriceRange( const string a_symbol, const double price )
{
  double min_price = SymbolInfoDouble( a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MIN );
  double max_price = SymbolInfoDouble( a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MAX );
  if ( ( price >= min_price ) && ( price <= max_price ) )
  {
    return( true );
  }
  return( false );
}
 

Часто используемые и полезные функции: 

Переработанная функция GetPositionPrice():

//+------------------------------------------------------------------+
//| 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;
//---  
  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;  
            }
          }
        }
//---  
        price = price_in - price_out;
        volume = volume_in - volume_out;
//---
        if ( volume > 0 )
        {       
          return( NormalizeDouble( price / volume, _Digits ) );
        }
      }
      else
      {
        Print( "GetPositionPrice: Невозможно получить историю позиции по символу ", aSymbol );
      }
    }
    else
    {
      Print( "GetPositionPrice: Невозможно определить идентификатор позиции по символу ", aSymbol );
    }
  return( 0 );
} 
 

Небольшая правка в функции (для универсальности)

вместо:

if ( volume_in > 0 )
{
  return( NormalizeDouble( price_in / volume_in, _Digits ) );
}

 сделать так:

if ( volume_in > 0 )
{
  int symb_digits = int( SymbolInfoInteger( aSymbol, SYMBOL_DIGITS ) );
  return( NormalizeDouble( price_in / volume_in, symb_digits ) );
}
 
билд 1241. реальный счет. если установлен отложенный ордер и он частично исполнился, то при последующей его модификации состояние ордера не изменяется на ORDER_STATE_PLACED, а так и остаётся ORDER_STATE_PARTIAL.
 

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

А когда новая версия MT5 и где узнать что в ней ожидается

comp, 2016.03.21 08:52

Если, например, я сам это сделаю: открою реальный счет и выложу на форумы инвест-доступ к нему, чтобы все могли видеть реальный фид ФОРТС в реал-тайме и имели доступ к нормальному тестингу, то могут быть проблемы? Или все чисто?

 
Здравствуйте! А существует ли какой-нибудь простой шаблон торговой системы или пример советника для ФОРТС с учётом описанных в данной теме особенностей? Нужно чтобы он корректно работал с ордерами на ФОРТС.
 

"Рекомендация

При проектировании советников для ФОРТС не рекомендую использовать событие Tick, а

лучше воспользоваться событием BookEvent"

 Не разъяснено почему лучше, может в одних случаях лучше, в других лучше onTick. Нельзя ли поподробнее. 

 
Alexander:

"Рекомендация

При проектировании советников для ФОРТС не рекомендую использовать событие Tick, а

лучше воспользоваться событием BookEvent"

 Не разъяснено почему лучше, может в одних случаях лучше, в других лучше onTick. Нельзя ли поподробнее. 

Автор в бане, и здесь ответа от него нескоро дождетесь.

Вот что я думаю по этому поводу:

Событие Tick приходит только когда меняется Bid, Ask, Last. Так же событие Tick накопительное (как говорили разработчики), за несколько изменений цены может придти один Tick.

Событие BookEvent приходит при любом изменении заявок в стакане и при совершении сделок. Событие BookEvent приходит гораздо чаще.

Если нет необходимости анализировать ликвидность в стакане, то лучше использовать OnTick().

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

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

из справки: 

Длина очереди транзакций составляет 1024 элемента. В случае, если OnTradeTransaction() будет обрабатывать очередную транзакцию слишком долго, старые транзакции в очереди могут быть вытеснены более новыми. 

 
Sergey Chalyshev:

Автор в бане, и здесь ответа от него нескоро дождетесь.

Да давненько уже Михаила выпустили из бани... Вот, аву поменял.
 
Alexey Kozitsyn:
Да давненько уже Михаила выпустили из бани... Вот, аву поменял.
Причем тут ава? На форуме писать у него нет возможности, вечный бан.