syntax = "proto2";

option go_package = "/openapi";

option java_multiple_files = true;

option java_generate_equals_and_hash = true;

option java_package = "com.xtrader.protocol.openapi.v2.model";

option java_outer_classname = "ContainerOpenApiV2ModelMessages";

enum ProtoOAPayloadType {
    PROTO_OA_APPLICATION_AUTH_REQ = 2100;
    PROTO_OA_APPLICATION_AUTH_RES = 2101;
    PROTO_OA_ACCOUNT_AUTH_REQ = 2102;
    PROTO_OA_ACCOUNT_AUTH_RES = 2103;
    PROTO_OA_VERSION_REQ = 2104;
    PROTO_OA_VERSION_RES = 2105;
    PROTO_OA_NEW_ORDER_REQ = 2106;
    PROTO_OA_TRAILING_SL_CHANGED_EVENT = 2107;
    PROTO_OA_CANCEL_ORDER_REQ = 2108;
    PROTO_OA_AMEND_ORDER_REQ = 2109;
    PROTO_OA_AMEND_POSITION_SLTP_REQ = 2110;
    PROTO_OA_CLOSE_POSITION_REQ = 2111;
    PROTO_OA_ASSET_LIST_REQ = 2112;
    PROTO_OA_ASSET_LIST_RES = 2113;
    PROTO_OA_SYMBOLS_LIST_REQ = 2114;
    PROTO_OA_SYMBOLS_LIST_RES = 2115;
    PROTO_OA_SYMBOL_BY_ID_REQ = 2116;
    PROTO_OA_SYMBOL_BY_ID_RES = 2117;
    PROTO_OA_SYMBOLS_FOR_CONVERSION_REQ = 2118;
    PROTO_OA_SYMBOLS_FOR_CONVERSION_RES = 2119;
    PROTO_OA_SYMBOL_CHANGED_EVENT = 2120;
    PROTO_OA_TRADER_REQ = 2121;
    PROTO_OA_TRADER_RES = 2122;
    PROTO_OA_TRADER_UPDATE_EVENT = 2123;
    PROTO_OA_RECONCILE_REQ = 2124;
    PROTO_OA_RECONCILE_RES = 2125;
    PROTO_OA_EXECUTION_EVENT = 2126;
    PROTO_OA_SUBSCRIBE_SPOTS_REQ = 2127;
    PROTO_OA_SUBSCRIBE_SPOTS_RES = 2128;
    PROTO_OA_UNSUBSCRIBE_SPOTS_REQ = 2129;
    PROTO_OA_UNSUBSCRIBE_SPOTS_RES = 2130;
    PROTO_OA_SPOT_EVENT = 2131;
    PROTO_OA_ORDER_ERROR_EVENT = 2132;
    PROTO_OA_DEAL_LIST_REQ = 2133;
    PROTO_OA_DEAL_LIST_RES = 2134;
    PROTO_OA_SUBSCRIBE_LIVE_TRENDBAR_REQ = 2135;
    PROTO_OA_UNSUBSCRIBE_LIVE_TRENDBAR_REQ = 2136;
    PROTO_OA_GET_TRENDBARS_REQ = 2137;
    PROTO_OA_GET_TRENDBARS_RES = 2138;
    PROTO_OA_EXPECTED_MARGIN_REQ = 2139;
    PROTO_OA_EXPECTED_MARGIN_RES = 2140;
    PROTO_OA_MARGIN_CHANGED_EVENT = 2141;
    PROTO_OA_ERROR_RES = 2142;
    PROTO_OA_CASH_FLOW_HISTORY_LIST_REQ = 2143;
    PROTO_OA_CASH_FLOW_HISTORY_LIST_RES = 2144;
    PROTO_OA_GET_TICKDATA_REQ = 2145;
    PROTO_OA_GET_TICKDATA_RES = 2146;
    PROTO_OA_ACCOUNTS_TOKEN_INVALIDATED_EVENT = 2147;
    PROTO_OA_CLIENT_DISCONNECT_EVENT = 2148;
    PROTO_OA_GET_ACCOUNTS_BY_ACCESS_TOKEN_REQ = 2149;
    PROTO_OA_GET_ACCOUNTS_BY_ACCESS_TOKEN_RES = 2150;
    PROTO_OA_GET_CTID_PROFILE_BY_TOKEN_REQ = 2151;
    PROTO_OA_GET_CTID_PROFILE_BY_TOKEN_RES = 2152;
    PROTO_OA_ASSET_CLASS_LIST_REQ = 2153;
    PROTO_OA_ASSET_CLASS_LIST_RES = 2154;
    PROTO_OA_DEPTH_EVENT = 2155;
    PROTO_OA_SUBSCRIBE_DEPTH_QUOTES_REQ = 2156;
    PROTO_OA_SUBSCRIBE_DEPTH_QUOTES_RES = 2157;
    PROTO_OA_UNSUBSCRIBE_DEPTH_QUOTES_REQ = 2158;
    PROTO_OA_UNSUBSCRIBE_DEPTH_QUOTES_RES = 2159;
    PROTO_OA_SYMBOL_CATEGORY_REQ = 2160;
    PROTO_OA_SYMBOL_CATEGORY_RES = 2161;
    PROTO_OA_ACCOUNT_LOGOUT_REQ = 2162;
    PROTO_OA_ACCOUNT_LOGOUT_RES = 2163;
    PROTO_OA_ACCOUNT_DISCONNECT_EVENT = 2164;
    PROTO_OA_SUBSCRIBE_LIVE_TRENDBAR_RES = 2165;
    PROTO_OA_UNSUBSCRIBE_LIVE_TRENDBAR_RES = 2166;
    PROTO_OA_MARGIN_CALL_LIST_REQ = 2167;
    PROTO_OA_MARGIN_CALL_LIST_RES = 2168;
    PROTO_OA_MARGIN_CALL_UPDATE_REQ = 2169;
    PROTO_OA_MARGIN_CALL_UPDATE_RES = 2170;
    PROTO_OA_MARGIN_CALL_UPDATE_EVENT = 2171;
    PROTO_OA_MARGIN_CALL_TRIGGER_EVENT = 2172;
    PROTO_OA_REFRESH_TOKEN_REQ = 2173;
    PROTO_OA_REFRESH_TOKEN_RES = 2174;
    PROTO_OA_ORDER_LIST_REQ = 2175;
    PROTO_OA_ORDER_LIST_RES = 2176;
    PROTO_OA_GET_DYNAMIC_LEVERAGE_REQ = 2177;
    PROTO_OA_GET_DYNAMIC_LEVERAGE_RES = 2178;
    PROTO_OA_DEAL_LIST_BY_POSITION_ID_REQ = 2179;
    PROTO_OA_DEAL_LIST_BY_POSITION_ID_RES = 2180;
    PROTO_OA_ORDER_DETAILS_REQ = 2181;
    PROTO_OA_ORDER_DETAILS_RES = 2182;
    PROTO_OA_ORDER_LIST_BY_POSITION_ID_REQ = 2183;
    PROTO_OA_ORDER_LIST_BY_POSITION_ID_RES = 2184;
    PROTO_OA_DEAL_OFFSET_LIST_REQ = 2185;
    PROTO_OA_DEAL_OFFSET_LIST_RES = 2186;
    PROTO_OA_GET_POSITION_UNREALIZED_PNL_REQ = 2187;
    PROTO_OA_GET_POSITION_UNREALIZED_PNL_RES = 2188;
}

/** Asset entity. */
message ProtoOAAsset {
    required int64 assetId = 1; // The unique asset ID.
    required string name = 2; // The asset name.
    optional string displayName = 3; // User friendly name.
    optional int32 digits = 4; // Precision of the asset.
}

/** Trading symbol entity. */
message ProtoOASymbol {
    required int64 symbolId = 1; // The unique identifier of the symbol in specific server environment within cTrader platform. Different servers have different IDs.
    required int32 digits = 2; // Number of price digits to be displayed.
    required int32 pipPosition = 3; // Pip position on digits.
    optional bool enableShortSelling = 4; // If TRUE then the short selling with the symbol is enabled.
    optional bool guaranteedStopLoss = 5; // If TRUE then setting of guaranteedStopLoss is available for limited risk accounts.
    optional ProtoOADayOfWeek swapRollover3Days = 6 [default = MONDAY]; // Day of the week when SWAP charge amount will be tripled. Doesn't impact Rollover Commission.
    optional double swapLong = 7; // SWAP charge for long positions.
    optional double swapShort = 8; // SWAP charge for short positions.
    optional int64 maxVolume = 9; // Maximum allowed volume in cents for an order with a symbol.
    optional int64 minVolume = 10; // Minimum allowed volume in cents for an order with a symbol.
    optional int64 stepVolume = 11; // Step of the volume in cents for an order.
    optional uint64 maxExposure = 12; // Value of max exposure per symbol, per account. Blocks execution if breached.
    repeated ProtoOAInterval schedule = 13; // Symbol trading interval, specified in seconds starting from SUNDAY 00:00 in specified time zone.
    optional int64 commission = 14 [deprecated = true]; // Commission base amount. Total commission depends on commissionType. Use preciseTradingCommissionRate.
    optional ProtoOACommissionType commissionType = 15 [default = USD_PER_MILLION_USD]; // Commission type. See ProtoOACommissionType for details.
    optional uint32 slDistance = 16; // Minimum allowed distance between stop loss and current market price.
    optional uint32 tpDistance = 17; // Minimum allowed distance between take profit and current market price.
    optional uint32 gslDistance = 18; // Minimum allowed distance between guaranteed stop loss and current market price.
    optional int64 gslCharge = 19; // Guaranteed stop loss fee.
    optional ProtoOASymbolDistanceType distanceSetIn = 20 [default = SYMBOL_DISTANCE_IN_POINTS]; // Unit of distance measure for slDistance, tpDistance, gslDistance.
    optional int64 minCommission = 21 [deprecated = true]; // Minimum commission amount per trade. Use preciseMinCommission.
    optional ProtoOAMinCommissionType minCommissionType = 22 [default = CURRENCY]; // Minimum commission Type. See ProtoOAMinCommissionType for details.
    optional string minCommissionAsset = 23 [default = "USD"]; // Currency for minimum commission. (USD or quote currency).
    optional int64 rolloverCommission = 24; // Administrative Fee, charged instead of Swaps if the Account is marked as a "Shariah Compliant (Swap Free)". The Administrative Fee is charged daily as USD per current open volume of Position in lots. The Account charged in the Deposit currency.
    optional int32 skipRolloverDays = 25; // Initial period before the first rolloverCommission will be charged on the account.
    optional string scheduleTimeZone = 26; // Time zone for the symbol trading intervals.
    optional ProtoOATradingMode tradingMode = 27 [default = ENABLED]; // Rules for trading with the symbol. See ProtoOATradingMode for details.
    optional ProtoOADayOfWeek rolloverCommission3Days = 28 [default = MONDAY]; // Day of the week (in UTC) when Administrative Fee charge amount will be tripled. Applied only if RolloverChargePeriod = 0 or 1.
    optional ProtoOASwapCalculationType swapCalculationType = 29 [default = PIPS]; // Specifies type of SWAP computation as PIPS (0) or PERCENTAGE (1, annual, in percent).
    optional int64 lotSize = 30; // Lot size of the Symbol (in cents).
    optional int64 preciseTradingCommissionRate = 31; // Commission base amount. Total commission depends on commissionType: for non-percentage types it is multiplied by 10^8, for percentage of value commission type it is multiplied by 10^5.
    optional int64 preciseMinCommission = 32; // Minimum commission amount per trade multiplied by 10^8.
    repeated ProtoOAHoliday holiday = 33; // List of holidays for this symbol specified by broker.
    optional int32 pnlConversionFeeRate = 34; // Percentage (1 = 0.01%) of the realized Gross Profit, which will be paid by the Trader for any trade if the Quote Asset of the traded Symbol is not matched with the Deposit Asset.
    optional int64 leverageId = 35; // The unique identifier of dynamic leverage entity. https://help.ctrader.com/ctrader/trading/dynamic-leverage
    optional int32 swapPeriod = 36; // Period of charging swaps in hours. 24 means swaps will be charged 1 time per day, 12 - every 12 hours, 8 - every 8 hours, etc.
    optional int32 swapTime = 37; // Time in minutes from 00:00 (UTC) when intraday swaps are charged for the first time.
    optional int32 skipSWAPPeriods = 38; // Count of swapPeriods before the first SWAP charge.
    optional bool chargeSwapAtWeekends = 39; // If enabled, SWAP will be charged for all days of the week, including Saturday and Sunday.
    optional string measurementUnits = 40;  // Specifies the units in which the base Asset of the Symbol is denominated.
}

/** Lightweight symbol entity. */
message ProtoOALightSymbol {
    required int64 symbolId = 1; // The unique identifier of the symbol in specific server environment within cTrader platform. Different brokers might have different IDs.
    optional string symbolName = 2; // Name of the symbol (e.g. EUR/USD).
    optional bool enabled = 3; // If TRUE then symbol is visible for traders.
    optional int64 baseAssetId = 4; // Base asset.
    optional int64 quoteAssetId = 5; // Quote asset.
    optional int64 symbolCategoryId = 6; // Id of the symbol category used for symbols grouping.
    optional string description = 7;
    optional double sortingNumber = 8; // The number used for sorting Symbols in the UI (lowest number should appear at the top).
}

message ProtoOAArchivedSymbol {
    required int64 symbolId = 1; // The unique identifier of the symbol in specific server environment within cTrader platform. Different brokers might have different IDs.
    required string name = 2; // Name of the symbol (e.g. EUR/USD).
    required int64 utcLastUpdateTimestamp = 3; // The Unix time in milliseconds of the last update of the symbol.
    optional string description = 4; // Description of the symbol.
}

/** Symbol category entity. */
message ProtoOASymbolCategory {
    required int64 id = 1; // The unique identifier of the symbol category.
    required int64 assetClassId = 2; // Link to the asset class. One asset class can have many symbol categories.
    required string name = 3; // Category name.
    optional double sortingNumber = 4; // The number used for sorting Symbol Categories in the UI (lowest number should appear at the top).
}

enum ProtoOADayOfWeek {
    NONE = 0;
    MONDAY = 1;
    TUESDAY = 2;
    WEDNESDAY = 3;
    THURSDAY = 4;
    FRIDAY = 5;
    SATURDAY = 6;
    SUNDAY = 7;
}

/** Symbol trading session entity. */
message ProtoOAInterval {
    required uint32 startSecond = 3; // Interval start, specified in seconds starting from SUNDAY 00:00 in specified time zone (inclusive to the interval).
    required uint32 endSecond = 4; // Interval end, specified in seconds starting from SUNDAY 00:00 in specified time zone (exclusive from the interval).
}

/** Enum for specifying type of trading commission. */
enum ProtoOACommissionType {
    USD_PER_MILLION_USD = 1; // USD per million USD volume - usually used for FX. Example: 50 USD for 1 mil USD of trading volume.
    USD_PER_LOT = 2; // USD per 1 lot - usually used for CFDs and futures for commodities, and indices. Example: 15 USD for 1 contract.
    PERCENTAGE_OF_VALUE = 3; // Percentage of trading volume - usually used for Equities. Example: 0.005% of notional trading volume. Multiplied by 100,000.
    QUOTE_CCY_PER_LOT = 4; // Quote ccy of Symbol per 1 lot - will be used for CFDs and futures for commodities, and indices. Example: 15 EUR for 1 contract of DAX.
}

/** Enum for specifying stop loss and take profit distances. */
enum ProtoOASymbolDistanceType {
    SYMBOL_DISTANCE_IN_POINTS = 1;
    SYMBOL_DISTANCE_IN_PERCENTAGE = 2;
}

/** Enum for specifying type of minimum trading commission. */
enum ProtoOAMinCommissionType {
    CURRENCY = 1;
    QUOTE_CURRENCY = 2;
}

/** Enum for specifying symbol trading mode. */
enum ProtoOATradingMode {
    ENABLED = 0;
    DISABLED_WITHOUT_PENDINGS_EXECUTION = 1;
    DISABLED_WITH_PENDINGS_EXECUTION = 2;
    CLOSE_ONLY_MODE = 3;
}

/** Enum for specifying SWAP calculation type for symbol. */
enum ProtoOASwapCalculationType {
    PIPS = 0; //Specifies type of SWAP computation as PIPS (0)
    PERCENTAGE = 1; //Specifies type of SWAP computation as PERCENTAGE (1, annual, in percent)
    POINTS = 2; // Specifies type of SWAP computation as POINTS (2)
}

/** Enum for specifying access right for a trader. */
enum ProtoOAAccessRights {
    FULL_ACCESS = 0; // Enable all trading.
    CLOSE_ONLY = 1; // Only closing trading request are enabled.
    NO_TRADING = 2; // View only access.
    NO_LOGIN = 3; // No access.
}

/** Enum for specifying margin calculation type for an account. */
enum ProtoOATotalMarginCalculationType {
    MAX = 0;
    SUM = 1;
    NET = 2;
}

/** Enum for specifying type of an account. */
enum ProtoOAAccountType {
    HEDGED = 0; // Allows multiple positions on a trading account for a symbol.
    NETTED = 1; // Only one position per symbol is allowed on a trading account.
    SPREAD_BETTING = 2; // Spread betting type account.
}

/** Trading account entity. */
message ProtoOATrader {
    required int64 ctidTraderAccountId = 1; // The unique Trader's Account ID used to match the responses to the Trader's Account.
    required int64 balance = 2; // Current account balance.
    optional int64 balanceVersion = 3; // Balance version used to identify the final balance. Increments each time when the trader's account balance is changed.
    optional int64 managerBonus = 4; // Amount of broker's bonus allocated to the account.
    optional int64 ibBonus = 5; // Amount of introducing broker bonus allocated to the account.
    optional int64 nonWithdrawableBonus = 6; // Broker's bonus that cannot be withdrew from the account as cash.
    optional ProtoOAAccessRights accessRights = 7 [default = FULL_ACCESS]; // Access rights that an owner has to the account in cTrader platform. See ProtoOAAccessRights for details.
    required int64 depositAssetId = 8; // Deposit currency of the account.
    optional bool swapFree = 9; // If TRUE then account is Shariah compliant.
    optional uint32 leverageInCents = 10; // Account leverage (e.g. If leverage = 1:50 then value = 5000).
    optional ProtoOATotalMarginCalculationType totalMarginCalculationType = 11; // Margin computation type for the account (MAX, SUM, NET).
    optional uint32 maxLeverage = 12; // Maximum allowed leverage for the account. Used as validation when a Trader can change leverage value.
    optional bool frenchRisk = 13 [deprecated = true]; // If TRUE then account is AMF compliant. Use isLimitedRisk and limitedRiskMarginCalculationStrategy.
    optional int64 traderLogin = 14; // ID of the account that is unique per server (Broker).
    optional ProtoOAAccountType accountType = 15 [default = HEDGED]; // Account type: HEDGED, NETTED, etc.
    optional string brokerName = 16; // Some whitelabel assigned to trader by broker at the moment of account creation.
    optional int64 registrationTimestamp = 17; // The Unix timestamp in milliseconds of the account registration. Should be used as minimal date in historical data requests.
    optional bool isLimitedRisk = 18; // If TRUE then account is compliant to use specific margin calculation strategy. Such accounts are require to have guaranteed stop loss on all positions.
    optional ProtoOALimitedRiskMarginCalculationStrategy limitedRiskMarginCalculationStrategy = 19 [default = ACCORDING_TO_LEVERAGE]; // Special strategy used in margin calculations for this account (if account isLimitedRisk).
    optional uint32 moneyDigits = 20; // Specifies the exponent of the monetary values. E.g. moneyDigits = 8 must be interpret as business value multiplied by 10^8, then real balance would be 10053099944 / 10^8 = 100.53099944. Affects balance, managerBonus, ibBonus, nonWithdrawableBonus.
    optional bool fairStopOut = 21; // If TRUE - Position is fully closed on Stop Out, if FALSE - smart (partial closing) Stop Out is applied, if unspecified  - Stop Out format is determined by Broker.
    optional ProtoOAStopOutStrategy stopOutStrategy = 22 [default = MOST_MARGIN_USED_FIRST]; //The Stop Out strategy that is used for this Trader. The Trader can change the value in the cTrader UI if this option is not disabled by the Broker
}

/** Position status ENUM. */
enum ProtoOAPositionStatus {
    POSITION_STATUS_OPEN = 1;
    POSITION_STATUS_CLOSED = 2;
    POSITION_STATUS_CREATED = 3; // Empty position is created for pending order.
    POSITION_STATUS_ERROR = 4;
}

/** Trader side ENUM. Used for order, position, deal. */
enum ProtoOATradeSide {
    BUY = 1;
    SELL = 2;
}

/** Order type ENUM. */
enum ProtoOAOrderType {
    MARKET = 1;
    LIMIT = 2;
    STOP = 3;
    STOP_LOSS_TAKE_PROFIT = 4;
    MARKET_RANGE = 5;
    STOP_LIMIT = 6;
}

/** Order's time in force ENUM. */
enum ProtoOATimeInForce {
    GOOD_TILL_DATE = 1;
    GOOD_TILL_CANCEL = 2;
    IMMEDIATE_OR_CANCEL = 3;
    FILL_OR_KILL = 4;
    MARKET_ON_OPEN = 5;
}

/** Order status ENUM. */
enum ProtoOAOrderStatus {
    ORDER_STATUS_ACCEPTED = 1; // Order request validated and accepted for execution.
    ORDER_STATUS_FILLED = 2; // Order is fully filled.
    ORDER_STATUS_REJECTED = 3; // Order is rejected due to validation.
    ORDER_STATUS_EXPIRED = 4; // Order expired. Might be valid for orders with partially filled volume that were expired on LP.
    ORDER_STATUS_CANCELLED = 5; // Order is cancelled. Might be valid for orders with partially filled volume that were cancelled by LP.
}

/** Stop Order and Stop Loss triggering method ENUM. */
enum ProtoOAOrderTriggerMethod {
    TRADE = 1; // Stop Order: buy is triggered by ask, sell by bid; Stop Loss Order: for buy position is triggered by bid and for sell position by ask.
    OPPOSITE = 2; // Stop Order: buy is triggered by bid, sell by ask; Stop Loss Order: for buy position is triggered by ask and for sell position by bid.
    DOUBLE_TRADE = 3; // The same as TRADE, but trigger is checked after the second consecutive tick.
    DOUBLE_OPPOSITE = 4; // The same as OPPOSITE, but trigger is checked after the second consecutive tick.
}

/** Trade position entity. */
message ProtoOAPosition {
    required int64 positionId = 1; // The unique ID of the position. Note: trader might have two positions with the same id if positions are taken from accounts from different brokers.
    required ProtoOATradeData tradeData = 2; // Position details. See ProtoOATradeData for details.
    required ProtoOAPositionStatus positionStatus = 3; // Current status of the position.
    required int64 swap = 4; // Total amount of charged swap on open position.
    optional double price = 5; // VWAP price of the position based on all executions (orders) linked to the position.
    optional double stopLoss = 6; // Current stop loss price.
    optional double takeProfit = 7; // Current take profit price.
    optional int64 utcLastUpdateTimestamp = 8; // The Unix time in milliseconds of the last change of the position, including amend SL/TP of the position, execution of related order, cancel or related order, etc.
    optional int64 commission = 9; // Current unrealized commission related to the position.
    optional double marginRate = 10; // Rate for used margin computation. Represented as Base/Deposit.
    optional int64 mirroringCommission = 11; // Amount of unrealized commission related to following of strategy provider.
    optional bool guaranteedStopLoss = 12; // If TRUE then position's stop loss is guaranteedStopLoss.
    optional uint64 usedMargin = 13; // Amount of margin used for the position in deposit currency.
    optional ProtoOAOrderTriggerMethod stopLossTriggerMethod = 14 [default = TRADE]; // Stop trigger method for SL/TP of the position.
    optional uint32 moneyDigits = 15; // Specifies the exponent of the monetary values. E.g. moneyDigits = 8 must be interpret as business value multiplied by 10^8, then real balance would be 10053099944 / 10^8 = 100.53099944. Affects swap, commission, mirroringCommission, usedMargin.
    optional bool trailingStopLoss = 16; //If TRUE then the Trailing Stop Loss is applied.
}

/** Position/order trading details entity. */
message ProtoOATradeData {
    required int64 symbolId = 1; // The unique identifier of the symbol in specific server environment within cTrader platform. Different brokers might have different IDs.
    required int64 volume = 2; // Volume in cents (e.g. 1000 in protocol means 10.00 units).
    required ProtoOATradeSide tradeSide = 3; // Buy, Sell.
    optional int64 openTimestamp = 4; // The Unix time in milliseconds when position was opened or order was created.
    optional string label = 5; // Text label specified during order request.
    optional bool guaranteedStopLoss = 6; // If TRUE then position/order stop loss is guaranteedStopLoss.
    optional string comment = 7; // User-specified comment.
    optional string measurementUnits = 8; // Specifies the units in which the Symbol is denominated.
    optional uint64 closeTimestamp = 9; // The Unix time in milliseconds when a Position was closed
}

/** Trade order entity. */
message ProtoOAOrder {
    required int64 orderId = 1; // The unique ID of the order. Note: trader might have two orders with the same id if orders are taken from accounts from different brokers.
    required ProtoOATradeData tradeData = 2; // Detailed trader data.
    required ProtoOAOrderType orderType = 3; // Order type.
    required ProtoOAOrderStatus orderStatus = 4; // Order status.
    optional int64 expirationTimestamp = 6; // The Unix time in milliseconds of expiration if the order has time in force GTD.
    optional double executionPrice = 7; // Price at which an order was executed. For order with FILLED status.
    optional int64 executedVolume = 8; // Part of the volume that was filled in cents (e.g. 1000 in protocol means 10.00 units).
    optional int64 utcLastUpdateTimestamp = 9; // The Unix time in milliseconds of the last update of the order.
    optional double baseSlippagePrice = 10; // Used for Market Range order with combination of slippageInPoints to specify price range were order can be executed.
    optional int64 slippageInPoints = 11; // Used for Market Range and STOP_LIMIT orders to to specify price range were order can be executed.
    optional bool closingOrder = 12; // If TRUE then the order is closing part of whole position. Must have specified positionId.
    optional double limitPrice = 13; // Valid only for LIMIT orders.
    optional double stopPrice = 14; // Valid only for STOP and STOP_LIMIT orders.
    optional double stopLoss = 15; // Absolute stopLoss price.
    optional double takeProfit = 16; // Absolute takeProfit price.
    optional string clientOrderId = 17; // Optional ClientOrderId. Max Length = 50 chars.
    optional ProtoOATimeInForce timeInForce = 18 [default = IMMEDIATE_OR_CANCEL]; // Order's time in force. Depends on order type.
    optional int64 positionId = 19; // ID of the position linked to the order (e.g. closing order, order that increase volume of a specific position, etc.).
    optional int64 relativeStopLoss = 20; // Relative stopLoss that can be specified instead of absolute as one. Specified in 1/100000 of unit of a price. (e.g. 123000 in protocol means 1.23, 53423782 means 534.23782) For BUY stopLoss = entryPrice - relativeStopLoss, for SELL stopLoss = entryPrice + relativeStopLoss.
    optional int64 relativeTakeProfit = 21; // Relative takeProfit that can be specified instead of absolute one. Specified in 1/100000 of unit of a price. (e.g. 123000 in protocol means 1.23, 53423782 means 534.23782) ForBUY takeProfit = entryPrice + relativeTakeProfit, for SELL takeProfit = entryPrice - relativeTakeProfit.
    optional bool isStopOut = 22; // If TRUE then order was stopped out from server side.
    optional bool trailingStopLoss = 23; // If TRUE then order is trailingStopLoss. Valid for STOP_LOSS_TAKE_PROFIT order.
    optional ProtoOAOrderTriggerMethod stopTriggerMethod = 24 [default = TRADE]; // Trigger method for the order. Valid only for STOP and STOP_LIMIT orders.
}

/** Execution event type ENUM. */
enum ProtoOAExecutionType {
    ORDER_ACCEPTED = 2; // Order passed validation.
    ORDER_FILLED = 3; // Order filled.
    ORDER_REPLACED = 4; // Pending order is changed with a new one.
    ORDER_CANCELLED = 5; // Order cancelled.
    ORDER_EXPIRED = 6; // Order with GTD time in force is expired.
    ORDER_REJECTED = 7; // Order is rejected due to validations.
    ORDER_CANCEL_REJECTED = 8; // Cancel order request is rejected.
    SWAP = 9; // Type related to SWAP execution events.
    DEPOSIT_WITHDRAW = 10; // Type related to event of deposit or withdrawal cash flow operation.
    ORDER_PARTIAL_FILL = 11; // Order is partially filled.
    BONUS_DEPOSIT_WITHDRAW = 12; // Type related to event of bonus deposit or bonus withdrawal.
}

/** Bonus deposit/withdrawal entity. */
message ProtoOABonusDepositWithdraw {
    required ProtoOAChangeBonusType operationType = 1; // Type of the operation. Deposit/Withdrawal.
    required int64 bonusHistoryId = 2; // The unique ID of the bonus deposit/withdrawal operation.
    required int64 managerBonus = 3; // Total amount of broker's bonus after the operation.
    required int64 managerDelta = 4; // Amount of bonus deposited/withdrew by manager.
    required int64 ibBonus = 5; // Total amount of introducing broker's bonus after the operation.
    required int64 ibDelta = 6; // Amount of bonus deposited/withdrew by introducing broker.
    required int64 changeBonusTimestamp = 7; // The Unix time in milliseconds when the bonus operation was executed.
    optional string externalNote = 8; // Note added to operation. Visible to the trader.
    optional int64 introducingBrokerId = 9; // ID of introducing broker who deposited/withdrew bonus.
    optional uint32 moneyDigits = 10; // Specifies the exponent of the monetary values. E.g. moneyDigits = 8 must be interpret as business value multiplied by 10^8, then real balance would be 10053099944 / 10^8 = 100.53099944. Affects managerBonus, managerDelta, ibBonus, ibDelta.
}

/** Bonus operation type ENUM. */
enum ProtoOAChangeBonusType {
    BONUS_DEPOSIT = 0;
    BONUS_WITHDRAW = 1;
}

/** Account deposit/withdrawal operation entity. */
message ProtoOADepositWithdraw {
    required ProtoOAChangeBalanceType operationType = 1; // Type of the operation. Deposit/Withdrawal.
    required int64 balanceHistoryId = 2; // The unique ID of the deposit/withdrawal operation.
    required int64 balance = 3; // Account balance after the operation was executed.
    required int64 delta = 4; // Amount of deposit/withdrawal operation.
    required int64 changeBalanceTimestamp = 5; // The Unix time in milliseconds when deposit/withdrawal operation was executed.
    optional string externalNote = 6; // Note added to operation. Visible to the trader.
    optional int64 balanceVersion = 7; // Balance version used to identify the final balance. Increments each time when the trader's account balance is changed.
    optional int64 equity = 8; // Total account's equity after balance operation was executed.
    optional uint32 moneyDigits = 9; // Specifies the exponent of the monetary values. E.g. moneyDigits = 8 must be interpret as business value multiplied by 10^8, then real balance would be 10053099944 / 10^8 = 100.53099944. Affects balance, delta, equity.
}

/** Balance operation entity. Covers all cash movement operations related to account, trading, IB operations, mirroring, etc. */
enum ProtoOAChangeBalanceType {
    BALANCE_DEPOSIT = 0; // Cash deposit.
    BALANCE_WITHDRAW = 1; // Cash withdrawal.
    BALANCE_DEPOSIT_STRATEGY_COMMISSION_INNER = 3; // Received mirroring commission.
    BALANCE_WITHDRAW_STRATEGY_COMMISSION_INNER = 4; // Paid mirroring commission.
    BALANCE_DEPOSIT_IB_COMMISSIONS = 5; // For IB account. Commissions paid by trader.
    BALANCE_WITHDRAW_IB_SHARED_PERCENTAGE = 6; // For IB account. Withdrawal of commissions shared with broker.
    BALANCE_DEPOSIT_IB_SHARED_PERCENTAGE_FROM_SUB_IB = 7; // For IB account. Commissions paid by sub-ibs.
    BALANCE_DEPOSIT_IB_SHARED_PERCENTAGE_FROM_BROKER = 8; // For IB account. Commissions paid by broker.
    BALANCE_DEPOSIT_REBATE = 9; // Deposit rebate for trading volume for period.
    BALANCE_WITHDRAW_REBATE = 10; // Withdrawal of rebate.
    BALANCE_DEPOSIT_STRATEGY_COMMISSION_OUTER = 11; // Mirroring commission.
    BALANCE_WITHDRAW_STRATEGY_COMMISSION_OUTER = 12; // Mirroring commission.
    BALANCE_WITHDRAW_BONUS_COMPENSATION = 13; // For IB account. Share commission with the Broker.
    BALANCE_WITHDRAW_IB_SHARED_PERCENTAGE_TO_BROKER = 14; // IB commissions.
    BALANCE_DEPOSIT_DIVIDENDS = 15; // Deposit dividends payments.
    BALANCE_WITHDRAW_DIVIDENDS = 16; // Negative dividend charge for short position.
    BALANCE_WITHDRAW_GSL_CHARGE = 17; // Charge for guaranteedStopLoss.
    BALANCE_WITHDRAW_ROLLOVER = 18; // Charge of rollover fee for Shariah compliant accounts.
    BALANCE_DEPOSIT_NONWITHDRAWABLE_BONUS = 19; // Broker's operation to deposit bonus.
    BALANCE_WITHDRAW_NONWITHDRAWABLE_BONUS = 20; // Broker's operation to withdrawal bonus.
    BALANCE_DEPOSIT_SWAP = 21; // Deposits of negative SWAP.
    BALANCE_WITHDRAW_SWAP = 22; // SWAP charges.

    BALANCE_DEPOSIT_MANAGEMENT_FEE = 27; // Mirroring commission.
    BALANCE_WITHDRAW_MANAGEMENT_FEE = 28; // Mirroring commission. Deprecated since 7.1 in favor of BALANCE_WITHDRAW_COPY_FEE (34).
    BALANCE_DEPOSIT_PERFORMANCE_FEE = 29; // Mirroring commission.
    BALANCE_WITHDRAW_FOR_SUBACCOUNT = 30; // Withdraw for subaccount creation (cTrader Copy).
    BALANCE_DEPOSIT_TO_SUBACCOUNT = 31; // Deposit to subaccount on creation (cTrader Copy).
    BALANCE_WITHDRAW_FROM_SUBACCOUNT = 32; // Manual user's withdraw from subaccount (cTrader Copy), to parent account.
    BALANCE_DEPOSIT_FROM_SUBACCOUNT = 33; // Manual user's deposit to subaccount (cTrader Copy), from parent account.
    BALANCE_WITHDRAW_COPY_FEE = 34; // Withdrawal fees to Strategy Provider.
    BALANCE_WITHDRAW_INACTIVITY_FEE = 35; // Withdraw of inactivity fee from the balance.
    BALANCE_DEPOSIT_TRANSFER = 36; // Deposit within the same server (from another account).
    BALANCE_WITHDRAW_TRANSFER = 37; // Withdraw within the same server (to another account).
    BALANCE_DEPOSIT_CONVERTED_BONUS = 38; // Bonus being converted from virtual bonus to real deposit.
    BALANCE_DEPOSIT_NEGATIVE_BALANCE_PROTECTION = 39; // Applies if negative balance protection is configured by broker, should make balance = 0.
}

/** Execution entity. */
message ProtoOADeal {
    required int64 dealId = 1; // The unique ID of the execution deal.
    required int64 orderId = 2; // Source order of the deal.
    required int64 positionId = 3; // Source position of the deal.
    required int64 volume = 4; // Volume sent for execution, in cents.
    required int64 filledVolume = 5; // Filled volume, in cents.
    required int64 symbolId = 6; // The unique identifier of the symbol in specific server environment within cTrader platform. Different servers have different IDs.
    required int64 createTimestamp = 7; // The Unix time in milliseconds when the deal was sent for execution.
    required int64 executionTimestamp = 8; // The Unix time in milliseconds when the deal was executed.
    optional int64 utcLastUpdateTimestamp = 9; // The Unix time in milliseconds when the deal was created, executed or rejected.
    optional double executionPrice = 10; // Execution price.
    required ProtoOATradeSide tradeSide = 11; // Buy/Sell.
    required ProtoOADealStatus dealStatus = 12; // Status of the deal.
    optional double marginRate = 13; // Rate for used margin computation. Represented as Base/Deposit.
    optional int64 commission = 14; // Amount of trading commission associated with the deal.
    optional double baseToUsdConversionRate = 15; // Base to USD conversion rate on the time of deal execution.
    optional ProtoOAClosePositionDetail closePositionDetail = 16; // Closing position detail. Valid only for closing deal.
    optional uint32 moneyDigits = 17; // Specifies the exponent of the monetary values. E.g. moneyDigits = 8 must be interpret as business value multiplied by 10^8, then real balance would be 10053099944 / 10^8 = 100.53099944. Affects commission.
}

/** Deal details for ProtoOADealOffsetListReq. */
message ProtoOADealOffset {
    required int64 dealId = 1; // The unique ID of the execution Deal.
    required int64 volume = 2; // Matched volume, in cents.
    optional int64 executionTimestamp = 3; // The Unix time in milliseconds when the offset Deal was executed.
    optional double executionPrice = 4; //  Execution price of the offset Deal.
}

/** Deal status ENUM. */
enum ProtoOADealStatus {
    FILLED = 2; // Deal filled.
    PARTIALLY_FILLED = 3; // Deal is partially filled.
    REJECTED = 4; // Deal is correct but was rejected by liquidity provider (e.g. no liquidity).
    INTERNALLY_REJECTED = 5; // Deal rejected by server (e.g. no price quotes).
    ERROR = 6; // Deal is rejected by LP due to error (e.g. symbol is unknown).
    MISSED = 7; // Liquidity provider did not sent response on the deal during specified execution time period.
}

/** Trading details for closing deal. */
message ProtoOAClosePositionDetail {
    required double entryPrice = 1; // Position price at the moment of filling the closing order.
    required int64 grossProfit = 2; // Amount of realized gross profit after closing deal execution.
    required int64 swap = 3; // Amount of realized swap related to closed volume.
    required int64 commission = 4; // Amount of realized commission related to closed volume.
    required int64 balance = 5; // Account balance after closing deal execution.
    optional double quoteToDepositConversionRate = 6; // Quote/Deposit currency conversion rate on the time of closing deal execution.
    optional int64 closedVolume = 7; // Closed volume in cents.
    optional int64 balanceVersion = 8; // Balance version of the account related to closing deal operation.
    optional uint32 moneyDigits = 9; // Specifies the exponent of the monetary values. E.g. moneyDigits = 8 must be interpret as business value multiplied by 10^8, then real balance would be 10053099944 / 10^8 = 100.53099944. Affects grossProfit, swap, commission, balance, pnlConversionFee.
    optional int64 pnlConversionFee = 10; // Fee for conversion applied to the Deal in account's ccy when trader symbol's quote asset id <> ProtoOATrader.depositAssetId.
}

/** Trendbar period ENUM. */
enum ProtoOATrendbarPeriod {
    M1 = 1;
    M2 = 2;
    M3 = 3;
    M4 = 4;
    M5 = 5;
    M10 = 6;
    M15 = 7;
    M30 = 8;
    H1 = 9;
    H4 = 10;
    H12 = 11;
    D1 = 12;
    W1 = 13;
    MN1 = 14;
}

/** Historical Trendbar entity. */
message ProtoOATrendbar {
    required int64 volume = 3; // Bar volume in ticks.
    optional ProtoOATrendbarPeriod period = 4 [default = M1]; // Bar period.
    optional int64 low = 5; // Low price of the bar.
    optional uint64 deltaOpen = 6; // Delta between open and low price. open = low + deltaOpen.
    optional uint64 deltaClose = 7; // Delta between close and low price. close = low + deltaClose.
    optional uint64 deltaHigh = 8; // Delta between high and low price. high = low + deltaHigh.
    optional uint32 utcTimestampInMinutes = 9; // The Unix time in minutes of the bar, equal to the timestamp of the open tick.
}

/** Expected margin computation entity. */
message ProtoOAExpectedMargin {
    required int64 volume = 1; // Volume in cents used for computation of expected margin.
    required int64 buyMargin = 2; // Buy margin amount.
    required int64 sellMargin = 3; // Sell margin amount.
}

/** Price quote type. */
enum ProtoOAQuoteType {
    BID = 1;
    ASK = 2;
}

/** Historical tick data type. */
message ProtoOATickData {
    required int64 timestamp = 1; // The Unix time in milliseconds of the tick. See ProtoOAGetTickDataRes.tickData for details.
    required int64 tick = 2; // Tick price.
}

/** Open API application permission in regards to token ENUM. */
enum ProtoOAClientPermissionScope {
    SCOPE_VIEW = 0; // Allows to use only view commends. Trade is prohibited.
    SCOPE_TRADE = 1; // Allows to use all commands.
}

/** Trader profile entity. Empty due to GDPR. */
message ProtoOACtidProfile {
    required int64 userId = 1;
}

/** Trader account entity. */
message ProtoOACtidTraderAccount {
    required uint64 ctidTraderAccountId = 1; // Unique identifier of the trader's account. Used to match responses to trader's accounts.cTrader platform. Different brokers might have different ids
    optional bool isLive = 2; // If TRUE then the account is belong to Live environment and live host must be used to authorize it
    optional int64 traderLogin = 3; // TraderLogin for a specific account. Value is displayed on Client App UI
    optional int64 lastClosingDealTimestamp = 4; // The Unix time in milliseconds of the last ProtoOAClosePositionDetail happened to this account.
    optional int64 lastBalanceUpdateTimestamp = 5; // The Unix time in milliseconds of the last ProtoOADepositWithdraw happened to this account.
    optional string brokerTitleShort = 6; // The name of the broker to which the account belongs to. Shortened to be displayed in the UI.
}

/** Asset class entity. */
message ProtoOAAssetClass {
    optional int64 id = 1; // Unique asset ID.
    optional string name = 2; // Asset class name.
    optional double sortingNumber = 3; // The number used for sorting Asset Classes in the UI (lowest number should appear at the top).
}

/** Depth of market entity. */
message ProtoOADepthQuote {
    required uint64 id = 1; // Quote ID.
    required uint64 size = 3; // Quote size in cents.
    optional uint64 bid = 4; // Bid price for bid quotes.
    optional uint64 ask = 5; // Ask price for ask quotes.
}

/** Margin call entity, specifies threshold for exact margin call type. Only 3 instances of margin calls are supported, identified by marginCallType. See ProtoOANotificationType for details. */
message ProtoOAMarginCall {
    required ProtoOANotificationType marginCallType = 1; // Type of margin call. All margin calls are similar, only difference is in marginLevelThreshold.
    required double marginLevelThreshold = 2; // Margin level threshold for margin call.
    optional int64 utcLastUpdateTimestamp = 3; // The Unix time in milliseconds of the last update of the margin call.
}

/** Type of notification, currently only 3 instances of marginCall are supported. */
enum ProtoOANotificationType {
    MARGIN_LEVEL_THRESHOLD_1 = 61; // one of three margin calls, they are all similar.
    MARGIN_LEVEL_THRESHOLD_2 = 62; // one of three margin calls, they are all similar.
    MARGIN_LEVEL_THRESHOLD_3 = 63; // one of three margin calls, they are all similar.
}

/** Error code ENUM. */
enum ProtoOAErrorCode {
    // Authorization
    OA_AUTH_TOKEN_EXPIRED = 1; // When token used for account authorization is expired.
    ACCOUNT_NOT_AUTHORIZED = 2; // When account is not authorized.
    RET_NO_SUCH_LOGIN = 12; // When such account no longer exists.
    ALREADY_LOGGED_IN = 14; // When client tries to authorize after it was already authorized.
    RET_ACCOUNT_DISABLED = 64; // When account is disabled.
    CH_CLIENT_AUTH_FAILURE = 101; // Open API client is not activated or wrong client credentials.
    CH_CLIENT_NOT_AUTHENTICATED = 102; // When a command is sent for not authorized Open API client.
    CH_CLIENT_ALREADY_AUTHENTICATED = 103; // Client is trying to authenticate twice.
    CH_ACCESS_TOKEN_INVALID = 104; // Access token is invalid.
    CH_SERVER_NOT_REACHABLE = 105; // Trading service is not available.
    CH_CTID_TRADER_ACCOUNT_NOT_FOUND = 106; // Trading account is not found.
    CH_OA_CLIENT_NOT_FOUND = 107; // Could not find this client id.

    // General
    REQUEST_FREQUENCY_EXCEEDED = 108; // Request frequency is reached.
    SERVER_IS_UNDER_MAINTENANCE = 109; // Server is under maintenance.
    CHANNEL_IS_BLOCKED = 110; // Operations are not allowed for this account.
    CONNECTIONS_LIMIT_EXCEEDED = 67; // Limit of connections is reached for this Open API client.
    WORSE_GSL_NOT_ALLOWED = 68; // Not allowed to increase risk for Positions with Guaranteed Stop Loss.
    SYMBOL_HAS_HOLIDAY = 69; // Trading disabled because symbol has holiday.

    // Pricing
    NOT_SUBSCRIBED_TO_SPOTS = 112; // When trying to subscribe to depth, trendbars, etc. without spot subscription.
    ALREADY_SUBSCRIBED = 113; // When subscription is requested for an active.
    SYMBOL_NOT_FOUND = 114; // Symbol not found.
    UNKNOWN_SYMBOL = 115; // Note: to be merged with SYMBOL_NOT_FOUND.
    INCORRECT_BOUNDARIES = 35; // When requested period (from,to) is too large or invalid values are set to from/to.

    // Trading
    NO_QUOTES = 117; // Trading cannot be done as not quotes are available. Applicable for Book B.
    NOT_ENOUGH_MONEY = 118; // Not enough funds to allocate margin.
    MAX_EXPOSURE_REACHED = 119; // Max exposure limit is reached for a {trader, symbol, side}.
    POSITION_NOT_FOUND = 120; // Position not found.
    ORDER_NOT_FOUND = 121; // Order not found.
    POSITION_NOT_OPEN = 122; // When trying to close a position that it is not open.
    POSITION_LOCKED = 123; // Position in the state that does not allow to perform an operation.
    TOO_MANY_POSITIONS = 124; // Trading account reached its limit for max number of open positions and orders.
    TRADING_BAD_VOLUME = 125; // Invalid volume.
    TRADING_BAD_STOPS = 126; // Invalid stop price.
    TRADING_BAD_PRICES = 127; // Invalid price (e.g. negative).
    TRADING_BAD_STAKE = 128; // Invalid stake volume (e.g. negative).
    PROTECTION_IS_TOO_CLOSE_TO_MARKET = 129; // Invalid protection prices.
    TRADING_BAD_EXPIRATION_DATE = 130; // Invalid expiration.
    PENDING_EXECUTION = 131; // Unable to apply changes as position has an order under execution.
    TRADING_DISABLED = 132; // Trading is blocked for the symbol.
    TRADING_NOT_ALLOWED = 133; // Trading account is in read only mode.
    UNABLE_TO_CANCEL_ORDER = 134; // Unable to cancel order.
    UNABLE_TO_AMEND_ORDER = 135; // Unable to amend order.
    SHORT_SELLING_NOT_ALLOWED = 136; // Short selling is not allowed.
}

enum ProtoOALimitedRiskMarginCalculationStrategy {
    ACCORDING_TO_LEVERAGE = 0;
    ACCORDING_TO_GSL = 1;
    ACCORDING_TO_GSL_AND_LEVERAGE = 2;
}

message ProtoOAHoliday {
    required int64 holidayId = 1; // Unique ID of holiday.
    required string name = 2; // Name of holiday.
    optional string description = 3; // Description of holiday.
    required string scheduleTimeZone = 4; // Timezone used for holiday.
    required int64 holidayDate = 5; // Amount of days from 1st Jan 1970, multiply it by 86400000 to get Unix time in milliseconds.
    required bool isRecurring = 6; // If TRUE, then the holiday happens each year.
    optional int32 startSecond = 7; // Amount of seconds from 00:00:00 of the holiday day when holiday actually starts.
    optional int32 endSecond = 8; // Amount of seconds from 00:00:00 of the holiday day when holiday actually finishes.
}

message ProtoOADynamicLeverage {
    required int64 leverageId = 1; // Unique ID of dynamic leverage.
    repeated ProtoOADynamicLeverageTier tiers = 2; // Tiers sorted by volume. Last tier's leverage is applied also to volume above specified.
}

message ProtoOADynamicLeverageTier {
    required int64 volume = 1; // Max USD volume (in cents) of the Open Position (per side) to apply specified leverage. Last tier's leverage is applied also to volume above specified.
    required int32 leverage = 2; // Applied leverage.
}

message ProtoOAPositionUnrealizedPnL {
    required int64 positionId = 1; // The position ID.
    required int64 grossUnrealizedPnL = 2; // The gross unrealized PnL of the position denoted in the account deposit currency.
    required int64 netUnrealizedPnL = 3; // The net unrealized PnL of the position denoted in the account deposit currency. It does not include potential closing commission.
}

enum ProtoOAStopOutStrategy {//The strategy for choosing which Position to close during a Stop Out
    MOST_MARGIN_USED_FIRST = 0; //A Stop Out strategy that closes a Position with the largest Used Margin
    MOST_LOSING_FIRST = 1; //A Stop Out strategy that closes a Position with the least PnL
}
