Guest User

Untitled

a guest
May 25th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1.  
  2. (defn cmp-order
  3. ([a b] (cmp-order a b >))
  4. ([a b pred]
  5. (if (pred (:price a) (:price b))
  6. true
  7. (if (== (:price a) (:price b))
  8. (if (< (:id a) (:id b))
  9. true
  10. false)
  11. false))))
  12.  
  13. (def bids (ref (sorted-set-by #(cmp-order % %2 >))))
  14. (def offers (ref (sorted-set-by #(cmp-order % %2 <))))
  15. (def execs (ref []))
  16. (def bookmap {:bid bids :offer offers})
  17. (def revbookmap {:bid offers :offer bids})
  18. (def orderid (ref 0))
  19. (defstruct order :price :quant :side :id)
  20. (def preds {:bid #(>= % %2) :offer #(<= % %2)})
  21.  
  22. (defn match
  23. [price quant side]
  24. (let [book (side revbookmap)
  25. pred (side preds)]
  26. (loop [bets @book quant-remain quant]
  27. (println "in loop" quant-remain)
  28. (if (pos? quant-remain)
  29. (if-let [bet (first bets)]
  30. (if (pred price (:price bet))
  31. (let [quant-to-ex (if (> quant-remain (:quant bet))
  32. (:quant bet)
  33. quant-remain)
  34. new-quant-remain (- quant-remain quant-to-ex)]
  35. (dosync
  36. (alter execs conj [(:price bet) quant-to-ex])
  37. (alter book disj bet)
  38. (let [quant-in-book (- (:quant bet) quant-to-ex)]
  39. (if (pos? quant-in-book)
  40. (alter book conj
  41. (struct order (:price bet) quant-in-book
  42. side
  43. (:id bet))))))
  44. (recur (next bets) new-quant-remain))
  45. (recur (next bets) quant-remain))
  46. quant-remain)
  47. quant-remain))))
  48.  
  49. (defn bet
  50. [price quant side]
  51. (let [remain (match price quant side)]
  52. (if (pos? remain)
  53. (dosync
  54. (alter (side bookmap) conj
  55. (struct order price remain side @orderid))
  56. (alter orderid inc)))))
Add Comment
Please, Sign In to add comment