syntax = "proto3";

package tinkoff.public.invest.api.contract.v1;

option go_package = "./;investapi";
option java_package = "ru.tinkoff.piapi.contract.v1";
option java_multiple_files = true;
option csharp_namespace = "Tinkoff.InvestApi.V1";
option objc_class_prefix = "TIAPI";
option php_namespace = "Tinkoff\\Invest\\V1";

import "google/protobuf/timestamp.proto";
import "t_tech/invest/grpc/google/api/field_behavior.proto";
import "t_tech/invest/grpc/common.proto";

service StopOrdersService { /* Сервис для работы со стоп-заявками: выставление, отмена, получение списка стоп-заявок.*/

  //PostStopOrder — выставить стоп-заявку
  rpc PostStopOrder(PostStopOrderRequest) returns (PostStopOrderResponse);

  //GetStopOrders — получить список активных стоп-заявок по счету
  rpc GetStopOrders(GetStopOrdersRequest) returns (GetStopOrdersResponse);

  //CancelStopOrder — отменить стоп-заявку
  rpc CancelStopOrder(CancelStopOrderRequest) returns (CancelStopOrderResponse);
}

//Запрос выставления стоп-заявки.
message PostStopOrderRequest {
  optional string figi = 1 [ deprecated = true ]; //Deprecated FIGI-идентификатор инструмента. Используйте `instrument_id`.
  int64 quantity = 2 [(google.api.field_behavior) = REQUIRED]; //Количество лотов.
  optional Quotation price = 3; //Цена за 1 инструмент биржевой заявки, которая будет выставлена при срабатывании по достижению `stop_price`. Чтобы получить стоимость лота, нужно умножить на лотность инструмента.
  optional Quotation stop_price = 4; //Стоп-цена заявки за 1 инструмент. При достижении стоп-цены происходит активация стоп-заявки, в результате чего выставляется биржевая заявка. Чтобы получить стоимость лота, нужно умножить на лотность инструмента.
  StopOrderDirection direction = 5 [(google.api.field_behavior) = REQUIRED]; //Направление операции.
  string account_id = 6 [(google.api.field_behavior) = REQUIRED]; //Номер счета.
  StopOrderExpirationType expiration_type = 7 [(google.api.field_behavior) = REQUIRED]; //Тип экспирации заявки.
  StopOrderType stop_order_type = 8 [(google.api.field_behavior) = REQUIRED]; //Тип заявки.
  optional google.protobuf.Timestamp expire_date = 9; //Дата и время окончания действия стоп-заявки по UTC. Для `ExpirationType = GoodTillDate` заполнение обязательно, для `GoodTillCancel` игнорируется.
  string instrument_id = 10 [(google.api.field_behavior) = REQUIRED]; //Идентификатор инструмента. Принимает значение `figi`, `instrument_uid` или `ticker + '_' + class_code`.
  ExchangeOrderType exchange_order_type = 11; //Тип дочерней биржевой заявки.
  TakeProfitType take_profit_type = 12; //Подтип стоп-заявки — `TakeProfit`.
  TrailingData trailing_data = 13; //Массив с параметрами трейлинг-стопа.
  PriceType price_type = 14; //Тип цены.
  string order_id = 15 [(google.api.field_behavior) = REQUIRED]; //Идентификатор запроса выставления поручения для целей идемпотентности в формате `UID`. Максимальная длина — 36 символов.
  bool confirm_margin_trade = 16; //Согласие на выставление заявки, которая может привести к непокрытой позиции, по умолчанию false.
  optional bool instant_execution = 17; //Признак необходимости моментальной активации, используется только для трейлинг-стопа.
  message TrailingData {
      Quotation indent = 1; //Отступ.
      TrailingValueType indent_type = 2; //Тип величины отступа.
      Quotation spread = 3; //Размер защитного спреда.
      TrailingValueType spread_type = 4; //Тип величины защитного спреда.
  }
}

//Результат выставления стоп-заявки.
message PostStopOrderResponse {
  string stop_order_id = 1; //Уникальный идентификатор стоп-заявки.
  string order_request_id = 2; //Идентификатор ключа идемпотентности, переданный клиентом, в формате `UID`. Максимальная длина 36 — символов.
  ResponseMetadata response_metadata = 254; //Метадата.
}

//Запрос получения списка активных стоп-заявок.
message GetStopOrdersRequest {
  string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Идентификатор счета клиента.
  StopOrderStatusOption status = 2; //Статус заявок.
  google.protobuf.Timestamp from = 3; //Левая граница.
  google.protobuf.Timestamp to = 4; //Правая граница.
}

//Список активных стоп-заявок.
message GetStopOrdersResponse {
  repeated StopOrder stop_orders = 1; //Массив стоп-заявок по счету.
}

//Запрос отмены выставленной стоп-заявки.
message CancelStopOrderRequest {
  string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Идентификатор счета клиента.
  string stop_order_id = 2 [(google.api.field_behavior) = REQUIRED]; //Уникальный идентификатор стоп-заявки.
}

//Результат отмены выставленной стоп-заявки.
message CancelStopOrderResponse {
  google.protobuf.Timestamp time = 1; //Время отмены заявки по UTC.
}

//Информация о стоп-заявке.
message StopOrder {
  string stop_order_id = 1; //Уникальный идентификатор стоп-заявки.
  int64 lots_requested = 2;  //Запрошено лотов.
  string figi = 3; //FIGI-идентификатор инструмента.
  StopOrderDirection direction = 4; //Направление операции.
  string currency = 5;  //Валюта стоп-заявки.
  StopOrderType order_type = 6; //Тип стоп-заявки.
  google.protobuf.Timestamp create_date = 7; //Дата и время выставления заявки по UTC.
  google.protobuf.Timestamp activation_date_time = 8; //Дата и время конвертации стоп-заявки в биржевую по UTC.
  google.protobuf.Timestamp expiration_time = 9; //Дата и время снятия заявки по UTC.
  MoneyValue price = 10; //Цена заявки за 1 инструмент. Чтобы получить стоимость лота, нужно умножить на лотность инструмента.
  MoneyValue stop_price = 11; //Цена активации стоп-заявки за 1 инструмент. Чтобы получить стоимость лота, нужно умножить на лотность инструмента.
  string instrument_uid = 12; //`instrument_uid`-идентификатор инструмента.
  TakeProfitType take_profit_type = 13; //Подтип стоп-заявки — `TakeProfit`.
  TrailingData trailing_data = 14; //Параметры трейлинг-стопа.
  StopOrderStatusOption status = 15; //Статус заявки.
  ExchangeOrderType exchange_order_type = 16; //Тип дочерней биржевой заявки для тейкпрофита.
  optional string exchange_order_id = 17; //Идентификатор биржевой заявки.
  string ticker = 18; //Тикер инструмента.
  string class_code = 19; //Класс-код (секция торгов).
  bool instant_execution = 20; //Признак необходимости моментальной активации, используется только для трейлинг-стопа.
  message TrailingData {
    Quotation indent = 1; //Отступ.
    TrailingValueType indent_type = 2; //Тип величины отступа.
    Quotation spread = 3; //Размер защитного спреда.
    TrailingValueType spread_type = 4; //Тип величины защитного спреда.
    TrailingStopStatus status = 5; //Статус трейлинг-стопа.
    Quotation price = 7; //Цена исполнения.
    Quotation extr = 8; //Локальный экстремум.
  }
}

//Направление сделки стоп-заявки.
enum StopOrderDirection {
  STOP_ORDER_DIRECTION_UNSPECIFIED = 0; //Значение не указано.
  STOP_ORDER_DIRECTION_BUY = 1; //Покупка.
  STOP_ORDER_DIRECTION_SELL = 2; //Продажа.
}

//Тип экспирации стоп-заявке.
enum StopOrderExpirationType {
  STOP_ORDER_EXPIRATION_TYPE_UNSPECIFIED = 0; //Значение не указано.
  STOP_ORDER_EXPIRATION_TYPE_GOOD_TILL_CANCEL = 1; //Действительно до отмены.
  STOP_ORDER_EXPIRATION_TYPE_GOOD_TILL_DATE = 2; //Действительно до даты снятия.
}

//Тип стоп-заявки.
enum StopOrderType {
  STOP_ORDER_TYPE_UNSPECIFIED = 0; //Значение не указано.
  STOP_ORDER_TYPE_TAKE_PROFIT = 1; //`Take-profit`-заявка.
  STOP_ORDER_TYPE_STOP_LOSS = 2; //`Stop-loss`-заявка.
  STOP_ORDER_TYPE_STOP_LIMIT = 3; //`Stop-limit`-заявка.
}

//Статус стоп-заяки.
enum StopOrderStatusOption {
    STOP_ORDER_STATUS_UNSPECIFIED = 0; //Значение не указано.
    STOP_ORDER_STATUS_ALL = 1; //Все заявки.
    STOP_ORDER_STATUS_ACTIVE = 2; //Активные заявки.
    STOP_ORDER_STATUS_EXECUTED = 3; //Исполненные заявки.
    STOP_ORDER_STATUS_CANCELED = 4; //Отмененные заявки.
    STOP_ORDER_STATUS_EXPIRED = 5; //Истекшие заявки.
}

//Тип выставляемой заявки.
enum ExchangeOrderType {
    EXCHANGE_ORDER_TYPE_UNSPECIFIED = 0; //Значение не указано.
    EXCHANGE_ORDER_TYPE_MARKET = 1; //Заявка по рыночной цене.
    EXCHANGE_ORDER_TYPE_LIMIT = 2; //Лимитная заявка.
}

//Тип TakeProfit-заявки.
enum TakeProfitType {
  TAKE_PROFIT_TYPE_UNSPECIFIED = 0; //Значение не указано.
  TAKE_PROFIT_TYPE_REGULAR = 1; //Обычная заявка, значение по умолчанию.
  TAKE_PROFIT_TYPE_TRAILING = 2; //Трейлинг-стоп.
}

//Тип параметров значений трейлинг-стопа.
enum TrailingValueType {
  TRAILING_VALUE_UNSPECIFIED = 0; //Значение не указано.
  TRAILING_VALUE_ABSOLUTE = 1; //Абсолютное значение в единицах цены.
  TRAILING_VALUE_RELATIVE = 2; //Относительное значение в процентах.
}

//Статус трейлинг-стопа.
enum TrailingStopStatus {
  TRAILING_STOP_UNSPECIFIED = 0; //Значение не указано.
  TRAILING_STOP_ACTIVE = 1; //Активный.
  TRAILING_STOP_ACTIVATED = 2; //Активированный.
}
