|
@@ -1,135 +0,0 @@
|
|
|
-package main
|
|
|
-
|
|
|
-import (
|
|
|
- "git.beejay.kim/Gshopper/sentio"
|
|
|
- "git.beejay.kim/Gshopper/sentio/util"
|
|
|
- "time"
|
|
|
-)
|
|
|
-
|
|
|
-var Strategy = qqq{}
|
|
|
-
|
|
|
-type qqq struct{}
|
|
|
-
|
|
|
-func (strategy qqq) Name() string {
|
|
|
- return "Alpaca: QQQ [TQQQ : SQQQ]"
|
|
|
-}
|
|
|
-
|
|
|
-func (strategy qqq) Model() string {
|
|
|
- return "stocks_dqn_seed0_250417_082646"
|
|
|
-}
|
|
|
-
|
|
|
-func (strategy qqq) MarketId() string {
|
|
|
- return "alpaca"
|
|
|
-}
|
|
|
-
|
|
|
-func (strategy qqq) Interval() uint8 {
|
|
|
- return 3
|
|
|
-}
|
|
|
-
|
|
|
-func (strategy qqq) PositionSymbols() map[sentio.Side]string {
|
|
|
- return map[sentio.Side]string{
|
|
|
- sentio.BASE: "QQQ",
|
|
|
- sentio.LONG: "TQQQ",
|
|
|
- sentio.SHORT: "SQQQ",
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-func (strategy qqq) MaxTradeDuration() time.Duration {
|
|
|
- return time.Duration(strategy.Interval()) * time.Minute * 3
|
|
|
-}
|
|
|
-
|
|
|
-func (strategy qqq) Handle(turn *sentio.Turn, market sentio.Market, rs sentio.RiskManager) error {
|
|
|
- if market == nil || turn == nil {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- var (
|
|
|
- now = market.Clock().Now()
|
|
|
- symbols = util.Symbols(strategy)
|
|
|
- quotes map[string]sentio.Quote
|
|
|
- orders []sentio.Order
|
|
|
- err error
|
|
|
- )
|
|
|
-
|
|
|
- // skip too early orders
|
|
|
- if now.Hour() < 10 {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- // close all orders before market close
|
|
|
- if now.Hour() == 15 && now.Minute() > 52 {
|
|
|
- return util.CloseAllOrders(market, strategy)
|
|
|
- }
|
|
|
-
|
|
|
- // retrieve running orders
|
|
|
- if orders, err = market.Orders(sentio.OrderListCriteria{
|
|
|
- Status: "open",
|
|
|
- Symbols: symbols,
|
|
|
- }); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- // update stoplosses or close running orders
|
|
|
- var (
|
|
|
- ts = turn.Time.AsTime().Round(time.Minute)
|
|
|
- hasClosedOrders = false
|
|
|
- )
|
|
|
-
|
|
|
- for i := range orders {
|
|
|
- if util.IsLongOrder(orders[i], strategy) &&
|
|
|
- sentio.IsAction(turn.Action, sentio.Action_HOLD, sentio.Action_SELL, sentio.Action_DOUBLE_SELL) &&
|
|
|
- ts.Before(time.Now()) {
|
|
|
- if _, err = market.CloseOrder(orders[i]); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- hasClosedOrders = true
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- if util.IsShortOrder(orders[i], strategy) &&
|
|
|
- sentio.IsAction(turn.Action, sentio.Action_HOLD, sentio.Action_BUY, sentio.Action_DOUBLE_BUY) &&
|
|
|
- ts.Before(time.Now()) {
|
|
|
- if _, err = market.CloseOrder(orders[i]); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- hasClosedOrders = true
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- if orders[i].GetCreatedAt().Round(time.Minute).Add(strategy.MaxTradeDuration()).Before(time.Now()) {
|
|
|
- if _, err = market.CloseOrder(orders[i]); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- hasClosedOrders = true
|
|
|
- continue
|
|
|
- }
|
|
|
-
|
|
|
- if err = market.UpdateOrder(orders[i].GetId(), rs); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Prevent new orders if we just closed one
|
|
|
- if hasClosedOrders || len(orders) > 0 {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- // Prevent BUYs on closing market
|
|
|
- if now.Hour() == 15 && now.Minute() > 45 {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- // Prevent Market.CreateOrder while probability is not clear
|
|
|
- if sentio.Action_HOLD == turn.Action || ts.After(time.Now()) {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- if quotes, err = market.Quotes(); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- return util.CreateOrder(market, strategy, turn.Action, quotes, rs)
|
|
|
-}
|