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