Created
January 20, 2017 04:14
-
-
Save TGOlson/1940affdc4c46ca0310399f6f1276ff9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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