Compare commits

...

3 Commits

Author SHA1 Message Date
injoyai
37eb34beaa 优化 2025-10-14 09:23:45 +08:00
钱纯净
7bf4839310 修改GetHistoryTradeAll为GetHistoryTradeDay,增加GetHistoryTradeFull,获取上市至今的分时成交 2025-10-13 20:04:47 +08:00
钱纯净
cbf56d936d 优化Klines的Kline和Merge 2025-10-13 19:53:19 +08:00
5 changed files with 112 additions and 32 deletions

View File

@@ -422,7 +422,7 @@ func (this *Client) GetHistoryTrade(date, code string, start, count uint16) (*pr
// GetHistoryMinuteTrade 获取历史分时交易 // GetHistoryMinuteTrade 获取历史分时交易
// 只能获取昨天及之前的数据,服务器最多返回2000条,count-start<=2000,如果日期输入错误,则返回0 // 只能获取昨天及之前的数据,服务器最多返回2000条,count-start<=2000,如果日期输入错误,则返回0
// 历史数据sz000001在20241116只能查到21111112,13年差几天,3141天,或者其他规则 // 历史数据只能查到20000609
func (this *Client) GetHistoryMinuteTrade(date, code string, start, count uint16) (*protocol.TradeResp, error) { func (this *Client) GetHistoryMinuteTrade(date, code string, start, count uint16) (*protocol.TradeResp, error) {
code = protocol.AddPrefix(code) code = protocol.AddPrefix(code)
f, err := protocol.MHistoryTrade.Frame(date, code, start, count) f, err := protocol.MHistoryTrade.Frame(date, code, start, count)
@@ -439,13 +439,36 @@ func (this *Client) GetHistoryMinuteTrade(date, code string, start, count uint16
return result.(*protocol.TradeResp), nil return result.(*protocol.TradeResp), nil
} }
func (this *Client) GetHistoryTradeAll(date, code string) (*protocol.TradeResp, error) { // GetHistoryTradeFull 获取上市至今的分时成交
return this.GetHistoryMinuteTradeAll(date, code) func (this *Client) GetHistoryTradeFull(code string) (protocol.Trades, error) {
ls := protocol.Trades(nil)
resp, err := this.GetKlineMonthAll(code)
if err != nil {
return nil, err
}
if len(resp.List) == 0 {
return nil, nil
}
start := time.Date(resp.List[0].Time.Year(), resp.List[0].Time.Month(), 1, 0, 0, 0, 0, resp.List[0].Time.Location())
var res *protocol.TradeResp
for ; start.Before(time.Now()); start = start.Add(time.Hour * 24) {
res, err = this.GetHistoryTradeDay(start.Format("20060102"), code)
if err != nil {
return nil, err
}
ls = append(ls, res.List...)
}
return ls, nil
} }
// GetHistoryMinuteTradeAll 获取历史分时全部交易,通过多次请求来拼接,只能获取昨天及之前的数据 // GetHistoryTradeDay 获取历史某天分时全部交易,通过多次请求来拼接,只能获取昨天及之前的数据
// 历史数据sz000001在20241116只能查到21111112,13年差几天,3141天,或者其他规则 func (this *Client) GetHistoryTradeDay(date, code string) (*protocol.TradeResp, error) {
func (this *Client) GetHistoryMinuteTradeAll(date, code string) (*protocol.TradeResp, error) { return this.GetHistoryMinuteTradeDay(date, code)
}
// GetHistoryMinuteTradeDay 获取历史某天分时全部交易,通过多次请求来拼接,只能获取昨天及之前的数据
// 历史数据只能查到20000609
func (this *Client) GetHistoryMinuteTradeDay(date, code string) (*protocol.TradeResp, error) {
resp := &protocol.TradeResp{} resp := &protocol.TradeResp{}
size := uint16(2000) size := uint16(2000)
for start := uint16(0); ; start += size { for start := uint16(0); ; start += size {

View File

@@ -8,7 +8,7 @@ import (
func main() { func main() {
common.Test(func(c *tdx.Client) { common.Test(func(c *tdx.Client) {
resp, err := c.GetHistoryMinuteTradeAll("20241025", "sz000001") resp, err := c.GetHistoryMinuteTradeDay("20251010", "sh000001")
logs.PanicErr(err) logs.PanicErr(err)
for _, v := range resp.List { for _, v := range resp.List {

View File

@@ -9,7 +9,7 @@ import (
func main() { func main() {
common.Test(func(c *tdx.Client) { common.Test(func(c *tdx.Client) {
resp, err := c.GetHistoryTradeAll("20251010", "sz000001") resp, err := c.GetHistoryTradeDay("20251010", "sz000001")
logs.PanicErr(err) logs.PanicErr(err)
ks := resp.List.Klines() ks := resp.List.Klines()

View File

@@ -56,7 +56,7 @@ func (this *PullTrade) PullYear(ctx context.Context, m *tdx.Manage, year int, co
var resp *protocol.TradeResp var resp *protocol.TradeResp
err = m.Do(func(c *tdx.Client) error { err = m.Do(func(c *tdx.Client) error {
resp, err = c.GetHistoryTradeAll(date, code) resp, err = c.GetHistoryTradeDay(date, code)
return err return err
}) })
if err != nil { if err != nil {

View File

@@ -257,12 +257,16 @@ func (this Klines) Sort() {
sort.Sort(this) sort.Sort(this)
} }
// Kline 计算多个K线,成一个K线 func (this Klines) Kline(t time.Time, last Price) *Kline {
func (this Klines) Kline() *Kline { k := &Kline{
if this == nil { Time: t,
return new(Kline) Open: last,
High: last,
Low: last,
Close: last,
Volume: 0,
Amount: 0,
} }
k := new(Kline)
for i, v := range this { for i, v := range this {
switch i { switch i {
case 0: case 0:
@@ -270,34 +274,87 @@ func (this Klines) Kline() *Kline {
k.High = v.High k.High = v.High
k.Low = v.Low k.Low = v.Low
k.Close = v.Close k.Close = v.Close
case len(this) - 1: default:
if k.Open == 0 {
k.Open = v.Open
}
k.High = conv.Select(k.High < v.High, v.High, k.High)
k.Low = conv.Select(k.Low > v.Low, v.Low, k.Low)
}
k.Close = v.Close k.Close = v.Close
k.Time = v.Time
}
if v.High > k.High {
k.High = v.High
}
if v.Low < k.Low {
k.Low = v.Low
}
k.Volume += v.Volume k.Volume += v.Volume
k.Amount += v.Amount k.Amount += v.Amount
} }
return k return k
} }
// Merge 合并K线,1分钟转成5,15,30分钟等 // Merge 合并成其他类型的K线
func (this Klines) Merge(n int) Klines { func (this Klines) Merge(n int) Klines {
if this == nil { if n <= 1 {
return nil return this
} }
ks := []*Kline(nil) ks := Klines(nil)
for i := 0; i < len(this); i += n { ls := Klines(nil)
if i+n > len(this) { for i := 0; ; i++ {
ks = append(ks, this[i:].Kline()) if len(this) <= i*n {
break
}
if len(this) < (i+1)*n {
ls = this[i*n:]
} else { } else {
ks = append(ks, this[i:i+n].Kline()) ls = this[i*n : (i+1)*n]
} }
if len(ls) == 0 {
break
}
last := ls[len(ls)-1]
k := ls.Kline(last.Time, ls[0].Open)
ks = append(ks, k)
} }
return ks return ks
} }
//// Kline 计算多个K线,成一个K线
//func (this Klines) Kline() *Kline {
// if this == nil {
// return new(Kline)
// }
// k := new(Kline)
// for i, v := range this {
// switch i {
// case 0:
// k.Open = v.Open
// k.High = v.High
// k.Low = v.Low
// k.Close = v.Close
// case len(this) - 1:
// k.Close = v.Close
// k.Time = v.Time
// }
// if v.High > k.High {
// k.High = v.High
// }
// if v.Low < k.Low {
// k.Low = v.Low
// }
// k.Volume += v.Volume
// k.Amount += v.Amount
// }
// return k
//}
//// Merge 合并K线,1分钟转成5,15,30分钟等
//func (this Klines) Merge(n int) Klines {
// if this == nil {
// return nil
// }
// ks := []*Kline(nil)
// for i := 0; i < len(this); i += n {
// if i+n > len(this) {
// ks = append(ks, this[i:].Kline())
// } else {
// ks = append(ks, this[i:i+n].Kline())
// }
// }
// return ks
//}