ソースを参照

解决“获取企业风管期货持仓头寸信息”接口无金额相关值的问题

zhou.xiaoning 4 年 前
コミット
0143961db2
5 ファイル変更215 行追加103 行削除
  1. 117 60
      controllers/ermcp/qryOrder.go
  2. 27 14
      docs/docs.go
  3. 27 14
      docs/swagger.json
  4. 24 12
      docs/swagger.yaml
  5. 20 3
      models/ermcpOrder.go

+ 117 - 60
controllers/ermcp/qryOrder.go

@@ -21,29 +21,31 @@ type QueryErmcpTradePositionReq struct {
 type QueryErmcpTradePositionRsp struct {
 	Goodsname            string  `json:"goodsname"`            // 商品名称
 	BuyOrSell            int64   `json:"buyorsell"`            // 方向 - 0:买 1:卖
-	EnableQTY            int64   `json:"enableqty"`            // 可用(总仓可用)
-	CurPositionQTY       int64   `json:"curpositionqty"`       // 当前持仓总数量(总仓数量)
+	EnableQTY            int64   `json:"enableqty"`            // 可用(总仓可用)
+	CurPositionQTY       int64   `json:"curpositionqty"`       // 持仓(总仓数量, 期末头寸
 	Last                 float64 `json:"last"`                 // 现价
-	CurHolderAmount      float64 `json:"curholderamount" `     // 当前持仓总金额[商品币种]
-	PositionPL           float64 `json:"positionpl"`           // 持仓盈亏
-	PositionPLRate       float64 `json:"positionplrate"`       // 持仓盈亏率
-	CurTDPosition        int64   `json:"curtdposition"`        // 期末今日头寸(今仓数量)
+	CurTDPosition        int64   `json:"curtdposition"`        // 今仓数量(期末今日头寸)
 	CurTDPositionEnabled int64   `json:"curtdpositionenabled"` // 今仓可用
-	AveragePrice         float64 `json:"averageprice"`         // 持仓均价
-	UsedMargin           float64 `json:"usedmargin"`           // 占用保证金[商品币种]
+	PositionAveragePrice float64 `json:"positionaverageprice"` // 持仓均价【头寸变化更新】= 持仓成本 / 期末头寸 / 合约单位
+	OpenAveragePrice     float64 `json:"openaverageprice" `    // 开仓均价【头寸变化更新】 = 开仓成本 / 期末头寸 / 合约单位
+	PositionPL           float64 `json:"positionpl"`           // 盯市浮盈【实时行情更新】(MTP:浮动盈亏、持仓盈亏) 买方向 = (最新价 - 持仓均价) * 买期末头寸 * 合约单位;卖方向 = (持仓均价 - 最新价) * 买期末头寸 * 合约单位
+	OpenPL               float64 `json:"openpl"`               // 逐笔浮盈【实时行情更新】(MTP:开仓盈亏、平仓盈亏) 买方向 = (最新价 - 开仓均价) * 买期末头寸 * 合约单位;卖方向 = (开仓均价 - 最新价) * 买期末头寸 * 合约单位
+	PositionPLRate       float64 `json:"positionplrate"`       // 持仓盈亏比例【实时行情更新】 = 持仓盈亏 / 开仓成本
+	UsedMargin           float64 `json:"usedmargin"`           // 占用保证金
 	ExExehangeName       string  `json:"exexchangename"`       // 外部交易所名称
-
-	Goodsid      int64   `json:"goodsid"`      // 商品ID(自增ID SEQ_GOODS)
-	Goodscode    string  `json:"goodscode"`    // 商品代码(内部)
-	Outgoodscode string  `json:"outgoodscode"` // 商品代码(外部)
-	Agreeunit    float64 `json:"agreeunit"`    // 合约单位
-	Decimalplace int64   `json:"decimalplace"` // 报价小数
-
-	Marketid int64 `json:"marketid"` // 所属市场ID
+	OpenCost             float64 `json:"opencost"`             // 开仓成本
+	PositionCost         float64 `json:"positioncost"`         // 持仓成本
+	Goodsid              int64   `json:"goodsid"`              // 商品ID(自增ID SEQ_GOODS)
+	Goodscode            string  `json:"goodscode"`            // 商品代码(内部)
+	Outgoodscode         string  `json:"outgoodscode"`         // 商品代码(外部)
+	Agreeunit            float64 `json:"agreeunit"`            // 合约单
+	Decimalplace         int64   `json:"decimalplace"`         // 报价小数位
+	Marketid             int64   `json:"marketid"`             // 所属市场ID
 }
 
 // QueryErmcpTradePosition 获取企业风管期货持仓头寸信息
 // @Summary 获取企业风管期货持仓头寸信息
+// @Description 本接口只使用于通道交易相关头寸查询;子账户持仓头寸占用保证金为0;
 // @Produce json
 // @Security ApiKeyAuth
 // @Param accountID query int true "资金账户ID"
@@ -78,9 +80,8 @@ func QueryErmcpTradePosition(c *gin.Context) {
 		return
 	}
 
-	// 母账户要从HEDGE_OUTTRADEPOSITION表查询持仓头寸(未生成内部头寸);子账户从TRADEPOSITION表获持仓头寸
 	if taAccount.Ismain == 1 {
-		// 母账户
+		// 母账户,从HEDGE_OUTTRADEPOSITION表查询持仓头寸(未生成内部头寸)
 		hedgeOutTradePositions, err := models.GetHedgeOutTradePositions(req.AccountID, req.MarketID)
 		if err != nil {
 			// 查询失败
@@ -97,14 +98,13 @@ func QueryErmcpTradePosition(c *gin.Context) {
 					BuyOrSell:            0,
 					EnableQTY:            v.Curbuyposition - v.Fretdbuyposition - v.Freydbuyposition, // 买可用 = 期末买头寸 - 冻结今日买头寸 - 冻结上日买头寸
 					CurPositionQTY:       v.Curbuyposition,
-					CurHolderAmount:      0, // FIXME: - 缺少数据?
 					CurTDPosition:        v.Curtdbuyposition,
 					CurTDPositionEnabled: v.Curtdbuyposition - v.Fretdbuyposition, // 今仓买可用 = 期末今日买头寸 - 冻结今日买头寸
-					UsedMargin:           0,                                       // FIXME: - 缺少数据?
-
-					Goodsid: v.Hedgegoodsid,
-
-					Marketid: int64(v.Marketid),
+					UsedMargin:           v.Buyusemargin,
+					OpenCost:             v.Buyopencost,
+					PositionCost:         v.Buypositioncost,
+					Goodsid:              v.Hedgegoodsid,
+					Marketid:             int64(v.Marketid),
 				}
 				// 获取对应商品信息
 				goods, err := models.GetGoods(int(v.Hedgegoodsid))
@@ -153,7 +153,23 @@ func QueryErmcpTradePosition(c *gin.Context) {
 						item.Last = utils.IntToFloat64(int(quoteDays[0].Presettle), int(goods.Decimalplace))
 					}
 				}
-				// FIXME: - 目前外部持仓头寸表里没有相关金额的字段,等相关服务处理
+				// 计算价格与盈亏
+				// 开仓均价 = 开仓成本 / 期末头寸 / 合约单位
+				item.OpenAveragePrice = v.Buyopencost / float64(v.Curbuyposition) / goods.Agreeunit
+				// 持仓均价 = 持仓成本 / 期末头寸 / 合约单位
+				item.PositionAveragePrice = v.Buypositioncost / float64(v.Curbuyposition) / goods.Agreeunit
+				// 盯市浮盈(MTP:浮动盈亏、持仓盈亏) 买方向 = (最新价 - 持仓均价) * 买期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.PositionPL = (item.Last - item.PositionAveragePrice) * float64(v.Curbuyposition) * goods.Agreeunit
+				}
+				// 逐笔浮盈(MTP:开仓盈亏、平仓盈亏)买方向 = (最新价 - 开仓均价) * 买期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.OpenPL = (item.Last - item.OpenAveragePrice) * float64(v.Curbuyposition) * goods.Agreeunit
+				}
+				// 持仓盈亏比例 = 持仓盈亏 / 开仓成本
+				if item.PositionPL != 0 && v.Buyopencost != 0 {
+					item.PositionPLRate = item.PositionPL / v.Buyopencost
+				}
 
 				rsp = append(rsp, item)
 			}
@@ -163,14 +179,13 @@ func QueryErmcpTradePosition(c *gin.Context) {
 					BuyOrSell:            1,
 					EnableQTY:            v.Cursellposition - v.Fretdsellposition - v.Freydsellposition,
 					CurPositionQTY:       v.Cursellposition,
-					CurHolderAmount:      0, // FIXME: - 缺少数据?
 					CurTDPosition:        v.Curtdsellposition,
 					CurTDPositionEnabled: v.Curtdsellposition - v.Fretdsellposition,
-					UsedMargin:           0, // FIXME: - 缺少数据?
-
-					Goodsid: v.Hedgegoodsid,
-
-					Marketid: int64(v.Marketid),
+					UsedMargin:           v.Sellusemargin,
+					OpenCost:             v.Sellopencost,
+					PositionCost:         v.Sellpositioncost,
+					Goodsid:              v.Hedgegoodsid,
+					Marketid:             int64(v.Marketid),
 				}
 				// 获取对应商品信息
 				goods, err := models.GetGoods(int(v.Hedgegoodsid))
@@ -219,7 +234,23 @@ func QueryErmcpTradePosition(c *gin.Context) {
 						item.Last = utils.IntToFloat64(int(quoteDays[0].Presettle), int(goods.Decimalplace))
 					}
 				}
-				// FIXME: - 目前外部持仓头寸表里没有相关金额的字段,等相关服务处理
+				// 计算价格与盈亏
+				// 开仓均价 = 开仓成本 / 期末头寸 / 合约单位
+				item.OpenAveragePrice = v.Sellopencost / float64(v.Cursellposition) / goods.Agreeunit
+				// 持仓均价 = 持仓成本 / 期末头寸 / 合约单位
+				item.PositionAveragePrice = v.Sellpositioncost / float64(v.Cursellposition) / goods.Agreeunit
+				// 盯市浮盈(MTP:浮动盈亏、持仓盈亏) 卖方向 = (持仓均价 - 最新价) * 卖期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.PositionPL = (item.PositionAveragePrice - item.Last) * float64(v.Cursellposition) * goods.Agreeunit
+				}
+				// 逐笔浮盈(MTP:开仓盈亏、平仓盈亏)买方向 = (开仓均价 - 最新价) * 卖期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.OpenPL = (item.Last - item.OpenAveragePrice) * float64(v.Cursellposition) * goods.Agreeunit
+				}
+				// 持仓盈亏比例 = 持仓盈亏 / 开仓成本
+				if item.PositionPL != 0 && v.Sellopencost != 0 {
+					item.PositionPLRate = item.PositionPL / v.Sellopencost
+				}
 
 				rsp = append(rsp, item)
 			}
@@ -241,12 +272,9 @@ func QueryErmcpTradePosition(c *gin.Context) {
 					BuyOrSell:            0,
 					EnableQTY:            v.Buycurpositionqty - v.Buyfrozenqty, // 买可用 = 买当前持仓总数量 - 买持仓冻结数量
 					CurPositionQTY:       v.Buycurpositionqty,
-					CurHolderAmount:      v.Buycurholderamount,
 					CurTDPosition:        v.Buycurtdposition,
-					CurTDPositionEnabled: v.Buycurtdposition - v.Buyfretdposition, // 今仓买可用 = 买期末今日头寸 - 买冻结今日头寸
-					UsedMargin:           v.Usedmargin,
-
-					Goodsid: int64(v.Goodsid),
+					CurTDPositionEnabled: v.Buycurtdposition - v.Buyfretdposition, // 今仓买可用 = 期末今日买头寸 - 冻结今日买头寸
+					Goodsid:              int64(v.Goodsid),
 				}
 				// 获取对应市场信息
 				market, err := models.GetMarketByGoodsID(int(v.Goodsid))
@@ -309,32 +337,42 @@ func QueryErmcpTradePosition(c *gin.Context) {
 						item.Last = utils.IntToFloat64(int(quoteDays[0].Presettle), int(goods.Decimalplace))
 					}
 				}
-				// 计算持仓均价 = 买当前持仓总金额 / 买当前持仓总数量 / 合约单位
-				item.AveragePrice = v.Buycurholderamount / float64(v.Buycurpositionqty) / goods.Agreeunit
-				// 计算持仓盈亏:买方向持仓盈亏 = (最新价 - 持仓价) * 数量 * 合约单位
-				// 知识点:交易服务在结算后,会按结算价更新持仓单金额,所以持仓均价就是持仓价(结算价)
-				// 知识点:持仓盈亏是今日浮动盈亏,针对结算价进行计算;平仓盈亏是针对建仓价进行计算
-				// if item.Last == 0 {
-				// 	item.PositionPL = 0
-				// } else {
-				// 	item.PositionPL = (item.Last - item.AveragePrice) * float64(v.Buycurpositionqty) * goods.Agreeunit
-				// }
-				// FIXME: - 与老邓及王旭讨论过后,确认后期头寸相关价格会由交易服务落地,目前暂不进行计算
+				// 子账户需要从内部持仓明细(通道)表汇总计划开仓成本和开仓均价
+				hedgeInnerHolderDetails, _ := models.GetHedgeInnerHolderDetails(int(item.Goodsid), 0)
+				for _, detail := range hedgeInnerHolderDetails {
+					// 开仓成本 = 建仓价 * 持仓数量 * 合约单位
+					item.OpenCost += detail.Openprice * float64(detail.Holderqty) * goods.Agreeunit
+				}
+				// 开仓均价 = 开仓成本 / 期末头寸 / 合约单位
+				item.OpenAveragePrice = item.OpenCost / float64(item.CurPositionQTY) / goods.Agreeunit
+				// 持仓成本
+				item.PositionCost = v.Buycurholderamount
+				// 持仓均价 = 持仓成本 / 期末头寸 / 合约单位
+				item.PositionAveragePrice = v.Buycurholderamount / float64(v.Buycurpositionqty) / goods.Agreeunit
+				// 盯市浮盈(MTP:浮动盈亏、持仓盈亏) 买方向 = (最新价 - 持仓均价) * 买期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.PositionPL = (item.Last - item.PositionAveragePrice) * float64(v.Buycurpositionqty) * goods.Agreeunit
+				}
+				// 逐笔浮盈(MTP:开仓盈亏、平仓盈亏)买方向 = (最新价 - 开仓均价) * 买期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.OpenPL = (item.Last - item.OpenAveragePrice) * float64(v.Buycurpositionqty) * goods.Agreeunit
+				}
+				// 持仓盈亏比例 = 持仓盈亏 / 开仓成本
+				if item.PositionPL != 0 && item.OpenCost != 0 {
+					item.PositionPLRate = item.PositionPL / item.OpenCost
+				}
 
 				rsp = append(rsp, item)
 			}
 			if v.Sellcurpositionqty > 0 {
 				// 卖方向
 				item := QueryErmcpTradePositionRsp{
-					BuyOrSell:            0,
-					EnableQTY:            v.Sellcurpositionqty - v.Sellfrozenqty,
+					BuyOrSell:            1,
+					EnableQTY:            v.Sellcurpositionqty - v.Sellfrozenqty, // 买可用 = 买当前持仓总数量 - 买持仓冻结数量
 					CurPositionQTY:       v.Sellcurpositionqty,
-					CurHolderAmount:      v.Sellcurholderamount,
 					CurTDPosition:        v.Sellcurtdposition,
-					CurTDPositionEnabled: v.Sellcurtdposition - v.Sellfretdposition,
-					UsedMargin:           v.Usedmargin,
-
-					Goodsid: int64(v.Goodsid),
+					CurTDPositionEnabled: v.Sellcurtdposition - v.Sellfretdposition, // 今仓买可用 = 期末今日买头寸 - 冻结今日买头寸
+					Goodsid:              int64(v.Goodsid),
 				}
 				// 获取对应市场信息
 				market, err := models.GetMarketByGoodsID(int(v.Goodsid))
@@ -397,11 +435,30 @@ func QueryErmcpTradePosition(c *gin.Context) {
 						item.Last = utils.IntToFloat64(int(quoteDays[0].Presettle), int(goods.Decimalplace))
 					}
 				}
-				// 计算持仓均价 = 买当前持仓总金额 / 买当前持仓总数量 / 合约单位
-				item.AveragePrice = v.Buycurholderamount / float64(v.Buycurpositionqty) / goods.Agreeunit
-				// 计算持仓盈亏:卖方向持仓盈亏 = (持仓价 - 最新价) * 数量 * 合约单位
-				// 知识点:交易服务在结算后,会按结算价更新持仓单金额,所以持仓均价就是持仓价(结算价)
-				// 知识点:持仓盈亏是今日浮动盈亏,针对结算价进行计算;平仓盈亏是针对建仓价进行计算
+				// 子账户需要从内部持仓明细(通道)表汇总计划开仓成本和开仓均价
+				hedgeInnerHolderDetails, _ := models.GetHedgeInnerHolderDetails(int(item.Goodsid), 1)
+				for _, detail := range hedgeInnerHolderDetails {
+					// 开仓成本 = 建仓价 * 持仓数量 * 合约单位
+					item.OpenCost += detail.Openprice * float64(detail.Holderqty) * goods.Agreeunit
+				}
+				// 开仓均价 = 开仓成本 / 期末头寸 / 合约单位
+				item.OpenAveragePrice = item.OpenCost / float64(item.CurPositionQTY) / goods.Agreeunit
+				// 持仓成本
+				item.PositionCost = v.Sellcurholderamount
+				// 持仓均价 = 持仓成本 / 期末头寸 / 合约单位
+				item.PositionAveragePrice = v.Sellcurholderamount / float64(v.Sellcurpositionqty) / goods.Agreeunit
+				// 盯市浮盈(MTP:浮动盈亏、持仓盈亏) 卖方向 = (持仓均价 - 最新价) * 买期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.PositionPL = (item.PositionAveragePrice - item.Last) * float64(v.Sellcurpositionqty) * goods.Agreeunit
+				}
+				// 逐笔浮盈(MTP:开仓盈亏、平仓盈亏)卖方向 = (开仓均价 - 最新价) * 买期末头寸 * 合约单位
+				if item.Last != 0 {
+					item.OpenPL = (item.OpenAveragePrice - item.Last) * float64(v.Sellcurpositionqty) * goods.Agreeunit
+				}
+				// 持仓盈亏比例 = 持仓盈亏 / 开仓成本
+				if item.PositionPL != 0 && item.OpenCost != 0 {
+					item.PositionPLRate = item.PositionPL / item.OpenCost
+				}
 
 				rsp = append(rsp, item)
 			}

+ 27 - 14
docs/docs.go

@@ -1664,6 +1664,7 @@ var doc = `{
                         "ApiKeyAuth": []
                     }
                 ],
+                "description": "本接口只使用于通道交易相关头寸查询;子账户持仓头寸占用保证金为0;",
                 "produces": [
                     "application/json"
                 ],
@@ -9378,24 +9379,16 @@ var doc = `{
                     "description": "合约单位",
                     "type": "number"
                 },
-                "averageprice": {
-                    "description": "持仓均价",
-                    "type": "number"
-                },
                 "buyorsell": {
                     "description": "方向 - 0:买 1:卖",
                     "type": "integer"
                 },
-                "curholderamount": {
-                    "description": "当前持仓总金额[商品币种]",
-                    "type": "number"
-                },
                 "curpositionqty": {
-                    "description": "当前持仓总数量(总仓数量)",
+                    "description": "持仓(总仓数量, 期末头寸)",
                     "type": "integer"
                 },
                 "curtdposition": {
-                    "description": "期末今日头寸(今仓数量)",
+                    "description": "今仓数量(期末今日头寸)",
                     "type": "integer"
                 },
                 "curtdpositionenabled": {
@@ -9407,7 +9400,7 @@ var doc = `{
                     "type": "integer"
                 },
                 "enableqty": {
-                    "description": "可用(总仓可用)",
+                    "description": "可用(总仓可用)",
                     "type": "integer"
                 },
                 "exexchangename": {
@@ -9434,20 +9427,40 @@ var doc = `{
                     "description": "所属市场ID",
                     "type": "integer"
                 },
+                "openaverageprice": {
+                    "description": "开仓均价【头寸变化更新】 = 开仓成本 / 期末头寸 / 合约单位",
+                    "type": "number"
+                },
+                "opencost": {
+                    "description": "开仓成本",
+                    "type": "number"
+                },
+                "openpl": {
+                    "description": "逐笔浮盈【实时行情更新】(MTP:开仓盈亏、平仓盈亏) 买方向 = (最新价 - 开仓均价) * 买期末头寸 * 合约单位;卖方向 = (开仓均价 - 最新价) * 买期末头寸 * 合约单位",
+                    "type": "number"
+                },
                 "outgoodscode": {
                     "description": "商品代码(外部)",
                     "type": "string"
                 },
+                "positionaverageprice": {
+                    "description": "持仓均价【头寸变化更新】= 持仓成本 / 期末头寸 / 合约单位",
+                    "type": "number"
+                },
+                "positioncost": {
+                    "description": "持仓成本",
+                    "type": "number"
+                },
                 "positionpl": {
-                    "description": "持仓盈亏",
+                    "description": "盯市浮盈【实时行情更新】(MTP:浮动盈亏、持仓盈亏) 买方向 = (最新价 - 持仓均价) * 买期末头寸 * 合约单位;卖方向 = (持仓均价 - 最新价) * 买期末头寸 * 合约单位",
                     "type": "number"
                 },
                 "positionplrate": {
-                    "description": "持仓盈亏率",
+                    "description": "持仓盈亏比例【实时行情更新】 = 持仓盈亏 / 开仓成本",
                     "type": "number"
                 },
                 "usedmargin": {
-                    "description": "占用保证金[商品币种]",
+                    "description": "占用保证金",
                     "type": "number"
                 }
             }

+ 27 - 14
docs/swagger.json

@@ -1648,6 +1648,7 @@
                         "ApiKeyAuth": []
                     }
                 ],
+                "description": "本接口只使用于通道交易相关头寸查询;子账户持仓头寸占用保证金为0;",
                 "produces": [
                     "application/json"
                 ],
@@ -9362,24 +9363,16 @@
                     "description": "合约单位",
                     "type": "number"
                 },
-                "averageprice": {
-                    "description": "持仓均价",
-                    "type": "number"
-                },
                 "buyorsell": {
                     "description": "方向 - 0:买 1:卖",
                     "type": "integer"
                 },
-                "curholderamount": {
-                    "description": "当前持仓总金额[商品币种]",
-                    "type": "number"
-                },
                 "curpositionqty": {
-                    "description": "当前持仓总数量(总仓数量)",
+                    "description": "持仓(总仓数量, 期末头寸)",
                     "type": "integer"
                 },
                 "curtdposition": {
-                    "description": "期末今日头寸(今仓数量)",
+                    "description": "今仓数量(期末今日头寸)",
                     "type": "integer"
                 },
                 "curtdpositionenabled": {
@@ -9391,7 +9384,7 @@
                     "type": "integer"
                 },
                 "enableqty": {
-                    "description": "可用(总仓可用)",
+                    "description": "可用(总仓可用)",
                     "type": "integer"
                 },
                 "exexchangename": {
@@ -9418,20 +9411,40 @@
                     "description": "所属市场ID",
                     "type": "integer"
                 },
+                "openaverageprice": {
+                    "description": "开仓均价【头寸变化更新】 = 开仓成本 / 期末头寸 / 合约单位",
+                    "type": "number"
+                },
+                "opencost": {
+                    "description": "开仓成本",
+                    "type": "number"
+                },
+                "openpl": {
+                    "description": "逐笔浮盈【实时行情更新】(MTP:开仓盈亏、平仓盈亏) 买方向 = (最新价 - 开仓均价) * 买期末头寸 * 合约单位;卖方向 = (开仓均价 - 最新价) * 买期末头寸 * 合约单位",
+                    "type": "number"
+                },
                 "outgoodscode": {
                     "description": "商品代码(外部)",
                     "type": "string"
                 },
+                "positionaverageprice": {
+                    "description": "持仓均价【头寸变化更新】= 持仓成本 / 期末头寸 / 合约单位",
+                    "type": "number"
+                },
+                "positioncost": {
+                    "description": "持仓成本",
+                    "type": "number"
+                },
                 "positionpl": {
-                    "description": "持仓盈亏",
+                    "description": "盯市浮盈【实时行情更新】(MTP:浮动盈亏、持仓盈亏) 买方向 = (最新价 - 持仓均价) * 买期末头寸 * 合约单位;卖方向 = (持仓均价 - 最新价) * 买期末头寸 * 合约单位",
                     "type": "number"
                 },
                 "positionplrate": {
-                    "description": "持仓盈亏率",
+                    "description": "持仓盈亏比例【实时行情更新】 = 持仓盈亏 / 开仓成本",
                     "type": "number"
                 },
                 "usedmargin": {
-                    "description": "占用保证金[商品币种]",
+                    "description": "占用保证金",
                     "type": "number"
                 }
             }

+ 24 - 12
docs/swagger.yaml

@@ -2477,20 +2477,14 @@ definitions:
       agreeunit:
         description: 合约单位
         type: number
-      averageprice:
-        description: 持仓均价
-        type: number
       buyorsell:
         description: 方向 - 0:买 1:卖
         type: integer
-      curholderamount:
-        description: 当前持仓总金额[商品币种]
-        type: number
       curpositionqty:
-        description: 当前持仓总数量(总仓数量)
+        description: 持仓(总仓数量, 期末头寸)
         type: integer
       curtdposition:
-        description: 期末今日头寸(今仓数量
+        description: 今仓数量(期末今日头寸)
         type: integer
       curtdpositionenabled:
         description: 今仓可用
@@ -2499,7 +2493,7 @@ definitions:
         description: 报价小数位
         type: integer
       enableqty:
-        description: 可用(总仓可用)
+        description: 可用(总仓可用)
         type: integer
       exexchangename:
         description: 外部交易所名称
@@ -2519,17 +2513,34 @@ definitions:
       marketid:
         description: 所属市场ID
         type: integer
+      openaverageprice:
+        description: 开仓均价【头寸变化更新】 = 开仓成本 / 期末头寸 / 合约单位
+        type: number
+      opencost:
+        description: 开仓成本
+        type: number
+      openpl:
+        description: 逐笔浮盈【实时行情更新】(MTP:开仓盈亏、平仓盈亏) 买方向 = (最新价 - 开仓均价) * 买期末头寸 * 合约单位;卖方向
+          = (开仓均价 - 最新价) * 买期末头寸 * 合约单位
+        type: number
       outgoodscode:
         description: 商品代码(外部)
         type: string
+      positionaverageprice:
+        description: 持仓均价【头寸变化更新】= 持仓成本 / 期末头寸 / 合约单位
+        type: number
+      positioncost:
+        description: 持仓成本
+        type: number
       positionpl:
-        description: 持仓盈亏
+        description: 盯市浮盈【实时行情更新】(MTP:浮动盈亏、持仓盈亏) 买方向 = (最新价 - 持仓均价) * 买期末头寸 * 合约单位;卖方向
+          = (持仓均价 - 最新价) * 买期末头寸 * 合约单位
         type: number
       positionplrate:
-        description: 持仓盈亏率
+        description: 持仓盈亏比例【实时行情更新】 = 持仓盈亏 / 开仓成本
         type: number
       usedmargin:
-        description: 占用保证金[商品币种]
+        description: 占用保证金
         type: number
     type: object
   ermcp.RealtimeExposurePositionRsp:
@@ -9726,6 +9737,7 @@ paths:
       - 企业风险管理(app)
   /Ermcp/QueryErmcpTradePosition:
     get:
+      description: 本接口只使用于通道交易相关头寸查询;子账户持仓头寸占用保证金为0;
       parameters:
       - description: 资金账户ID
         in: query

+ 20 - 3
models/ermcpOrder.go

@@ -26,9 +26,12 @@ type Hedgeouttradeposition struct {
 	Curtdsellposition int64   `json:"curtdsellposition"  xorm:"'CURTDSELLPOSITION'"`          // 期末今日卖头寸
 	Freydsellposition int64   `json:"freydsellposition"  xorm:"'FREYDSELLPOSITION'"`          // 冻结上日卖头寸
 	Fretdsellposition int64   `json:"fretdsellposition"  xorm:"'FRETDSELLPOSITION'"`          // 冻结今日卖头寸
-	Opencost          float64 `json:"opencost"  xorm:"'OPENCOST'"`                            // 开仓成本
-	Positioncost      float64 `json:"positioncost"  xorm:"'POSITIONCOST'"`                    // 持仓成本
-	Usemargin         float64 `json:"usemargin"  xorm:"'USEMARGIN'"`                          // 占用保证金
+	Buyopencost       float64 `json:"buyopencost"  xorm:"'BUYOPENCOST'"`                      // 买开仓成本
+	Buypositioncost   float64 `json:"buypositioncost"  xorm:"'BUYPOSITIONCOST'"`              // 买持仓成本
+	Buyusemargin      float64 `json:"buyusemargin"  xorm:"'BUYUSEMARGIN'"`                    // 买占用保证金
+	Sellopencost      float64 `json:"sellopencost"  xorm:"'SELLOPENCOST'"`                    // 卖开仓成本
+	Sellpositioncost  float64 `json:"sellpositioncost"  xorm:"'SELLPOSITIONCOST'"`            // 卖持仓成本
+	Sellusemargin     float64 `json:"sellusemargin"  xorm:"'SELLUSEMARGIN'"`                  // 卖占用保证金
 }
 
 // TableName is HEDGE_OUTTRADEPOSITION
@@ -267,3 +270,17 @@ func GetHedgeOutTradePositions(accountID int, marketID int) ([]Hedgeouttradeposi
 
 	return hedgeOutTradePositions, nil
 }
+
+// GetHedgeInnerHolderDetails 获取指定商品和方向的通道交易内部持仓明细数据
+func GetHedgeInnerHolderDetails(goodsID, buyOrSell int) ([]Hedgeinnerholderdetail, error) {
+	hedgeInnerHolderDetails := make([]Hedgeinnerholderdetail, 0)
+
+	if err := db.GetEngine().
+		Where("GOODSID = ?", goodsID).
+		And("BUYORSELL = ?", buyOrSell).
+		Find(&hedgeInnerHolderDetails); err != nil {
+		return nil, err
+	}
+
+	return hedgeInnerHolderDetails, nil
+}