module Network.GDAX.Explicit.Private where
import Control.Monad.Catch
import Control.Monad.IO.Class
import Data.Monoid
import Data.Set (Set)
import qualified Data.Set as Set
import qualified Data.Text as T
import Data.Vector (Vector)
import Network.GDAX.Core
import Network.GDAX.Types.Private
import Network.GDAX.Types.Shared
listAccounts :: (MonadIO m, MonadThrow m) => Gdax -> m (Vector Account)
listAccounts g = gdaxSignedGet g "/accounts" []
getAccount :: (MonadIO m, MonadThrow m) => Gdax -> AccountId -> m Account
getAccount g aid = gdaxSignedGet g ("/accounts/" <> show aid) []
getAccountHistory :: (MonadIO m, MonadThrow m) => Gdax -> AccountId -> m (Vector Entry)
getAccountHistory g aid = gdaxSignedGet g ("/accounts/" <> show aid <> "/ledger") []
getAccountHolds :: (MonadIO m, MonadThrow m) => Gdax -> AccountId -> m (Vector Hold)
getAccountHolds g aid = gdaxSignedGet g ("/accounts/" <> show aid <> "/holds") []
placeOrder :: (MonadIO m, MonadThrow m) => Gdax -> NewOrder -> m NewOrderConfirmation
placeOrder g no = gdaxSignedPost g "/orders" [] no
placeLimitOrder :: (MonadIO m, MonadThrow m) => Gdax -> NewLimitOrder -> m NewOrderConfirmation
placeLimitOrder g no = gdaxSignedPost g "/orders" [] no
placeMarketOrder :: (MonadIO m, MonadThrow m) => Gdax -> NewMarketOrder -> m NewOrderConfirmation
placeMarketOrder g no = gdaxSignedPost g "/orders" [] no
placeStopOrder :: (MonadIO m, MonadThrow m) => Gdax -> NewStopOrder -> m NewOrderConfirmation
placeStopOrder g no = gdaxSignedPost g "/orders" [] no
cancelOrder :: (MonadIO m, MonadThrow m) => Gdax -> OrderId -> m ()
cancelOrder g oid = gdaxSignedDelete g ("/orders/" <> show oid) []
cancelAllOrders :: (MonadIO m, MonadThrow m) => Gdax -> ProductId -> m (Vector OrderId)
cancelAllOrders g pid = gdaxSignedDelete g ("/orders") [("product_id", T.pack (show pid))]
listOrders :: (MonadIO m, MonadThrow m) => Gdax -> Set ProductId -> Set OrderStatus -> m (Vector Order)
listOrders g pids oss = gdaxSignedGet g "/orders" params
where
params = fmap (\p -> ("product_id", T.pack (show p))) (Set.toList pids)
<> fmap (\s -> ("status", T.pack (show s))) (Set.toList oss)
getOrder :: (MonadIO m, MonadThrow m) => Gdax -> OrderId -> m Order
getOrder g oid = gdaxSignedGet g ("/orders/" <> show oid) []
listFills :: (MonadIO m, MonadThrow m) => Gdax -> Set OrderId -> Set ProductId -> m (Vector Fill)
listFills g oids pids = gdaxSignedGet g "/fills" params
where
params = fmap (\p -> ("product_id", T.pack (show p))) (Set.toList pids)
<> fmap (\o -> ("order_id", T.pack (show o))) (Set.toList oids)
listFundings :: (MonadIO m, MonadThrow m) => Gdax -> Set FundingStatus -> m (Vector Funding)
listFundings g fs = gdaxSignedGet g "/fundings" (fmap (\f -> ("status", T.pack (show f))) (Set.toList fs))
repayFunding :: (MonadIO m, MonadThrow m) => Gdax -> CurrencyId -> Double -> m ()
repayFunding g c a = gdaxSignedPost g "/funding/repay" params ()
where
params = [ ("currency", T.pack (show c))
, ("amount", T.pack (show a))
]
createMarginTransfer :: (MonadIO m, MonadThrow m) => Gdax -> NewMarginTransfer -> m MarginTransfer
createMarginTransfer g nmt = gdaxSignedPost g "/profiles/margin-transfer" [] nmt
getPosition :: (MonadIO m, MonadThrow m) => Gdax -> m Position
getPosition g = gdaxSignedGet g "/position" []
type RepayOnly = Bool
closePosition :: (MonadIO m, MonadThrow m) => Gdax -> RepayOnly -> m ()
closePosition g r = gdaxSignedPost g "/position/close" [("repay_only", str)] ()
where
str = if r then "true" else "false"
deposit :: (MonadIO m, MonadThrow m) => Gdax -> Deposit -> m DepositReceipt
deposit g d = gdaxSignedPost g "/deposits/payment-method" [] d
depositCoinbase :: (MonadIO m, MonadThrow m) => Gdax -> CoinbaseDeposit -> m CoinbaseDepositReceipt
depositCoinbase g d = gdaxSignedPost g "/deposits/coinbase-account" [] d
withdraw :: (MonadIO m, MonadThrow m) => Gdax -> Withdraw -> m WithdrawReceipt
withdraw g w = gdaxSignedPost g "/withdrawals/payment-method" [] w
withdrawCoinbase :: (MonadIO m, MonadThrow m) => Gdax -> CoinbaseWithdraw -> m CoinbaseWithdrawReceipt
withdrawCoinbase g w = gdaxSignedPost g "/withdrawals/coinbase-account" [] w
withdrawCrypto :: (MonadIO m, MonadThrow m) => Gdax -> CryptoWithdraw -> m CryptoWithdrawReceipt
withdrawCrypto g w = gdaxSignedPost g "/withdrawals/crypto" [] w
listPaymentMethods :: (MonadIO m, MonadThrow m) => Gdax -> m (Vector PaymentMethod)
listPaymentMethods g = gdaxSignedGet g "/payment-methods" []
listCoinbaseAccounts :: (MonadIO m, MonadThrow m) => Gdax -> m (Vector CoinbaseAccount)
listCoinbaseAccounts g = gdaxSignedGet g "/coinbase-accounts" []
createReport :: (MonadIO m, MonadThrow m) => Gdax -> NewReport -> m Report
createReport g nr = gdaxSignedPost g "/reports" [] nr
getReport :: (MonadIO m, MonadThrow m) => Gdax -> ReportId -> m Report
getReport g rid = gdaxSignedGet g ("/reports/" <> show rid) []
listTrailingVolume :: (MonadIO m, MonadThrow m) => Gdax -> m (Vector TrailingVolume)
listTrailingVolume g = gdaxSignedGet g "/users/self/trailing-volume" []