Alexey Kim преди 5 часа
родител
ревизия
447cb80b25
променени са 5 файла, в които са добавени 34 реда и са изтрити 12 реда
  1. 2 2
      market.go
  2. 6 1
      order_options.go
  3. 2 0
      strategy.go
  4. 23 8
      strategy/alpaca/ppo_20250630/strategy.go
  5. 1 1
      util/order.go

+ 2 - 2
market.go

@@ -14,8 +14,8 @@ type Market interface {
 	Account() (MarketAccount, error)
 	MaxBudget() float64
 
-	CreateOrder(opts OrderOptions) error
-	UpdateOrder(orderID string, rm RiskManager) error
+	CreateOrder(opts OrderCreateOptions) error
+	UpdateOrder(orderID string, opts OrderUpdateOptions) error
 	CloseOrder(order Order, desiredPrice *float64) (float64, error)
 
 	DeletePosition(symbol string) (float64, error)

+ 6 - 1
order_options.go

@@ -1,6 +1,6 @@
 package sentio
 
-type OrderOptions struct {
+type OrderCreateOptions struct {
 	Symbol     string
 	Action     Action
 	Limit      *float64
@@ -8,3 +8,8 @@ type OrderOptions struct {
 	TakeProfit *float64
 	StopLoss   *float64
 }
+
+type OrderUpdateOptions struct {
+	TakeProfit *float64
+	StopLoss   *float64
+}

+ 2 - 0
strategy.go

@@ -11,5 +11,7 @@ type Strategy interface {
 	MaxTradeDuration() time.Duration
 	Interval() uint8
 
+	EnableStopLoss() bool
+
 	Handle(turn *Turn, market Market, rs RiskManager) error
 }

+ 23 - 8
strategy/alpaca/ppo_20250630/strategy.go

@@ -26,6 +26,10 @@ func (strategy qqq) Interval() uint8 {
 	return 1
 }
 
+func (strategy qqq) EnableStopLoss() bool {
+	return false
+}
+
 func (strategy qqq) PositionSymbols() map[sentio.Side]string {
 	return map[sentio.Side]string{
 		sentio.BASE:  "QQQ",
@@ -61,6 +65,10 @@ func (strategy qqq) Handle(turn *sentio.Turn, market sentio.Market, rs sentio.Ri
 		return util.CloseAllOrders(market, strategy)
 	}
 
+	if quotes, err = market.Quotes(); err != nil {
+		return err
+	}
+
 	// retrieve running orders
 	if orders, err = market.Orders(sentio.OrderListCriteria{
 		Status:  util.ToPtr("open"),
@@ -69,7 +77,7 @@ func (strategy qqq) Handle(turn *sentio.Turn, market sentio.Market, rs sentio.Ri
 		return err
 	}
 
-	// update stoplosses or close running orders
+	// update StopLosses or close running orders
 	var hasClosedOrders = false
 
 	for i := range orders {
@@ -102,7 +110,16 @@ func (strategy qqq) Handle(turn *sentio.Turn, market sentio.Market, rs sentio.Ri
 			continue
 		}
 
-		if err = market.UpdateOrder(orders[i].GetId(), rs); err != nil {
+		opts := sentio.OrderUpdateOptions{
+			TakeProfit: util.ToPtr(rs.TakeProfit(orders[i].GetSymbol(), quotes[orders[i].GetSymbol()].BidPrice)),
+			StopLoss:   util.ToPtr(rs.StopLoss(orders[i].GetSymbol(), quotes[orders[i].GetSymbol()].BidPrice)),
+		}
+
+		if !strategy.EnableStopLoss() {
+			opts.StopLoss = nil
+		}
+
+		if err = market.UpdateOrder(orders[i].GetId(), opts); err != nil {
 			return err
 		}
 	}
@@ -117,17 +134,15 @@ func (strategy qqq) Handle(turn *sentio.Turn, market sentio.Market, rs sentio.Ri
 		return nil
 	}
 
-	if quotes, err = market.Quotes(); err != nil {
-		return err
-	}
-
-	var opts sentio.OrderOptions
+	var opts sentio.OrderCreateOptions
 	if opts, err = util.NewOrder(market, strategy, turn.Action, quotes, rs); err != nil {
 		return err
 	}
 
 	// Disable StopLoss
-	opts.StopLoss = nil
+	if !strategy.EnableStopLoss() {
+		opts.StopLoss = nil
+	}
 
 	return market.CreateOrder(opts)
 }

+ 1 - 1
util/order.go

@@ -18,7 +18,7 @@ func NewOrder(
 	action sentio.Action,
 	quotes map[string]sentio.Quote,
 	rm sentio.RiskManager,
-) (opts sentio.OrderOptions, err error) {
+) (opts sentio.OrderCreateOptions, err error) {
 	var (
 		side sentio.Side
 		bid  float64