1、累计亏损
This commit is contained in:
@ -422,8 +422,8 @@ func savePosition(db *gorm.DB, preOrder *DbModels.LinePreOrder) positiondto.Posi
|
|||||||
SymbolType: preOrder.SymbolType,
|
SymbolType: preOrder.SymbolType,
|
||||||
Symbol: preOrder.Symbol,
|
Symbol: preOrder.Symbol,
|
||||||
Price: utility.StrToDecimal(preOrder.Price),
|
Price: utility.StrToDecimal(preOrder.Price),
|
||||||
Side: preOrder.Site,
|
// Side: preOrder.Site,
|
||||||
Quantity: utility.StrToDecimal(preOrder.Num),
|
Quantity: utility.StrToDecimal(preOrder.Num),
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
@ -436,8 +436,16 @@ func savePosition(db *gorm.DB, preOrder *DbModels.LinePreOrder) positiondto.Posi
|
|||||||
}
|
}
|
||||||
|
|
||||||
//减仓单 数量为负
|
//减仓单 数量为负
|
||||||
if preOrder.OrderType == 4 {
|
if preOrder.OrderType != 0 {
|
||||||
|
if preOrder.Site == "BUY" {
|
||||||
|
positionReq.Side = "SELL"
|
||||||
|
} else {
|
||||||
|
positionReq.Side = "BUY"
|
||||||
|
}
|
||||||
|
|
||||||
positionReq.Quantity = positionReq.Quantity.Mul(decimal.NewFromInt(-1))
|
positionReq.Quantity = positionReq.Quantity.Mul(decimal.NewFromInt(-1))
|
||||||
|
} else {
|
||||||
|
positionReq.Side = preOrder.Site
|
||||||
}
|
}
|
||||||
|
|
||||||
positionData, err := positionManage.SavePosition(&positionReq, global.EXCHANGE_BINANCE)
|
positionData, err := positionManage.SavePosition(&positionReq, global.EXCHANGE_BINANCE)
|
||||||
@ -453,9 +461,9 @@ func getOpenPositionMainOrderId(db *gorm.DB, newId, apiId, symbolType int, excha
|
|||||||
mainOrders := make([]DbModels.LinePreOrder, 0)
|
mainOrders := make([]DbModels.LinePreOrder, 0)
|
||||||
|
|
||||||
if err := db.Model(&DbModels.LinePreOrder{}).
|
if err := db.Model(&DbModels.LinePreOrder{}).
|
||||||
Where("api_id =? AND status>4 AND status<7 AND symbol=? AND symbol_type =? AND side= ? AND exchange_type=? AND id!=?",
|
Where("api_id =? AND status>4 AND status<7 AND symbol=? AND symbol_type =? AND site= ? AND exchange_type=? AND id!=?",
|
||||||
apiId, symbol, symbolType, side, exchangeType, newId).
|
apiId, symbol, symbolType, side, exchangeType, newId).
|
||||||
Select("id", "order_sn").Find(&mainOrders).Error; err != nil {
|
Select("id", "main_id", "order_sn").Find(&mainOrders).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -87,13 +87,6 @@ func futTriggerOrder(db *gorm.DB, v *dto.PreOrderRedisList, item string, futApi
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//判断是否有已触发交易对
|
|
||||||
count, _ := GetSymbolTriggerCount(db, v.Symbol, v.ApiId, 2)
|
|
||||||
|
|
||||||
if count > 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
price, _ := decimal.NewFromString(v.Price)
|
price, _ := decimal.NewFromString(v.Price)
|
||||||
num, _ := decimal.NewFromString(preOrder.Num)
|
num, _ := decimal.NewFromString(preOrder.Num)
|
||||||
|
|
||||||
|
|||||||
@ -160,7 +160,7 @@ func handleReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
|||||||
if v.OrderType == 1 {
|
if v.OrderType == 1 {
|
||||||
//亏损大于0 重新计算比例
|
//亏损大于0 重新计算比例
|
||||||
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||||
percentag := positionData.TotalLoss.Div(totalNum).Div(price)
|
percentag := positionData.TotalLoss.Div(totalNum).Div(price).Mul(decimal.NewFromInt(100))
|
||||||
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
||||||
v.Rate = percentag.String()
|
v.Rate = percentag.String()
|
||||||
percentag = percentag.Div(decimal.NewFromInt(100))
|
percentag = percentag.Div(decimal.NewFromInt(100))
|
||||||
@ -434,6 +434,7 @@ func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder) {
|
|||||||
// 获取和保存持仓数据
|
// 获取和保存持仓数据
|
||||||
positionData := savePosition(db, preOrder)
|
positionData := savePosition(db, preOrder)
|
||||||
orderExt := models.LinePreOrderExt{}
|
orderExt := models.LinePreOrderExt{}
|
||||||
|
db.Model(&orderExt).Where("order_id =?", preOrder.Id).First(&orderExt)
|
||||||
num := getFuturesPositionAvailableQuantity(db, apiInfo, preOrder, tradeSet).Truncate(int32(tradeSet.AmountDigit))
|
num := getFuturesPositionAvailableQuantity(db, apiInfo, preOrder, tradeSet).Truncate(int32(tradeSet.AmountDigit))
|
||||||
|
|
||||||
// 更新订单数量并处理止盈、止损、减仓
|
// 更新订单数量并处理止盈、止损、减仓
|
||||||
@ -449,7 +450,7 @@ func handleFutMainOrderFilled(db *gorm.DB, preOrder *models.LinePreOrder) {
|
|||||||
case 1: // 止盈
|
case 1: // 止盈
|
||||||
//亏损大于0 重新计算比例
|
//亏损大于0 重新计算比例
|
||||||
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||||
percentag := positionData.TotalLoss.Div(num).Div(price)
|
percentag := positionData.TotalLoss.Div(num).Div(price).Mul(decimal.NewFromInt(100))
|
||||||
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
||||||
order.Rate = percentag.String()
|
order.Rate = percentag.String()
|
||||||
percentag = percentag.Div(decimal.NewFromInt(100))
|
percentag = percentag.Div(decimal.NewFromInt(100))
|
||||||
@ -492,8 +493,13 @@ func cancelPositionOtherOrders(apiUserInfo DbModels.LineApiUser, db *gorm.DB, pr
|
|||||||
|
|
||||||
mainIds := []int{}
|
mainIds := []int{}
|
||||||
for _, mainOrder := range mainOrders {
|
for _, mainOrder := range mainOrders {
|
||||||
removeFutLossAndAddPosition(mainOrder.Id, mainOrder.OrderSn)
|
mainId := mainOrder.Id
|
||||||
mainIds = append(mainIds, mainOrder.Id)
|
|
||||||
|
if mainOrder.MainId > 0 {
|
||||||
|
mainId = mainOrder.MainId
|
||||||
|
}
|
||||||
|
removeFutLossAndAddPosition(mainId, mainOrder.OrderSn)
|
||||||
|
mainIds = append(mainIds, mainId)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(mainIds) > 0 {
|
if len(mainIds) > 0 {
|
||||||
@ -512,6 +518,10 @@ func cancelPositionOtherOrders(apiUserInfo DbModels.LineApiUser, db *gorm.DB, pr
|
|||||||
logger.Errorf("批量取消订单失败 orderSns:%v", item)
|
logger.Errorf("批量取消订单失败 orderSns:%v", item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := db.Exec("UPDATE line_pre_order SET `status`=4, `desc`=CONCAT(`desc`, ' 新单触发取消') WHERE id IN ? AND `status` =6", mainIds).Error; err != nil {
|
||||||
|
logger.Errorf("合约 新下单成功后更新主单取消状态失败, 新主单号:%s, 错误信息:%v", preOrder.MainId, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -211,7 +211,7 @@ func handleMainReduceFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
|||||||
if orders[index].OrderType == 1 {
|
if orders[index].OrderType == 1 {
|
||||||
//亏损大于0 重新计算比例
|
//亏损大于0 重新计算比例
|
||||||
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||||
percentag := positionData.TotalLoss.Div(totalNum).Div(price)
|
percentag := positionData.TotalLoss.Div(totalNum).Div(price).Mul(decimal.NewFromInt(100))
|
||||||
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
||||||
orders[index].Rate = percentag.String()
|
orders[index].Rate = percentag.String()
|
||||||
percentag = percentag.Div(decimal.NewFromInt(100))
|
percentag = percentag.Div(decimal.NewFromInt(100))
|
||||||
@ -429,11 +429,11 @@ func handleSpotTakeProfitFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := db.Model(&DbModels.LinePreOrder{}).Where("main_id =? AND status=0").Update("status", 4).Error; err != nil {
|
// if err := db.Model(&DbModels.LinePreOrder{}).Where("main_id =? AND status=0",).Update("status", 4).Error; err != nil {
|
||||||
logger.Errorf("止盈订单回调失败, 回调订单号:%s 更新取消状态失败:%v", preOrder.OrderSn, err)
|
// logger.Errorf("止盈订单回调失败, 回调订单号:%s 更新取消状态失败:%v", preOrder.OrderSn, err)
|
||||||
|
|
||||||
return err
|
// return err
|
||||||
}
|
// }
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
@ -522,8 +522,19 @@ func handleMainOrderFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
|||||||
mainOrders, _ := getOpenPositionMainOrderId(db, preOrder.Id, preOrder.ApiId, preOrder.SymbolType, preOrder.ExchangeType, preOrder.Symbol, preOrder.Site)
|
mainOrders, _ := getOpenPositionMainOrderId(db, preOrder.Id, preOrder.ApiId, preOrder.SymbolType, preOrder.ExchangeType, preOrder.Symbol, preOrder.Site)
|
||||||
|
|
||||||
if len(mainOrders) > 0 {
|
if len(mainOrders) > 0 {
|
||||||
|
mainIds := []int{}
|
||||||
for _, mainOrder := range mainOrders {
|
for _, mainOrder := range mainOrders {
|
||||||
removeSpotLossAndAddPosition(mainOrder.Id, mainOrder.OrderSn)
|
mainId := mainOrder.Id
|
||||||
|
|
||||||
|
if mainOrder.MainId > 0 {
|
||||||
|
mainId = mainOrder.MainId
|
||||||
|
}
|
||||||
|
|
||||||
|
removeSpotLossAndAddPosition(mainId, mainOrder.OrderSn)
|
||||||
|
|
||||||
|
if !utility.ContainsInt(mainIds, mainId) {
|
||||||
|
mainIds = append(mainIds, mainId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spotApi := SpotRestApi{}
|
spotApi := SpotRestApi{}
|
||||||
@ -531,6 +542,10 @@ func handleMainOrderFilled(db *gorm.DB, preOrder *DbModels.LinePreOrder) {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("取消未成交订单失败, 交易对:%s 主单号:%s, 错误信息:%v", preOrder.Symbol, preOrder.MainId, err)
|
logger.Errorf("取消未成交订单失败, 交易对:%s 主单号:%s, 错误信息:%v", preOrder.Symbol, preOrder.MainId, err)
|
||||||
|
} else if len(mainIds) > 0 {
|
||||||
|
if err := db.Exec("UPDATE line_pre_order SET status=4,desc=desc +' 新单触发取消' WHERE id IN ? AND status =6", mainIds).Error; err != nil {
|
||||||
|
logger.Errorf("新下单成功后更新主单取消状态失败, 新主单号:%s, 错误信息:%v", preOrder.MainId, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -658,7 +673,7 @@ func processTakeProfitAndStopLossOrders(db *gorm.DB, preOrder *models.LinePreOrd
|
|||||||
case 1: // 止盈
|
case 1: // 止盈
|
||||||
//亏损大于0 重新计算比例
|
//亏损大于0 重新计算比例
|
||||||
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
if positionData.TotalLoss.Cmp(decimal.Zero) > 0 && orderExt.Id > 0 {
|
||||||
percentag := positionData.TotalLoss.Div(num).Div(price)
|
percentag := positionData.TotalLoss.Div(num).Div(price).Mul(decimal.NewFromInt(100))
|
||||||
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
percentag = percentag.Add(orderExt.TakeProfitRatio).Truncate(2)
|
||||||
order.Rate = percentag.String()
|
order.Rate = percentag.String()
|
||||||
percentag = percentag.Div(decimal.NewFromInt(100))
|
percentag = percentag.Div(decimal.NewFromInt(100))
|
||||||
|
|||||||
@ -56,20 +56,31 @@ func (e *BinancePositionManagement) SavePosition(data *positiondto.PositionAddRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
var totalLoss decimal.Decimal
|
var totalLoss decimal.Decimal
|
||||||
|
|
||||||
if result.LastPrice.Cmp(decimal.Zero) > 0 {
|
if result.LastPrice.Cmp(decimal.Zero) > 0 {
|
||||||
switch {
|
switch {
|
||||||
//多 买入
|
//多 买入
|
||||||
case data.PositionSide == "LONG":
|
case data.PositionSide == "LONG":
|
||||||
totalLoss = result.LastPrice.Sub(data.Price).Abs().Mul(result.Quantity)
|
totalLoss = result.LastPrice.Sub(data.Price).Mul(result.Quantity)
|
||||||
|
|
||||||
|
if data.Price.Cmp(result.LastPrice) < 0 {
|
||||||
|
result.LastPrice = data.Price
|
||||||
|
}
|
||||||
case data.PositionSide == "SHORT":
|
case data.PositionSide == "SHORT":
|
||||||
totalLoss = data.Price.Sub(result.LastPrice).Abs().Mul(result.Quantity)
|
totalLoss = data.Price.Sub(result.LastPrice).Mul(result.Quantity)
|
||||||
|
|
||||||
|
if data.Price.Cmp(result.LastPrice) > 0 {
|
||||||
|
result.LastPrice = data.Price
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
//默认没有金额的时候
|
||||||
|
result.LastPrice = data.Price
|
||||||
|
}
|
||||||
|
|
||||||
|
if totalLoss.Cmp(decimal.Zero) > 0 {
|
||||||
|
result.TotalLoss = result.TotalLoss.Add(totalLoss)
|
||||||
}
|
}
|
||||||
|
|
||||||
result.LastPrice = data.Price
|
|
||||||
result.TotalLoss = result.TotalLoss.Add(totalLoss)
|
|
||||||
result.Quantity = data.Quantity.Add(result.Quantity)
|
result.Quantity = data.Quantity.Add(result.Quantity)
|
||||||
|
|
||||||
dataVal, _ := sonic.MarshalString(result)
|
dataVal, _ := sonic.MarshalString(result)
|
||||||
|
|||||||
Reference in New Issue
Block a user