fix(trader): stop swallowing critical errors in order paths

- check CancelAllOrders errors in okx/kucoin/bitget/gate open/close paths
  (aligns with existing binance/hyperliquid/aster/bybit pattern)
- log saveDecision failures in auto_trader_loop instead of discarding
- remove dead MustNormalizeTimeframe that panicked in market package
- web: npm audit fix resolves react-router HIGH CVEs (GHSA-49rj-9fvp-4h2h,
  GHSA-2j2x-hqr9-3h42, GHSA-8x6r-g9mw-2r78, GHSA-rxv8-25v2-qmq8)
This commit is contained in:
tinkle-community
2026-06-11 00:12:58 +08:00
parent 220cb7428b
commit 094ab45476
7 changed files with 55 additions and 32 deletions

View File

@@ -47,7 +47,9 @@ func (at *AutoTrader) runCycle() error {
at.logWarnf("⏸ Risk control: Trading paused, remaining %.0f minutes", remaining.Minutes())
record.Success = false
record.ErrorMessage = fmt.Sprintf("Risk control paused, remaining %.0f minutes", remaining.Minutes())
at.saveDecision(record)
if err := at.saveDecision(record); err != nil {
at.logWarnf("⚠ Failed to save decision record: %v", err)
}
return nil
}
@@ -64,7 +66,9 @@ func (at *AutoTrader) runCycle() error {
at.logErrorf("failed to build trading context: %v", err)
record.Success = false
record.ErrorMessage = fmt.Sprintf("Failed to build trading context: %v", err)
at.saveDecision(record)
if saveErr := at.saveDecision(record); saveErr != nil {
at.logWarnf("⚠ Failed to save decision record: %v", saveErr)
}
return fmt.Errorf("failed to build trading context: %w", err)
}
@@ -84,7 +88,9 @@ func (at *AutoTrader) runCycle() error {
PositionCount: ctx.Account.PositionCount,
InitialBalance: at.initialBalance,
}
at.saveDecision(record)
if err := at.saveDecision(record); err != nil {
at.logWarnf("⚠ Failed to save decision record: %v", err)
}
return nil
}
@@ -157,7 +163,9 @@ func (at *AutoTrader) runCycle() error {
}
}
at.saveDecision(record)
if saveErr := at.saveDecision(record); saveErr != nil {
at.logWarnf("⚠ Failed to save decision record: %v", saveErr)
}
// In safe mode, don't return error — keep the loop running to retry next cycle
if at.safeMode {

View File

@@ -14,7 +14,9 @@ func (t *BitgetTrader) OpenLong(symbol string, quantity float64, leverage int) (
symbol = t.convertSymbol(symbol)
// Cancel old orders first
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {
@@ -68,7 +70,9 @@ func (t *BitgetTrader) OpenShort(symbol string, quantity float64, leverage int)
symbol = t.convertSymbol(symbol)
// Cancel old orders first
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {

View File

@@ -44,7 +44,9 @@ func (t *GateTrader) OpenLong(symbol string, quantity float64, leverage int) (ma
symbol = t.convertSymbol(symbol)
// Cancel old orders first
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {
@@ -102,7 +104,9 @@ func (t *GateTrader) OpenShort(symbol string, quantity float64, leverage int) (m
symbol = t.convertSymbol(symbol)
// Cancel old orders first
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {

View File

@@ -14,7 +14,9 @@ import (
// OpenLong opens long position
func (t *KuCoinTrader) OpenLong(symbol string, quantity float64, leverage int) (map[string]interface{}, error) {
// Cancel old orders
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {
@@ -69,7 +71,9 @@ func (t *KuCoinTrader) OpenLong(symbol string, quantity float64, leverage int) (
// OpenShort opens short position
func (t *KuCoinTrader) OpenShort(symbol string, quantity float64, leverage int) (map[string]interface{}, error) {
// Cancel old orders
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {
@@ -218,7 +222,9 @@ func (t *KuCoinTrader) CloseLong(symbol string, quantity float64) (map[string]in
logger.Infof("✓ KuCoin closed long position: %s", symbol)
// Cancel pending orders
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel pending orders: %v", err)
}
return map[string]interface{}{
"orderId": result.OrderId,
@@ -299,7 +305,9 @@ func (t *KuCoinTrader) CloseShort(symbol string, quantity float64) (map[string]i
logger.Infof("✓ KuCoin closed short position: %s", symbol)
// Cancel pending orders
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel pending orders: %v", err)
}
return map[string]interface{}{
"orderId": result.OrderId,

View File

@@ -12,7 +12,9 @@ import (
// OpenLong opens long position
func (t *OKXTrader) OpenLong(symbol string, quantity float64, leverage int) (map[string]interface{}, error) {
// Cancel old orders
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {
@@ -91,7 +93,9 @@ func (t *OKXTrader) OpenLong(symbol string, quantity float64, leverage int) (map
// OpenShort opens short position
func (t *OKXTrader) OpenShort(symbol string, quantity float64, leverage int) (map[string]interface{}, error) {
// Cancel old orders
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel old pending orders (may not have any): %v", err)
}
// Set leverage
if err := t.SetLeverage(symbol, leverage); err != nil {
@@ -269,7 +273,9 @@ func (t *OKXTrader) CloseLong(symbol string, quantity float64) (map[string]inter
logger.Infof("✓ OKX closed long position successfully: %s", symbol)
// Cancel pending orders after closing position
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel pending orders: %v", err)
}
return map[string]interface{}{
"orderId": orders[0].OrdId,
@@ -383,7 +389,9 @@ func (t *OKXTrader) CloseShort(symbol string, quantity float64) (map[string]inte
logger.Infof("✓ OKX closed short position successfully: %s, ordId=%s", symbol, orders[0].OrdId)
// Cancel pending orders after closing position
t.CancelAllOrders(symbol)
if err := t.CancelAllOrders(symbol); err != nil {
logger.Infof(" ⚠ Failed to cancel pending orders: %v", err)
}
return map[string]interface{}{
"orderId": orders[0].OrdId,