btc306.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package main
  2. import (
  3. "git.beejay.kim/Gshopper/sentio"
  4. "github.com/samber/lo"
  5. "time"
  6. )
  7. var Strategy = _ibkr{
  8. clock: sentio.ClockUTC{},
  9. }
  10. type _ibkr struct {
  11. clock sentio.Clock
  12. }
  13. func (s _ibkr) Name() string {
  14. return "BTC: BITO/BITI"
  15. }
  16. func (s _ibkr) Model() string {
  17. return "btc306"
  18. }
  19. func (s _ibkr) MarketId() string {
  20. return "ibkr"
  21. }
  22. func (s _ibkr) PositionSymbols() map[sentio.Side]string {
  23. return map[sentio.Side]string{
  24. sentio.LONG: "521525019", // BITO
  25. sentio.SHORT: "569311092", // BITI
  26. }
  27. }
  28. func (s _ibkr) IsOpen() bool {
  29. utc := s.clock.Now()
  30. h := utc.Hour()
  31. m := utc.Minute()
  32. return (h == 13 && m >= 30 || h > 13) &&
  33. h < 19 &&
  34. utc.Weekday() != time.Saturday && utc.Weekday() != time.Sunday
  35. }
  36. func (s _ibkr) ShouldClosePositions(portfolio sentio.Portfolio, proba float64) []string {
  37. if !s.IsOpen() {
  38. p := lo.Map(portfolio.Positions(), func(item sentio.Position, _ int) string {
  39. return item.GetSymbol()
  40. })
  41. symbols := lo.Values(s.PositionSymbols())
  42. p = lo.Filter(p, func(item string, _ int) bool {
  43. return lo.Contains(symbols, item)
  44. })
  45. return p
  46. }
  47. var (
  48. utc = s.clock.Now()
  49. symbols []string
  50. )
  51. if portfolio == nil {
  52. return nil
  53. }
  54. for side, symbol := range s.PositionSymbols() {
  55. position, ok := portfolio.Get(symbol)
  56. if !ok {
  57. continue
  58. }
  59. if position.GetSize() <= 0 {
  60. continue
  61. }
  62. if utc.Hour() >= 19 {
  63. symbols = append(symbols, symbol)
  64. continue
  65. }
  66. if sentio.LONG == side && proba < 1 {
  67. symbols = append(symbols, symbol)
  68. continue
  69. }
  70. if sentio.SHORT == side && proba > 1 {
  71. symbols = append(symbols, symbol)
  72. continue
  73. }
  74. }
  75. return symbols
  76. }
  77. func (s _ibkr) ShouldOpenPosition(portfolio sentio.Portfolio, proba float64) (*string, float64) {
  78. if !s.IsOpen() {
  79. return nil, 0
  80. }
  81. if proba < 0 {
  82. return nil, 0
  83. }
  84. for side, symbol := range s.PositionSymbols() {
  85. position, ok := portfolio.Get(symbol)
  86. if sentio.LONG == side && proba > 1.002 {
  87. if !ok || position.GetSize() <= 0 {
  88. return &symbol, .6
  89. } else {
  90. return &symbol, .3
  91. }
  92. }
  93. if sentio.SHORT == side && proba < 0.998 {
  94. if !ok || position.GetSize() <= 0 {
  95. return &symbol, .8
  96. } else {
  97. return &symbol, .3
  98. }
  99. }
  100. }
  101. return nil, 0
  102. }