|
|
@@ -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)
|