From 93c480b033bad9a696c67a8215dc1fa35591c4a5 Mon Sep 17 00:00:00 2001 From: "Rune K. Svendsen" Date: Mon, 8 Jan 2024 10:14:15 +0100 Subject: [PATCH] Remove "bittrex" venue They are now closed: https://web.archive.org/web/20240105122332/https://bittrexglobal.com/ --- crypto-venues.cabal | 1 - src/CryptoVenues/Types/ABook.hs | 6 -- src/CryptoVenues/Venues.hs | 3 - src/CryptoVenues/Venues/Bittrex.hs | 136 ----------------------------- 4 files changed, 146 deletions(-) delete mode 100644 src/CryptoVenues/Venues/Bittrex.hs diff --git a/crypto-venues.cabal b/crypto-venues.cabal index 9837fec..7b24aeb 100644 --- a/crypto-venues.cabal +++ b/crypto-venues.cabal @@ -49,7 +49,6 @@ library CryptoVenues.Venues.Bitfinex CryptoVenues.Venues.Bitfinex.Mapping CryptoVenues.Venues.Bitstamp - CryptoVenues.Venues.Bittrex CryptoVenues.Venues.Coinbase CryptoVenues.Venues.Common.ScientificOrder other-modules: diff --git a/src/CryptoVenues/Types/ABook.hs b/src/CryptoVenues/Types/ABook.hs index cb46aff..75d0a80 100644 --- a/src/CryptoVenues/Types/ABook.hs +++ b/src/CryptoVenues/Types/ABook.hs @@ -14,11 +14,6 @@ import qualified OrderBook.Types as OB import qualified Data.Aeson as Json import Data.Aeson ((.=), (.:)) -import Data.Proxy (Proxy(..)) -import GHC.TypeLits (KnownSymbol, SomeSymbol(..) - , symbolVal, someSymbolVal - ) -import Data.Maybe (fromMaybe) -- | Just some order book data ABook = @@ -102,7 +97,6 @@ data MarketBookVenue = marketBookVenue :: String -> Maybe MarketBookVenue marketBookVenue "bitfinex" = Just . MarketBookVenue $ Proxy @"bitfinex" -marketBookVenue "bittrex" = Just . MarketBookVenue $ Proxy @"bittrex" marketBookVenue "binance" = Just . MarketBookVenue $ Proxy @"binance" marketBookVenue "bitstamp" = Just . MarketBookVenue $ Proxy @"bitstamp" marketBookVenue "coinbase" = Just . MarketBookVenue $ Proxy @"coinbase" diff --git a/src/CryptoVenues/Venues.hs b/src/CryptoVenues/Venues.hs index 630f9aa..e8a613c 100644 --- a/src/CryptoVenues/Venues.hs +++ b/src/CryptoVenues/Venues.hs @@ -13,7 +13,6 @@ import CryptoVenues.Fetch.MarketBook import CryptoVenues.Venues.Coinbase as Coinbase () import CryptoVenues.Venues.Bitstamp as Bitstamp () import qualified CryptoVenues.Venues.Bitfinex as Bitfinex -import CryptoVenues.Venues.Bittrex as Bittrex () import CryptoVenues.Venues.Binance as Binance () import qualified Data.HashMap.Strict as HM @@ -28,7 +27,6 @@ instance MarketBook "bitfinex" where allVenues :: [AnyVenue] allVenues = [ AnyVenue (Proxy :: Proxy "bitfinex") - , AnyVenue (Proxy :: Proxy "bittrex") , AnyVenue (Proxy :: Proxy "binance") , AnyVenue (Proxy :: Proxy "bitstamp") , AnyVenue (Proxy :: Proxy "coinbase") @@ -47,4 +45,3 @@ venueLookup :: Text -> Maybe AnyVenue venueLookup = (`HM.lookup` venueMap) - \ No newline at end of file diff --git a/src/CryptoVenues/Venues/Bittrex.hs b/src/CryptoVenues/Venues/Bittrex.hs deleted file mode 100644 index 9b070bf..0000000 --- a/src/CryptoVenues/Venues/Bittrex.hs +++ /dev/null @@ -1,136 +0,0 @@ -{-# OPTIONS_GHC -fno-warn-orphans #-} -{-# OPTIONS_GHC -fno-warn-name-shadowing #-} -{-# LANGUAGE LambdaCase #-} -{- - https://bittrex.github.io/api/v3 --} -module CryptoVenues.Venues.Bittrex -() -where - -import CryptoVenues.Internal.CPrelude -import CryptoVenues.Venues.Common.ScientificOrder (QuotedScientific) -import OrderBook -import CryptoVenues.Fetch -import CryptoVenues.Types.Market -import CryptoVenues.Types.MarketSymbol - -import qualified Servant.Client as SC -import Servant.API -import qualified Data.Aeson as Json -import qualified Data.Aeson.Types as Json -import Data.Vector (Vector) -import qualified Data.Vector as Vec - -instance Json.FromJSON (SomeBook "bittrex") where - parseJSON val = - let fromBook Book{..} = mkSomeBook - <$> traverse parseOrder (fromMaybe Vec.empty bid) - <*> traverse parseOrder (fromMaybe Vec.empty ask) - in Json.parseJSON val >>= fromBook >>= either fail return - -data Book = Book - { bid :: Maybe (Vector BittrexOrder) - , ask :: Maybe (Vector BittrexOrder) - } deriving (Show, Generic) - -instance Json.FromJSON Book - -data BittrexOrder = BittrexOrder - { quantity :: QuotedScientific - , rate :: QuotedScientific - } deriving (Show, Generic) - -instance Json.FromJSON BittrexOrder where - parseJSON = Json.genericParseJSON - Json.defaultOptions - -parseOrder :: BittrexOrder -> Json.Parser SomeOrder -parseOrder bo@BittrexOrder{..} = - maybe (fail $ "Bad BittrexOrder: " ++ show bo) return soM - where soM = mkSomeOrder (toRational quantity) (toRational rate) - -apiUrl :: BaseUrl -apiUrl = BaseUrl Https "api.bittrex.com" 443 "" - --- | Example: https://api.bittrex.com/v3/markets/BTC-USD/orderbook -type Api base quote - = "v3" - :> "markets" - :> Capture "symbol" (MarketSymbol "bittrex") - :> "orderbook" - :> QueryParam "depth" Depth - :> Get '[JSON] (SomeBook "bittrex") - -mkBookSrc :: MarketSymbol "bittrex" -> DataSrc (SomeBook "bittrex") -mkBookSrc pair = DataSrc apiUrl (clientM pair (Just MaxDepth)) - where - clientM = SC.client (Proxy :: Proxy (Api base quote)) - -data BMarket = BMarket - { baseCurrencySymbol :: Text - , quoteCurrencySymbol :: Text - , symbol :: Text - , status :: Status - } deriving (Show, Generic) - -data Depth - = MaxDepth - | DefaultDepth - | MinDepth - -depthInteger :: Depth -> Int -depthInteger = \case - MaxDepth -> 500 - DefaultDepth -> 25 - MinDepth -> 1 - -instance ToHttpApiData Depth where - toUrlPiece = toS . show . depthInteger - toQueryParam = toS . show . depthInteger - -data Status - = Online - | Unknown - deriving (Eq, Show) - -statusFromText :: Text -> Status -statusFromText = \case - "ONLINE" -> Online - _ -> Unknown - -instance Json.FromJSON Status where - parseJSON = Json.withText "Status" (pure . statusFromText) - -instance Json.FromJSON BMarket where - parseJSON = Json.genericParseJSON - Json.defaultOptions - --- | https://api.bittrex.com/v3/markets -type ApiMarkets - = "v3" - :> "markets" - :> Get '[JSON] (MarketList "bittrex") - -instance MarketBook "bittrex" where - marketBook = mkBookSrc - rateLimit = DataSrc apiUrl (return 1) - -- Rate limit: 1 per second (https://bitcoin.stackexchange.com/questions/59316/trading-bot-what-is-the-maximum-load-an-exchange-server-can-take) - -instance EnumMarkets "bittrex" where - allMarkets = DataSrc apiUrl clientM - where - clientM = SC.client (Proxy :: Proxy ApiMarkets) - -instance Json.FromJSON (MarketList "bittrex") where - parseJSON val = do - result <- Json.parseJSON val - return $ MarketList $ map fromBM $ filter ((== Online) . status) result - -fromBM :: BMarket -> Market venue -fromBM BMarket{..} = - Market - { miBase = baseCurrencySymbol - , miQuote = quoteCurrencySymbol - , miApiSymbol = toMarketSymbol symbol - }