1、主单增加减仓、加仓状态
2、bug修复
This commit is contained in:
@ -9,6 +9,7 @@ import (
|
||||
"go-admin/common/global"
|
||||
"go-admin/common/helper"
|
||||
"go-admin/models"
|
||||
"go-admin/models/binancedto"
|
||||
"go-admin/models/spot"
|
||||
"go-admin/pkg/httputils"
|
||||
"go-admin/pkg/utility"
|
||||
@ -529,3 +530,61 @@ func (e SpotRestApi) GetSpotSymbolLastPrice(targetSymbol string) (lastPrice deci
|
||||
// }
|
||||
return lastPrice
|
||||
}
|
||||
|
||||
func (e SpotRestApi) GetOrderByOrderSn(symbol, orderSn string, apiUserInfo DbModels.LineApiUser) (order binancedto.BinanceSpotOrder, err error) {
|
||||
result := binancedto.BinanceSpotOrder{}
|
||||
params := map[string]string{
|
||||
"symbol": symbol,
|
||||
"origClientOrderId": orderSn,
|
||||
}
|
||||
|
||||
client := GetClient(&apiUserInfo)
|
||||
|
||||
body, code, err := client.SendSpotAuth("/api/v3/order", "GET", params)
|
||||
if err != nil || code != 200 {
|
||||
log.Error("查询现货委托 参数:", params)
|
||||
log.Error("查询现货委托失败 code:", code)
|
||||
log.Error("查询现货委托失败 err:", err)
|
||||
dataMap := make(map[string]interface{})
|
||||
if err.Error() != "" {
|
||||
if err := sonic.Unmarshal([]byte(err.Error()), &dataMap); err != nil {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
code, ok := dataMap["code"]
|
||||
if ok {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%s", apiUserInfo.Id, symbol, ErrorMaps[code.(float64)])
|
||||
}
|
||||
if strings.Contains(err.Error(), "Unknown order sent.") {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, ErrorMaps[-2011])
|
||||
}
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, err.Error())
|
||||
}
|
||||
|
||||
sonic.Unmarshal(body, &result)
|
||||
|
||||
if result.OrderID == 0 {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, "订单不存在")
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
/*
|
||||
查询现货委托
|
||||
*/
|
||||
func (e SpotRestApi) GetOrderByOrderSnLoop(symbol, ordersn string, apiUserInfo DbModels.LineApiUser, retryCount int) (order binancedto.BinanceSpotOrder, err error) {
|
||||
result, err := e.GetOrderByOrderSn(symbol, ordersn, apiUserInfo)
|
||||
|
||||
if err != nil {
|
||||
for x := 1; x < retryCount; x++ {
|
||||
result, err = e.GetOrderByOrderSn(symbol, ordersn, apiUserInfo)
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
@ -215,3 +215,35 @@ func TestFutOrderPlace(t *testing.T) {
|
||||
fmt.Println("err:", err)
|
||||
|
||||
}
|
||||
|
||||
func TestFutureQueryOrder(t *testing.T) {
|
||||
futureApi := FutRestApi{}
|
||||
// dsn := "root:root@tcp(192.168.1.12:3306)/go_exchange_single?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"
|
||||
// db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
||||
|
||||
helper.InitDefaultRedis("192.168.1.12:6379", "", 2)
|
||||
apiUserInfo, _ := GetApiInfo(49)
|
||||
order, err := futureApi.GetOrderByOrderSnLoop("TRUMPUSDT", "380211842506555392", apiUserInfo, 3)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("err:", err)
|
||||
}
|
||||
|
||||
fmt.Println("future order:", order)
|
||||
}
|
||||
|
||||
func TestSpotQueryOrder(t *testing.T) {
|
||||
spotApi := SpotRestApi{}
|
||||
// dsn := "root:root@tcp(192.168.1.12:3306)/go_exchange_single?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"
|
||||
// db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
||||
|
||||
helper.InitDefaultRedis("192.168.1.12:6379", "", 2)
|
||||
apiUserInfo, _ := GetApiInfo(49)
|
||||
order, err := spotApi.GetOrderByOrderSnLoop("ADAUSDT", "380577197825458177", apiUserInfo, 3)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("err:", err)
|
||||
}
|
||||
|
||||
fmt.Println("spot order:", order)
|
||||
}
|
||||
|
||||
@ -9,6 +9,7 @@ import (
|
||||
"go-admin/common/global"
|
||||
"go-admin/common/helper"
|
||||
"go-admin/models"
|
||||
"go-admin/models/binancedto"
|
||||
"go-admin/models/futuresdto"
|
||||
"go-admin/pkg/httputils"
|
||||
"go-admin/pkg/utility"
|
||||
@ -936,3 +937,66 @@ func (e FutRestApi) GetFutSymbolLastPrice(targetSymbol string) (lastPrice decima
|
||||
// }
|
||||
return lastPrice
|
||||
}
|
||||
|
||||
func (e FutRestApi) GetOrderByOrderSn(symbol, orderSn string, apiUserInfo DbModels.LineApiUser) (order binancedto.BinanceFutureOrder, err error) {
|
||||
result := binancedto.BinanceFutureOrder{}
|
||||
params := map[string]string{
|
||||
"symbol": symbol,
|
||||
"origClientOrderId": orderSn,
|
||||
}
|
||||
|
||||
client := GetClient(&apiUserInfo)
|
||||
|
||||
body, code, err := client.SendFuturesAuth("/fapi/v1/order", "GET", params)
|
||||
if err != nil || code != 200 {
|
||||
log.Error("查询合约委托 参数:", params)
|
||||
log.Error("查询合约委托失败 code:", code)
|
||||
log.Error("查询合约委托失败 err:", err)
|
||||
dataMap := make(map[string]interface{})
|
||||
if err.Error() != "" {
|
||||
if err := sonic.Unmarshal([]byte(err.Error()), &dataMap); err != nil {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
code, ok := dataMap["code"]
|
||||
if ok {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%s", apiUserInfo.Id, symbol, ErrorMaps[code.(float64)])
|
||||
}
|
||||
if strings.Contains(err.Error(), "Unknown order sent.") {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, ErrorMaps[-2011])
|
||||
}
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, err.Error())
|
||||
}
|
||||
|
||||
sonic.Unmarshal(body, &result)
|
||||
|
||||
if result.OrderID == 0 {
|
||||
return result, fmt.Errorf("api_id:%d 交易对:%s 查询订单失败:%+v", apiUserInfo.Id, symbol, "订单不存在")
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
/*
|
||||
查询现货委托
|
||||
*/
|
||||
// 根据订单号获取订单信息,如果获取失败,则进行重试
|
||||
func (e FutRestApi) GetOrderByOrderSnLoop(symbol, ordersn string, apiUserInfo DbModels.LineApiUser, retryCount int) (order binancedto.BinanceFutureOrder, err error) {
|
||||
result, err := e.GetOrderByOrderSn(symbol, ordersn, apiUserInfo)
|
||||
// 如果获取失败,则进行重试
|
||||
|
||||
if err != nil {
|
||||
// 调用GetOrderByOrderSn方法获取订单信息
|
||||
for x := 1; x < retryCount; x++ {
|
||||
// 如果获取成功,则跳出循环
|
||||
result, err = e.GetOrderByOrderSn(symbol, ordersn, apiUserInfo)
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
// 返回订单信息和错误信息
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
@ -88,7 +88,7 @@ func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi
|
||||
}
|
||||
|
||||
//判断是否有已触发交易对
|
||||
count, _ := GetSymbolTriggerCount(db, v.Symbol, 2)
|
||||
count, _ := GetSymbolTriggerCount(db, v.Symbol, v.ApiId, 2)
|
||||
|
||||
if count > 0 {
|
||||
return
|
||||
@ -316,7 +316,7 @@ func FutAddPositionTrigger(db *gorm.DB, v *AddPositionList, item string, futApi
|
||||
defer lock.Release()
|
||||
|
||||
setting, _ := GetSystemSetting(db)
|
||||
tradeSet, _ := GetTradeSet(v.Symbol, 0)
|
||||
tradeSet, _ := GetTradeSet(v.Symbol, 1)
|
||||
|
||||
if tradeSet.LastPrice == "" {
|
||||
log.Errorf("合约加仓触发 查询交易对失败 交易对:%s ordersn:%s", v.Symbol, v.OrderSn)
|
||||
|
||||
@ -111,16 +111,20 @@ func handleFutOrderByType(db *gorm.DB, preOrder *DbModels.LinePreOrder, orderSta
|
||||
|
||||
// 减仓回调
|
||||
func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
if err := db.Model(&DbModels.LinePreOrderStatus{}).Where("order_id =? ", preOrder.MainId).Update("reduce_status", 1).Error; err != nil {
|
||||
logger.Errorf("handleReduceFilled 更新主单减仓状态失败,订单号:%s", preOrder.OrderSn)
|
||||
}
|
||||
|
||||
apiUserInfo, _ := GetApiInfo(preOrder.ApiId)
|
||||
if apiUserInfo.Id == 0 {
|
||||
logger.Errorf("handleMainReduceFilled 获取api信息失败,订单号:%s", preOrder.OrderSn)
|
||||
logger.Errorf("handleReduceFilled 获取api信息失败,订单号:%s", preOrder.OrderSn)
|
||||
return
|
||||
}
|
||||
|
||||
tradeSet, err := GetTradeSet(preOrder.Symbol, 1)
|
||||
|
||||
if err != nil {
|
||||
logger.Errorf("handleMainReduceFilled 获取交易对设置失败,订单号:%s", preOrder.OrderSn)
|
||||
logger.Errorf("handleReduceFilled 获取交易对设置失败,订单号:%s", preOrder.OrderSn)
|
||||
return
|
||||
}
|
||||
|
||||
@ -128,7 +132,7 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
parentOrder, err := GetOrderById(db, preOrder.Pid)
|
||||
|
||||
if err != nil {
|
||||
logger.Errorf("handleMainReduceFilled 获取主单失败,订单号:%s", preOrder.OrderSn)
|
||||
logger.Errorf("handleReduceFilled 获取主单失败,订单号:%s", preOrder.OrderSn)
|
||||
return
|
||||
}
|
||||
parentPrice := utility.StrToDecimal(parentOrder.Price)
|
||||
@ -353,7 +357,7 @@ func removeFutLossAndAddPosition(preOrder *DbModels.LinePreOrder) {
|
||||
// preOrder 主单
|
||||
func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder) {
|
||||
orders := []models.LinePreOrder{}
|
||||
tradeSet, _ := GetTradeSet(preOrder.Symbol, 0)
|
||||
tradeSet, _ := GetTradeSet(preOrder.Symbol, 1)
|
||||
|
||||
if tradeSet.Coin == "" {
|
||||
logger.Error("获取交易对失败")
|
||||
@ -366,6 +370,10 @@ func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder) {
|
||||
}
|
||||
|
||||
if preOrder.OrderCategory == 3 {
|
||||
if err := db.Model(&DbModels.LinePreOrderStatus{}).Where("order_id = ?", preOrder.MainId).Update("add_position_status", 1).Error; err != nil {
|
||||
logger.Errorf("更新主单加仓状态失败, 主单号:%s, 错误信息:%v", preOrder.MainId, err)
|
||||
}
|
||||
|
||||
if err := cancelSymbolTakeAndStop(db, preOrder.MainId, preOrder.SymbolType); err != nil {
|
||||
logger.Errorf("取消止盈止损订单失败 orderSn:%s err:%v", preOrder.OrderSn, err)
|
||||
}
|
||||
|
||||
@ -144,10 +144,10 @@ func GetSymbolTakeAndStop(db *gorm.DB, mainId int, symbolType int) ([]models.Lin
|
||||
// 获取交易对触发数量
|
||||
// symbol 交易对
|
||||
// symbolType 交易对类型 1-现货 2-合约
|
||||
func GetSymbolTriggerCount(db *gorm.DB, symbol string, symbolType int) (int64, error) {
|
||||
func GetSymbolTriggerCount(db *gorm.DB, symbol string, apiId, symbolType int) (int64, error) {
|
||||
var count int64
|
||||
|
||||
if err := db.Model(&models.LinePreOrder{}).Where("symbol =? AND symbol_type =? AND order_type =0 AND pid=0 AND status IN (1,5,6)", symbol, symbolType).Count(&count).Error; err != nil {
|
||||
if err := db.Model(&models.LinePreOrder{}).Where("symbol =? AND api_id =? AND symbol_type =? AND order_type =0 AND pid=0 AND status IN (1,5,6)", symbol, apiId, symbolType).Count(&count).Error; err != nil {
|
||||
logger.Error("查询交易对触发数量失败:", err)
|
||||
return count, err
|
||||
}
|
||||
|
||||
@ -84,7 +84,7 @@ func SpotOrderLock(db *gorm.DB, v *dto.PreOrderRedisList, item string, spotApi S
|
||||
}
|
||||
|
||||
//判断是否有已触发交易对
|
||||
count, _ := GetSymbolTriggerCount(db, v.Symbol, 2)
|
||||
count, _ := GetSymbolTriggerCount(db, v.Symbol, v.ApiId, 1)
|
||||
|
||||
if count > 0 {
|
||||
return
|
||||
|
||||
@ -158,6 +158,10 @@ func handleMainReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
orders := make([]models.LinePreOrder, 0)
|
||||
rate := utility.StringAsFloat(preOrder.Rate)
|
||||
|
||||
if err := db.Model(&DbModels.LinePreOrderStatus{}).Where("order_id =? ", preOrder.MainId).Update("reduce_status", 1).Error; err != nil {
|
||||
logger.Errorf("handleMainReduceFilled 更新主单减仓状态失败,订单号:%s", preOrder.OrderSn)
|
||||
}
|
||||
|
||||
// 100%减仓 终止流程
|
||||
if rate >= 100 {
|
||||
removeSpotLossAndAddPosition(preOrder)
|
||||
@ -436,6 +440,12 @@ func removeSpotLossAndAddPosition(preOrder *DbModels.LinePreOrder) {
|
||||
|
||||
// 主单成交
|
||||
func handleMainOrderFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
||||
if preOrder.OrderCategory == 3 {
|
||||
if err := db.Model(&DbModels.LinePreOrderStatus{}).Where("order_id = ?", preOrder.MainId).Update("add_position_status", 1).Error; err != nil {
|
||||
logger.Errorf("更新主单加仓状态失败, 主单号:%s, 错误信息:%v", preOrder.MainId, err)
|
||||
}
|
||||
}
|
||||
|
||||
processTakeProfitAndStopLossOrders(db, preOrder)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user