Browse Source

Positions: fix partial execution handling

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

23
src/ATrade/RoboCom/Positions.hs

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

Loading…
Cancel
Save