|
|
|
@ -6,6 +6,8 @@ module ATrade.Broker.TradeSinks.MQTTTradeSink |
|
|
|
withMQTTTradeSink |
|
|
|
withMQTTTradeSink |
|
|
|
) where |
|
|
|
) where |
|
|
|
import ATrade.Broker.Protocol (TradeSinkMessage (..)) |
|
|
|
import ATrade.Broker.Protocol (TradeSinkMessage (..)) |
|
|
|
|
|
|
|
import ATrade.Logging (Severity (Debug, Info), |
|
|
|
|
|
|
|
logWith) |
|
|
|
import ATrade.Types (SignalId (..), Trade (..), |
|
|
|
import ATrade.Types (SignalId (..), Trade (..), |
|
|
|
toDouble) |
|
|
|
toDouble) |
|
|
|
import Control.Concurrent (forkIO, killThread, |
|
|
|
import Control.Concurrent (forkIO, killThread, |
|
|
|
@ -15,7 +17,7 @@ import Control.Concurrent.MVar (isEmptyMVar, newEmptyMVar, |
|
|
|
putMVar, tryReadMVar) |
|
|
|
putMVar, tryReadMVar) |
|
|
|
import Control.Exception (bracket, handle, throwIO) |
|
|
|
import Control.Exception (bracket, handle, throwIO) |
|
|
|
import Control.Monad (void, when) |
|
|
|
import Control.Monad (void, when) |
|
|
|
import Control.Monad.Extra (unlessM) |
|
|
|
import Control.Monad.Extra (whenM) |
|
|
|
import Control.Monad.Loops (whileM_) |
|
|
|
import Control.Monad.Loops (whileM_) |
|
|
|
import Data.Aeson (encode) |
|
|
|
import Data.Aeson (encode) |
|
|
|
import qualified Data.ByteString as B |
|
|
|
import qualified Data.ByteString as B |
|
|
|
@ -28,19 +30,25 @@ import qualified Data.Text.Lazy as TL |
|
|
|
import GHC.Exception (SomeException) |
|
|
|
import GHC.Exception (SomeException) |
|
|
|
import Language.Haskell.Printf |
|
|
|
import Language.Haskell.Printf |
|
|
|
import Network.MQTT.Client (connectURI, mqttConfig, |
|
|
|
import Network.MQTT.Client (connectURI, mqttConfig, |
|
|
|
publish) |
|
|
|
normalDisconnect, publish) |
|
|
|
|
|
|
|
|
|
|
|
withMQTTTradeSink mqttBrokerUri mqttTopic f = do |
|
|
|
withMQTTTradeSink mqttBrokerUri mqttTopic logger f = do |
|
|
|
killMv <- newEmptyMVar |
|
|
|
killMv <- newEmptyMVar |
|
|
|
chan <- BC.newBoundedChan 1000 |
|
|
|
chan <- BC.newBoundedChan 1000 |
|
|
|
bracket (forkIO $ sinkThread mqttBrokerUri mqttTopic killMv chan) (stopSinkThread killMv) (\_ -> f $ sink chan) |
|
|
|
bracket (forkIO $ sinkThread mqttBrokerUri mqttTopic killMv chan logger) (stopSinkThread killMv) (\_ -> f $ sink chan) |
|
|
|
where |
|
|
|
where |
|
|
|
sink = BC.writeChan |
|
|
|
sink = BC.writeChan |
|
|
|
|
|
|
|
|
|
|
|
sinkThread mqttBrokerUri mqttTopic killMv chan = whileM_ (not <$> wasKilled) $ do |
|
|
|
sinkThread mqttBrokerUri mqttTopic killMv chan logger = whileM_ (not <$> wasKilled) $ do |
|
|
|
|
|
|
|
log Info "Thread started" |
|
|
|
mqtt <- connectURI mqttConfig mqttBrokerUri |
|
|
|
mqtt <- connectURI mqttConfig mqttBrokerUri |
|
|
|
|
|
|
|
log Debug "Connected" |
|
|
|
sinkThread' mqtt |
|
|
|
sinkThread' mqtt |
|
|
|
|
|
|
|
log Debug "Disconnecting" |
|
|
|
|
|
|
|
normalDisconnect mqtt |
|
|
|
|
|
|
|
log Info "Disconnected" |
|
|
|
where |
|
|
|
where |
|
|
|
|
|
|
|
log sev = logWith logger sev "MQTTTradeSink" |
|
|
|
sinkThread' mqtt = do |
|
|
|
sinkThread' mqtt = do |
|
|
|
maybeTrade <- BC.tryReadChan chan |
|
|
|
maybeTrade <- BC.tryReadChan chan |
|
|
|
case maybeTrade of |
|
|
|
case maybeTrade of |
|
|
|
@ -48,7 +56,7 @@ sinkThread mqttBrokerUri mqttTopic killMv chan = whileM_ (not <$> wasKilled) $ d |
|
|
|
void $ publish mqtt mqttTopic (BL.fromStrict $ encodeTrade trade) False |
|
|
|
void $ publish mqtt mqttTopic (BL.fromStrict $ encodeTrade trade) False |
|
|
|
Nothing -> do |
|
|
|
Nothing -> do |
|
|
|
threadDelay 1000000 |
|
|
|
threadDelay 1000000 |
|
|
|
unlessM (isEmptyMVar killMv) $ sinkThread' mqtt |
|
|
|
whenM (isEmptyMVar killMv) $ sinkThread' mqtt |
|
|
|
|
|
|
|
|
|
|
|
wasKilled = isJust <$> tryReadMVar killMv |
|
|
|
wasKilled = isJust <$> tryReadMVar killMv |
|
|
|
encodeTrade :: Trade -> B.ByteString |
|
|
|
encodeTrade :: Trade -> B.ByteString |
|
|
|
@ -61,5 +69,5 @@ sinkThread mqttBrokerUri mqttTopic killMv chan = whileM_ (not <$> wasKilled) $ d |
|
|
|
(strategyId . tradeSignalId $ trade) |
|
|
|
(strategyId . tradeSignalId $ trade) |
|
|
|
(signalName . tradeSignalId $ trade) |
|
|
|
(signalName . tradeSignalId $ trade) |
|
|
|
|
|
|
|
|
|
|
|
stopSinkThread killMv threadId = putMVar killMv () >> killThread threadId |
|
|
|
stopSinkThread killMv threadId = putMVar killMv () >> threadDelay 10000000 |
|
|
|
|
|
|
|
|
|
|
|
|