Browse Source

Positions: fix partial execution handling

stable
Denis Tereshkin 6 years ago
parent
commit
cb8897ad95
  1. 17
      src/ATrade/RoboCom/Positions.hs

17
src/ATrade/RoboCom/Positions.hs

@ -203,10 +203,15 @@ dispatchPosition event pos = case posState pos of
lastTs <- view seLastTimestamp <$> getEnvironment lastTs <- view seLastTimestamp <$> getEnvironment
case posCurrentOrder pos of case posCurrentOrder pos of
Just order -> if orderDeadline (posExecutionDeadline pos) lastTs Just order -> if orderDeadline (posExecutionDeadline pos) lastTs
then do -- TODO call TimeoutHandler then
if posBalance pos == 0
then do
appendToLog $ [st|"In PositionWaitingOpen: execution timeout: %?/%?"|] (posExecutionDeadline pos) lastTs appendToLog $ [st|"In PositionWaitingOpen: execution timeout: %?/%?"|] (posExecutionDeadline pos) lastTs
cancelOrder $ orderId order cancelOrder $ orderId order
return $ pos { posState = PositionWaitingPendingCancellation, posNextState = Just PositionCancelled } return $ pos { posState = PositionWaitingPendingCancellation, posNextState = Just PositionCancelled }
else do
appendToLog $ [st|Order executed (partially, %? / %?): %?|] (posBalance pos) (orderQuantity order) order
return pos { posState = PositionOpen, posCurrentOrder = Nothing, posExecutionDeadline = Nothing, posEntryTime = Just lastTs}
else case event of else case event of
OrderUpdate oid newstate -> OrderUpdate oid newstate ->
if oid == orderId order if oid == orderId order
@ -225,9 +230,7 @@ dispatchPosition event pos = case posState pos of
_ -> do _ -> do
appendToLog $ [st|In PositionWaitingOpen: order state update: %?|] newstate appendToLog $ [st|In PositionWaitingOpen: order state update: %?|] newstate
return pos return pos
else do else return pos -- Update for another position's order
appendToLog $ [st|Invalid order id: %?/%?|] oid (orderId order)
return pos
NewTrade trade -> do NewTrade trade -> do
appendToLog $ [st|Order new trade: %?/%?|] order trade appendToLog $ [st|Order new trade: %?/%?|] order trade
return $ if tradeOrderId trade == orderId order return $ if tradeOrderId trade == orderId order
@ -304,6 +307,7 @@ dispatchPosition event pos = case posState pos of
case posCurrentOrder pos of case posCurrentOrder pos of
Just order -> cancelOrder (orderId order) Just order -> cancelOrder (orderId order)
_ -> doNothing _ -> doNothing
appendToLog $ [st|Was unable to close position, remaining balance: %?|] (posBalance pos)
return $ pos { posState = PositionOpen, posSubmissionDeadline = Nothing, posExecutionDeadline = Nothing } -- TODO call TimeoutHandler if present return $ pos { posState = PositionOpen, posSubmissionDeadline = Nothing, posExecutionDeadline = Nothing } -- TODO call TimeoutHandler if present
else case (event, posCurrentOrder pos) of else case (event, posCurrentOrder pos) of
(OrderUpdate oid newstate, Just order) -> (OrderUpdate oid newstate, Just order) ->
@ -313,6 +317,11 @@ dispatchPosition event pos = case posState pos of
posBalance = 0, posBalance = 0,
posSubmissionDeadline = Nothing } posSubmissionDeadline = Nothing }
else pos else pos
(NewTrade trade, Just order) ->
return $ if (tradeOrderId trade == orderId order)
then pos { posBalance = if tradeOperation trade == Buy then posBalance pos + tradeQuantity trade else posBalance pos - tradeQuantity trade }
else pos
_ -> return pos _ -> return pos
handlePositionClosed = return handlePositionClosed = return

Loading…
Cancel
Save