ibkr.go 2.2 KB

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