|
|
|
@ -20,7 +20,6 @@ |
|
|
|
module ATrade.RoboCom.Positions |
|
|
|
module ATrade.RoboCom.Positions |
|
|
|
( |
|
|
|
( |
|
|
|
StateHasPositions(..), |
|
|
|
StateHasPositions(..), |
|
|
|
ParamsHasMainTicker(..), |
|
|
|
|
|
|
|
PositionState(..), |
|
|
|
PositionState(..), |
|
|
|
Position(..), |
|
|
|
Position(..), |
|
|
|
posIsOpen, |
|
|
|
posIsOpen, |
|
|
|
@ -79,8 +78,10 @@ import Control.Lens |
|
|
|
import Control.Monad |
|
|
|
import Control.Monad |
|
|
|
|
|
|
|
|
|
|
|
import ATrade.Logging (Severity (Trace, Warning)) |
|
|
|
import ATrade.Logging (Severity (Trace, Warning)) |
|
|
|
|
|
|
|
import ATrade.RoboCom.Monad (MonadRobot (getAvailableTickers)) |
|
|
|
import Data.Aeson |
|
|
|
import Data.Aeson |
|
|
|
import qualified Data.List as L |
|
|
|
import qualified Data.List as L |
|
|
|
|
|
|
|
import qualified Data.List.NonEmpty as NE |
|
|
|
import qualified Data.Text as T |
|
|
|
import qualified Data.Text as T |
|
|
|
import qualified Data.Text.Lazy as TL |
|
|
|
import qualified Data.Text.Lazy as TL |
|
|
|
import Data.Time.Clock |
|
|
|
import Data.Time.Clock |
|
|
|
@ -389,17 +390,17 @@ modifyPosition f oldpos = do |
|
|
|
return $ f oldpos |
|
|
|
return $ f oldpos |
|
|
|
Nothing -> return oldpos |
|
|
|
Nothing -> return oldpos |
|
|
|
|
|
|
|
|
|
|
|
getCurrentTicker :: (ParamsHasMainTicker c, MonadRobot m c s) => m [Bar] |
|
|
|
getCurrentTicker :: (MonadRobot m c s) => m [Bar] |
|
|
|
getCurrentTicker = do |
|
|
|
getCurrentTicker = do |
|
|
|
(tf, mainTicker') <- mainTicker <$> getConfig |
|
|
|
(BarSeriesId mainTicker' tf) <- NE.head <$> getAvailableTickers |
|
|
|
maybeBars <- getTicker mainTicker' tf |
|
|
|
maybeBars <- getTicker mainTicker' tf |
|
|
|
case maybeBars of |
|
|
|
case maybeBars of |
|
|
|
Just b -> return $ bsBars b |
|
|
|
Just b -> return $ bsBars b |
|
|
|
_ -> return [] |
|
|
|
_ -> return [] |
|
|
|
|
|
|
|
|
|
|
|
getCurrentTickerSeries :: (ParamsHasMainTicker c, MonadRobot m c s) => m (Maybe BarSeries) |
|
|
|
getCurrentTickerSeries :: (MonadRobot m c s) => m (Maybe BarSeries) |
|
|
|
getCurrentTickerSeries = do |
|
|
|
getCurrentTickerSeries = do |
|
|
|
(tf, mainTicker') <- mainTicker <$> getConfig |
|
|
|
(BarSeriesId mainTicker' tf) <- NE.head <$> getAvailableTickers |
|
|
|
getTicker mainTicker' tf |
|
|
|
getTicker mainTicker' tf |
|
|
|
|
|
|
|
|
|
|
|
getLastActivePosition :: (StateHasPositions s, MonadRobot m c s) => m (Maybe Position) |
|
|
|
getLastActivePosition :: (StateHasPositions s, MonadRobot m c s) => m (Maybe Position) |
|
|
|
@ -460,14 +461,14 @@ onActionCompletedEvent event f = case event of |
|
|
|
ActionCompleted tag v -> f tag v |
|
|
|
ActionCompleted tag v -> f tag v |
|
|
|
_ -> doNothing |
|
|
|
_ -> doNothing |
|
|
|
|
|
|
|
|
|
|
|
enterAtMarket :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => T.Text -> Operation -> m Position |
|
|
|
enterAtMarket :: (StateHasPositions s, MonadRobot m c s) => T.Text -> Operation -> m Position |
|
|
|
enterAtMarket operationSignalName operation = do |
|
|
|
enterAtMarket operationSignalName operation = do |
|
|
|
env <- getEnvironment |
|
|
|
env <- getEnvironment |
|
|
|
enterAtMarketWithParams (env ^. seAccount) (env ^. seVolume) (SignalId (env ^. seInstanceId) operationSignalName "") operation |
|
|
|
enterAtMarketWithParams (env ^. seAccount) (env ^. seVolume) (SignalId (env ^. seInstanceId) operationSignalName "") operation |
|
|
|
|
|
|
|
|
|
|
|
enterAtMarketWithParams :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => T.Text -> Int -> SignalId -> Operation -> m Position |
|
|
|
enterAtMarketWithParams :: (StateHasPositions s, MonadRobot m c s) => T.Text -> Int -> SignalId -> Operation -> m Position |
|
|
|
enterAtMarketWithParams account quantity signalId operation = do |
|
|
|
enterAtMarketWithParams account quantity signalId operation = do |
|
|
|
tickerId <- snd . mainTicker <$> getConfig |
|
|
|
BarSeriesId tickerId _ <- getFirstTickerId |
|
|
|
oid <- submitOrder $ order tickerId |
|
|
|
oid <- submitOrder $ order tickerId |
|
|
|
newPosition ((order tickerId) { orderId = oid }) account tickerId operation quantity 20 |
|
|
|
newPosition ((order tickerId) { orderId = oid }) account tickerId operation quantity 20 |
|
|
|
where |
|
|
|
where |
|
|
|
@ -480,20 +481,20 @@ enterAtMarketWithParams account quantity signalId operation = do |
|
|
|
orderSignalId = signalId |
|
|
|
orderSignalId = signalId |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
enterAtLimit :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => NominalDiffTime -> T.Text -> Price -> Operation -> m Position |
|
|
|
enterAtLimit :: (StateHasPositions s, MonadRobot m c s) => NominalDiffTime -> T.Text -> Price -> Operation -> m Position |
|
|
|
enterAtLimit timeToCancel operationSignalName price operation = do |
|
|
|
enterAtLimit timeToCancel operationSignalName price operation = do |
|
|
|
env <- getEnvironment |
|
|
|
env <- getEnvironment |
|
|
|
enterAtLimitWithParams timeToCancel (env ^. seAccount) (env ^. seVolume) (SignalId (env ^. seInstanceId) operationSignalName "") price operation |
|
|
|
enterAtLimitWithParams timeToCancel (env ^. seAccount) (env ^. seVolume) (SignalId (env ^. seInstanceId) operationSignalName "") price operation |
|
|
|
|
|
|
|
|
|
|
|
enterAtLimitWithVolume :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => NominalDiffTime -> T.Text -> Price -> Int -> Operation -> m Position |
|
|
|
enterAtLimitWithVolume :: (StateHasPositions s, MonadRobot m c s) => NominalDiffTime -> T.Text -> Price -> Int -> Operation -> m Position |
|
|
|
enterAtLimitWithVolume timeToCancel operationSignalName price vol operation = do |
|
|
|
enterAtLimitWithVolume timeToCancel operationSignalName price vol operation = do |
|
|
|
acc <- view seAccount <$> getEnvironment |
|
|
|
acc <- view seAccount <$> getEnvironment |
|
|
|
inst <- view seInstanceId <$> getEnvironment |
|
|
|
inst <- view seInstanceId <$> getEnvironment |
|
|
|
enterAtLimitWithParams timeToCancel acc vol (SignalId inst operationSignalName "") price operation |
|
|
|
enterAtLimitWithParams timeToCancel acc vol (SignalId inst operationSignalName "") price operation |
|
|
|
|
|
|
|
|
|
|
|
enterAtLimitWithParams :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => NominalDiffTime -> T.Text -> Int -> SignalId -> Price -> Operation -> m Position |
|
|
|
enterAtLimitWithParams :: (StateHasPositions s, MonadRobot m c s) => NominalDiffTime -> T.Text -> Int -> SignalId -> Price -> Operation -> m Position |
|
|
|
enterAtLimitWithParams timeToCancel account quantity signalId price operation = do |
|
|
|
enterAtLimitWithParams timeToCancel account quantity signalId price operation = do |
|
|
|
tickerId <- snd . mainTicker <$> getConfig |
|
|
|
BarSeriesId tickerId _ <- getFirstTickerId |
|
|
|
enterAtLimitForTickerWithParams tickerId timeToCancel account quantity signalId price operation |
|
|
|
enterAtLimitForTickerWithParams tickerId timeToCancel account quantity signalId price operation |
|
|
|
|
|
|
|
|
|
|
|
enterAtLimitForTickerWithVolume :: (StateHasPositions s, MonadRobot m c s) => TickerId -> NominalDiffTime -> T.Text -> Price -> Int -> Operation -> m Position |
|
|
|
enterAtLimitForTickerWithVolume :: (StateHasPositions s, MonadRobot m c s) => TickerId -> NominalDiffTime -> T.Text -> Price -> Int -> Operation -> m Position |
|
|
|
@ -526,19 +527,19 @@ enterAtLimitForTickerWithParams tickerId timeToCancel account quantity signalId |
|
|
|
orderSignalId = signalId |
|
|
|
orderSignalId = signalId |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
enterLongAtMarket :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => T.Text -> m Position |
|
|
|
enterLongAtMarket :: (StateHasPositions s, MonadRobot m c s) => T.Text -> m Position |
|
|
|
enterLongAtMarket operationSignalName = enterAtMarket operationSignalName Buy |
|
|
|
enterLongAtMarket operationSignalName = enterAtMarket operationSignalName Buy |
|
|
|
|
|
|
|
|
|
|
|
enterShortAtMarket :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => T.Text -> m Position |
|
|
|
enterShortAtMarket :: (StateHasPositions s, MonadRobot m c s) => T.Text -> m Position |
|
|
|
enterShortAtMarket operationSignalName = enterAtMarket operationSignalName Sell |
|
|
|
enterShortAtMarket operationSignalName = enterAtMarket operationSignalName Sell |
|
|
|
|
|
|
|
|
|
|
|
enterLongAtLimit :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
enterLongAtLimit :: (StateHasPositions s, MonadRobot m c s) => NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
enterLongAtLimit timeToCancel price operationSignalName = enterAtLimit timeToCancel operationSignalName price Buy |
|
|
|
enterLongAtLimit timeToCancel price operationSignalName = enterAtLimit timeToCancel operationSignalName price Buy |
|
|
|
|
|
|
|
|
|
|
|
enterLongAtLimitForTicker :: (StateHasPositions s, MonadRobot m c s) => TickerId -> NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
enterLongAtLimitForTicker :: (StateHasPositions s, MonadRobot m c s) => TickerId -> NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
enterLongAtLimitForTicker tickerId timeToCancel price operationSignalName = enterAtLimitForTicker tickerId timeToCancel operationSignalName price Buy |
|
|
|
enterLongAtLimitForTicker tickerId timeToCancel price operationSignalName = enterAtLimitForTicker tickerId timeToCancel operationSignalName price Buy |
|
|
|
|
|
|
|
|
|
|
|
enterShortAtLimit :: (StateHasPositions s, ParamsHasMainTicker c, MonadRobot m c s) => NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
enterShortAtLimit :: (StateHasPositions s, MonadRobot m c s) => NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
enterShortAtLimit timeToCancel price operationSignalName = enterAtLimit timeToCancel operationSignalName price Sell |
|
|
|
enterShortAtLimit timeToCancel price operationSignalName = enterAtLimit timeToCancel operationSignalName price Sell |
|
|
|
|
|
|
|
|
|
|
|
enterShortAtLimitForTicker :: (StateHasPositions s, MonadRobot m c s) => TickerId -> NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
enterShortAtLimitForTicker :: (StateHasPositions s, MonadRobot m c s) => TickerId -> NominalDiffTime -> Price -> T.Text -> m Position |
|
|
|
|