123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- package main
- import (
- "git.beejay.kim/Gshopper/sentio"
- "github.com/samber/lo"
- "time"
- )
- var Strategy = _ibkr{
- clock: sentio.ClockUTC{},
- }
- type _ibkr struct {
- clock sentio.Clock
- }
- func (s _ibkr) Name() string {
- return "BTC: BITO/BITI"
- }
- func (s _ibkr) Model() string {
- return "btc306"
- }
- func (s _ibkr) MarketId() string {
- return "ibkr"
- }
- func (s _ibkr) PositionSymbols() map[sentio.Side]string {
- return map[sentio.Side]string{
- sentio.LONG: "521525019", // BITO
- sentio.SHORT: "569311092", // BITI
- }
- }
- func (s _ibkr) IsOpen() bool {
- utc := s.clock.Now()
- h := utc.Hour()
- m := utc.Minute()
- return (h == 13 && m >= 30 || h > 13) &&
- h < 19 &&
- utc.Weekday() != time.Saturday && utc.Weekday() != time.Sunday
- }
- func (s _ibkr) ShouldClosePositions(portfolio sentio.Portfolio, proba float64) []string {
- if !s.IsOpen() {
- p := lo.Map(portfolio.Positions(), func(item sentio.Position, _ int) string {
- return item.GetSymbol()
- })
- symbols := lo.Values(s.PositionSymbols())
- p = lo.Filter(p, func(item string, _ int) bool {
- return lo.Contains(symbols, item)
- })
- return p
- }
- var (
- utc = s.clock.Now()
- symbols []string
- )
- if portfolio == nil {
- return nil
- }
- for side, symbol := range s.PositionSymbols() {
- position, ok := portfolio.Get(symbol)
- if !ok {
- continue
- }
- if position.GetSize() <= 0 {
- continue
- }
- if utc.Hour() >= 19 {
- symbols = append(symbols, symbol)
- continue
- }
- if sentio.LONG == side && proba < 1 {
- symbols = append(symbols, symbol)
- continue
- }
- if sentio.SHORT == side && proba > 1 {
- symbols = append(symbols, symbol)
- continue
- }
- }
- return symbols
- }
- func (s _ibkr) ShouldOpenPosition(portfolio sentio.Portfolio, proba float64) (*string, float64) {
- if !s.IsOpen() {
- return nil, 0
- }
- if proba < 0 {
- return nil, 0
- }
- for side, symbol := range s.PositionSymbols() {
- position, ok := portfolio.Get(symbol)
- if sentio.LONG == side && proba > 1.002 {
- if !ok || position.GetSize() <= 0 {
- return &symbol, .6
- } else {
- return &symbol, .3
- }
- }
- if sentio.SHORT == side && proba < 0.998 {
- if !ok || position.GetSize() <= 0 {
- return &symbol, .8
- } else {
- return &symbol, .3
- }
- }
- }
- return nil, 0
- }
|