--------------------------------------------------------------------------------
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
--------------------------------------------------------------------------------
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 Text
import Bittrex.Internal
import Bittrex.Types
import Bittrex.Util
--------------------------------------------------------------------------------
-- $intro
-- Bittrex provides a simple and powerful REST API to allow you to
-- programmatically 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 .
--
-- 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
-- .
--
-- 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 { apiOptsPath = "getmarkets" })
--------------------------------------------------------------------------------
-- | Used to get all supported currencies at Bittrex along with other meta data.
getCurrencies
:: IO (Either ErrorMessage [Currency])
getCurrencies
= callAPI (defOpts { apiOptsPath = "getcurrencies" })
--------------------------------------------------------------------------------
-- | Used to get the current tick values for a market.
getTicker
:: MarketName
-- ^ A string literal for the market (e.g.: @BTC-LTC@).
-> IO (Either ErrorMessage Ticker)
getTicker market
= callAPI (defOpts { apiOptsQueryParams = [("market", toMarket market)]
, apiOptsPath = "getticker"
})
--------------------------------------------------------------------------------
-- | This function returns a summary of the last 24 hours for all
-- active exchanges.
getMarketSummaries
:: IO (Either ErrorMessage [MarketSummary])
getMarketSummaries
= callAPI (defOpts { apiOptsPath = "getmarketsummaries" })
--------------------------------------------------------------------------------
-- | This function returns a summary of the last 24 hours for the given market.
getMarketSummary
:: MarketName
-- ^ A string literal for the market (e.g.: @BTC-LTC@).
-> IO (Either ErrorMessage [MarketSummary])
getMarketSummary market
= callAPI (defOpts { apiOptsQueryParams = pure ("market", toMarket market)
, apiOptsPath = "getmarketsummary"
})
--------------------------------------------------------------------------------
-- | Used to get retrieve the orderbook for a given market
getOrderBookBuys
:: MarketName
-- ^ A string literal for the market (e.g.: @BTC-LTC@).
-- -> OrderBookType
-- -- ^ buy, sell or both to identify the type of orderbook to return.
-> IO (Either ErrorMessage [OrderBookEntry])
getOrderBookBuys market
= callAPI (defOpts { apiOptsPath = "getorderbook"
, apiOptsQueryParams = [ ("market", toMarket market)
, ("type", "buy")
]
})
--------------------------------------------------------------------------------
-- | Used to get retrieve the orderbook for a given market
getOrderBookSells
:: MarketName
-- ^ A string literal for the market (e.g.: @BTC-LTC@).
-- -> OrderBookType
-- -- ^ buy, sell or both to identify the type of orderbook to return.
-> IO (Either ErrorMessage [OrderBookEntry])
getOrderBookSells market
= callAPI (defOpts { apiOptsPath = "getorderbook"
, apiOptsQueryParams = [ ("market", toMarket market)
, ("type", "sell")
]
})
-- | Used to retrieve the latest trades that have occured for a specific market.
getMarketHistory
:: MarketName
-- ^ A string literal for the market (e.g.: @BTC-LTC@).
-> IO (Either ErrorMessage [MarketHistory])
getMarketHistory market
= callAPI (defOpts { apiOptsPath = "getmarkethistory"
, apiOptsQueryParams = pure ("market", toMarket market)
})
-- | Get all orders that you currently have opened.
-- A specific market can be requested using the 'MarketName' parameter.
getOpenOrders
:: APIKeys
-- ^ Your Bittrex API credentials.
-> MarketName
-- ^ String literal for the market (e.g.: @BTC-LTC@).
-> IO (Either ErrorMessage [OpenOrder])
getOpenOrders keys market
= callAPI (defOpts { apiOptsPath = "getopenorders"
, apiOptsAPIType = MarketAPI
, apiOptsQueryParams = pure ("market", toMarket market)
, apiOptsKeys = 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
-- ^ Your Bittrex API credentials.
-> MarketName
-- ^ A string literal for the market (e.g.: @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 { apiOptsPath = "buylimit"
, apiOptsKeys = keys
, apiOptsAPIType = MarketAPI
, apiOptsQueryParams = [ ("market", toMarket 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
-- ^ Your Bittrex API credentials.
-> MarketName
-- ^ A string literal for the market (e.g.: @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 { apiOptsPath = "selllimit"
, apiOptsKeys = keys
, apiOptsAPIType = MarketAPI
, apiOptsQueryParams = [ ("market", toMarket market)
, ("quantity", show quantity)
, ("rate", show rate)
]
})
-- | Used to cancel a buy or sell order.
cancel
:: APIKeys
-- ^ Your Bittrex API credentials.
-> UUID
-- ^ The UUID of the buy or sell order.
-> IO (Either ErrorMessage (Maybe Text))
cancel keys (UUID uuid)
= callAPI (defOpts { apiOptsPath = "cancel"
, apiOptsKeys = keys
, apiOptsAPIType = MarketAPI
, apiOptsQueryParams = [ ("uuid", Text.unpack uuid) ]
})
-- | Used to retrieve all balances from your account
getBalances
:: APIKeys
-- ^ Your Bittrex API credentials.
-> IO (Either ErrorMessage [Balance])
getBalances keys
= callAPI (defOpts { apiOptsPath = "getbalances"
, apiOptsKeys = keys
, apiOptsAPIType = AccountAPI
})
-- | Used to retrieve the balance from your account for a specific currency.
getBalance
:: APIKeys
-- ^ Your Bittrex API credentials.
-> CurrencyName
-- ^ A string literal for the currency (e.g.: @LTC@).
-> IO (Either ErrorMessage Balance)
getBalance keys curr
= callAPI (defOpts { apiOptsPath = "getbalance"
, apiOptsKeys = keys
, apiOptsAPIType = AccountAPI
, apiOptsQueryParams = pure ("currency", Text.unpack curr)
})
-- | 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
-- ^ Your Bittrex API credentials.
-> CurrencyName
-- ^ A string literal for the currency (e.g.: @BTC@).
-> IO (Either ErrorMessage DepositAddress)
getDepositAddress keys curr
= callAPI (defOpts { apiOptsPath = "getdepositaddress"
, apiOptsAPIType = AccountAPI
, apiOptsKeys = keys
, apiOptsQueryParams = pure ("currency", Text.unpack curr)
})
-- | Used to retrieve your withdrawal history.
getWithdrawalHistory
:: APIKeys
-- ^ Your Bittrex API credentials.
-> CurrencyName
-- ^ A string literal for the currency (e.g.: @BTC@).
-> IO (Either ErrorMessage [WithdrawalHistory])
getWithdrawalHistory keys curr
= callAPI (defOpts { apiOptsPath = "getwithdrawalhistory"
, apiOptsAPIType = AccountAPI
, apiOptsKeys = keys
, apiOptsQueryParams = pure ("currency", show curr)
})
-- | Used to retrieve your order history.
getOrderHistory
:: APIKeys
-- ^ Your Bittrex API credentials.
-> Maybe MarketName
-- ^ A string literal for the market (e.g.: @BTC-LTC@).
-- If this is 'Nothing', all markets will be returned.
-> IO (Either ErrorMessage [OrderHistory])
getOrderHistory keys market
= callAPI (defOpts { apiOptsPath = "getorderhistory"
, apiOptsAPIType = AccountAPI
, apiOptsKeys = keys
, apiOptsQueryParams = [ ("market", toMarket m)
| Just m <- pure market ]
})
-- | Used to retrieve a single order by uuid.
getOrder
:: APIKeys
-- ^ Your Bittrex API credentials.
-> UUID
-- ^ The UUID of the buy or sell order.
-> IO (Either ErrorMessage Order)
getOrder keys (UUID uuid)
= callAPI (defOpts { apiOptsPath = "getorder"
, apiOptsKeys = keys
, apiOptsAPIType = AccountAPI
, apiOptsQueryParams = [ ("uuid", Text.unpack uuid) ]
})
-- | Used to withdraw funds from your account. note: please account for txfee.
withdraw
:: APIKeys
-- ^ Your Bittrex API credentials.
-> CurrencyName
-- ^ A string literal for the currency (e.g.: @BTC@).
-> Quantity
-- ^ The quantity of coins to withdraw
-> Address
-- ^ The address where to send the funds.
-> Maybe PaymentId
-- ^ used for the optional field representing the memo / payment ID on
-- CryptoNotes, BitShareX, and Nxt transactions.
-> IO (Either ErrorMessage UUID)
withdraw keys curr quantity address payment
= callAPI (defOpts { apiOptsPath = "withdraw"
, apiOptsKeys = keys
, apiOptsAPIType = AccountAPI
, apiOptsQueryParams = [ ("currency", Text.unpack curr)
, ("quantity", show quantity)
, ("address", address)
] <> [ ("paymentid", show p)
| Just p <- pure payment
]
})
-- | Used to retrieve your deposit history.
getDepositHistory
:: APIKeys
-- ^ Your Bittrex API credentials.
-> Maybe CurrencyName
-- ^ A string literal for the currency (e.g.: @BTC@).
-- If this is 'Nothing', all currencies will be returned.
-> IO (Either ErrorMessage [DepositHistory])
getDepositHistory keys curr
= callAPI (defOpts { apiOptsPath = "getdeposithistory"
, apiOptsAPIType = AccountAPI
, apiOptsKeys = keys
, apiOptsQueryParams = [ ("currency", show c)
| Just c <- pure curr
]
})
--------------------------------------------------------------------------------