Browse Source

exitAtLimit: round exit price

master
Denis Tereshkin 4 years ago
parent
commit
d0e130e121
  1. 35
      src/ATrade/RoboCom/Positions.hs

35
src/ATrade/RoboCom/Positions.hs

@ -661,23 +661,32 @@ exitAtLimit :: (StateHasPositions s, MonadRobot m c s) => NominalDiffTime -> Pri
exitAtLimit timeToCancel price position operationSignalName = do exitAtLimit timeToCancel price position operationSignalName = do
lastTs <- view seLastTimestamp <$> getEnvironment lastTs <- view seLastTimestamp <$> getEnvironment
inst <- view seInstanceId <$> getEnvironment inst <- view seInstanceId <$> getEnvironment
case posCurrentOrder position of cfg <- getConfig
Just order -> cancelOrder (orderId order) (BarSeriesId tid tf) <- getFirstTickerId
Nothing -> doNothing maybeSeries <- getTicker tid tf
oid <- submitOrder (closeOrder inst) case maybeSeries of
appendToLog Trace $ [t|exitAtLimit: %?, deadline: %?|] (posTicker position) (timeToCancel `addUTCTime` lastTs) Just series -> do
modifyPosition (\pos -> let roundedPrice = roundTo (ipTickSize . bsParams $ series) price
pos { posCurrentOrder = Nothing, case posCurrentOrder position of
posState = PositionWaitingCloseSubmission (closeOrder inst) { orderId = oid }, Just order -> cancelOrder (orderId order)
posNextState = Just PositionClosed, Nothing -> doNothing
posSubmissionDeadline = Just $ 10 `addUTCTime` lastTs, oid <- submitOrder (closeOrder inst roundedPrice)
posExecutionDeadline = Just $ timeToCancel `addUTCTime` lastTs }) position appendToLog Trace $ [t|exitAtLimit: %?, deadline: %?|] (posTicker position) (timeToCancel `addUTCTime` lastTs)
modifyPosition (\pos ->
pos { posCurrentOrder = Nothing,
posState = PositionWaitingCloseSubmission (closeOrder inst roundedPrice) { orderId = oid },
posNextState = Just PositionClosed,
posSubmissionDeadline = Just $ 10 `addUTCTime` lastTs,
posExecutionDeadline = Just $ timeToCancel `addUTCTime` lastTs }) position
Nothing -> do
appendToLog Warning $ "Unable to locate first bar series"
return position
where where
closeOrder inst = mkOrder { closeOrder inst roundedPrice = mkOrder {
orderAccountId = posAccount position, orderAccountId = posAccount position,
orderSecurity = posTicker position, orderSecurity = posTicker position,
orderQuantity = (abs . posBalance) position, orderQuantity = (abs . posBalance) position,
orderPrice = Limit price, orderPrice = Limit roundedPrice,
orderOperation = if posBalance position > 0 then Sell else Buy, orderOperation = if posBalance position > 0 then Sell else Buy,
orderSignalId = SignalId inst operationSignalName "" orderSignalId = SignalId inst operationSignalName ""
} }

Loading…
Cancel
Save