Files
injoyai-tdx/extend/pull-trade.go

169 lines
3.5 KiB
Go

package extend
import (
"context"
"github.com/injoyai/conv"
"github.com/injoyai/logs"
"github.com/injoyai/tdx"
"github.com/injoyai/tdx/protocol"
"path/filepath"
"time"
)
func NewPullTrade(dir string) *PullTrade {
return &PullTrade{
Dir: dir,
}
}
type PullTrade struct {
Dir string
}
func (this *PullTrade) Pull(ctx context.Context, m *tdx.Manage, code string) error {
for i := 2000; i <= time.Now().Year(); i++ {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
if err := this.PullYear(ctx, m, i, code); err != nil {
return err
}
}
return nil
}
func (this *PullTrade) PullYear(ctx context.Context, m *tdx.Manage, year int, code string) (err error) {
tss := protocol.Trades{}
kss1 := protocol.Klines(nil)
kss5 := protocol.Klines(nil)
kss15 := protocol.Klines(nil)
kss30 := protocol.Klines(nil)
kss60 := protocol.Klines(nil)
m.Workday.RangeYear(year, func(t time.Time) bool {
select {
case <-ctx.Done():
err = ctx.Err()
return false
default:
}
date := t.Format("20060102")
var resp *protocol.TradeResp
err = m.Do(func(c *tdx.Client) error {
resp, err = c.GetHistoryTradeAll(date, code)
return err
})
if err != nil {
logs.Err(err)
return false
}
tss = append(tss, resp.List...)
//转成分时K线
ks := resp.List.Klines()
kss1 = append(kss1, ks...)
kss5 = append(kss5, ks.Merge(5)...)
kss15 = append(kss5, ks.Merge(15)...)
kss30 = append(kss5, ks.Merge(30)...)
kss60 = append(kss5, ks.Merge(60)...)
return true
})
if err != nil {
return
}
filename := filepath.Join(this.Dir, "分时成交", code+"-"+conv.String(year)+".csv")
filename1 := filepath.Join(this.Dir, "1分钟", code+"-"+conv.String(year)+".csv")
filename5 := filepath.Join(this.Dir, "5分钟", code+"-"+conv.String(year)+".csv")
filename15 := filepath.Join(this.Dir, "15分钟", code+"-"+conv.String(year)+".csv")
filename30 := filepath.Join(this.Dir, "30分钟", code+"-"+conv.String(year)+".csv")
filename60 := filepath.Join(this.Dir, "60分钟", code+"-"+conv.String(year)+".csv")
name := m.Codes.GetName(code)
err = TradeToCsv(filename, tss)
if err != nil {
return err
}
err = KlinesToCsv(filename1, code, name, kss1)
if err != nil {
return err
}
err = KlinesToCsv(filename5, code, name, kss5)
if err != nil {
return err
}
err = KlinesToCsv(filename15, code, name, kss15)
if err != nil {
return err
}
err = KlinesToCsv(filename30, code, name, kss30)
if err != nil {
return err
}
err = KlinesToCsv(filename60, code, name, kss60)
if err != nil {
return err
}
return nil
}
func KlinesToCsv(filename string, code, name string, ks protocol.Klines) error {
data := [][]any{{"日期", "时间", "代码", "名称", "开盘", "最高", "最低", "收盘", "总手", "金额"}}
for _, v := range ks {
data = append(data, []any{
v.Time.Format("20060102"),
v.Time.Format("15:04"),
code,
name,
v.Open.Float64(),
v.High.Float64(),
v.Low.Float64(),
v.Close.Float64(),
v.Volume,
v.Amount.Float64(),
})
}
buf, err := toCsv(data)
if err != nil {
return err
}
return newFile(filename, buf)
}
func TradeToCsv(filename string, ts protocol.Trades) error {
data := [][]any{{"日期", "时间", "价格", "成交量(手)", "成交额", "方向(0买,1卖)"}}
for _, v := range ts {
data = append(data, []any{
v.Time.Format(time.DateOnly),
v.Time.Format("15:04"),
v.Price.Float64(),
v.Volume,
v.Amount().Float64(),
v.Status,
})
}
buf, err := toCsv(data)
if err != nil {
return err
}
return newFile(filename, buf)
}