quote.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package models
  2. import (
  3. "errors"
  4. "fmt"
  5. "mtp2_if/db"
  6. "time"
  7. "gopkg.in/mgo.v2/bson"
  8. )
  9. // CycleType 周期类型
  10. type CycleType int
  11. const (
  12. // CycleTypeSecond 周期类型 - 秒
  13. CycleTypeSecond CycleType = 0
  14. // CycleTypeMinutes1 周期类型 - 1分钟
  15. CycleTypeMinutes1 CycleType = 1
  16. // CycleTypeMinutes5 周期类型 - 5分钟
  17. CycleTypeMinutes5 CycleType = 2
  18. // CycleTypeMinutes30 周期类型 - 30分钟
  19. CycleTypeMinutes30 CycleType = 3
  20. // CycleTypeMinutes60 周期类型 - 60分钟
  21. CycleTypeMinutes60 CycleType = 4
  22. // CycleTypeMinutes120 周期类型 - 2小时
  23. CycleTypeMinutes120 CycleType = 120
  24. // CycleTypeMinutes240 周期类型 - 4小时
  25. CycleTypeMinutes240 CycleType = 240
  26. // CycleTypeMinutesDay 周期类型 - 日线
  27. CycleTypeMinutesDay CycleType = 11
  28. // CycleTypeWeek 周期类型 - 周线
  29. CycleTypeWeek CycleType = 12
  30. // CycleTypeYear 周期类型 - 年线
  31. CycleTypeYear CycleType = 14
  32. // CycleTypeTik 周期类型 - Tik
  33. CycleTypeTik CycleType = 10
  34. )
  35. // CycleData MongoDB中历史数据模型
  36. type CycleData struct {
  37. ID bson.ObjectId `json:"-" bson:"_id"` // id
  38. GC string `bson:"GC"` // 商品代码
  39. ST int `json:"-" bson:"ST"` // 时间戳
  40. SST string `bson:"SST"` // 时间文本
  41. Open int `bson:"Open"` // 开盘价
  42. High int `bson:"High"` // 最高价
  43. Low int `bson:"Low"` // 最低价
  44. Close int `bson:"Close"` // 收盘价
  45. TV int `bson:"TV"` // 总量
  46. TT int `bson:"TT"` // 总金额
  47. HV int `bson:"HV"` // 持仓量
  48. SP int `bson:"SP"` // 结算价,日线周期(包括)以上才有
  49. FI bool `json:"FI"` // 是否补充数据
  50. }
  51. // Quoteday 行情盘面
  52. type Quoteday struct {
  53. Id int64 `xorm:"pk autoincr BIGINT(20)"`
  54. Exchangedate int64 `xorm:"not null BIGINT(20)"` // 交易日
  55. Goodscode string `xorm:"not null unique CHAR(10)"` // 商品代码
  56. Exchangecode int `xorm:"INT(11)"` // 交易所代码
  57. Preclose int64 `xorm:"default 0 BIGINT(20)"` // 昨收
  58. Opentime int64 `xorm:"BIGINT(20)"` // 开盘时间
  59. Opened int64 `xorm:"not null default 0 BIGINT(20)"` // 开盘价
  60. Highest int64 `xorm:"not null default 0 BIGINT(20)"` // 最高价
  61. Lowest int64 `xorm:"not null default 0 BIGINT(20)"` // 最低价
  62. Lasttime string `xorm:"VARCHAR(20)"` // 行情时间(只有现价变化行情时间才变化)
  63. Utclasttime int64 `xorm:"not null BIGINT(20)"` // utc的行情时间
  64. Last int64 `xorm:"not null BIGINT(20)"` // 最新价
  65. Lastvolume int64 `xorm:"default 0 BIGINT(20)"` // 最新成交量
  66. Lastturnover int64 `xorm:"default 0 BIGINT(20)"` // 最新成交金额
  67. Totalbidvolume int64 `xorm:"default 0 BIGINT(20)"` // 外盘
  68. Totalaskvolume int64 `xorm:"default 0 BIGINT(20)"` // 内盘
  69. Totalvolume int64 `xorm:"default 0 BIGINT(20)"` // 总量
  70. Totalturnover int64 `xorm:"default 0 BIGINT(20)"` // 总金额
  71. Bid int64 `xorm:"default 0 BIGINT(20)"` // 买1
  72. Bid2 int64 `xorm:"default 0 BIGINT(20)"` // 买2
  73. Bid3 int64 `xorm:"default 0 BIGINT(20)"` // 买3
  74. Bid4 int64 `xorm:"default 0 BIGINT(20)"` // 买4
  75. Bid5 int64 `xorm:"default 0 BIGINT(20)"` // 买5
  76. Bidvolume int64 `xorm:"default 0 BIGINT(20)"` // 买量1
  77. Bidvolume2 int64 `xorm:"default 0 BIGINT(20)"` // 买量2
  78. Bidvolume3 int64 `xorm:"default 0 BIGINT(20)"` // 买量3
  79. Bidvolume4 int64 `xorm:"default 0 BIGINT(20)"` // 买量4
  80. Bidvolume5 int64 `xorm:"default 0 BIGINT(20)"` // 买量5
  81. Ask int64 `xorm:"default 0 BIGINT(20)"` // 卖1
  82. Ask2 int64 `xorm:"default 0 BIGINT(20)"` // 卖2
  83. Ask3 int64 `xorm:"default 0 BIGINT(20)"` // 卖3
  84. Ask4 int64 `xorm:"default 0 BIGINT(20)"` // 卖4
  85. Ask5 int64 `xorm:"default 0 BIGINT(20)"` // 卖5
  86. Askvolume int64 `xorm:"default 0 BIGINT(20)"` // 卖量1
  87. Askvolume2 int64 `xorm:"default 0 BIGINT(20)"` // 卖量2
  88. Askvolume3 int64 `xorm:"default 0 BIGINT(20)"` // 卖量3
  89. Askvolume4 int64 `xorm:"default 0 BIGINT(20)"` // 卖量4
  90. Askvolume5 int64 `xorm:"default 0 BIGINT(20)"` // 卖量5
  91. Presettle int64 `xorm:"default 0 BIGINT(20)"` // 昨结价
  92. Settle int64 `xorm:"default 0 BIGINT(20)"` // 结算价
  93. Preholdvolume int64 `xorm:"default 0 BIGINT(20)"` // 昨持仓
  94. Holdvolume int64 `xorm:"default 0 BIGINT(20)"` // 持仓
  95. Averageprice int64 `xorm:"default 0 BIGINT(20)"` // 均价
  96. Orderid int64 `xorm:"default 0 BIGINT(20)"` // 序号
  97. Limitup int64 `xorm:"default 0 BIGINT(20)"` // 涨停价
  98. Limitdown int64 `xorm:"default 0 BIGINT(20)"` // 跌停价
  99. Inventory int64 `xorm:"default 0 BIGINT(20)"` // 库存
  100. Holdincrement int64 `xorm:"default 0 BIGINT(20)"` // 单笔持仓
  101. Iscleared int `xorm:"INT(11)"` // 是否清盘标志
  102. Issettled int `xorm:"INT(11)"` // 是否结算标志
  103. Bidqueueinfo string `xorm:"VARCHAR(2000)"` // 大利市买港股用
  104. Askqueueinfo string `xorm:"VARCHAR(2000)"` // 大利市卖港股用
  105. Bidorderid int64 `xorm:"BIGINT(20)"` // 买单号1
  106. Bidorderid2 int64 `xorm:"BIGINT(20)"` // 买单号2
  107. Bidorderid3 int64 `xorm:"BIGINT(20)"` // 买单号3
  108. Bidorderid4 int64 `xorm:"BIGINT(20)"` // 买单号4
  109. Bidorderid5 int64 `xorm:"BIGINT(20)"` // 买单号5
  110. Askorderid int64 `xorm:"BIGINT(20)"` // 卖单号1
  111. Askorderid2 int64 `xorm:"BIGINT(20)"` // 卖单号2
  112. Askorderid3 int64 `xorm:"BIGINT(20)"` // 卖单号3
  113. Askorderid4 int64 `xorm:"BIGINT(20)"` // 卖单号4
  114. Askorderid5 int64 `xorm:"BIGINT(20)"` // 卖单号5
  115. Lastlot int64 `xorm:"BIGINT(20)"` // 最新成交手数
  116. Totallot int64 `xorm:"BIGINT(20)"` // 总手数
  117. Strikeprice int64 `xorm:"BIGINT(20)"` // 发行价
  118. Cleartime int64 `xorm:"BIGINT(20)"` // 清盘时间
  119. Calloptionpremiums int64 `xorm:"default 0 BIGINT(20)"` // 认购期权1
  120. Calloptionpremiums2 int64 `xorm:"default 0 BIGINT(20)"` // 认购期权2
  121. Calloptionpremiums3 int64 `xorm:"default 0 BIGINT(20)"` // 认购期权3
  122. Calloptionpremiums4 int64 `xorm:"default 0 BIGINT(20)"` // 认购期权4
  123. Calloptionpremiums5 int64 `xorm:"default 0 BIGINT(20)"` // 认购期权5
  124. Putoptionpremiums int64 `xorm:"default 0 BIGINT(20)"` // 认沽期权1
  125. Putoptionpremiums2 int64 `xorm:"default 0 BIGINT(20)"` // 认沽期权2
  126. Putoptionpremiums3 int64 `xorm:"default 0 BIGINT(20)"` // 认沽期权3
  127. Putoptionpremiums4 int64 `xorm:"default 0 BIGINT(20)"` // 认沽期权4
  128. Putoptionpremiums5 int64 `xorm:"default 0 BIGINT(20)"` // 认沽期权5
  129. Nontotalvolume int64 `xorm:"default 0 BIGINT(20)"` // 非交易总量
  130. Nontotalholdervolume int64 `xorm:"default 0 BIGINT(20)"` // 非交易持仓量
  131. Nontotalturnover int64 `xorm:"default 0 BIGINT(20)"` // 非交易总金额
  132. Nontotallot int64 `xorm:"default 0 BIGINT(20)"` // 非交易总手数
  133. Publictradetype string `xorm:"VARCHAR(2)"` // 公共交易标志类型 港股专用
  134. Iep int64 `xorm:"default 0 BIGINT(20)"` // 平衡价 港股专用
  135. Iev int64 `xorm:"default 0 BIGINT(20)"` // 平衡量 港股专用
  136. Grepmarketprice int64 `xorm:"default 0 BIGINT(20)"` // 暗盘价 港股专用
  137. Bid6 int64 `xorm:"default 0 BIGINT(20)"` // 买6
  138. Bid7 int64 `xorm:"default 0 BIGINT(20)"` // 买7
  139. Bid8 int64 `xorm:"default 0 BIGINT(20)"` // 买8
  140. Bid9 int64 `xorm:"default 0 BIGINT(20)"` // 买9
  141. Bid10 int64 `xorm:"default 0 BIGINT(20)"` // 买10
  142. Bidvolume6 int64 `xorm:"default 0 BIGINT(20)"` // 买量6
  143. Bidvolume7 int64 `xorm:"default 0 BIGINT(20)"` // 买量7
  144. Bidvolume8 int64 `xorm:"default 0 BIGINT(20)"` // 买量8
  145. Bidvolume9 int64 `xorm:"default 0 BIGINT(20)"` // 买量9
  146. Bidvolume10 int64 `xorm:"default 0 BIGINT(20)"` // 买量10
  147. Ask6 int64 `xorm:"default 0 BIGINT(20)"` // 卖6
  148. Ask7 int64 `xorm:"default 0 BIGINT(20)"` // 卖7
  149. Ask8 int64 `xorm:"default 0 BIGINT(20)"` // 卖8
  150. Ask9 int64 `xorm:"default 0 BIGINT(20)"` // 卖9
  151. Ask10 int64 `xorm:"default 0 BIGINT(20)"` // 卖10
  152. Askvolume6 int64 `xorm:"default 0 BIGINT(20)"` // 卖量6
  153. Askvolume7 int64 `xorm:"default 0 BIGINT(20)"` // 卖量7
  154. Askvolume8 int64 `xorm:"default 0 BIGINT(20)"` // 卖量8
  155. Askvolume9 int64 `xorm:"default 0 BIGINT(20)"` // 卖量9
  156. Askvolume10 int64 `xorm:"default 0 BIGINT(20)"` // 卖量10
  157. Bidordervolume int64 `xorm:"default 0 BIGINT(20)"` // 买单量1
  158. Bidordervolume2 int64 `xorm:"default 0 BIGINT(20)"` // 买单量2
  159. Bidordervolume3 int64 `xorm:"default 0 BIGINT(20)"` // 买单量3
  160. Bidordervolume4 int64 `xorm:"default 0 BIGINT(20)"` // 买单量4
  161. Bidordervolume5 int64 `xorm:"default 0 BIGINT(20)"` // 买单量5
  162. Bidordervolume6 int64 `xorm:"default 0 BIGINT(20)"` // 买单量6
  163. Bidordervolume7 int64 `xorm:"default 0 BIGINT(20)"` // 买单量7
  164. Bidordervolume8 int64 `xorm:"default 0 BIGINT(20)"` // 买单量8
  165. Bidordervolume9 int64 `xorm:"default 0 BIGINT(20)"` // 买单量9
  166. Bidordervolume10 int64 `xorm:"default 0 BIGINT(20)"` // 买单量10
  167. Askordervolume int64 `xorm:"default 0 BIGINT(20)"` // 卖单量1
  168. Askordervolume2 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量2
  169. Askordervolume3 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量3
  170. Askordervolume4 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量4
  171. Askordervolume5 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量5
  172. Askordervolume6 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量6
  173. Askordervolume7 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量7
  174. Askordervolume8 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量8
  175. Askordervolume9 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量9
  176. Askordervolume10 int64 `xorm:"default 0 BIGINT(20)"` // 卖单量10
  177. }
  178. // TableName is Quoteday
  179. func (*Quoteday) TableName() string {
  180. return "quoteday"
  181. }
  182. // GetHistoryCycleDatas 获取历史数据
  183. // 参数 cycleType CycleType 周期类型
  184. // 参数 goodsCode string 商品代码
  185. // 参数 startTime time.Time 开始时间(闭区间)
  186. // 参数 endTime time.Time 结束时间(闭区间)
  187. // 参数 count int 条数
  188. // 参数 isAscForST bool 是否按时间顺序排序,默认为时间倒序排序
  189. // 返回值 []CycleData 历史数据
  190. // 返回值 error 错误
  191. func GetHistoryCycleDatas(cycleType CycleType, goodsCode string, startTime, endTime *time.Time, count int, isAscForST bool) ([]CycleData, error) {
  192. db := db.GetMongoDB()
  193. // 获取目标Collection
  194. collection := "mincycle"
  195. switch cycleType {
  196. case CycleTypeTik:
  197. collection = "quotetik"
  198. case CycleTypeMinutes1:
  199. collection = "mincycle"
  200. case CycleTypeMinutes5:
  201. collection = "min5cycle"
  202. case CycleTypeMinutes30:
  203. collection = "min30cycle"
  204. case CycleTypeMinutes60:
  205. collection = "min60cycle"
  206. case CycleTypeMinutes240:
  207. collection = "min240cycle"
  208. case CycleTypeMinutesDay:
  209. collection = "daycycle"
  210. case CycleTypeWeek:
  211. collection = "weekcycle"
  212. case CycleTypeYear:
  213. collection = "yearcycle"
  214. default:
  215. return nil, errors.New("不支持的周期类型")
  216. }
  217. c := db.C(collection)
  218. // 按时间排序
  219. sort := "-ST"
  220. if isAscForST {
  221. sort = "ST"
  222. }
  223. // 查询数据
  224. var cycleDatas []CycleData
  225. m := bson.M{"GC": goodsCode}
  226. if startTime != nil && endTime == nil {
  227. m["ST"] = bson.M{"$gte": startTime.Unix()}
  228. } else if startTime == nil && endTime != nil {
  229. m["ST"] = bson.M{"$lte": endTime.Unix()}
  230. } else if startTime != nil && endTime != nil {
  231. m["ST"] = bson.M{"$gte": startTime.Unix(), "$lte": endTime.Unix()}
  232. }
  233. query := c.Find(m)
  234. if count > 0 {
  235. query = query.Limit(count)
  236. }
  237. if err := query.Sort(sort).All(&cycleDatas); err != nil {
  238. return nil, err
  239. }
  240. return cycleDatas, nil
  241. }
  242. // GetQuoteDays 获取目标商品的盘面数据
  243. // 参数 goodsCodes string 商品代码字串,以“,”分隔
  244. // 返回 []Quoteday 盘面数据
  245. // 返回 error error
  246. func GetQuoteDays(goodsCodes string) ([]Quoteday, error) {
  247. engine := db.GetMySQLEngine()
  248. datas := make([]Quoteday, 0)
  249. if err := engine.Where(fmt.Sprintf("goodscode in (%s)", goodsCodes)).Find(&datas); err != nil {
  250. return nil, err
  251. }
  252. return datas, nil
  253. }