Helpdesk
  • Overview
    • Welcome to Finery Markets
    • About Our Products
      • FM Liquidity Match
        • Master Account
        • Sub-Account
      • FM Pulse
      • White Label solution
  • Product Features
    • Onboarding
    • Risk Management
    • Trading
      • Aggregated Order Book
      • Firm Order Book
      • Pending Limit Orders (GTC)
      • RFQ
      • Toxic Flow Protection
      • Markups
      • Authorized trading
      • Non-Deliverable Trading
      • Voice Trading
      • Interdealer Trading
    • Position Management
    • Settlements
      • Automated Settlements
      • Addresses
    • Control Center
      • Multi-Roles
      • Notifications
      • Reporting
      • Bulk Edit
    • Referral program
  • API Reference
    • Quick Start with API
      • For Market Makers
      • For Takers
    • Data Types
    • REST API
      • Client management
        • connectCounterparty
        • cancelConnectionInvite
        • getCounterpartyInfo
        • getSubaccounts
      • RFQ
        • getSettings
        • getSettings (authorized)
        • getUserSettings (authorized)
        • setUserSettings (authorized)
        • getProviders
        • getSessions
      • Trading
        • add
        • add (authorized)
        • Pending limit orders
          • add (pending limit order)
          • add (pending limit order) (authorized)
          • del
          • del (authorized)
          • delAll
          • delAll (authorized)
          • orders
          • orders (authorized)
        • mod
        • del
        • delAll
        • book
        • voiceTrade
        • liquidationTrade
        • dealHistory
        • dealHistory (authorized)
        • instruments
        • positions
        • instrumentMarkups
        • addInstrumentMarkups
        • delInstrumentMarkups
      • Settlements
        • settlementRequests
        • settlementOrders
        • settlementTransactions
        • settlementHistory
        • settlementTransactionHistory
        • addIncomingSettlementRequest
        • delIncomingSettlementRequest
        • delIncomingSettlementCPRequest
        • addOutgoingSettlementTransaction
        • addIncomingSettlementTransaction
        • sendSettlementTransaction
        • commitIncomingSettlementTransaction
        • delSettlementTransaction
      • Risk Management
        • climits
        • setCLimit
        • delCLimit
        • setSubaccountLimit
        • delSubaccountLimit
        • enableTrading
        • disableTrading
        • cAssetLimits
        • setCAssetLimit
        • delCAssetLimit
        • cShortSalesBan
        • setShortSalesBan
        • delShortSalesBan
        • enableInstrumentsWhitelist
        • setInstrumentsWhitelist
        • disableInstrumentsWhitelist
        • instrumentsWhitelist
      • Non-deliverable Trading
        • settings/getOvernightRates
        • settings/setOvernightRates
    • Websocket API
      • Feed 'A' - Assets
      • Feed 'P' - Positions
      • Feed 'L' - Counterparty limits
      • Feed 'B' - Global order books
      • Feed 'F' - Tradable order books
      • Feed 'R' - Settlement requests
      • Feed 'N' - Settlement transactions
      • Feed 'K' - Positions
      • Feed 'O' - Orders
      • Feed 'S' - Settlement orders
      • RFQ
    • FIX API
      • Admin messages
      • Market Data
      • Trade
        • Trading for Takers
        • Trading for LPs and Masters
    • Troubleshooting Errors
      • List of Error Codes
      • Error 3
      • Error 6
      • Error 7
      • Error 14
Powered by GitBook
On this page
  1. API Reference
  2. Websocket API

Feed 'P' - Positions

Positions, Orders and Settlement Orders feed

PreviousFeed 'A' - AssetsNextFeed 'L' - Counterparty limits

Last updated 1 month ago

Please find the position elements description in the .

The P feed is considered obsolete, and one is highly encouraged to use dedicated (S, K, O) feeds instead.

Requests

{"event": "bind", "feed": "P"}
{"event": "unbind", "feed": "P"}

Feed handling

position = [
  0: currencyName (string)
  1: value (Efx::Size)
  2: counterpartyId (Efx::ClientId)
  3: maxReachablePosition (Efx::Size)
  4: minReachablePosition (Efx::Size)
]

order = [
  0: instrumentName (string)
  1: orderType (unsigned int16)
  2: orderSide (Efx::Side)
  3: orderCancelReason (Efx::CancelReason)
  4: orderId (Efx::OrderId)
  5: clientOrderId (Efx::ClientOrderId)
  6: orderPrice (Efx::Price)
  7: initialSize (Efx::Size)
  8: sizeLeft (Efx::Size)
  9: createdAt (Efx::Timestamp)
  10: bySizeOrByVolume (unsigned int16)
]

deal = [
  0: instrumentName (string)
  1: orderType (unsigned int16)
  2: orderSide (Efx::Side)
  3: orderCancelReason (Efx::CancelReason)
  4: orderId (Efx::OrderId)
  5: clientOrderId (Efx::ClientOrderId)
  6: orderPrice (Efx::Price)
  7: initialSize (Efx::Size)
  8: sizeOrVolumeLeft (Efx::Size)
  9: createdAt (Efx::Timestamp)
  10: dealMoment (Efx::Timestamp)
  11: dealId (Efx::DealId)
  12: dealAggressorSide (Efx::Side)
  13: dealPrice (Efx::Price)
  14: dealSize (Efx::Size)
  15: dealVolume (Efx::Size)
  16: dealDelta (Efx::Size)
  17: counterpartyId (Efx::ClientId)
  18: isOrderByVolume (unsigned int16)
  19: takerOrderOwnerId (Efx::ClientId)
  20: linkedTo (Efx::DealId)
  21: dealType (DealType)
  22: makerOrderOwnerId (Efx::ClientId)
  23: liquiditySource (Efx::LiquiditySource)
]

settlementOrder = [
  0: settlementOrderId (Efx::OrderId)
  1: currency1 (string)
  2: currency2 (string)
  3: size1 (Efx::Size)
  4: size2 (Efx::Size)
  5: createdAt (Efx::Timestamp)
  6: counterpartyId (Efx::ClientId)
  7: network1 (string)
  8: network2 (string)
]

settlementDeal = [
  0: settlementOrderId (Efx::OrderId)
  1: currency1 (string)
  2: currency2 (string)
  3: size1 (Efx::Size)
  4: size2 (Efx::Size)
  5: createdAt (Efx::Timestamp)
  6: counterpartyId (Efx::ClientId)
  7: network1 (string)
  8: network2 (string)
  9: settlementMoment (Efx::Timestamp)
  10: settlementId (Efx::DealId)
]

For detailed positions description

// snapshot
['P', 0, 'S', [
  nextDealOrSettlementOrTransactionId (Efx::DealId),
  array of position,
  array of order,
  array of settlementOrder
]]

// order added
['O', 0, '+', order]

// order executed
['O', 0, 'D', deal]

// order removed
['O', 0, '-', order]

// settlement order added
['S', 0, '+', settlementOrder]

// settlement order modifed
['S', 0, 'M', settlementOrder]

// settlement order executed
['S', 0, 'D', settlementDeal]

// settlement order removed
['S', 0, '-', settlementOrder]

// failed to subscribe
['P', 0, 'Z', 2]

// unsubscribed
['P', 0, 'U', 0]
applyToSnapshot(prevSnapshot, feed, action, data) {
    switch (feed) {
        case 'P': {
            switch (action) {
                case 'S' : {
                    return [data[0], [...data[1]], [...data[2]], [...data[3]]]
                }
            }
            break
        }
        case 'O': {
            switch (action) {
                case '+' : {
                    prevSnapshot[2].push(data)
                    break
                }
                case 'D' : {
                    // 1) update next dealOrSettlementId

                    prevSnapshot[0] = data[11] + 1

                    // 2) apply to positions

                    let [assetCurrency, balanceCurrency] = data[0].split('-')

                    for (var i in prevSnapshot[1]) {
                        if (prevSnapshot[1][i][0] == assetCurrency &&
                            prevSnapshot[1][i][2] == data[17]) {

                            if (data[2]) {
                                prevSnapshot[1][i][1] -= data[14]
                            } else {
                                prevSnapshot[1][i][1] += data[14]
                            }
                            if (0 == prevSnapshot[1][i][1]) {
                                prevSnapshot[1].splice(i, 1)
                            }
                            assetCurrency = null
                            break
                        }
                    }

                    for (var i in prevSnapshot[1]) {
                        if (prevSnapshot[1][i][0] == balanceCurrency &&
                            prevSnapshot[1][i][2] == data[17]) {

                            if (data[2]) {
                                prevSnapshot[1][i][1] += data[15] - data[16]
                            } else {
                                prevSnapshot[1][i][1] -= data[15] + data[16]
                            }
                            if (0 == prevSnapshot[1][i][1]) {
                                prevSnapshot[1].splice(i, 1)
                            }
                            balanceCurrency = null
                            break
                        }
                    }
                    if (assetCurrency) {
                        if (data[14]) {
                            if (data[2]) {
                                prevSnapshot[1].push([assetCurrency, -data[14], data[17]])
                            } else {
                                prevSnapshot[1].push([assetCurrency, data[14], data[17]])
                            }
                        }
                    }
                    if (balanceCurrency) {
                        if (data[2]) {
                            if (data[15] - data[16]) {
                                prevSnapshot[1].push([balanceCurrency, data[15] - data[16], data[17]])
                            }
                        } else {
                            if (- data[15] - data[16]) {
                                prevSnapshot[1].push([balanceCurrency, - data[15] - data[16], data[17]])
                            }
                        }
                    }

                    // 3) update or remove item

                    if (data[8]) {
                        for (var i in prevSnapshot[2]) {
                            if (prevSnapshot[2][i][4] == data[4]) {
                                for (var field = 0; field < 10; ++field) {
                                    prevSnapshot[2][i][field] = data[field]
                                }
                                break
                            }
                        }
                    } else {
                        for (var i in prevSnapshot[2]) {
                            if (prevSnapshot[2][i][4] == data[4]) {
                                prevSnapshot[2].splice(i, 1)
                                break
                            }
                        }

                    }
                    break
                }
                case '-' : {
                    for (var i in prevSnapshot[2]) {
                        if (prevSnapshot[2][i][4] == data[4]) {
                            prevSnapshot[2].splice(i, 1)
                            break
                        }
                    }
                    break
                }
            }
            break
        }
        case 'S': {
            switch (action) {
                case '+' : {
                    prevSnapshot[3].push(data)
                    break
                }
                case 'M' : {
                    for (var i in prevSnapshot[3]) {
                        if (prevSnapshot[3][i][0] == data[0]) {
                            prevSnapshot[3][i] = data
                            break
                        }
                    }
                    break
                }
                case 'D' : {
                    // 1) update next dealOrSettlementId

                    prevSnapshot[0] = data[8] + 1

                    // 2) apply to positions

                    let currency1 = data[1]
                    let size1 = data[3]
                    for (var i in prevSnapshot[1]) {
                        if (prevSnapshot[1][i][0] == currency1 &&
                            prevSnapshot[1][i][2] == data[6]) {

                            prevSnapshot[1][i][1] += size1
                            if (0 == prevSnapshot[1][i][1]) {
                                prevSnapshot[1].splice(i, 1)
                            }
                            currency1 = null
                            break
                        }
                    }
                    let currency2 = data[2]
                    let size2 = data[4]
                    if (currency2 == '') {
                        currency2 = null
                    }
                    if (currency2) {
                        for (var i in prevSnapshot[1]) {
                            if (prevSnapshot[1][i][0] == currency2 &&
                                prevSnapshot[1][i][2] == data[6]) {

                                prevSnapshot[1][i][1] += size2
                                if (0 == prevSnapshot[1][i][1]) {
                                    prevSnapshot[1].splice(i, 1)
                                }
                                currency2 = null
                                break
                            }
                        }
                    }

                    if (currency1) {
                        prevSnapshot[1].push([currency1, size1, data[6]])
                    }
                    if (currency2) {
                        prevSnapshot[1].push([currency2, size2, data[6]])
                    }

                    // 3) remove item

                    for (var i in prevSnapshot[3]) {
                        if (prevSnapshot[3][i][0] == data[0]) {
                            prevSnapshot[3].splice(i, 1)
                            break
                        }
                    }
                    break
                }
                case '-' : {
                    for (var i in prevSnapshot[3]) {
                        if (prevSnapshot[3][i][0] == data[0]) {
                            prevSnapshot[3].splice(i, 1)
                            break
                        }
                    }
                    break
                }
            }
            break
        }
    }
    return prevSnapshot
}
Positions feed documentation
positions