fix: enable full-size Claw402 autopilot trading

This commit is contained in:
tinkle-community
2026-06-27 11:31:19 +08:00
parent 24f6421a73
commit a4983d2cb0
10 changed files with 291 additions and 44 deletions

View File

@@ -11,8 +11,8 @@ func TestApplyAutopilotFullSizeOpenForClaw402(t *testing.T) {
cfg.CoinSource.SourceType = "vergex_signal"
cfg.RiskControl.BTCETHMaxLeverage = 10
cfg.RiskControl.AltcoinMaxLeverage = 10
cfg.RiskControl.BTCETHMaxPositionValueRatio = 1
cfg.RiskControl.AltcoinMaxPositionValueRatio = 1
cfg.RiskControl.BTCETHMaxPositionValueRatio = 10
cfg.RiskControl.AltcoinMaxPositionValueRatio = 10
at := &AutoTrader{config: AutoTraderConfig{StrategyConfig: &cfg}}
decision := &kernel.Decision{
@@ -27,8 +27,8 @@ func TestApplyAutopilotFullSizeOpenForClaw402(t *testing.T) {
if decision.Leverage != 10 {
t.Fatalf("expected leverage to be forced to 10x, got %dx", decision.Leverage)
}
if decision.PositionSizeUSD != 29.8 {
t.Fatalf("expected position size to use full notional 29.8, got %.2f", decision.PositionSizeUSD)
if decision.PositionSizeUSD != 298 {
t.Fatalf("expected position size to use full 10x notional 298, got %.2f", decision.PositionSizeUSD)
}
}

View File

@@ -58,13 +58,14 @@ func (t *HyperliquidTrader) OpenLong(symbol string, quantity float64, leverage i
// Check if this is an xyz dex asset
isXyz := strings.HasPrefix(coin, "xyz:")
// Set leverage (skip for xyz dex as it may not support leverage adjustment)
if !isXyz {
if err := t.SetLeverage(symbol, leverage); err != nil {
// Set leverage before order placement. Hyperliquid supports leverage
// updates for HIP-3/XYZ perps as well; skipping this left reused accounts
// at whatever leverage they had previously selected (for example 20x).
if err := t.SetLeverage(symbol, leverage); err != nil {
if !isXyz {
return nil, err
}
} else {
logger.Infof(" xyz dex asset %s - using default leverage", coin)
logger.Warnf(" ⚠ Failed to set leverage for xyz dex asset %s: %v", coin, err)
}
// Get current price (for market order)
@@ -130,13 +131,14 @@ func (t *HyperliquidTrader) OpenShort(symbol string, quantity float64, leverage
// Check if this is an xyz dex asset
isXyz := strings.HasPrefix(coin, "xyz:")
// Set leverage (skip for xyz dex)
if !isXyz {
if err := t.SetLeverage(symbol, leverage); err != nil {
// Set leverage before order placement. Hyperliquid supports leverage
// updates for HIP-3/XYZ perps as well; skipping this left reused accounts
// at whatever leverage they had previously selected (for example 20x).
if err := t.SetLeverage(symbol, leverage); err != nil {
if !isXyz {
return nil, err
}
} else {
logger.Infof(" xyz dex asset %s - using default leverage", coin)
logger.Warnf(" ⚠ Failed to set leverage for xyz dex asset %s: %v", coin, err)
}
// Get current price
@@ -1029,11 +1031,15 @@ func (t *HyperliquidTrader) SetTakeProfit(symbol string, positionSide string, qu
func (t *HyperliquidTrader) PlaceLimitOrder(req *types.LimitOrderRequest) (*types.LimitOrderResult, error) {
coin := convertSymbolToHyperliquid(req.Symbol)
// Set leverage if specified and not xyz dex
// Set leverage if specified.
isXyz := strings.HasPrefix(coin, "xyz:")
if req.Leverage > 0 && !isXyz {
if req.Leverage > 0 {
if err := t.SetLeverage(req.Symbol, req.Leverage); err != nil {
logger.Warnf("[Hyperliquid] Failed to set leverage: %v", err)
if !isXyz {
logger.Warnf("[Hyperliquid] Failed to set leverage: %v", err)
} else {
logger.Warnf("[Hyperliquid] Failed to set xyz leverage for %s: %v", coin, err)
}
}
}