Skip to content

Instantly share code, notes, and snippets.

@TGOlson
Created January 20, 2017 04:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TGOlson/1940affdc4c46ca0310399f6f1276ff9 to your computer and use it in GitHub Desktop.
Save TGOlson/1940affdc4c46ca0310399f6f1276ff9 to your computer and use it in GitHub Desktop.
okcoin :: Exchange
okcoin = Exchange
{ exchageName = OkCoin
, fetchTicker = fetchOkCoinTicker
}
fetchOkCoinTicker :: IO Ticker
fetchOkCoinTicker = do
r <- Wreq.asJSON =<< Wreq.get tickerUrl
let OkCoinTicker{..} = r ^. responseBody
return Ticker { tBid = octnBid octTicker
, tAsk = octnAsk octTicker
, tLast = octnLast octTicker
, tVolume = octnVolume octTicker
}
where tickerUrl = "https://www.okcoin.com/api/v1/ticker.do?symbol=btc_usd"
data OkCoinTicker = OkCoinTicker
{ octdate :: Float
, octTicker :: OkCoinTickerNested
}
instance Aeson.FromJSON OkCoinTicker where
parseJSON = Aeson.withObject "OkCoinTicker" $ \o ->
OkCoinTicker <$>
(o .: "date" >>= parseFloat) <$>
o .: "ticker"
data OkCoinTickerNested = OkCoinTickerNested
{ octnBid :: Float
, octnAsk :: Float
, octnLast :: Float
, octnVolume :: Float
}
instance Aeson.FromJSON OkCoinTickerNested where
parseJSON = Aeson.withObject "OkCoinTickerNested" $ \o ->
OkCoinTickerNested <$>
(o' .: "buy" >>= parseFloat) <*>
(o' .: "ask" >>= parseFloat) <*>
(o' .: "last" >>= parseFloat) <*>
(o' .: "volume" >>= parseFloat)
kraken :: Exchange
kraken = Exchange
{ exchageName = Kraken
, fetchTicker = fetchKrakenTicker
}
fetchOkCoinTicker :: IO Ticker
fetchOkCoinTicker = do
r <- Wreq.asJSON =<< W.get tickerUrl
let KrakenTicker{..} = r ^. responseBody
--
return Ticker { tBid = ktBid
, tAsk = ktAsk
, tLast = ktLast
, tVolume = ktVolume
}
where tickerUrl = "https://api.kraken.com/0/public/AssetPairs?pair=xbtusd"
data KrakenTicker = KrakenTicker
{ ktError :: [String]
, kfResult :: KrakenTickerResult
}
instance Aeson.FromJSON KrakenTicker where
parseJSON = Aeson.withObject "KrakenTicker" $ \o ->
KrakenTicker <$>
(o .: "error" >>= parseFloat) <$>
o .: "result"
newtype KrakenTickerResult = KrakenTickerResult KrakenTickerPair
instance Aeson.FromJSON KrakenTickerResult
data KrakenTickerPair = KrakenTickerPair
{ ktpAsk :: (Float, Float, Float) -- ask array(<price>, <whole lot volume>, <lot volume>)
, ktpBid :: (Float, Float, Float) -- bid array(<price>, <whole lot volume>, <lot volume>)
, ktpLast :: (Float, Float) -- last trade closed array(<price>, <lot volume>)
, ktpVolume :: (Float, Float) -- volume array(<today>, <last 24 hours>)
, ktpAverage :: (Float, Float) -- volume weighted average price array(<today>, <last 24 hours>)
, ktpNumTrades :: (Int, Int) -- number of trades array(<today>, <last 24 hours>)
, ktpLow :: (Float, Float) -- low array(<today>, <last 24 hours>)
, ktpHigh :: (Float, Float) -- high array(<today>, <last 24 hours>)
, ktpOpen :: Float -- today's opening price
}
instance Aeson.FromJSON KrakenTickerPair where
parseJSON = Aeson.withObject "KrakenTickerPair" $ \o ->
KrakenTickerPair <$>
(o .: "a" >>= parseFloatTriple) <*>
(o .: "b" >>= parseFloatTriple) <*>
(o .: "c" >>= parseFloatPair) <*>
(o .: "v" >>= parseFloatPair) <*>
(o .: "p" >>= parseFloatPair) <*>
o .: "t" <*>
(o .: "l" >>= parseFloatPair) <*>
(o .: "h" >>= parseFloatPair) <*>
(o .: "o" >>= parseFloat) <*>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment