2
0

order.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package util
  2. import (
  3. "errors"
  4. "git.beejay.kim/Gshopper/sentio"
  5. "math"
  6. )
  7. func CreateOrder(
  8. m sentio.Market,
  9. s sentio.Strategy,
  10. t sentio.Side,
  11. stamp *sentio.Probability_Stamp,
  12. quotes map[string]sentio.Quote,
  13. rm sentio.RiskManager,
  14. ) error {
  15. var (
  16. symbol string
  17. account sentio.MarketAccount
  18. threshold float32
  19. size uint
  20. bid float64
  21. tp float64
  22. sl float64
  23. ok bool
  24. err error
  25. )
  26. if symbol, ok = s.PositionSymbols()[t]; !ok {
  27. return errors.New("`CreateOrder`: unknown Side for the current strategy")
  28. }
  29. bid = sentio.ToFixed(quotes[symbol].BidPrice, 2)
  30. tp = sentio.ToFixed(rm.TakeProfit(symbol, bid), 2)
  31. sl = sentio.ToFixed(rm.StopLoss(symbol, bid), 2)
  32. // define threshold
  33. if threshold, ok = s.PositionProbabilities()[t]; !ok {
  34. return nil
  35. }
  36. // Prevent orders those have too small expected profit
  37. if tp < bid+0.02 {
  38. return sentio.ErrLowTakeProfit
  39. }
  40. // Prevent cases when order will be closed ASAP they were opened.
  41. // Also, Alpaca requires at least 0.01 gap against base_price
  42. if sl > bid-0.01 {
  43. return sentio.ErrHighStoploss
  44. }
  45. if account, err = m.Account(); err != nil {
  46. return err
  47. }
  48. if account.GetCash() < bid {
  49. return sentio.ErrTooSmallOrder
  50. }
  51. if sentio.LONG == t && stamp.Value > threshold ||
  52. sentio.SHORT == t && stamp.Value < threshold {
  53. // create a new order
  54. if size = uint(math.Floor(account.GetCash() * .8 / bid)); size < 1 {
  55. return sentio.ErrTooSmallOrder
  56. }
  57. _, err = m.CreateOrder(symbol, size, rm)
  58. return err
  59. }
  60. return nil
  61. }
  62. func CloseAllOrders(m sentio.Market, s sentio.Strategy) error {
  63. var (
  64. symbols = Symbols(s)
  65. orders []sentio.Order
  66. err error
  67. )
  68. if orders, err = m.Orders(sentio.OrderListCriteria{
  69. Status: "open",
  70. Symbols: symbols,
  71. }); err != nil {
  72. return err
  73. }
  74. for i := range orders {
  75. if _, err = m.CloseOrder(orders[i]); err != nil {
  76. return err
  77. }
  78. }
  79. return nil
  80. }