restruct
This commit is contained in:
parent
3f2c113e88
commit
7ce7deba92
@ -6,6 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/phyer/core/internal/core"
|
||||||
logrus "github.com/sirupsen/logrus"
|
logrus "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -21,11 +22,11 @@ type SegmentItem struct {
|
|||||||
PolarQuadrant string // shangxian,manyue,xiaxian,xinyue, 分别对应圆周的四个阶段。
|
PolarQuadrant string // shangxian,manyue,xiaxian,xinyue, 分别对应圆周的四个阶段。
|
||||||
LastUpdate int64
|
LastUpdate int64
|
||||||
ExtremumPixels *Extremum // 极值 是两个pixel对象
|
ExtremumPixels *Extremum // 极值 是两个pixel对象
|
||||||
FirstPixel *Pixel // 起始值,最后的pixel对象
|
FirstPixel *core.Pixel // 起始值,最后的pixel对象
|
||||||
LastPixel *Pixel // 最后值,最后的maX pixel对象
|
LastPixel *core.Pixel // 最后值,最后的maX pixel对象
|
||||||
LastCandle *Pixel // 最后值,最后的Candle的pixel对象
|
LastCandle *core.Pixel // 最后值,最后的Candle的pixel对象
|
||||||
LastMa7 *Pixel // 最后值,最后的Ma7的pixel对象
|
LastMa7 *core.Pixel // 最后值,最后的Ma7的pixel对象
|
||||||
LastMa30 *Pixel // 最后值,最后的Ma30的pixel对象
|
LastMa30 *core.Pixel // 最后值,最后的Ma30的pixel对象
|
||||||
VerticalElevation float64 // 仰角, Interval范围内线段的仰角
|
VerticalElevation float64 // 仰角, Interval范围内线段的仰角
|
||||||
StartIdx int // 开始的坐标
|
StartIdx int // 开始的坐标
|
||||||
EndIdx int // 结束的坐标
|
EndIdx int // 结束的坐标
|
||||||
@ -52,8 +53,8 @@ const XIAOXIAXIANYUE = "xiaoxiaxianyue"
|
|||||||
const tinySeg = 0.1
|
const tinySeg = 0.1
|
||||||
|
|
||||||
type Extremum struct {
|
type Extremum struct {
|
||||||
Max *Pixel
|
Max *core.Pixel
|
||||||
Min *Pixel
|
Min *core.Pixel
|
||||||
}
|
}
|
||||||
|
|
||||||
func CalPolar(e0 float64, e1 float64, e2 float64) string {
|
func CalPolar(e0 float64, e1 float64, e2 float64) string {
|
||||||
@ -258,8 +259,8 @@ func (seg *SegmentItem) Process(cr *Core) {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (srs *Series) MakeSegment(cr *Core, start int, end int, subArys [][]int, ctype string) *SegmentItem {
|
func (srs *Series) MakeSegment(cr *core.Core, start int, end int, subArys [][]int, ctype string) *SegmentItem {
|
||||||
list := []*Pixel{}
|
list := []*core.Pixel{}
|
||||||
if ctype == "ma7" {
|
if ctype == "ma7" {
|
||||||
list = srs.Ma7Series.List
|
list = srs.Ma7Series.List
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-redis/redis"
|
"github.com/go-redis/redis"
|
||||||
|
"github.com/phyer/core/internal/core"
|
||||||
|
"github.com/phyer/core/internal/models"
|
||||||
|
"github.com/phyer/core/internal/utils"
|
||||||
logrus "github.com/sirupsen/logrus"
|
logrus "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -21,10 +24,10 @@ type Series struct {
|
|||||||
Scale float64 `json:"scale,number"`
|
Scale float64 `json:"scale,number"`
|
||||||
LastUpdateTime int64 `json:"lastUpdateTime,number"`
|
LastUpdateTime int64 `json:"lastUpdateTime,number"`
|
||||||
UpdateNickName string
|
UpdateNickName string
|
||||||
LastCandle1m Candle `json:"lastCandle1m"`
|
LastCandle1m *models.Candle `json:"lastCandle1m"`
|
||||||
CandleSeries *PixelList `json:"candleSerie"`
|
CandleSeries *core.PixelList `json:"candleSerie"`
|
||||||
Ma7Series *PixelList `json:"ma7Serie"`
|
Ma7Series *core.PixelList `json:"ma7Serie"`
|
||||||
Ma30Series *PixelList `json:"ma30Serie"`
|
Ma30Series *core.PixelList `json:"ma30Serie"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SeriesInfo struct {
|
type SeriesInfo struct {
|
||||||
@ -64,7 +67,7 @@ type VerticalReportItem struct {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// 根据instId 和period 从 PlateMap里拿到coaster,创建对应的 series,
|
// 根据instId 和period 从 PlateMap里拿到coaster,创建对应的 series,
|
||||||
func (sr *Series) Refresh(cr *Core) error {
|
func (sr *Series) Refresh(cr *core.Core) error {
|
||||||
curCo, err := cr.GetCoasterFromPlate(sr.InstID, sr.Period)
|
curCo, err := cr.GetCoasterFromPlate(sr.InstID, sr.Period)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -101,7 +104,7 @@ func (sr *Series) Refresh(cr *Core) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sr *Series) SetToKey(cr *Core) (string, error) {
|
func (sr *Series) SetToKey(cr *core.Core) (string, error) {
|
||||||
if sr == nil || sr.CandleSeries == nil {
|
if sr == nil || sr.CandleSeries == nil {
|
||||||
return "", errors.New("sr.CandlesSeries == nil")
|
return "", errors.New("sr.CandlesSeries == nil")
|
||||||
}
|
}
|
||||||
@ -122,12 +125,12 @@ func (sr *Series) SetToKey(cr *Core) (string, error) {
|
|||||||
seriesName := sr.InstID + "|" + sr.Period + "|series"
|
seriesName := sr.InstID + "|" + sr.Period + "|series"
|
||||||
res, err := cr.RedisLocalCli.Set(seriesName, string(js), 0).Result()
|
res, err := cr.RedisLocalCli.Set(seriesName, string(js), 0).Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Panic(GetFuncName(), err, " seriesSetToKey1: instId:", sr.InstID, " period: ", sr.Period, " lastUpdate:", sr.LastUpdateTime, " md5:", Md5V(string(js)))
|
logrus.Panic(utils.GetFuncName(), err, " seriesSetToKey1: instId:", sr.InstID, " period: ", sr.Period, " lastUpdate:", sr.LastUpdateTime, " md5:", Md5V(string(js)))
|
||||||
}
|
}
|
||||||
res, err = cr.RedisLocal2Cli.Set(seriesName, string(js), 0).Result()
|
res, err = cr.RedisLocal2Cli.Set(seriesName, string(js), 0).Result()
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
func PrintSerieY(cr *Core, list []redis.Z, period string, count int) {
|
func PrintSerieY(cr *core.Core, list []redis.Z, period string, count int) {
|
||||||
// fmt.Println("PrintSerieY start")
|
// fmt.Println("PrintSerieY start")
|
||||||
env := os.Getenv("GO_ENV")
|
env := os.Getenv("GO_ENV")
|
||||||
isProduction := env == "production"
|
isProduction := env == "production"
|
||||||
@ -180,7 +183,7 @@ func PrintSerieY(cr *Core, list []redis.Z, period string, count int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sei *SeriesInfo) Process(cr *Core) {
|
func (sei *SeriesInfo) Process(cr *core.Core) {
|
||||||
curSe, err := cr.GetPixelSeries(sei.InstID, sei.Period)
|
curSe, err := cr.GetPixelSeries(sei.InstID, sei.Period)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Warn("GetPixelSeries: ", err)
|
logrus.Warn("GetPixelSeries: ", err)
|
||||||
@ -260,7 +263,7 @@ func (sei *SeriesInfo) Process(cr *Core) {
|
|||||||
//-------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------
|
||||||
|
|
||||||
// 拉扯极限相关: 加入seriesY值排行榜, 用于生成拉扯极限
|
// 拉扯极限相关: 加入seriesY值排行榜, 用于生成拉扯极限
|
||||||
func (srs *Series) AddToYSorted(cr *Core) error {
|
func (srs *Series) AddToYSorted(cr *core.Core) error {
|
||||||
setName := "series|YValue|sortedSet|period" + srs.Period
|
setName := "series|YValue|sortedSet|period" + srs.Period
|
||||||
srs.CandleSeries.RecursiveBubbleS(srs.CandleSeries.Count, "asc")
|
srs.CandleSeries.RecursiveBubbleS(srs.CandleSeries.Count, "asc")
|
||||||
length := len(srs.CandleSeries.List)
|
length := len(srs.CandleSeries.List)
|
||||||
@ -290,7 +293,7 @@ func (srs *Series) AddToYSorted(cr *Core) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 垂直极限排名有一定片面性。暂时先不开放。垂直极限推荐最高的,可能是个不太容易📈上来的股票,甚至垃圾股,而且过一会儿可能跌的更多,所以就算使用这个功能,也仅供参考,
|
// 垂直极限排名有一定片面性。暂时先不开放。垂直极限推荐最高的,可能是个不太容易📈上来的股票,甚至垃圾股,而且过一会儿可能跌的更多,所以就算使用这个功能,也仅供参考,
|
||||||
func (vir *VerticalReportItem) AddToVeriticalLimitSorted(cr *Core, srs *Series, period2 string) error {
|
func (vir *VerticalReportItem) AddToVeriticalLimitSorted(cr *core.Core, srs *Series, period2 string) error {
|
||||||
// redis key: verticalReportItem|BTC-USDT|4H-15m|ts:1643002300000
|
// redis key: verticalReportItem|BTC-USDT|4H-15m|ts:1643002300000
|
||||||
// sortedSet: verticalLimit|2D-4H|rank|sortedSet
|
// sortedSet: verticalLimit|2D-4H|rank|sortedSet
|
||||||
|
|
||||||
@ -316,7 +319,7 @@ func (vir *VerticalReportItem) AddToVeriticalLimitSorted(cr *Core, srs *Series,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vri *VerticalReportItem) Report(cr *Core) error {
|
func (vri *VerticalReportItem) Report(cr *core.Core) error {
|
||||||
dd := DingdingMsg{
|
dd := DingdingMsg{
|
||||||
Topic: "垂直极限触发",
|
Topic: "垂直极限触发",
|
||||||
RobotName: "pengpeng",
|
RobotName: "pengpeng",
|
||||||
@ -352,7 +355,7 @@ func (vri *VerticalReportItem) Report(cr *Core) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vri *VerticalReportItem) Show(cr *Core) error {
|
func (vri *VerticalReportItem) Show(cr *core.Core) error {
|
||||||
ary1 := []string{}
|
ary1 := []string{}
|
||||||
str := "``币名: ``" + vri.InstID + "\n"
|
str := "``币名: ``" + vri.InstID + "\n"
|
||||||
str1 := fmt.Sprintln("``基础维度:``", vri.Period)
|
str1 := fmt.Sprintln("``基础维度:``", vri.Period)
|
||||||
@ -375,7 +378,7 @@ func (vri *VerticalReportItem) Show(cr *Core) error {
|
|||||||
|
|
||||||
// TODO 求某个PixelList里两个点之间的仰角,从ridx开始,往lidx的元素画一条直线,的仰角
|
// TODO 求某个PixelList里两个点之间的仰角,从ridx开始,往lidx的元素画一条直线,的仰角
|
||||||
|
|
||||||
func (srs *Series) GetElevation(cr *Core, ctype string, lIdx int, rIdx int) (float64, error) {
|
func (srs *Series) GetElevation(cr *core.Core, ctype string, lIdx int, rIdx int) (float64, error) {
|
||||||
yj := float64(0)
|
yj := float64(0)
|
||||||
switch ctype {
|
switch ctype {
|
||||||
case "candle":
|
case "candle":
|
||||||
@ -396,7 +399,7 @@ func (srs *Series) GetElevation(cr *Core, ctype string, lIdx int, rIdx int) (flo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO 求极值,在某个线段上。一个最大值,一个最小值
|
// TODO 求极值,在某个线段上。一个最大值,一个最小值
|
||||||
func (srs *Series) GetExtremum(cr *Core, lIdx int, rIdx int, ctype string) (*Extremum, error) {
|
func (srs *Series) GetExtremum(cr *core.Core, lIdx int, rIdx int, ctype string) (*Extremum, error) {
|
||||||
ext := Extremum{
|
ext := Extremum{
|
||||||
Max: &Pixel{},
|
Max: &Pixel{},
|
||||||
Min: &Pixel{},
|
Min: &Pixel{},
|
||||||
@ -513,13 +516,13 @@ func (srs *Series) GetExtremum(cr *Core, lIdx int, rIdx int, ctype string) (*Ext
|
|||||||
// 存储在sortedSet里,命名:
|
// 存储在sortedSet里,命名:
|
||||||
// verticalLimit|15m~4H|rank|sortedSet
|
// verticalLimit|15m~4H|rank|sortedSet
|
||||||
// return rank, err
|
// return rank, err
|
||||||
func (vir *VerticalReportItem) MakeVerticalLimit(cr *Core, srs *Series, startIdx int, endIdx int, period2 string) (err error) {
|
func (vir *VerticalReportItem) MakeVerticalLimit(cr *core.Core, srs *Series, startIdx int, endIdx int, period2 string) (err error) {
|
||||||
count := len(srs.CandleSeries.List) - 1
|
count := len(srs.CandleSeries.List) - 1
|
||||||
lastMa30Pixel := srs.Ma30Series.List[count]
|
lastMa30Pixel := srs.Ma30Series.List[count]
|
||||||
// func (srs *Series) GetExtremum(cr *Core, lIdx int, rIdx int, ctype string) (*Extremum, error) {
|
// func (srs *Series) GetExtremum(cr *core.Core, lIdx int, rIdx int, ctype string) (*Extremum, error) {
|
||||||
ext, err := srs.GetExtremum(cr, startIdx, endIdx, "ma30")
|
ext, err := srs.GetExtremum(cr, startIdx, endIdx, "ma30")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Warn(GetFuncName(), ":", err)
|
logrus.Warn(utils.GetFuncName(), ":", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ext.Max.Score < 1.05*lastMa30Pixel.Score {
|
if ext.Max.Score < 1.05*lastMa30Pixel.Score {
|
||||||
@ -533,7 +536,7 @@ func (vir *VerticalReportItem) MakeVerticalLimit(cr *Core, srs *Series, startIdx
|
|||||||
|
|
||||||
yj, err := srs.GetElevation(cr, "ma30", startIdx, endIdx)
|
yj, err := srs.GetElevation(cr, "ma30", startIdx, endIdx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Warn(GetFuncName(), ":", err)
|
logrus.Warn(utils.GetFuncName(), ":", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
vir.VerticalElevation = yj
|
vir.VerticalElevation = yj
|
||||||
@ -549,7 +552,7 @@ func (vir *VerticalReportItem) MakeVerticalLimit(cr *Core, srs *Series, startIdx
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 计算剪切力
|
// 计算剪切力
|
||||||
func LacheJixian(cr *Core, srs *Series, period string) (float64, error) {
|
func LacheJixian(cr *core.Core, srs *Series, period string) (float64, error) {
|
||||||
curSe, _ := cr.GetPixelSeries(srs.InstID, period)
|
curSe, _ := cr.GetPixelSeries(srs.InstID, period)
|
||||||
return curSe.CandleSeries.List[len(srs.CandleSeries.List)-1].Y, nil
|
return curSe.CandleSeries.List[len(srs.CandleSeries.List)-1].Y, nil
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-redis/redis"
|
"github.com/go-redis/redis"
|
||||||
|
"github.com/phyer/core/internal/core"
|
||||||
logrus "github.com/sirupsen/logrus"
|
logrus "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package model
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package model
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package model
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package model
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user