Ver código fonte

1.期货报表开(平)仓均价除以合约单位
2.开(平)仓数量按成交量小位数缩小

zou.yingbin 4 anos atrás
pai
commit
e9d14fd9c5
2 arquivos alterados com 93 adições e 54 exclusões
  1. 66 54
      models/ermcp3Report.go
  2. 27 0
      models/ermcpCommon.go

+ 66 - 54
models/ermcp3Report.go

@@ -1914,65 +1914,71 @@ func (r *Ermcp3ArealSumPL) GetDataEx() (interface{}, error) {
 
 // Ermcp3TaFutuReDataReport 期货报表
 type Ermcp3TaFutuReDataReport struct {
-	RECKONDATE             string  `json:"reckondate"  xorm:"RECKONDATE"`                         // 日照时期(yyyyMMdd)
-	CYCLETIME              string  `json:"cycletime"  xorm:"CYCLETIME"`                           // 周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
-	CYCLETYPE              int32   `json:"cycletype"  xorm:"CYCLETYPE"`                           // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
-	ACCOUNTID              int64   `json:"accountid"  xorm:"ACCOUNTID"`                           // 交易账户
-	GOODSID                int32   `json:"goodsid"  xorm:"GOODSID"`                               // 交易合约
-	BUYORSELL              int32   `json:"buyorsell"  xorm:"BUYORSELL"`                           // 持仓方向
-	CURRENCYID             int32   `json:"currencyid"  xorm:"CURRENCYID"`                         // 结算币种ID
-	USERID                 int64   `json:"userid"  xorm:"USERID"`                                 // 账户所属用户ID
-	RELATEDUSERID          int64   `json:"relateduserid"  xorm:"RELATEDUSERID"`                   // 账户关联用户ID
-	GOODSGROUPID           int32   `json:"goodsgroupid"  xorm:"GOODSGROUPID"`                     // 交易品种
-	ORIHOLDQTY             float64 `json:"oriholdqty"  xorm:"ORIHOLDQTY"`                         // 期初持仓量
-	ORIOPENAMOUNT          float64 `json:"oriopenamount"  xorm:"ORIOPENAMOUNT"`                   // 期初开仓额
-	ORIHOLDAMOUNT          float64 `json:"oriholdamount"  xorm:"ORIHOLDAMOUNT"`                   // 期初持仓额
-	TODAYOPENQTY           float64 `json:"todayopenqty"  xorm:"TODAYOPENQTY"`                     // 今开仓量
-	TODAYOPENAMOUNT        float64 `json:"todayopenamount"  xorm:"TODAYOPENAMOUNT"`               // 今开仓额
-	TODAYCLOSEQTY          float64 `json:"todaycloseqty"  xorm:"TODAYCLOSEQTY"`                   // 今平仓量
-	TODAYCLOSEAMOUNT       float64 `json:"todaycloseamount"  xorm:"TODAYCLOSEAMOUNT"`             // 今平仓额
-	HOLDQTY                float64 `json:"holdqty"  xorm:"HOLDQTY"`                               // 期末持仓量
-	OPENAMOUNT             float64 `json:"openamount"  xorm:"OPENAMOUNT"`                         // 期末开仓额
-	HOLDAMOUNT             float64 `json:"holdamount"  xorm:"HOLDAMOUNT"`                         // 期末持仓额
-	RECKONPRICE            float64 `json:"reckonprice"  xorm:"RECKONPRICE"`                       // 结算价
-	RECKONHOLDAMOUNT       float64 `json:"reckonholdamount"  xorm:"RECKONHOLDAMOUNT"`             // 结算持仓额
-	CHARGE                 float64 `json:"charge"  xorm:"CHARGE"`                                 // 手续费
-	CLOSEPL                float64 `json:"closepl"  xorm:"CLOSEPL"`                               // 平仓损益
-	RECKONPL               float64 `json:"reckonpl"  xorm:"RECKONPL"`                             // 结算损益
-	LASTPRICE              float64 `json:"lastprice"  xorm:"LASTPRICE"`                           // 最新价
-	LASTHOLDAMOUNT         float64 `json:"lastholdamount"  xorm:"LASTHOLDAMOUNT"`                 // 当前持仓额
-	FLOATPL                float64 `json:"floatpl"  xorm:"FLOATPL"`                               // 浮动损益
-	GOODSGROUPSPOTQTY      float64 `json:"goodsgroupspotqty"  xorm:"GOODSGROUPSPOTQTY"`           // 交易品种期末量 (= 期末持仓量 * 合约乘数)
-	TODAYGOODSGROUPSPOTQTY float64 `json:"todaygoodsgroupspotqty"  xorm:"TODAYGOODSGROUPSPOTQTY"` // 交易品种变化量 (=(期末持仓量 - 期初持仓量)* 合约乘数)
-	MIDDLEGOODSQTY         float64 `json:"middlegoodsqty"  xorm:"MIDDLEGOODSQTY"`                 // 套保品种期末量 (=交易品种期末量 * 期货品种折算系数)
-	TODAYMIDDLEGOODSQTY    float64 `json:"todaymiddlegoodsqty"  xorm:"TODAYMIDDLEGOODSQTY"`       // 套保品种变化量 (= 交易品种变化量*期货品种折算系数)
-	RECKONPL2              float64 `json:"reckonpl2"  xorm:"RECKONPL2"`                           // 结算逐笔盈亏
-	OUTERGROUPCODE         string  `json:"outergroupcode"  xorm:"'OUTERGROUPCODE'"`               // 交易品种代码
-	GOODSGROUPNAME         string  `json:"goodsgroupname"  xorm:"'GOODSGROUPNAME'"`               // 交易品种名称
-	GOODSCODE              string  `json:"goodscode"  xorm:"'GOODSCODE'"`                         // 交易合约代码
-	GOODSNAME              string  `json:"goodsname"  xorm:"'GOODSNAME'"`                         // 交易合约名称
-	GOODUNITID             int32   `json:"goodunitid"  xorm:"'GOODUNITID'"`                       // 交易合约单位id
-	ACCOUNTNAME            string  `json:"accountname"  xorm:"'ACCOUNTNAME'"`                     // 交易账号名称
-	MIDDLEGOODSID          int32   `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"`                 // 套保品种id
-	MIDDLEGOODSNAME        string  `json:"middlegoodsname"  xorm:"'MIDDLEGOODSNAME'"`             // 套保商品名称
-	MIDDLEGOODSCODE        string  `json:"middlgoodscode"  xorm:"'MIDDLEGOODSCODE'"`              // 套保商品代码
-
-	OPENAVGPRICE  float64 `json:"openavgprice"`  // 开仓均价
-	CLOSEAVGPRICE float64 `json:"closeavgprice"` // 平仓均价
-	ENUMDICNAME   string  `json:"enumdicname"`   // 单位名称
-	CURRENCYNAME  string  `json:"currencyname"`  // 币种名称
-	QueryType     int32   `json:"-"`             // 查询类型 1-报表 2-报表明细
-	BeginDate     string  `json:"begindate"`     // 开始交易日
-	EndDate       string  `json:"enddate"`       // 结束交易日
+	RECKONDATE             string   `json:"reckondate"  xorm:"RECKONDATE"`                         // 日照时期(yyyyMMdd)
+	CYCLETIME              string   `json:"cycletime"  xorm:"CYCLETIME"`                           // 周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
+	CYCLETYPE              int32    `json:"cycletype"  xorm:"CYCLETYPE"`                           // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
+	ACCOUNTID              int64    `json:"accountid"  xorm:"ACCOUNTID"`                           // 交易账户
+	GOODSID                int32    `json:"goodsid"  xorm:"GOODSID"`                               // 交易合约
+	BUYORSELL              int32    `json:"buyorsell"  xorm:"BUYORSELL"`                           // 持仓方向
+	CURRENCYID             int32    `json:"currencyid"  xorm:"CURRENCYID"`                         // 结算币种ID
+	USERID                 int64    `json:"userid"  xorm:"USERID"`                                 // 账户所属用户ID
+	RELATEDUSERID          int64    `json:"relateduserid"  xorm:"RELATEDUSERID"`                   // 账户关联用户ID
+	GOODSGROUPID           int32    `json:"goodsgroupid"  xorm:"GOODSGROUPID"`                     // 交易品种
+	ORIHOLDQTY             float64  `json:"oriholdqty"  xorm:"ORIHOLDQTY"`                         // 期初持仓量
+	ORIOPENAMOUNT          float64  `json:"oriopenamount"  xorm:"ORIOPENAMOUNT"`                   // 期初开仓额
+	ORIHOLDAMOUNT          float64  `json:"oriholdamount"  xorm:"ORIHOLDAMOUNT"`                   // 期初持仓额
+	TODAYOPENQTY           SFLOAT64 `json:"todayopenqty"  xorm:"TODAYOPENQTY"`                     // 今开仓量
+	TODAYOPENAMOUNT        float64  `json:"todayopenamount"  xorm:"TODAYOPENAMOUNT"`               // 今开仓额
+	TODAYCLOSEQTY          SFLOAT64 `json:"todaycloseqty"  xorm:"TODAYCLOSEQTY"`                   // 今平仓量
+	TODAYCLOSEAMOUNT       float64  `json:"todaycloseamount"  xorm:"TODAYCLOSEAMOUNT"`             // 今平仓额
+	HOLDQTY                float64  `json:"holdqty"  xorm:"HOLDQTY"`                               // 期末持仓量
+	OPENAMOUNT             float64  `json:"openamount"  xorm:"OPENAMOUNT"`                         // 期末开仓额
+	HOLDAMOUNT             float64  `json:"holdamount"  xorm:"HOLDAMOUNT"`                         // 期末持仓额
+	RECKONPRICE            float64  `json:"reckonprice"  xorm:"RECKONPRICE"`                       // 结算价
+	RECKONHOLDAMOUNT       float64  `json:"reckonholdamount"  xorm:"RECKONHOLDAMOUNT"`             // 结算持仓额
+	CHARGE                 float64  `json:"charge"  xorm:"CHARGE"`                                 // 手续费
+	CLOSEPL                float64  `json:"closepl"  xorm:"CLOSEPL"`                               // 平仓损益
+	RECKONPL               float64  `json:"reckonpl"  xorm:"RECKONPL"`                             // 结算损益
+	LASTPRICE              float64  `json:"lastprice"  xorm:"LASTPRICE"`                           // 最新价
+	LASTHOLDAMOUNT         float64  `json:"lastholdamount"  xorm:"LASTHOLDAMOUNT"`                 // 当前持仓额
+	FLOATPL                float64  `json:"floatpl"  xorm:"FLOATPL"`                               // 浮动损益
+	GOODSGROUPSPOTQTY      float64  `json:"goodsgroupspotqty"  xorm:"GOODSGROUPSPOTQTY"`           // 交易品种期末量 (= 期末持仓量 * 合约乘数)
+	TODAYGOODSGROUPSPOTQTY float64  `json:"todaygoodsgroupspotqty"  xorm:"TODAYGOODSGROUPSPOTQTY"` // 交易品种变化量 (=(期末持仓量 - 期初持仓量)* 合约乘数)
+	MIDDLEGOODSQTY         float64  `json:"middlegoodsqty"  xorm:"MIDDLEGOODSQTY"`                 // 套保品种期末量 (=交易品种期末量 * 期货品种折算系数)
+	TODAYMIDDLEGOODSQTY    float64  `json:"todaymiddlegoodsqty"  xorm:"TODAYMIDDLEGOODSQTY"`       // 套保品种变化量 (= 交易品种变化量*期货品种折算系数)
+	RECKONPL2              float64  `json:"reckonpl2"  xorm:"RECKONPL2"`                           // 结算逐笔盈亏
+	OUTERGROUPCODE         string   `json:"outergroupcode"  xorm:"'OUTERGROUPCODE'"`               // 交易品种代码
+	GOODSGROUPNAME         string   `json:"goodsgroupname"  xorm:"'GOODSGROUPNAME'"`               // 交易品种名称
+	GOODSCODE              string   `json:"goodscode"  xorm:"'GOODSCODE'"`                         // 交易合约代码
+	GOODSNAME              string   `json:"goodsname"  xorm:"'GOODSNAME'"`                         // 交易合约名称
+	GOODUNITID             int32    `json:"goodunitid"  xorm:"'GOODUNITID'"`                       // 交易合约单位id
+	AGREEUNIT              float64  `json:"agreeunit"  xorm:"'AGREEUNIT'"`                         // 商品合约单位
+	QTYDECIMALPLACE        int      `json:"qtydecimalplace"  xorm:"'QTYDECIMALPLACE'"`             // 成交量小数位
+	ACCOUNTNAME            string   `json:"accountname"  xorm:"'ACCOUNTNAME'"`                     // 交易账号名称
+	MIDDLEGOODSID          int32    `json:"middlegoodsid"  xorm:"'MIDDLEGOODSID'"`                 // 套保品种id
+	MIDDLEGOODSNAME        string   `json:"middlegoodsname"  xorm:"'MIDDLEGOODSNAME'"`             // 套保商品名称
+	MIDDLEGOODSCODE        string   `json:"middlgoodscode"  xorm:"'MIDDLEGOODSCODE'"`              // 套保商品代码
+
+	OPENAVGPRICE  SFLOAT64 `json:"openavgprice"`  // 开仓均价
+	CLOSEAVGPRICE SFLOAT64 `json:"closeavgprice"` // 平仓均价
+	ENUMDICNAME   string   `json:"enumdicname"`   // 单位名称
+	CURRENCYNAME  string   `json:"currencyname"`  // 币种名称
+	QueryType     int32    `json:"-"`             // 查询类型 1-报表 2-报表明细
+	BeginDate     string   `json:"begindate"`     // 开始交易日
+	EndDate       string   `json:"enddate"`       // 结束交易日
 }
 
 func (r *Ermcp3TaFutuReDataReport) calc() {
-	if r.TODAYOPENQTY != 0 {
-		r.OPENAVGPRICE = r.TODAYOPENAMOUNT / r.TODAYOPENQTY
+	if r.TODAYOPENQTY != 0 && r.AGREEUNIT > 1e-8 {
+		r.TODAYOPENQTY.Power10(r.QTYDECIMALPLACE * -1)
+		r.OPENAVGPRICE = SFLOAT64(r.TODAYOPENAMOUNT / r.TODAYOPENQTY.Float64() / r.AGREEUNIT)
+		r.OPENAVGPRICE.Round(3)
 	}
 
-	if r.TODAYCLOSEQTY != 0 {
-		r.CLOSEAVGPRICE = r.TODAYCLOSEAMOUNT / r.TODAYCLOSEQTY
+	if r.TODAYCLOSEQTY != 0 && r.AGREEUNIT > 1e-8 {
+		r.TODAYCLOSEQTY.Power10(r.QTYDECIMALPLACE * -1)
+		r.CLOSEAVGPRICE = SFLOAT64(r.TODAYCLOSEAMOUNT / r.TODAYCLOSEQTY.Float64() / r.AGREEUNIT)
+		r.CLOSEAVGPRICE.Round(3)
 	}
 	r.ENUMDICNAME = mtpcache.GetEnumDicitemName(r.GOODUNITID)
 	r.CURRENCYNAME = mtpcache.GetCurrencyName(r.CURRENCYID)
@@ -2010,6 +2016,8 @@ func (r *Ermcp3TaFutuReDataReport) buildSqlReckon(userType int32) string {
 		"       g.goodscode," +
 		"       g.goodsname," +
 		"       g.goodunitid," +
+		"       g.agreeunit," +
+		"       g.qtydecimalplace," +
 		"       mg.middlegoodsid," +
 		"       mg.middlegoodscode," +
 		"       mg.middlegoodsname" +
@@ -2083,6 +2091,8 @@ func (r *Ermcp3TaFutuReDataReport) buildSqlReckonDetail(userType int32) string {
 		"       g.goodscode," +
 		"       g.goodsname," +
 		"       g.goodunitid," +
+		"       g.agreeunit," +
+		"       g.qtydecimalplace," +
 		"       ta.accountname," +
 		"       mg.middlegoodsid," +
 		"       mg.middlegoodscode," +
@@ -2165,6 +2175,8 @@ func (r *Ermcp3TaFutuReDataReport) buildSqlReport(userType int32) string {
 		"       g.goodscode," +
 		"       g.goodsname," +
 		"       g.goodunitid," +
+		"       g.agreeunit," +
+		"       g.qtydecimalplace," +
 		"       mg.middlegoodsid," +
 		"       mg.middlegoodscode," +
 		"       mg.middlegoodsname" +

+ 27 - 0
models/ermcpCommon.go

@@ -10,6 +10,7 @@ package models
 import (
 	"encoding/hex"
 	"fmt"
+	"github.com/shopspring/decimal"
 	"math"
 	"mtp2_if/utils"
 )
@@ -132,3 +133,29 @@ func (r *SFLOAT64) MarshalJSON() ([]byte, error) {
 	sData := fmt.Sprintf("%g", *r)
 	return []byte(sData), nil
 }
+
+// Float64
+func (r *SFLOAT64) Float64() float64 {
+	return float64(*r)
+}
+
+// Set
+func (r *SFLOAT64) Set(v float64) {
+	*r = SFLOAT64(v)
+}
+
+// Round
+func (r *SFLOAT64) Round(places int32) *SFLOAT64 {
+	d, ok := decimal.NewFromFloat(float64(*r)).Round(places).Float64()
+	if ok {
+		*r = SFLOAT64(d)
+		return r
+	}
+	return r
+}
+
+// Power10
+func (r *SFLOAT64) Power10(n int) *SFLOAT64 {
+	*r = *r * SFLOAT64(math.Pow10(n))
+	return r
+}