1、重写
This commit is contained in:
@ -13,12 +13,10 @@ import (
|
||||
"go-admin/models/futuresdto"
|
||||
"go-admin/pkg/httputils"
|
||||
"go-admin/pkg/utility"
|
||||
"go-admin/pkg/utility/snowflakehelper"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/shopspring/decimal"
|
||||
"gorm.io/gorm"
|
||||
|
||||
@ -722,11 +720,10 @@ func (e FutRestApi) ClosePosition(symbol string, orderSn string, quantity decima
|
||||
判断合约触发
|
||||
*/
|
||||
func JudgeFuturesPrice(tradeSet models.TradeSet) {
|
||||
preOrderVal, _ := helper.DefaultRedis.GetAllList(rediskey.PreFutOrderList)
|
||||
preOrderVal, _ := helper.DefaultRedis.GetAllList(fmt.Sprintf(rediskey.PreFutOrderList, global.EXCHANGE_BINANCE))
|
||||
db := GetDBConnection()
|
||||
|
||||
if len(preOrderVal) == 0 {
|
||||
// log.Debug("没有合约预下单")
|
||||
return
|
||||
}
|
||||
futApi := FutRestApi{}
|
||||
@ -766,32 +763,21 @@ func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi
|
||||
return
|
||||
} else if ok {
|
||||
defer lock.Release()
|
||||
|
||||
key := fmt.Sprintf(rediskey.PreFutOrderList, global.EXCHANGE_BINANCE)
|
||||
preOrder := DbModels.LinePreOrder{}
|
||||
key := fmt.Sprintf(rediskey.UserHolding, v.ApiId)
|
||||
symbols, err := helper.DefaultRedis.GetAllList(key)
|
||||
|
||||
if err != nil && err != redis.Nil {
|
||||
log.Error("获取用户持仓失败", err)
|
||||
return
|
||||
}
|
||||
|
||||
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(rediskey.PreFutOrderList, item)
|
||||
helper.DefaultRedis.LRem(key, item)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
coin := utility.ReplaceSuffix(v.Symbol, preOrder.QuoteSymbol, "")
|
||||
if utility.ContainsStr(symbols, coin) {
|
||||
log.Info("用户已经持有", coin)
|
||||
return
|
||||
}
|
||||
hasrecord, _ := helper.DefaultRedis.IsElementInList(rediskey.PreFutOrderList, item)
|
||||
hasrecord, _ := helper.DefaultRedis.IsElementInList(key, item)
|
||||
|
||||
if !hasrecord {
|
||||
log.Debug("预下单缓存中不存在", item)
|
||||
@ -827,7 +813,7 @@ func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(rediskey.PreFutOrderList, preOrderVal); err != nil {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
}
|
||||
@ -836,7 +822,7 @@ func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi
|
||||
}
|
||||
|
||||
if preOrderVal != "" {
|
||||
if _, err := helper.DefaultRedis.LRem(rediskey.PreFutOrderList, preOrderVal); err != nil {
|
||||
if _, err := helper.DefaultRedis.LRem(key, preOrderVal); err != nil {
|
||||
log.Error("删除redis 预下单失败:", err)
|
||||
}
|
||||
}
|
||||
@ -845,10 +831,6 @@ func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi
|
||||
log.Error("更新预下单状态失败 ordersn:", v.OrderSn, " status:1")
|
||||
}
|
||||
|
||||
if err := helper.DefaultRedis.RPushList(key, coin); err != nil {
|
||||
log.Error("写入用户持仓失败", v.Symbol)
|
||||
}
|
||||
|
||||
return
|
||||
} else {
|
||||
log.Error("获取锁失败")
|
||||
@ -1010,125 +992,3 @@ func (e FutRestApi) GetFutSymbolLastPrice(targetSymbol string) (lastPrice decima
|
||||
}
|
||||
return lastPrice
|
||||
}
|
||||
|
||||
/*
|
||||
重下止盈单
|
||||
*/
|
||||
func (e FutRestApi) reTakeOrder(parentOrderInfo DbModels.LinePreOrder, orm *gorm.DB) {
|
||||
parentId := parentOrderInfo.Id
|
||||
|
||||
if parentOrderInfo.Pid > 0 {
|
||||
parentId = parentOrderInfo.Pid
|
||||
}
|
||||
|
||||
price, _ := decimal.NewFromString(parentOrderInfo.Price)
|
||||
num, _ := decimal.NewFromString(parentOrderInfo.Num)
|
||||
takePrice := decimal.Zero
|
||||
holdeAKey := fmt.Sprintf(rediskey.HoldeA, parentId)
|
||||
holdeAVal, _ := helper.DefaultRedis.GetString(holdeAKey)
|
||||
holdeA := HoldeData{}
|
||||
|
||||
if holdeAVal != "" {
|
||||
sonic.Unmarshal([]byte(holdeAVal), &holdeA)
|
||||
}
|
||||
|
||||
//查询持仓失败
|
||||
if holdeA.Id == 0 {
|
||||
log.Error("查询A账号持仓失败")
|
||||
return
|
||||
}
|
||||
|
||||
takeOrder := DbModels.LinePreOrder{}
|
||||
if err := orm.Model(&DbModels.LinePreOrder{}).Where("pid =? AND order_type ='3'").First(&takeOrder).Error; err != nil {
|
||||
log.Error("查询止盈单失败", err)
|
||||
return
|
||||
}
|
||||
|
||||
apiUserInfo, _ := GetApiInfo(takeOrder.ApiId)
|
||||
if apiUserInfo.Id == 0 {
|
||||
log.Error("重下止盈 查询api信息失败")
|
||||
return
|
||||
}
|
||||
|
||||
newTakeOrder := DbModels.LinePreOrder{}
|
||||
copier.Copy(&newTakeOrder, &takeOrder)
|
||||
newTakeOrder.Id = 0
|
||||
newTakeOrder.OrderType = 1
|
||||
newTakeOrder.Status = 0
|
||||
newTakeOrder.OrderSn = strconv.FormatInt(snowflakehelper.GetOrderId(), 10)
|
||||
|
||||
//加仓次数大于0 就需要使用均价
|
||||
if holdeA.PositionIncrementCount > 0 {
|
||||
price = holdeA.AveragePrice
|
||||
}
|
||||
|
||||
if parentOrderInfo.Site == "BUY" {
|
||||
takePrice = price.Mul(decimal.NewFromInt(100).Add(parentOrderInfo.ProfitRate)).Div(decimal.NewFromInt(100))
|
||||
} else {
|
||||
takePrice = price.Mul(decimal.NewFromInt(100).Sub(parentOrderInfo.ProfitRate)).Div(decimal.NewFromInt(100))
|
||||
}
|
||||
|
||||
tradeset, _ := GetTradeSet(takeOrder.Symbol, 1)
|
||||
|
||||
if tradeset.Coin == "" {
|
||||
log.Error("查询交易对失败")
|
||||
return
|
||||
}
|
||||
|
||||
newTakeOrder.Price = takePrice.Truncate(int32(tradeset.PriceDigit)).String()
|
||||
newTakeOrder.Num = num.Mul(decimal.NewFromFloat(0.995)).Truncate(int32(tradeset.AmountDigit)).String()
|
||||
|
||||
if err := orm.Create(&newTakeOrder).Error; err != nil {
|
||||
log.Error("重新止盈单创建失败", err)
|
||||
return
|
||||
}
|
||||
|
||||
params := FutOrderPlace{
|
||||
ApiId: newTakeOrder.ApiId,
|
||||
Symbol: newTakeOrder.Symbol,
|
||||
Price: utility.StringToDecimal(newTakeOrder.Price),
|
||||
Quantity: utility.StringToDecimal(newTakeOrder.Num),
|
||||
Side: newTakeOrder.Site,
|
||||
OrderType: "TAKE_PROFIT_MARKET",
|
||||
Profit: utility.StringToDecimal(newTakeOrder.Price),
|
||||
NewClientOrderId: newTakeOrder.OrderSn,
|
||||
}
|
||||
|
||||
if err := e.CancelFutOrder(apiUserInfo, takeOrder.Symbol, takeOrder.OrderSn); err != nil {
|
||||
log.Error("取消老止盈单失败:", err)
|
||||
|
||||
orm.Model(&newTakeOrder).Updates(map[string]interface{}{"status": "2", "desc": "取消老止盈单失败," + err.Error()})
|
||||
return
|
||||
} else {
|
||||
if err := orm.Model(&DbModels.LinePreOrder{}).Where("pid = ? AND order_type =5 AND status in ('0','1','5') AND order_sn !=?", parentId, newTakeOrder.OrderSn).Update("status", "4").Error; err != nil {
|
||||
log.Error("更新旧止盈单取消状态失败 err:", err)
|
||||
}
|
||||
}
|
||||
|
||||
var err error
|
||||
for x := 0; x < 3; x++ {
|
||||
err = e.OrderPlace(orm, params)
|
||||
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
|
||||
log.Error("下止盈单失败 第", utility.IntToString(x), "次", " err:", err)
|
||||
time.Sleep(2 * time.Second * time.Duration(x))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
log.Error("重新下单止盈失败 err:", err)
|
||||
|
||||
if err1 := orm.Model(&DbModels.LinePreOrder{}).Where("id =?", newTakeOrder.Id).
|
||||
Updates(map[string]interface{}{"status": "2", "desc": err.Error()}).Error; err1 != nil {
|
||||
log.Error("重新下单止盈 修改止盈订单失败 id:", newTakeOrder.Id, " takePrice:", takePrice, " err:", err1)
|
||||
}
|
||||
}
|
||||
|
||||
//修改止盈单信息
|
||||
if err := orm.Model(&DbModels.LinePreOrder{}).Where("id =?", newTakeOrder.Id).
|
||||
Updates(map[string]interface{}{"price": takePrice, "rate": parentOrderInfo.ProfitRate}).Error; err != nil {
|
||||
log.Error("重新下单止盈 修改订单失败 id:", newTakeOrder.Id, " takePrice:", takePrice, " rate:", parentOrderInfo.ProfitRate, " err:", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user