1
This commit is contained in:
@ -1,7 +1,6 @@
|
||||
package binanceservice
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
DbModels "go-admin/app/admin/models"
|
||||
@ -723,129 +722,6 @@ func (e FutRestApi) ClosePosition(symbol string, orderSn string, quantity decima
|
||||
return nil
|
||||
}
|
||||
|
||||
/*
|
||||
判断合约触发
|
||||
*/
|
||||
func JudgeFuturesPrice(tradeSet models.TradeSet) {
|
||||
preOrderVal, _ := helper.DefaultRedis.GetAllList(fmt.Sprintf(rediskey.PreFutOrderList, global.EXCHANGE_BINANCE))
|
||||
db := GetDBConnection()
|
||||
|
||||
if len(preOrderVal) == 0 {
|
||||
return
|
||||
}
|
||||
futApi := FutRestApi{}
|
||||
|
||||
for _, item := range preOrderVal {
|
||||
preOrder := dto.PreOrderRedisList{}
|
||||
if err := sonic.Unmarshal([]byte(item), &preOrder); err != nil {
|
||||
log.Error("反序列化失败")
|
||||
continue
|
||||
}
|
||||
|
||||
if preOrder.Symbol != tradeSet.Coin+tradeSet.Currency {
|
||||
continue
|
||||
}
|
||||
|
||||
orderPrice, _ := decimal.NewFromString(preOrder.Price)
|
||||
tradePrice, _ := decimal.NewFromString(tradeSet.LastPrice)
|
||||
|
||||
if orderPrice.Cmp(decimal.Zero) == 0 || tradePrice.Cmp(decimal.Zero) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
//多
|
||||
if (strings.ToUpper(preOrder.Site) == "BUY" && orderPrice.Cmp(tradePrice) >= 0) ||
|
||||
(strings.ToUpper(preOrder.Site) == "SELL" && orderPrice.Cmp(tradePrice) <= 0) {
|
||||
futTriggerOrder(db, &preOrder, item, futApi)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 分布式锁下单
|
||||
func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi FutRestApi) {
|
||||
lock := helper.NewRedisLock(fmt.Sprintf(rediskey.SpotTrigger, v.ApiId, v.Symbol), 200, 5, 100*time.Millisecond)
|
||||
|
||||
if ok, err := lock.AcquireWait(context.Background()); err != nil {
|
||||
log.Debug("获取锁失败", err)
|
||||
return
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
|
||||
key := fmt.Sprintf(rediskey.PreFutOrderList, global.EXCHANGE_BINANCE)
|
||||
preOrder := DbModels.LinePreOrder{}
|
||||
if err := db.Where("id = ?", v.Id).First(&preOrder).Error; err != nil {
|
||||
log.Error("获取预下单失败", err)
|
||||
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
log.Error("不存在待触发主单", item)
|
||||
helper.DefaultRedis.LRem(key, item)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
hasrecord, _ := helper.DefaultRedis.IsElementInList(key, item)
|
||||
|
||||
if !hasrecord {
|
||||
log.Debug("预下单缓存中不存在", item)
|
||||
return
|
||||
}
|
||||
|
||||
price, _ := decimal.NewFromString(v.Price)
|
||||
num, _ := decimal.NewFromString(preOrder.Num)
|
||||
|
||||
if price.Cmp(decimal.Zero) == 0 {
|
||||
log.Error("价格不能为0")
|
||||
return
|
||||
}
|
||||
|
||||
params := FutOrderPlace{
|
||||
ApiId: v.ApiId,
|
||||
Symbol: v.Symbol,
|
||||
Side: v.Site,
|
||||
OrderType: preOrder.MainOrderType,
|
||||
SideType: preOrder.MainOrderType,
|
||||
Price: price,
|
||||
Quantity: num,
|
||||
NewClientOrderId: v.OrderSn,
|
||||
}
|
||||
preOrderVal, _ := sonic.MarshalString(&v)
|
||||
|
||||
if err := futApi.OrderPlace(db, params); err != nil {
|
||||
log.Error("下单失败", v.Symbol, " err:", err)
|
||||
err := db.Model(&DbModels.LinePreOrder{}).Where("id =? and status='0'", preOrder.Id).Updates(map[string]interface{}{"status": "2", "desc": err.Error()}).Error
|
||||
|
||||
if err != nil {
|
||||
log.Error("更新预下单状态失败")
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("id =? AND status ='0'", preOrder.Id).Update("status", "1").Error; err != nil {
|
||||
log.Error("更新预下单状态失败 ordersn:", v.OrderSn, " status:1")
|
||||
}
|
||||
|
||||
return
|
||||
} else {
|
||||
log.Error("获取锁失败")
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// CancelFutOrder 通过单个订单号取消合约委托
|
||||
// symbol 交易对
|
||||
// newClientOrderId 系统自定义订单号
|
||||
@ -865,7 +741,7 @@ func (e FutRestApi) CancelFutOrder(apiUserInfo DbModels.LineApiUser, symbol stri
|
||||
if err != nil {
|
||||
var dataMap map[string]interface{}
|
||||
if err2 := sonic.Unmarshal([]byte(err.Error()), &dataMap); err2 != nil {
|
||||
return errors.New(fmt.Sprintf("api_id:%d 交易对:%s 撤销合约委托出错:%s", apiUserInfo.Id, symbol, err.Error()))
|
||||
return fmt.Errorf("api_id:%d 交易对:%s 撤销合约委托出错:%s", apiUserInfo.Id, symbol, err.Error())
|
||||
}
|
||||
code, ok := dataMap["code"]
|
||||
if ok {
|
||||
@ -875,7 +751,7 @@ func (e FutRestApi) CancelFutOrder(apiUserInfo DbModels.LineApiUser, symbol stri
|
||||
errContent = err.Error()
|
||||
}
|
||||
|
||||
return errors.New(fmt.Sprintf("api_id:%d 交易对:%s 撤销合约委托出错:%s", apiUserInfo.Id, symbol, errContent))
|
||||
return fmt.Errorf("api_id:%d 交易对:%s 撤销合约委托出错:%s", apiUserInfo.Id, symbol, errContent)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@ -920,7 +796,7 @@ func (e FutRestApi) CancelAllFutOrder(apiUserInfo DbModels.LineApiUser, symbol s
|
||||
// newClientOrderIdList 系统自定义的订单号, 最多支持10个订单
|
||||
func (e FutRestApi) CancelBatchFutOrder(apiUserInfo DbModels.LineApiUser, symbol string, newClientOrderIdList []string) error {
|
||||
if len(newClientOrderIdList) > 10 {
|
||||
return errors.New(fmt.Sprintf("api_id:%d 交易对:%s 撤销批量合约委托出错:%s", apiUserInfo.Id, symbol, "最多支持10个订单"))
|
||||
return fmt.Errorf("api_id:%d 交易对:%s 撤销批量合约委托出错:%s", apiUserInfo.Id, symbol, "最多支持10个订单")
|
||||
}
|
||||
endpoint := "/fapi/v1/batchOrders"
|
||||
marshal, _ := sonic.Marshal(newClientOrderIdList)
|
||||
@ -942,7 +818,7 @@ func (e FutRestApi) CancelBatchFutOrder(apiUserInfo DbModels.LineApiUser, symbol
|
||||
var dataMap map[string]interface{}
|
||||
if err.Error() != "" {
|
||||
if err2 := sonic.Unmarshal([]byte(err.Error()), &dataMap); err2 != nil {
|
||||
return errors.New(fmt.Sprintf("api_id:%d 交易对:%s 撤销批量合约委托出错:%s", apiUserInfo.Id, symbol, err.Error()))
|
||||
return fmt.Errorf("api_id:%d 交易对:%s 撤销批量合约委托出错:%s", apiUserInfo.Id, symbol, err.Error())
|
||||
}
|
||||
}
|
||||
code, ok := dataMap["code"]
|
||||
|
||||
Reference in New Issue
Block a user