瀏覽代碼

持仓汇总支持计算汇率

zhou.xiaoning 1 年之前
父節點
當前提交
4752668c0f
共有 1 個文件被更改,包括 27 次插入7 次删除
  1. 27 7
      controllers/order/order.go

+ 27 - 7
controllers/order/order.go

@@ -173,8 +173,20 @@ func GetTradePosition(accIds string, tradeModes string) (rst []QueryTradePositio
 		goodGuotes, _ = models.GetQuoteDays(a.InStr())
 	}
 
+	// 获取汇率配置
+	exchangeRateConfigs := make([]models.Exchangerateconfig, 0)
+	if err := engine.Find(&exchangeRateConfigs); err != nil {
+		// 查询失败
+		logger.GetLogger().Errorf("获取汇率配置失败, err: %s", err.Error())
+		return rst, false
+	}
+	rateMap := make(map[string]float64)
+	for _, item := range exchangeRateConfigs {
+		rateMap[fmt.Sprintf("%d_%d", item.ORICURRENCYID, item.DESCURRENCYID)] = item.EXCHANGERATE
+	}
+
 	fCalcPL := func(goodsCode string, buyOrSell int64, qty, holderPrice,
-		agreeUnit float64, decimalPlace int64) (positionPL float64, marketAmount float64, lastPrice float64) {
+		agreeUnit float64, decimalPlace int64, exchangeRate float64) (positionPL float64, marketAmount float64, lastPrice float64) {
 		positionPL = 0
 		for _, q := range goodGuotes {
 			if goodsCode == q.Goodscode {
@@ -185,13 +197,13 @@ func GetTradePosition(accIds string, tradeModes string) (rst []QueryTradePositio
 				} else {
 					return
 				}
-				positionPL = (lastPrice - holderPrice) * qty * agreeUnit
+				positionPL = (lastPrice - holderPrice) * qty * agreeUnit * exchangeRate
 				positionPL, _ = strconv.ParseFloat(utils.FormatFloat(positionPL, 2), 64)
 				if buyOrSell == 1 {
 					// 卖方向 *-1
 					positionPL *= -1.0
 				}
-				marketAmount = lastPrice * qty * agreeUnit
+				marketAmount = lastPrice * qty * agreeUnit * exchangeRate
 				marketAmount, _ = strconv.ParseFloat(utils.FormatFloat(marketAmount, 2), 64)
 			}
 		}
@@ -200,6 +212,14 @@ func GetTradePosition(accIds string, tradeModes string) (rst []QueryTradePositio
 
 	// 构建返回数据
 	for _, v := range datas {
+		// 获取汇率
+		exchangeRate := 1.0
+		if v.Currencyid != v.TaCurrencyid {
+			if rate, ok := rateMap[fmt.Sprintf("%d_%d", v.Currencyid, v.TaCurrencyid)]; ok {
+				exchangeRate = rate
+			}
+		}
+
 		// 构建买方向持仓汇总
 		if v.Buycurpositionqty > 0 {
 			var tradePosition QueryTradePositionRsp
@@ -229,14 +249,14 @@ func GetTradePosition(accIds string, tradeModes string) (rst []QueryTradePositio
 				tradePosition.FreTDPosition = c.CovertQty(v.Buyfretdposition)
 				tradePosition.EnableQTY = c.CovertQty(v.Buycurpositionqty - v.Buyfrozenqty - v.Buyotherfrozenqty)
 				// 计算持仓均价
-				averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit
+				averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit / exchangeRate
 
 				// #96004 改为固定3位小数
 				// #3524 又改为跟商品价格小数位走 2022.04.07
 				// 运维提出, 不要四舍五入, 改为去尾法 2022.04.26
 				tradePosition.AveragePrice, _ = decimal.NewFromFloat(averagePrice).Truncate(int32(v.Decimalplace + 2)).Float64()
 				tradePosition.PositionPL, tradePosition.MarketAmount, tradePosition.LastPrice = fCalcPL(tradePosition.GoodsCode, tradePosition.BuyOrSell, tradePosition.CurPositionQTY,
-					tradePosition.AveragePrice, tradePosition.AgreeUnit, tradePosition.DecimalPlace+1)
+					tradePosition.AveragePrice, tradePosition.AgreeUnit, tradePosition.DecimalPlace+1, exchangeRate)
 				if tradePosition.CurHolderAmount > 1e-10 {
 					tradePosition.PositionPLRate = tradePosition.PositionPL / tradePosition.CurHolderAmount
 					tradePosition.PositionPLRate, _ = strconv.ParseFloat(utils.FormatFloat(tradePosition.PositionPLRate, 4), 64)
@@ -278,11 +298,11 @@ func GetTradePosition(accIds string, tradeModes string) (rst []QueryTradePositio
 				tradePosition.FreTDPosition = c.CovertQty(v.Sellfretdposition)
 				tradePosition.EnableQTY = c.CovertQty(v.Sellcurpositionqty - v.Sellfrozenqty - v.Sellotherfrozenqty)
 				// 计算持仓均价
-				averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit
+				averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit / exchangeRate
 
 				tradePosition.AveragePrice, _ = decimal.NewFromFloat(averagePrice).Truncate(int32(v.Decimalplace + 2)).Float64()
 				tradePosition.PositionPL, tradePosition.MarketAmount, tradePosition.LastPrice = fCalcPL(tradePosition.GoodsCode, tradePosition.BuyOrSell, tradePosition.CurPositionQTY,
-					tradePosition.AveragePrice, tradePosition.AgreeUnit, tradePosition.DecimalPlace)
+					tradePosition.AveragePrice, tradePosition.AgreeUnit, tradePosition.DecimalPlace, exchangeRate)
 				if tradePosition.CurHolderAmount > 1e-10 {
 					tradePosition.PositionPLRate = tradePosition.PositionPL / tradePosition.CurHolderAmount
 					tradePosition.PositionPLRate, _ = strconv.ParseFloat(utils.FormatFloat(tradePosition.PositionPLRate, 4), 64)