bittrex-0.4.0.0: src/Bittrex/API.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE DeriveGeneric #-}
module Bittrex.API
(
-- * Overview
-- $intro
-- * Public
getMarkets
, getCurrencies
, getTicker
, getMarketSummaries
, getMarketSummary
, getOrderBookBuys
, getOrderBookSells
, getMarketHistory
-- * Market
, buyLimit
, sellLimit
, cancel
, getOpenOrders
-- * Account
, getBalances
, getBalance
, getDepositAddress
, withdraw
, getOrder
, getOrderHistory
, getWithdrawalHistory
, getDepositHistory
) where
import Data.Aeson
import Data.Char
import Data.Monoid
import Data.Scientific
import Data.Text (Text)
import qualified Data.Text as T
import Bittrex.Types
import Bittrex.Util
import Bittrex.Internal
-- $intro
-- Bittrex provides a simple and powerful REST API to allow you to programatically perform nearly all actions you can from our web interface.
--
-- All requests use the application/json content type and go over https.
-- The base url is https://bittrex.com/api/{version}/.
--
-- All requests are GET requests and all responses come in a default response object with the result in the result field. Always check the success flag to ensure that your API call succeeded.
--
-- We are currently restricting orders to 500 open orders and 200,000 orders a day. We reserve the right to change these settings as we tune the system. If you are affected by these limits as an active trader, please email support@bittrex.com.
--
-- If you have any questions, feedback or recommendation for API support you can post a question in our support center.
--
-- | Used to get the open and available trading markets at Bittrex along with other meta data.
getMarkets
:: IO (Either ErrorMessage [Market])
getMarkets = callAPI defOpts { path = "getmarkets" }
-- | Used to get all supported currencies at Bittrex along with other meta data.
getCurrencies
:: IO (Either ErrorMessage [Currency])
getCurrencies = callAPI defOpts { path = "getcurrencies" }
-- | Used to get the current tick values for a market.
getTicker
:: MarketName -- ^ a string literal for the market (ex: `BTC-LTC`)
-> IO (Either ErrorMessage Ticker)
getTicker market =
callAPI defOpts {
qParams = [("market", camelToDash $ show market)]
, path = "getticker"
}
-- | Used to get the last 24 hour summary of all active exchanges
getMarketSummaries
:: IO (Either ErrorMessage [MarketSummary])
getMarketSummaries =
callAPI defOpts { path = "getmarketsummaries" }
-- | Used to get the last 24 hour summary of all active exchanges
getMarketSummary
:: MarketName -- ^ a string literal for the market (ex: `BTC-LTC`)
-> IO (Either ErrorMessage [MarketSummary])
getMarketSummary market =
callAPI defOpts {
qParams = pure ("market", camelToDash $ show market)
, path = "getmarketsummary"
}
-- | Used to get retrieve the orderbook for a given market
getOrderBookBuys
:: MarketName -- ^ a string literal for the market (ex: `BTC-LTC`)
-- -> OrderBookType -- ^ buy, sell or both to identify the type of orderbook to return.
-> IO (Either ErrorMessage [OrderBookEntry])
getOrderBookBuys market =
callAPI defOpts {
path = "getorderbook"
, qParams = [ ("market", camelToDash $ show market)
, ("type", "buy")
]
}
-- | Used to get retrieve the orderbook for a given market
getOrderBookSells
:: MarketName -- ^ a string literal for the market (ex: `BTC-LTC`)
-- -> OrderBookType -- ^ buy, sell or both to identify the type of orderbook to return.
-> IO (Either ErrorMessage [OrderBookEntry])
getOrderBookSells market =
callAPI defOpts {
path = "getorderbook"
, qParams = [ ("market", camelToDash $ show market)
, ("type", "sell")
]
}
-- | Used to retrieve the latest trades that have occured for a specific market.
getMarketHistory
:: MarketName -- ^ string literal for the market (ex: `BTC-LTC`)
-> IO (Either ErrorMessage [MarketHistory])
getMarketHistory market =
callAPI defOpts {
path = "getmarkethistory"
, qParams = pure ("market", camelToDash $ show market)
}
-- | Get all orders that you currently have opened. A specific market can be requested
getOpenOrders
:: APIKeys -- ^ Bittrex API credentials
-> MarketName -- ^ String literal for the market (ie. BTC-LTC)
-> IO (Either ErrorMessage [OpenOrder])
getOpenOrders keys market =
callAPI defOpts {
path = "getopenorders"
, apiType = MarketAPI
, qParams = pure ("market", camelToDash $ show market)
, keys = keys
}
-- | Used to place a buy order in a specific market. Use buylimit to place limit orders. Make sure you have the proper permissions set on your API keys for this call to work
buyLimit
:: APIKeys -- ^ Bittrex API credentials
-> MarketName -- ^ A string literal for the market (ex: BTC-LTC)
-> Quantity -- ^ The amount to purchase
-> Rate -- ^ The rate at which to place the order.
-> IO (Either ErrorMessage UUID)
buyLimit keys market quantity rate =
callAPI defOpts {
path = "buylimit"
, keys = keys
, apiType = MarketAPI
, qParams = [ ("market", camelToDash $ show market )
, ("quantity", show quantity )
, ("rate", show rate )
]
}
-- | Used to place an sell order in a specific market. Use selllimit to place limit orders.
-- Make sure you have the proper permissions set on your API keys for this call to workn
sellLimit
:: APIKeys -- ^ Bittrex API credentials
-> MarketName -- ^ A string literal for the market (ex: BTC-LTC)
-> Quantity -- ^ The amount to purchase
-> Rate -- ^ The rate at which to place the order
-> IO (Either ErrorMessage UUID)
sellLimit keys market quantity rate =
callAPI defOpts {
path = "selllimit"
, keys = keys
, apiType = MarketAPI
, qParams = [ ("market", camelToDash $ show market )
, ("quantity", show quantity )
, ("rate", show rate )
]
}
-- | Used to cancel a buy or sell order.
cancel
:: APIKeys -- ^ Bittrex API credentials
-> UUID -- ^ uuid of buy or sell order
-> IO (Either ErrorMessage (Maybe Text))
cancel keys (UUID uuid) =
callAPI defOpts {
path = "cancel"
, keys = keys
, apiType = MarketAPI
, qParams = [ ("uuid", T.unpack uuid ) ]
}
-- | Used to retrieve all balances from your account
getBalances
:: APIKeys -- ^ Bittrex API credentials
-> IO (Either ErrorMessage [Balance])
getBalances keys =
callAPI defOpts {
path = "getbalances"
, keys = keys
, apiType = AccountAPI
}
-- | Used to retrieve the balance from your account for a specific currency.
getBalance
:: APIKeys -- ^ Bittrex API credentials
-> CurrencyName -- ^ a string literal for the currency (ex: LTC)
-> IO (Either ErrorMessage Balance)
getBalance keys currency =
callAPI defOpts {
path = "getbalance"
, keys = keys
, apiType = AccountAPI
, qParams = pure ("currency", T.unpack currency )
}
-- | Used to retrieve or generate an address for a specific currency.
-- If one does not exist, the call will fail and return ADDRESS_GENERATING until one is available.
getDepositAddress
:: APIKeys -- ^ Bittrex API credentials
-> CurrencyName -- ^ a string literal for the currency (ie. BTC)
-> IO (Either ErrorMessage DepositAddress)
getDepositAddress keys currency =
callAPI defOpts {
path = "getdepositaddress"
, apiType = AccountAPI
, keys = keys
, qParams = pure ("currency", T.unpack currency )
}
-- | Used to retrieve your withdrawal history.
getWithdrawalHistory
:: APIKeys -- ^ Bittrex API credentials
-> CurrencyName
-> IO (Either ErrorMessage [WithdrawalHistory])
getWithdrawalHistory keys currency =
callAPI defOpts {
path = "getwithdrawalhistory"
, apiType = AccountAPI
, keys = keys
, qParams = pure ( "currency"
, show currency
)
}
-- | Used to retrieve your order history.
getOrderHistory
:: APIKeys -- ^ Bittrex API credentials
-> Maybe MarketName -- ^ a string literal for the market (ie. BTC-LTC). If ommited, will return for all markets
-> IO (Either ErrorMessage [OrderHistory] )
getOrderHistory keys market =
callAPI defOpts {
path = "getorderhistory"
, apiType = AccountAPI
, keys = keys
, qParams = [ ("market", camelToDash (show m) )
| Just m <- pure market
]
}
-- | Used to retrieve a single order by uuid.
getOrder
:: APIKeys -- ^ Bittrex API credentials
-> UUID -- ^ the uuid of the buy or sell order
-> IO (Either ErrorMessage Order)
getOrder keys (UUID uuid) =
callAPI defOpts {
path = "getorder"
, keys = keys
, apiType = AccountAPI
, qParams = [ ("uuid", T.unpack uuid) ]
}
-- | Used to withdraw funds from your account. note: please account for txfee.
withdraw
:: APIKeys -- ^ Bittrex API credentials
-> CurrencyName -- ^ A string literal for the currency (ie. BTC)
-> Quantity -- ^ The quantity of coins to withdraw
-> Address -- ^ The address where to send the funds.
-> Maybe PaymentId -- ^ used for CryptoNotes/BitShareX/Nxt optional field (memo/paymentid)
-> IO (Either ErrorMessage UUID)
withdraw keys currency quantity address payment =
callAPI defOpts {
path = "withdraw"
, keys = keys
, apiType = AccountAPI
, qParams = [ ("currency", T.unpack currency )
, ("quantity", show quantity )
, ("address", address )
] <> [ ("paymentid", show p )
| Just p <- pure payment
]
}
-- | Used to retrieve your deposit history.
getDepositHistory
:: APIKeys
-- ^ Bittrex API credentials
-> Maybe CurrencyName
-- ^ A string literal for the currecy (ie. BTC). If `Nothing`, will return for all currencies
-> IO (Either ErrorMessage [DepositHistory])
getDepositHistory keys currency =
callAPI defOpts {
path = "getdeposithistory"
, apiType = AccountAPI
, keys = keys
, qParams = [ ("currency", show c)
| Just c <- pure currency
]
}