haskell-bitmex-client-0.1.0.0: lib/BitMEXClient/WebSockets/Types/Response.hs
module BitMEXClient.WebSockets.Types.Response
( Response(..)
, RespAffiliate(..)
, RespAnnouncement(..)
, RespChat(..)
, RespConnectedUsers(..)
, RespExecution(..)
, RespFunding(..)
, RespInstrument(..)
, RespInsurance(..)
, RespLiquidation(..)
, RespMargin(..)
, RespNotification(..)
, RespOrder(..)
, RespOrderBookL2(..)
, RespOrderBook10(..)
, RespPosition(..)
, RespQuote(..)
, RespSettlement(..)
, RespTrade(..)
, RespTransaction(..)
, RespWallet(..)
, TABLE(..)
, STATUS(..)
, INFO(..)
, ERROR(..)
, Action(..)
) where
import BitMEX.Core
( DateTime
)
import BitMEXClient.CustomPrelude
import BitMEXClient.WebSockets.Types.General
import Data.Text
( Text
)
import Data.Vector
( Vector
)
data Action
= Partial
| Update
| Insert
| Delete
deriving (Eq, Show, Generic)
instance FromJSON Action where
parseJSON = genericParseJSON opts
where
opts =
defaultOptions
{ constructorTagModifier =
\xs ->
case xs of
[] -> xs
(x:xs') -> (toLower x : xs')
}
data NotificationType
= NERROR
| NINFO
| NSUCCESS
deriving (Eq, Show, Generic)
instance FromJSON NotificationType where
parseJSON = genericParseJSON opts
where
opts =
defaultOptions
{ constructorTagModifier =
((drop 1) . (map toLower))
}
data TABLE a = TABLE
{ _table :: !Text
, _action :: !Action
, _data :: !(Vector a)
, _keys :: !(Maybe (Vector Text))
, _foreignKeys :: !(Maybe Value)
, _types :: !(Maybe Value)
, _filter :: !(Maybe Value)
, _attributes :: !(Maybe Value)
} deriving (Eq, Show, Generic)
instance (FromJSON a) => FromJSON (TABLE a)
data STATUS = STATUS
{ success :: !Bool
, subscribe :: !(Maybe Text)
, request :: !Value
} deriving (Eq, Show, Generic)
instance FromJSON STATUS
data INFO = INFO
{ info :: !Text
, version :: !Text
, timestamp :: !Text
, docs :: !Text
, limit :: !Value
} deriving (Eq, Show, Generic)
instance FromJSON INFO
data ERROR = ERROR
{ error :: !Text
, status :: !(Maybe Int)
, meta :: !(Maybe Value)
, request :: !(Maybe Value)
} deriving (Eq, Show, Generic)
instance FromJSON ERROR
data RespAffiliate = RespAffiliate
{ account :: !Double -- ^ /Required/ "account"
, currency :: !Currency -- ^ /Required/ "currency"
, prevPayout :: !(Maybe Double) -- ^ "prevPayout"
, prevTurnover :: !(Maybe Double) -- ^ "prevTurnover"
, prevComm :: !(Maybe Double) -- ^ "prevComm"
, prevTimestamp :: !(Maybe DateTime) -- ^ "prevTimestamp"
, execTurnover :: !(Maybe Double) -- ^ "execTurnover"
, execComm :: !(Maybe Double) -- ^ "execComm"
, totalReferrals :: !(Maybe Double) -- ^ "totalReferrals"
, totalTurnover :: !(Maybe Double) -- ^ "totalTurnover"
, totalComm :: !(Maybe Double) -- ^ "totalComm"
, payoutPcnt :: !(Maybe Double) -- ^ "payoutPcnt"
, pendingPayout :: !(Maybe Double) -- ^ "pendingPayout"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
, referrerAccount :: !(Maybe Double) -- ^ "referrerAccount"
} deriving (Show, Eq, Generic)
instance FromJSON RespAffiliate
data RespAnnouncement = RespAnnouncement
{ id :: !Double -- ^ /Required/ "id"
, link :: !(Maybe Text) -- ^ "link"
, title :: !(Maybe Text) -- ^ "title"
, content :: !(Maybe Text) -- ^ "content"
, date :: !(Maybe DateTime) -- ^ "date"
} deriving (Show, Eq, Generic)
instance FromJSON RespAnnouncement
data RespChat = RespChat
{ id :: !(Maybe Double) -- ^ "id"
, date :: !DateTime -- ^ /Required/ "date"
, user :: !Text -- ^ /Required/ "user"
, message :: !Text -- ^ /Required/ "message"
, html :: !Text -- ^ /Required/ "html"
, fromBot :: !(Maybe Bool) -- ^ "fromBot"
, channelID :: !(Maybe Double) -- ^ "channelID"
} deriving (Show, Eq, Generic)
instance FromJSON RespChat
data RespConnectedUsers = RespConnectedUsers
{ users :: !(Maybe Int) -- ^ "users"
, bots :: !(Maybe Int) -- ^ "bots"
} deriving (Show, Eq, Generic)
instance FromJSON RespConnectedUsers
data RespExecution = RespExecution
{ execID :: !Text -- ^ /Required/ "execID"
, orderID :: !(Maybe Text) -- ^ "orderID"
, clOrdID :: !(Maybe Text) -- ^ "clOrdID"
, clOrdLinkID :: !(Maybe Text) -- ^ "clOrdLinkID"
, account :: !(Maybe Double) -- ^ "account"
, symbol :: !(Maybe Symbol) -- ^ "symbol"
, side :: !(Maybe Side) -- ^ "side"
, lastQty :: !(Maybe Double) -- ^ "lastQty"
, lastPx :: !(Maybe Double) -- ^ "lastPx"
, underlyingLastPx :: !(Maybe Double) -- ^ "underlyingLastPx"
, lastMkt :: !(Maybe Text) -- ^ "lastMkt"
, lastLiquidityInd :: !(Maybe Text) -- ^ "lastLiquidityInd"
, simpleOrderQty :: !(Maybe Double) -- ^ "simpleOrderQty"
, orderQty :: !(Maybe Double) -- ^ "orderQty"
, price :: !(Maybe Double) -- ^ "price"
, displayQty :: !(Maybe Double) -- ^ "displayQty"
, stopPx :: !(Maybe Double) -- ^ "stopPx"
, pegOffsetValue :: !(Maybe Double) -- ^ "pegOffsetValue"
, pegPriceType :: !(Maybe Text) -- ^ "pegPriceType"
, currency :: !(Maybe Currency) -- ^ "currency"
, settlCurrency :: !(Maybe Currency) -- ^ "settlCurrency"
, execType :: !(Maybe Text) -- ^ "execType"
, ordType :: !(Maybe Text) -- ^ "ordType"
, timeInForce :: !(Maybe Text) -- ^ "timeInForce"
, execInst :: !(Maybe Text) -- ^ "execInst"
, contingencyType :: !(Maybe Text) -- ^ "contingencyType"
, exDestination :: !(Maybe Text) -- ^ "exDestination"
, ordStatus :: !(Maybe Text) -- ^ "ordStatus"
, triggered :: !(Maybe Text) -- ^ "triggered"
, workingIndicator :: !(Maybe Bool) -- ^ "workingIndicator"
, ordRejReason :: !(Maybe Text) -- ^ "ordRejReason"
, simpleLeavesQty :: !(Maybe Double) -- ^ "simpleLeavesQty"
, leavesQty :: !(Maybe Double) -- ^ "leavesQty"
, simpleCumQty :: !(Maybe Double) -- ^ "simpleCumQty"
, cumQty :: !(Maybe Double) -- ^ "cumQty"
, avgPx :: !(Maybe Double) -- ^ "avgPx"
, commission :: !(Maybe Double) -- ^ "commission"
, tradePublishIndicator :: !(Maybe Text) -- ^ "tradePublishIndicator"
, multiLegReportingType :: !(Maybe Text) -- ^ "multiLegReportingType"
, text :: !(Maybe Text) -- ^ "text"
, trdMatchID :: !(Maybe Text) -- ^ "trdMatchID"
, execCost :: !(Maybe Double) -- ^ "execCost"
, execComm :: !(Maybe Double) -- ^ "execComm"
, homeNotional :: !(Maybe Double) -- ^ "homeNotional"
, foreignNotional :: !(Maybe Double) -- ^ "foreignNotional"
, transactTime :: !(Maybe DateTime) -- ^ "transactTime"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
} deriving (Show, Eq, Generic)
instance FromJSON RespExecution
data RespFunding = RespFunding
{ timestamp :: !DateTime -- ^ /Required/ "timestamp"
, symbol :: !Text -- ^ /Required/ "symbol"
, fundingInterval :: !(Maybe DateTime) -- ^ "fundingInterval"
, fundingRate :: !(Maybe Double) -- ^ "fundingRate"
, fundingRateDaily :: !(Maybe Double) -- ^ "fundingRateDaily"
} deriving (Show, Eq, Generic)
instance FromJSON RespFunding
data RespInstrument = RespInstrument
{ symbol :: !Symbol -- ^ /Required/ "symbol"
, rootSymbol :: !(Maybe Currency) -- ^ "rootSymbol"
, state :: !(Maybe Text) -- ^ "state"
, typ :: !(Maybe Text) -- ^ "typ"
, listing :: !(Maybe DateTime) -- ^ "listing"
, front :: !(Maybe DateTime) -- ^ "front"
, expiry :: !(Maybe DateTime) -- ^ "expiry"
, settle :: !(Maybe DateTime) -- ^ "settle"
, relistInterval :: !(Maybe DateTime) -- ^ "relistInterval"
, inverseLeg :: !(Maybe Text) -- ^ "inverseLeg"
, sellLeg :: !(Maybe Text) -- ^ "sellLeg"
, buyLeg :: !(Maybe Text) -- ^ "buyLeg"
, positionCurrency :: !(Maybe Currency) -- ^ "positionCurrency"
, underlying :: !(Maybe Currency) -- ^ "underlying"
, quoteCurrency :: !(Maybe Currency) -- ^ "quoteCurrency"
, underlyingSymbol :: !(Maybe Text) -- ^ "underlyingSymbol"
, reference :: !(Maybe Text) -- ^ "reference"
, referenceSymbol :: !(Maybe Text) -- ^ "referenceSymbol"
, calcInterval :: !(Maybe DateTime) -- ^ "calcInterval"
, publishInterval :: !(Maybe DateTime) -- ^ "publishInterval"
, publishTime :: !(Maybe DateTime) -- ^ "publishTime"
, maxOrderQty :: !(Maybe Double) -- ^ "maxOrderQty"
, maxPrice :: !(Maybe Double) -- ^ "maxPrice"
, lotSize :: !(Maybe Double) -- ^ "lotSize"
, tickSize :: !(Maybe Double) -- ^ "tickSize"
, multiplier :: !(Maybe Double) -- ^ "multiplier"
, settlCurrency :: !(Maybe Currency) -- ^ "settlCurrency"
, underlyingToPositionMultiplier :: !(Maybe Double) -- ^ "underlyingToPositionMultiplier"
, underlyingToSettleMultiplier :: !(Maybe Double) -- ^ "underlyingToSettleMultiplier"
, quoteToSettleMultiplier :: !(Maybe Double) -- ^ "quoteToSettleMultiplier"
, isQuanto :: !(Maybe Bool) -- ^ "isQuanto"
, isInverse :: !(Maybe Bool) -- ^ "isInverse"
, initMargin :: !(Maybe Double) -- ^ "initMargin"
, maintMargin :: !(Maybe Double) -- ^ "maintMargin"
, riskLimit :: !(Maybe Double) -- ^ "riskLimit"
, riskStep :: !(Maybe Double) -- ^ "riskStep"
, limit :: !(Maybe Double) -- ^ "limit"
, capped :: !(Maybe Bool) -- ^ "capped"
, taxed :: !(Maybe Bool) -- ^ "taxed"
, deleverage :: !(Maybe Bool) -- ^ "deleverage"
, makerFee :: !(Maybe Double) -- ^ "makerFee"
, takerFee :: !(Maybe Double) -- ^ "takerFee"
, settlementFee :: !(Maybe Double) -- ^ "settlementFee"
, insuranceFee :: !(Maybe Double) -- ^ "insuranceFee"
, fundingBaseSymbol :: !(Maybe Text) -- ^ "fundingBaseSymbol"
, fundingQuoteSymbol :: !(Maybe Text) -- ^ "fundingQuoteSymbol"
, fundingPremiumSymbol :: !(Maybe Text) -- ^ "fundingPremiumSymbol"
, fundingTimestamp :: !(Maybe DateTime) -- ^ "fundingTimestamp"
, fundingInterval :: !(Maybe DateTime) -- ^ "fundingInterval"
, fundingRate :: !(Maybe Double) -- ^ "fundingRate"
, indicativeFundingRate :: !(Maybe Double) -- ^ "indicativeFundingRate"
, rebalanceTimestamp :: !(Maybe DateTime) -- ^ "rebalanceTimestamp"
, rebalanceInterval :: !(Maybe DateTime) -- ^ "rebalanceInterval"
, openingTimestamp :: !(Maybe DateTime) -- ^ "openingTimestamp"
, closingTimestamp :: !(Maybe DateTime) -- ^ "closingTimestamp"
, sessionInterval :: !(Maybe DateTime) -- ^ "sessionInterval"
, prevClosePrice :: !(Maybe Double) -- ^ "prevClosePrice"
, limitDownPrice :: !(Maybe Double) -- ^ "limitDownPrice"
, limitUpPrice :: !(Maybe Double) -- ^ "limitUpPrice"
, bankruptLimitDownPrice :: !(Maybe Double) -- ^ "bankruptLimitDownPrice"
, bankruptLimitUpPrice :: !(Maybe Double) -- ^ "bankruptLimitUpPrice"
, prevTotalVolume :: !(Maybe Double) -- ^ "prevTotalVolume"
, totalVolume :: !(Maybe Double) -- ^ "totalVolume"
, volume :: !(Maybe Double) -- ^ "volume"
, volume24h :: !(Maybe Double) -- ^ "volume24h"
, prevTotalTurnover :: !(Maybe Double) -- ^ "prevTotalTurnover"
, totalTurnover :: !(Maybe Double) -- ^ "totalTurnover"
, turnover :: !(Maybe Double) -- ^ "turnover"
, turnover24h :: !(Maybe Double) -- ^ "turnover24h"
, prevPrice24h :: !(Maybe Double) -- ^ "prevPrice24h"
, vwap :: !(Maybe Double) -- ^ "vwap"
, highPrice :: !(Maybe Double) -- ^ "highPrice"
, lowPrice :: !(Maybe Double) -- ^ "lowPrice"
, lastPrice :: !(Maybe Double) -- ^ "lastPrice"
, lastPriceProtected :: !(Maybe Double) -- ^ "lastPriceProtected"
, lastTickDirection :: !(Maybe Text) -- ^ "lastTickDirection"
, lastChangePcnt :: !(Maybe Double) -- ^ "lastChangePcnt"
, bidPrice :: !(Maybe Double) -- ^ "bidPrice"
, midPrice :: !(Maybe Double) -- ^ "midPrice"
, askPrice :: !(Maybe Double) -- ^ "askPrice"
, impactBidPrice :: !(Maybe Double) -- ^ "impactBidPrice"
, impactMidPrice :: !(Maybe Double) -- ^ "impactMidPrice"
, impactAskPrice :: !(Maybe Double) -- ^ "impactAskPrice"
, hasLiquidity :: !(Maybe Bool) -- ^ "hasLiquidity"
, openInterest :: !(Maybe Double) -- ^ "openInterest"
, openValue :: !(Maybe Double) -- ^ "openValue"
, fairMethod :: !(Maybe Text) -- ^ "fairMethod"
, fairBasisRate :: !(Maybe Double) -- ^ "fairBasisRate"
, fairBasis :: !(Maybe Double) -- ^ "fairBasis"
, fairPrice :: !(Maybe Double) -- ^ "fairPrice"
, markMethod :: !(Maybe Text) -- ^ "markMethod"
, markPrice :: !(Maybe Double) -- ^ "markPrice"
, indicativeTaxRate :: !(Maybe Double) -- ^ "indicativeTaxRate"
, indicativeSettlePrice :: !(Maybe Double) -- ^ "indicativeSettlePrice"
, settledPrice :: !(Maybe Double) -- ^ "settledPrice"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
} deriving (Show, Eq, Generic)
instance FromJSON RespInstrument
data RespInsurance = RespInsurance
{ currency :: !Currency -- ^ /Required/ "currency"
, timestamp :: !DateTime -- ^ /Required/ "timestamp"
, walletBalance :: !(Maybe Double) -- ^ "walletBalance"
} deriving (Show, Eq, Generic)
instance FromJSON RespInsurance
data RespLiquidation = RespLiquidation
{ orderID :: !Text -- ^ /Required/ "orderID"
, symbol :: !(Maybe Symbol) -- ^ "symbol"
, side :: !(Maybe Side) -- ^ "side"
, price :: !(Maybe Double) -- ^ "price"
, leavesQty :: !(Maybe Double) -- ^ "leavesQty"
} deriving (Show, Eq, Generic)
instance FromJSON RespLiquidation
data RespMargin = RespMargin
{ account :: !Double -- ^ /Required/ "account"
, currency :: !Currency -- ^ /Required/ "currency"
, riskLimit :: !(Maybe Double) -- ^ "riskLimit"
, prevState :: !(Maybe Text) -- ^ "prevState"
, state :: !(Maybe Text) -- ^ "state"
, action :: !(Maybe Text) -- ^ "action"
, amount :: !(Maybe Double) -- ^ "amount"
, pendingCredit :: !(Maybe Double) -- ^ "pendingCredit"
, pendingDebit :: !(Maybe Double) -- ^ "pendingDebit"
, confirmedDebit :: !(Maybe Double) -- ^ "confirmedDebit"
, prevRealisedPnl :: !(Maybe Double) -- ^ "prevRealisedPnl"
, prevUnrealisedPnl :: !(Maybe Double) -- ^ "prevUnrealisedPnl"
, grossComm :: !(Maybe Double) -- ^ "grossComm"
, grossOpenCost :: !(Maybe Double) -- ^ "grossOpenCost"
, grossOpenPremium :: !(Maybe Double) -- ^ "grossOpenPremium"
, grossExecCost :: !(Maybe Double) -- ^ "grossExecCost"
, grossMarkValue :: !(Maybe Double) -- ^ "grossMarkValue"
, riskValue :: !(Maybe Double) -- ^ "riskValue"
, taxableMargin :: !(Maybe Double) -- ^ "taxableMargin"
, initMargin :: !(Maybe Double) -- ^ "initMargin"
, maintMargin :: !(Maybe Double) -- ^ "maintMargin"
, sessionMargin :: !(Maybe Double) -- ^ "sessionMargin"
, targetExcessMargin :: !(Maybe Double) -- ^ "targetExcessMargin"
, varMargin :: !(Maybe Double) -- ^ "varMargin"
, realisedPnl :: !(Maybe Double) -- ^ "realisedPnl"
, unrealisedPnl :: !(Maybe Double) -- ^ "unrealisedPnl"
, indicativeTax :: !(Maybe Double) -- ^ "indicativeTax"
, unrealisedProfit :: !(Maybe Double) -- ^ "unrealisedProfit"
, syntheticMargin :: !(Maybe Double) -- ^ "syntheticMargin"
, walletBalance :: !(Maybe Double) -- ^ "walletBalance"
, marginBalance :: !(Maybe Double) -- ^ "marginBalance"
, marginBalancePcnt :: !(Maybe Double) -- ^ "marginBalancePcnt"
, marginLeverage :: !(Maybe Double) -- ^ "marginLeverage"
, marginUsedPcnt :: !(Maybe Double) -- ^ "marginUsedPcnt"
, excessMargin :: !(Maybe Double) -- ^ "excessMargin"
, excessMarginPcnt :: !(Maybe Double) -- ^ "excessMarginPcnt"
, availableMargin :: !(Maybe Double) -- ^ "availableMargin"
, withdrawableMargin :: !(Maybe Double) -- ^ "withdrawableMargin"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
, grossLastValue :: !(Maybe Double) -- ^ "grossLastValue"
, commission :: !(Maybe Double) -- ^ "commission"
} deriving (Show, Eq, Generic)
instance FromJSON RespMargin
data RespNotification = RespNotification
{ _id :: !(Maybe Int) -- ^ "id"
, _date :: !DateTime -- ^ /Required/ "date"
, _title :: !Text -- ^ /Required/ "title"
, _body :: !Text -- ^ /Required/ "body"
, _ttl :: !Int -- ^ /Required/ "ttl"
, _type :: !(Maybe NotificationType) -- ^ "type"
, _closable :: !(Maybe Bool) -- ^ "closable"
, _persist :: !(Maybe Bool) -- ^ "persist"
, _waitForVisibility :: !(Maybe Bool) -- ^ "waitForVisibility"
, _sound :: !(Maybe Text) -- ^ "sound"
} deriving (Show, Eq, Generic)
instance FromJSON RespNotification where
parseJSON = genericParseJSON opts
where
opts = defaultOptions {fieldLabelModifier = drop 1}
data RespOrder = RespOrder
{ orderID :: !Text -- ^ /Required/ "orderID"
, clOrdID :: !(Maybe Text) -- ^ "clOrdID"
, clOrdLinkID :: !(Maybe Text) -- ^ "clOrdLinkID"
, account :: !(Maybe Double) -- ^ "account"
, symbol :: !(Maybe Symbol) -- ^ "symbol"
, side :: !(Maybe Side) -- ^ "side"
, simpleOrderQty :: !(Maybe Double) -- ^ "simpleOrderQty"
, orderQty :: !(Maybe Double) -- ^ "orderQty"
, price :: !(Maybe Double) -- ^ "price"
, displayQty :: !(Maybe Double) -- ^ "displayQty"
, stopPx :: !(Maybe Double) -- ^ "stopPx"
, pegOffsetValue :: !(Maybe Double) -- ^ "pegOffsetValue"
, pegPriceType :: !(Maybe Text) -- ^ "pegPriceType"
, currency :: !(Maybe Currency) -- ^ "currency"
, settlCurrency :: !(Maybe Currency) -- ^ "settlCurrency"
, ordType :: !(Maybe Text) -- ^ "ordType"
, timeInForce :: !(Maybe Text) -- ^ "timeInForce"
, execInst :: !(Maybe Text) -- ^ "execInst"
, contingencyType :: !(Maybe Text) -- ^ "contingencyType"
, exDestination :: !(Maybe Text) -- ^ "exDestination"
, ordStatus :: !(Maybe Text) -- ^ "ordStatus"
, triggered :: !(Maybe Text) -- ^ "triggered"
, workingIndicator :: !(Maybe Bool) -- ^ "workingIndicator"
, ordRejReason :: !(Maybe Text) -- ^ "ordRejReason"
, simpleLeavesQty :: !(Maybe Double) -- ^ "simpleLeavesQty"
, leavesQty :: !(Maybe Double) -- ^ "leavesQty"
, simpleCumQty :: !(Maybe Double) -- ^ "simpleCumQty"
, cumQty :: !(Maybe Double) -- ^ "cumQty"
, avgPx :: !(Maybe Double) -- ^ "avgPx"
, multiLegReportingType :: !(Maybe Text) -- ^ "multiLegReportingType"
, text :: !(Maybe Text) -- ^ "text"
, transactTime :: !(Maybe DateTime) -- ^ "transactTime"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
} deriving (Show, Eq, Generic)
instance FromJSON RespOrder
data RespOrderBookL2 = RespOrderBookL2
{ symbol :: !Symbol -- ^ /Required/ "symbol"
, id :: !Double -- ^ /Required/ "id"
, side :: !Side -- ^ /Required/ "side"
, size :: !(Maybe Double) -- ^ "size"
, price :: !(Maybe Double) -- ^ "price"
} deriving (Show, Eq, Generic)
instance FromJSON RespOrderBookL2
data RespOrderBook10 = RespOrderBook10
{ symbol :: !Symbol
, timestamp :: !Text
, asks :: !(Vector (Vector Double))
, bids :: !(Vector (Vector Double))
} deriving (Eq, Show, Generic)
instance FromJSON RespOrderBook10
data RespPosition = RespPosition
{ account :: !Double -- ^ /Required/ "account"
, symbol :: !Symbol -- ^ /Required/ "symbol"
, currency :: !Currency -- ^ /Required/ "currency"
, underlying :: !(Maybe Currency) -- ^ "underlying"
, quoteCurrency :: !(Maybe Currency) -- ^ "quoteCurrency"
, commission :: !(Maybe Double) -- ^ "commission"
, initMarginReq :: !(Maybe Double) -- ^ "initMarginReq"
, maintMarginReq :: !(Maybe Double) -- ^ "maintMarginReq"
, riskLimit :: !(Maybe Double) -- ^ "riskLimit"
, leverage :: !(Maybe Double) -- ^ "leverage"
, crossMargin :: !(Maybe Bool) -- ^ "crossMargin"
, deleveragePercentile :: !(Maybe Double) -- ^ "deleveragePercentile"
, rebalancedPnl :: !(Maybe Double) -- ^ "rebalancedPnl"
, prevRealisedPnl :: !(Maybe Double) -- ^ "prevRealisedPnl"
, prevUnrealisedPnl :: !(Maybe Double) -- ^ "prevUnrealisedPnl"
, prevClosePrice :: !(Maybe Double) -- ^ "prevClosePrice"
, openingTimestamp :: !(Maybe DateTime) -- ^ "openingTimestamp"
, openingQty :: !(Maybe Double) -- ^ "openingQty"
, openingCost :: !(Maybe Double) -- ^ "openingCost"
, openingComm :: !(Maybe Double) -- ^ "openingComm"
, openOrderBuyQty :: !(Maybe Double) -- ^ "openOrderBuyQty"
, openOrderBuyCost :: !(Maybe Double) -- ^ "openOrderBuyCost"
, openOrderBuyPremium :: !(Maybe Double) -- ^ "openOrderBuyPremium"
, openOrderSellQty :: !(Maybe Double) -- ^ "openOrderSellQty"
, openOrderSellCost :: !(Maybe Double) -- ^ "openOrderSellCost"
, openOrderSellPremium :: !(Maybe Double) -- ^ "openOrderSellPremium"
, execBuyQty :: !(Maybe Double) -- ^ "execBuyQty"
, execBuyCost :: !(Maybe Double) -- ^ "execBuyCost"
, execSellQty :: !(Maybe Double) -- ^ "execSellQty"
, execSellCost :: !(Maybe Double) -- ^ "execSellCost"
, execQty :: !(Maybe Double) -- ^ "execQty"
, execCost :: !(Maybe Double) -- ^ "execCost"
, execComm :: !(Maybe Double) -- ^ "execComm"
, currentTimestamp :: !(Maybe DateTime) -- ^ "currentTimestamp"
, currentQty :: !(Maybe Double) -- ^ "currentQty"
, currentCost :: !(Maybe Double) -- ^ "currentCost"
, currentComm :: !(Maybe Double) -- ^ "currentComm"
, realisedCost :: !(Maybe Double) -- ^ "realisedCost"
, unrealisedCost :: !(Maybe Double) -- ^ "unrealisedCost"
, grossOpenCost :: !(Maybe Double) -- ^ "grossOpenCost"
, grossOpenPremium :: !(Maybe Double) -- ^ "grossOpenPremium"
, grossExecCost :: !(Maybe Double) -- ^ "grossExecCost"
, isOpen :: !(Maybe Bool) -- ^ "isOpen"
, markPrice :: !(Maybe Double) -- ^ "markPrice"
, markValue :: !(Maybe Double) -- ^ "markValue"
, riskValue :: !(Maybe Double) -- ^ "riskValue"
, homeNotional :: !(Maybe Double) -- ^ "homeNotional"
, foreignNotional :: !(Maybe Double) -- ^ "foreignNotional"
, posState :: !(Maybe Text) -- ^ "posState"
, posCost :: !(Maybe Double) -- ^ "posCost"
, posCost2 :: !(Maybe Double) -- ^ "posCost2"
, posCross :: !(Maybe Double) -- ^ "posCross"
, posInit :: !(Maybe Double) -- ^ "posInit"
, posComm :: !(Maybe Double) -- ^ "posComm"
, posLoss :: !(Maybe Double) -- ^ "posLoss"
, posMargin :: !(Maybe Double) -- ^ "posMargin"
, posMaint :: !(Maybe Double) -- ^ "posMaint"
, posAllowance :: !(Maybe Double) -- ^ "posAllowance"
, taxableMargin :: !(Maybe Double) -- ^ "taxableMargin"
, initMargin :: !(Maybe Double) -- ^ "initMargin"
, maintMargin :: !(Maybe Double) -- ^ "maintMargin"
, sessionMargin :: !(Maybe Double) -- ^ "sessionMargin"
, targetExcessMargin :: !(Maybe Double) -- ^ "targetExcessMargin"
, varMargin :: !(Maybe Double) -- ^ "varMargin"
, realisedGrossPnl :: !(Maybe Double) -- ^ "realisedGrossPnl"
, realisedTax :: !(Maybe Double) -- ^ "realisedTax"
, realisedPnl :: !(Maybe Double) -- ^ "realisedPnl"
, unrealisedGrossPnl :: !(Maybe Double) -- ^ "unrealisedGrossPnl"
, longBankrupt :: !(Maybe Double) -- ^ "longBankrupt"
, shortBankrupt :: !(Maybe Double) -- ^ "shortBankrupt"
, taxBase :: !(Maybe Double) -- ^ "taxBase"
, indicativeTaxRate :: !(Maybe Double) -- ^ "indicativeTaxRate"
, indicativeTax :: !(Maybe Double) -- ^ "indicativeTax"
, unrealisedTax :: !(Maybe Double) -- ^ "unrealisedTax"
, unrealisedPnl :: !(Maybe Double) -- ^ "unrealisedPnl"
, unrealisedPnlPcnt :: !(Maybe Double) -- ^ "unrealisedPnlPcnt"
, unrealisedRoePcnt :: !(Maybe Double) -- ^ "unrealisedRoePcnt"
, simpleQty :: !(Maybe Double) -- ^ "simpleQty"
, simpleCost :: !(Maybe Double) -- ^ "simpleCost"
, simpleValue :: !(Maybe Double) -- ^ "simpleValue"
, simplePnl :: !(Maybe Double) -- ^ "simplePnl"
, simplePnlPcnt :: !(Maybe Double) -- ^ "simplePnlPcnt"
, avgCostPrice :: !(Maybe Double) -- ^ "avgCostPrice"
, avgEntryPrice :: !(Maybe Double) -- ^ "avgEntryPrice"
, breakEvenPrice :: !(Maybe Double) -- ^ "breakEvenPrice"
, marginCallPrice :: !(Maybe Double) -- ^ "marginCallPrice"
, liquidationPrice :: !(Maybe Double) -- ^ "liquidationPrice"
, bankruptPrice :: !(Maybe Double) -- ^ "bankruptPrice"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
, lastPrice :: !(Maybe Double) -- ^ "lastPrice"
, lastValue :: !(Maybe Double) -- ^ "lastValue"
} deriving (Show, Eq, Generic)
instance FromJSON RespPosition
data RespQuote = RespQuote
{ timestamp :: !DateTime -- ^ /Required/ "timestamp"
, symbol :: !Symbol -- ^ /Required/ "symbol"
, bidSize :: !(Maybe Double) -- ^ "bidSize"
, bidPrice :: !(Maybe Double) -- ^ "bidPrice"
, askPrice :: !(Maybe Double) -- ^ "askPrice"
, askSize :: !(Maybe Double) -- ^ "askSize"
} deriving (Show, Eq, Generic)
instance FromJSON RespQuote
data RespSettlement = RespSettlement
{ timestamp :: !DateTime -- ^ /Required/ "timestamp"
, symbol :: !Symbol -- ^ /Required/ "symbol"
, settlementType :: !(Maybe Text) -- ^ "settlementType"
, settledPrice :: !(Maybe Double) -- ^ "settledPrice"
, bankrupt :: !(Maybe Double) -- ^ "bankrupt"
, taxBase :: !(Maybe Double) -- ^ "taxBase"
, taxRate :: !(Maybe Double) -- ^ "taxRate"
} deriving (Show, Eq, Generic)
instance FromJSON RespSettlement
data RespTrade = RespTrade
{ timestamp :: !DateTime -- ^ /Required/ "timestamp"
, symbol :: !Symbol -- ^ /Required/ "symbol"
, side :: !(Maybe Side) -- ^ "side"
, size :: !(Maybe Double) -- ^ "size"
, price :: !(Maybe Double) -- ^ "price"
, tickDirection :: !(Maybe Text) -- ^ "tickDirection"
, trdMatchID :: !(Maybe Text) -- ^ "trdMatchID"
, grossValue :: !(Maybe Double) -- ^ "grossValue"
, homeNotional :: !(Maybe Double) -- ^ "homeNotional"
, foreignNotional :: !(Maybe Double) -- ^ "foreignNotional"
} deriving (Show, Eq, Generic)
instance FromJSON RespTrade
-- TODO: TradeBin
data RespTransaction = RespTransaction
{ transactID :: !Text -- ^ /Required/ "transactID"
, account :: !(Maybe Double) -- ^ "account"
, currency :: !(Maybe Currency) -- ^ "currency"
, transactType :: !(Maybe Text) -- ^ "transactType"
, amount :: !(Maybe Double) -- ^ "amount"
, fee :: !(Maybe Double) -- ^ "fee"
, transactStatus :: !(Maybe Text) -- ^ "transactStatus"
, address :: !(Maybe Text) -- ^ "address"
, tx :: !(Maybe Text) -- ^ "tx"
, text :: !(Maybe Text) -- ^ "text"
, transactTime :: !(Maybe DateTime) -- ^ "transactTime"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
} deriving (Show, Eq, Generic)
instance FromJSON RespTransaction
data RespWallet = RespWallet
{ account :: !Double -- ^ /Required/ "account"
, currency :: !Currency -- ^ /Required/ "currency"
, prevDeposited :: !(Maybe Double) -- ^ "prevDeposited"
, prevWithdrawn :: !(Maybe Double) -- ^ "prevWithdrawn"
, prevTransferIn :: !(Maybe Double) -- ^ "prevTransferIn"
, prevTransferOut :: !(Maybe Double) -- ^ "prevTransferOut"
, prevAmount :: !(Maybe Double) -- ^ "prevAmount"
, prevTimestamp :: !(Maybe DateTime) -- ^ "prevTimestamp"
, deltaDeposited :: !(Maybe Double) -- ^ "deltaDeposited"
, deltaWithdrawn :: !(Maybe Double) -- ^ "deltaWithdrawn"
, deltaTransferIn :: !(Maybe Double) -- ^ "deltaTransferIn"
, deltaTransferOut :: !(Maybe Double) -- ^ "deltaTransferOut"
, deltaAmount :: !(Maybe Double) -- ^ "deltaAmount"
, deposited :: !(Maybe Double) -- ^ "deposited"
, withdrawn :: !(Maybe Double) -- ^ "withdrawn"
, transferIn :: !(Maybe Double) -- ^ "transferIn"
, transferOut :: !(Maybe Double) -- ^ "transferOut"
, amount :: !(Maybe Double) -- ^ "amount"
, pendingCredit :: !(Maybe Double) -- ^ "pendingCredit"
, pendingDebit :: !(Maybe Double) -- ^ "pendingDebit"
, confirmedDebit :: !(Maybe Double) -- ^ "confirmedDebit"
, timestamp :: !(Maybe DateTime) -- ^ "timestamp"
, addr :: !(Maybe Text) -- ^ "addr"
, script :: !(Maybe Text) -- ^ "script"
, withdrawalLock :: !(Maybe (Vector Text)) -- ^ "withdrawalLock"
} deriving (Show, Eq, Generic)
instance FromJSON RespWallet
data Response
= Aff (TABLE RespAffiliate)
| Ann (TABLE RespAnnouncement)
| C (TABLE RespChat)
| CU (TABLE RespConnectedUsers)
| Exe (TABLE RespExecution)
| F (TABLE RespFunding)
| I (TABLE RespInstrument)
| Insu (TABLE RespInsurance)
| L (TABLE RespLiquidation)
| M (TABLE RespMargin)
| N (TABLE RespNotification)
| O (TABLE RespOrder)
| OB (TABLE RespOrderBookL2)
| OB10 (TABLE RespOrderBook10)
| P (TABLE RespPosition)
| Q (TABLE RespQuote)
| Setl (TABLE RespSettlement)
| T (TABLE RespTrade)
-- | TB (TABLE RespTradeBin)
| TX (TABLE RespTransaction)
| W (TABLE RespWallet)
| Status STATUS
| Info INFO
| Error ERROR
deriving (Eq, Show, Generic)
instance FromJSON Response where
parseJSON =
withObject "Response" $ \o -> do
kind <- o .:? "table"
success <- o .:? "success"
info <- o .:? "info"
error <- o .:? "error"
case (kind :: Maybe Text) of
Just "affiliate" ->
Aff <$> genericParseJSON opts (Object o)
Just "announcement" ->
Ann <$> genericParseJSON opts (Object o)
Just "chat" ->
C <$> genericParseJSON opts (Object o)
Just "connected" ->
CU <$> genericParseJSON opts (Object o)
Just "execution" ->
Exe <$> genericParseJSON opts (Object o)
Just "funding" ->
F <$> genericParseJSON opts (Object o)
Just "instrument" ->
I <$> genericParseJSON opts (Object o)
Just "insurance" ->
Insu <$>
genericParseJSON opts (Object o)
Just "liquidation" ->
L <$> genericParseJSON opts (Object o)
Just "margin" ->
M <$> genericParseJSON opts (Object o)
Just "order" ->
O <$> genericParseJSON opts (Object o)
Just "orderBookL2" ->
OB <$> genericParseJSON opts (Object o)
Just "orderBook10" ->
OB10 <$>
genericParseJSON opts (Object o)
Just "position" ->
P <$> genericParseJSON opts (Object o)
Just "privateNotifications" ->
N <$> genericParseJSON opts (Object o)
Just "publicNotifications" ->
N <$> genericParseJSON opts (Object o)
Just "quote" ->
Q <$> genericParseJSON opts (Object o)
Just "settlement" ->
Setl <$>
genericParseJSON opts (Object o)
Just "trade" ->
T <$> genericParseJSON opts (Object o)
Just "transact" ->
TX <$> genericParseJSON opts (Object o)
Just "wallet" ->
W <$> genericParseJSON opts (Object o)
Just _ ->
fail
"Cannot parse response: the kind of the response is not supported"
Nothing ->
case (success :: Maybe Bool) of
Just _ ->
Status <$> parseJSON (Object o)
Nothing ->
case (info :: Maybe Text) of
Just _ ->
Info <$>
parseJSON (Object o)
Nothing ->
case (error :: Maybe Text) of
Just _ ->
Error <$>
parseJSON
(Object o)
Nothing ->
fail
"Cannot parse response: unknown response format"
where
opts =
defaultOptions
{ fieldLabelModifier = drop 1
, sumEncoding = UntaggedValue
}