Обработка тиков и ордеров¶
В этом разделе описан порядок обработки новых тиков в группах клиентов, а также проверка и срабатывание отложенных ордеров и стоп-уровней позиций (Stop Loss, Take Profit, Stop Out).
Основные этапы обработки¶
- Поступает тик по символу AAABBB.
- Текущая цена открытых позиций и отложенных ордеров по символу AAABBB обновляется (
TradeRecord::close_price). -
Для отложенных ордеров по AAABBB:
- Если ордер не обрабатывается через STP-шлюз (
ConGatewayRule), вызывается hookSrvTradePendingsFilter(по умолчанию возвращаетRET_OK_NONE). - Если hook возвращает
RET_OK, далее проверяется, активировал ли новый тик отложенный ордер. - Если hook возвращает не
RET_OK, дальнейшая проверка активации выполняется только если для группы символов не установлен режим "Только вручную, без автоматизации" (ConGroupSec::execution). - Если ордер сработал, он запоминается для дальнейшей активации.
- Если ордер не обрабатывается через STP-шлюз (
-
Для позиций (не отложенных ордеров) по AAABBB:
- Пересчитывается прибыль (
TradeRecord::close_profit) по новой цене. - Если стоп-уровни не через STP-шлюз, проверяется срабатывание Take Profit.
- Если Take Profit достигнут, вызывается hook
SrvTradeStopsFilter(по умолчанию возвращаетRET_OK_NONE):- Если hook возвращает
RET_OK, закрытие позиции по Take Profit выполняется безусловно. - Если hook возвращает не
RET_OK, дальнейшее закрытие по Take Profit происходит только при режиме "Только автоматически" или если нет онлайн-дилеров в режиме "Вручную, но автоматически при отсутствии дилеров".
- Если hook возвращает
- Проверяется правило FIFO, если оно включено для группы (
ConGroup::close_fifo). - Готовится закрытие позиции: пересчитываются прибыль и конверсия.
- Вызывается hook
SrvTradeStopsApply(по умолчанию возвращаетRET_OK):- Если hook возвращает
RET_OK, позиция закрывается и начисляется агентская комиссия. Если цена закрытия изменилась, прибыль и курсы пересчитываются. - Если не
RET_OK, закрытие по Take Profit пропускается до следующего срабатывания.
- Если hook возвращает
- Аналогично проверяется и срабатывает Stop Loss.
- Пересчитывается прибыль (
-
Активируются отложенные ордера из пункта 3.
- Hook
SrvTradePendingsFilterвызывается повторно (по умолчаниюRET_OK_NONE):- Если hook возвращает
RET_OK, отложенный ордер активируется безусловно. - Если не
RET_OK, активация происходит только при режиме "Только автоматически" или при отсутствии онлайн-дилеров в соответствующем режиме.
- Если hook возвращает
- Проверяется разрешение на открытие новых позиций (
ConSymbol::trade). Если открытие запрещено, ордер удаляется с комментарием "deleted [close only]". - Проверяется маржа клиента. Если средств недостаточно, ордер удаляется с комментарием "deleted [no money]".
- Проверяется запрет хеджирования (
ConGroup::hedge_prohibited). Если хеджирование запрещено, ордер удаляется с комментарием "deleted [hedge is prohibited]". - Готовится новая позиция вместо отложенного ордера: рассчитывается комиссия, начальная прибыль и курсы.
- Вызывается hook
SrvTradePendingsApply(по умолчаниюRET_OK):- Если hook возвращает
RET_OK, отложенный ордер активируется. Если цена изменилась, прибыль и курсы пересчитываются. - Если не
RET_OK, сервер пропускает дальнейшую активацию.
- Если hook возвращает
- Hook
-
Если Stop Out не обрабатывается через STP-шлюз, проверяются требования по марже:
- Для всех счетов, где пересчитаны позиции (см. п. 4), сравнивается уровень маржи с условиями Stop Out.
- Для счетов, достигших Stop Out, находится позиция для закрытия (наибольший убыток, подлежит FIFO).
- Готовится закрытие позиции. Вызывается hook
SrvTradeStopoutsFilter(по умолчаниюRET_OK_NONE):- Если hook возвращает
RET_OK, Stop Out обрабатывается безусловно. - Если не
RET_OK, Stop Out исполняется только при режиме "Только автоматически" или при отсутствии онлайн-дилеров.
- Если hook возвращает
- Вызывается hook
SrvTradeStopoutsApply(по умолчаниюRET_OK):- Если hook возвращает
RET_OK, позиция закрывается и начисляется агентская комиссия. Если цена закрытия изменилась, прибыль и курсы пересчитываются. - Если не
RET_OK, закрытие по Stop Out пропускается до следующего срабатывания.
- Если hook возвращает