strategy.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package sentio
  2. import (
  3. "time"
  4. )
  5. type Strategy interface {
  6. Name() string
  7. Model() string
  8. MarketId() string
  9. PositionSymbols() map[Side]string
  10. PositionProbabilities() map[Side]float64
  11. Interval() uint8
  12. Cooldown(periods uint8) time.Duration
  13. Handle(market Market, probability Probability) error
  14. }
  15. //type BaseStrategy struct {
  16. // Strategy
  17. //}
  18. //
  19. //func (strategy BaseStrategy) Symbols() []string {
  20. // var symbols []string
  21. //
  22. // for side, s := range strategy.PositionSymbols() {
  23. // if BASE == side {
  24. // continue
  25. // }
  26. //
  27. // symbols = append(symbols, s)
  28. // }
  29. //
  30. // return symbols
  31. //}
  32. //
  33. //func (strategy BaseStrategy) CloseAllOrders(market Market) error {
  34. // var (
  35. // symbols = strategy.Symbols()
  36. // orders []Order
  37. // err error
  38. // )
  39. //
  40. // if orders, err = market.Orders(OrderListCriteria{
  41. // Status: "open",
  42. // Symbols: symbols,
  43. // Nested: true,
  44. // }); err != nil {
  45. // return err
  46. // }
  47. //
  48. // for i := range orders {
  49. // if _, err = market.CloseOrder(orders[i].GetId()); err != nil {
  50. // return err
  51. // }
  52. // }
  53. //
  54. // return nil
  55. //}
  56. //
  57. //func (strategy BaseStrategy) AtrStopLoss(market Market, symbols ...string) (map[string]float64, error) {
  58. // var (
  59. // stoplosses map[string]float64
  60. // bars map[string][]Bar
  61. // err error
  62. // )
  63. //
  64. // if bars, err = market.HistoricalBars(symbols, time.Minute, nil); err != nil {
  65. // return nil, err
  66. // }
  67. //
  68. // if bars == nil || len(bars) < ATR_PERIOD {
  69. // return nil, errors.New("AtrStopLoss: could not calculate stoploss for too short timeseries")
  70. // }
  71. //
  72. // stoplosses = make(map[string]float64)
  73. // for s := range bars {
  74. // h := make([]float64, len(bars[s]))
  75. // l := make([]float64, len(bars[s]))
  76. // c := make([]float64, len(bars[s]))
  77. //
  78. // for i := range bars[s] {
  79. // h[i] = bars[s][i].High
  80. // l[i] = bars[s][i].Low
  81. // c[i] = bars[s][i].Close
  82. // }
  83. //
  84. // trailing := indicator.AtrTrailingStopLoss(h, l, c, ATR_PERIOD, ATR_MULTIPLIER, ATR_HHV)
  85. // stoplosses[s] = trailing[len(trailing)-1]
  86. // }
  87. //
  88. // return stoplosses, nil
  89. //}
  90. //
  91. //func (strategy BaseStrategy) CreateOrder(m Market, t Side, proba Probability, p Portfolio, q map[string]Quote, sl map[string]float64) error {
  92. // var (
  93. // symbol = strategy.PositionSymbols()[t]
  94. // position Position
  95. // account MarketAccount
  96. // has = false
  97. // threshold float64
  98. // size uint
  99. // ok bool
  100. // err error
  101. // )
  102. //
  103. // // ensure portfolio
  104. // position, has = p.Get(symbol)
  105. //
  106. // // define threshold
  107. // if threshold, ok = strategy.PositionProbabilities()[t]; !ok {
  108. // threshold = -1
  109. // }
  110. //
  111. // if threshold == -1 || symbol == "" {
  112. // return nil
  113. // }
  114. //
  115. // // Prevent Market.CreateOrder when BidPrice less than ATR_STOPLOSS_THRESHOLD
  116. // if q[symbol].BidPrice/sl[symbol] < ATR_STOPLOSS_THRESHOLD {
  117. // return nil
  118. // }
  119. //
  120. // if account, err = m.Account(); err != nil {
  121. // return err
  122. // }
  123. //
  124. // if account.GetCash() < q[symbol].BidPrice {
  125. // return ErrTooSmallOrder
  126. // }
  127. //
  128. // if !has && proba.Value > threshold {
  129. //
  130. // // create a new order
  131. // if size = uint(math.Floor(account.GetCash() * .7 / q[symbol].BidPrice)); size < 1 {
  132. // return ErrTooSmallOrder
  133. // }
  134. //
  135. // _, err = m.CreateOrder(symbol, size, sl[symbol])
  136. // return err
  137. //
  138. // } else if has && position.GetAvgPrice()/position.GetCurrentPrice() > EXTRA_POSITION_THRESHOLD {
  139. //
  140. // // create an extra position
  141. // if size = uint(math.Floor(account.GetCash() * .5 / q[symbol].BidPrice)); size < 1 {
  142. // return ErrTooSmallOrder
  143. // }
  144. //
  145. // _, err = m.CreateOrder(symbol, size, sl[symbol])
  146. // return err
  147. // }
  148. //
  149. // return nil
  150. //}