Skip to content

Обработка тиков и ордеров

В этом разделе описан порядок обработки новых тиков в группах клиентов, а также проверка и срабатывание отложенных ордеров и стоп-уровней позиций (Stop Loss, Take Profit, Stop Out).

Основные этапы обработки

  1. Поступает тик по символу AAABBB.
  2. Текущая цена открытых позиций и отложенных ордеров по символу AAABBB обновляется (TradeRecord::close_price).
  3. Для отложенных ордеров по AAABBB:

    • Если ордер не обрабатывается через STP-шлюз (ConGatewayRule), вызывается hook SrvTradePendingsFilter (по умолчанию возвращает RET_OK_NONE).
    • Если hook возвращает RET_OK, далее проверяется, активировал ли новый тик отложенный ордер.
    • Если hook возвращает не RET_OK, дальнейшая проверка активации выполняется только если для группы символов не установлен режим "Только вручную, без автоматизации" (ConGroupSec::execution).
    • Если ордер сработал, он запоминается для дальнейшей активации.
  4. Для позиций (не отложенных ордеров) по AAABBB:

    • Пересчитывается прибыль (TradeRecord::close_profit) по новой цене.
    • Если стоп-уровни не через STP-шлюз, проверяется срабатывание Take Profit.
    • Если Take Profit достигнут, вызывается hook SrvTradeStopsFilter (по умолчанию возвращает RET_OK_NONE):
      • Если hook возвращает RET_OK, закрытие позиции по Take Profit выполняется безусловно.
      • Если hook возвращает не RET_OK, дальнейшее закрытие по Take Profit происходит только при режиме "Только автоматически" или если нет онлайн-дилеров в режиме "Вручную, но автоматически при отсутствии дилеров".
    • Проверяется правило FIFO, если оно включено для группы (ConGroup::close_fifo).
    • Готовится закрытие позиции: пересчитываются прибыль и конверсия.
    • Вызывается hook SrvTradeStopsApply (по умолчанию возвращает RET_OK):
      • Если hook возвращает RET_OK, позиция закрывается и начисляется агентская комиссия. Если цена закрытия изменилась, прибыль и курсы пересчитываются.
      • Если не RET_OK, закрытие по Take Profit пропускается до следующего срабатывания.
    • Аналогично проверяется и срабатывает Stop Loss.
  5. Активируются отложенные ордера из пункта 3.

    • Hook SrvTradePendingsFilter вызывается повторно (по умолчанию RET_OK_NONE):
      • Если hook возвращает RET_OK, отложенный ордер активируется безусловно.
      • Если не RET_OK, активация происходит только при режиме "Только автоматически" или при отсутствии онлайн-дилеров в соответствующем режиме.
    • Проверяется разрешение на открытие новых позиций (ConSymbol::trade). Если открытие запрещено, ордер удаляется с комментарием "deleted [close only]".
    • Проверяется маржа клиента. Если средств недостаточно, ордер удаляется с комментарием "deleted [no money]".
    • Проверяется запрет хеджирования (ConGroup::hedge_prohibited). Если хеджирование запрещено, ордер удаляется с комментарием "deleted [hedge is prohibited]".
    • Готовится новая позиция вместо отложенного ордера: рассчитывается комиссия, начальная прибыль и курсы.
    • Вызывается hook SrvTradePendingsApply (по умолчанию RET_OK):
      • Если hook возвращает RET_OK, отложенный ордер активируется. Если цена изменилась, прибыль и курсы пересчитываются.
      • Если не RET_OK, сервер пропускает дальнейшую активацию.
  6. Если Stop Out не обрабатывается через STP-шлюз, проверяются требования по марже:

    • Для всех счетов, где пересчитаны позиции (см. п. 4), сравнивается уровень маржи с условиями Stop Out.
    • Для счетов, достигших Stop Out, находится позиция для закрытия (наибольший убыток, подлежит FIFO).
    • Готовится закрытие позиции. Вызывается hook SrvTradeStopoutsFilter (по умолчанию RET_OK_NONE):
      • Если hook возвращает RET_OK, Stop Out обрабатывается безусловно.
      • Если не RET_OK, Stop Out исполняется только при режиме "Только автоматически" или при отсутствии онлайн-дилеров.
    • Вызывается hook SrvTradeStopoutsApply (по умолчанию RET_OK):
      • Если hook возвращает RET_OK, позиция закрывается и начисляется агентская комиссия. Если цена закрытия изменилась, прибыль и курсы пересчитываются.
      • Если не RET_OK, закрытие по Stop Out пропускается до следующего срабатывания.