diff --git a/.gitignore b/.gitignore index 9b27916..8e94e23 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ Thumbs.db /api/pb /fs /run/* + +/config/production diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a1eef44 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:24.10 +ARG APP +ENV LANG=C.UTF-8 +WORKDIR /opt +COPY localtime /etc/localtime +COPY target/${APP} /opt/app +COPY config/*.toml /opt/config/ +COPY config/production/*.toml /opt/config/ +RUN chmod +x /opt/app +CMD ["./app"] diff --git a/README.md b/README.md index 2836ffb..bec0b5f 100644 --- a/README.md +++ b/README.md @@ -137,10 +137,12 @@ RSI[1,2,3,4] -> RSI[0] 因子挖掘 -> 策略挖掘 exchange_service.go: 100 task/一批, 批量成功后mark, 再发布下一波 -viceAccount 负账户对冲交易 {Long: mainAccount, Short: viceAccount} +viceAccount 副账户对冲交易 {Long: mainAccount, Short: viceAccount} page design: - 指标页: 币种选择 -> 周期选择 -> 指标选择 -> 参数选择 -> 绘图 - - 交易计划: 交易策略 -> 交易所,币种,驱动周期 -> risk,sig,close,trade_strategy_param -> + - 交易所查询, 时间周期查询 + - 币种查询: 正常状态币种列表, 查询表单 - 回测页: 交易策略, 跑策略, 结果绘图 + - 交易计划: 交易策略 -> 交易所,币种,驱动周期 -> risk, sig, close, trade_strategy_param - 参数遍历回测 diff --git a/build-all.sh b/build-all.sh new file mode 100755 index 0000000..ce50a37 --- /dev/null +++ b/build-all.sh @@ -0,0 +1,7 @@ +#! /bin/bash + +./build.sh market 1.0 \ + && ./build.sh exchange 1.0 \ + && ./build.sh gateway 1.0 \ + && ./build.sh admin 1.0 \ + && ./build.sh trading 1.0 diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..d978cc7 --- /dev/null +++ b/build.sh @@ -0,0 +1,21 @@ +#! /bin/bash + +# ./build.sh exchange 1.0 + +APP=$1 +DOCKER_IMAGE_VERSION=$2 +GO111MODULE=on +CGO_ENABLED=0 +GOOS=linux +GOARCH=amd64 + +go build -o target/$APP cmd/$APP/main.go + +if [ -n "$DOCKER_IMAGE_VERSION" ]; then + echo "docker build -t sig-$APP:$DOCKER_IMAGE_VERSION --build-arg APP=$APP ." + cp -f /usr/share/zoneinfo/Asia/Shanghai ./localtime + docker build -t sig-$APP:$DOCKER_IMAGE_VERSION --build-arg APP=$APP . + rm -f localtime +fi + +echo "$APP build finished" diff --git a/cmd/sig-admin/main.go b/cmd/admin/main.go similarity index 90% rename from cmd/sig-admin/main.go rename to cmd/admin/main.go index fce2faa..7f1fe17 100644 --- a/cmd/sig-admin/main.go +++ b/cmd/admin/main.go @@ -1,7 +1,7 @@ package main import ( - "sig-pub/internal/sig" + "sig-pub/internal/admin" "sig-pub/pkg/config" "sig-pub/pkg/storage/persist" "sig-pub/pkg/utils/exit" @@ -23,7 +23,7 @@ func main() { panic(err) } - sigServer := sig.NewSigServer(rdb) + sigServer := admin.NewSigServer(rdb) if err = sigServer.Init(); err != nil { panic(err) } diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml new file mode 100644 index 0000000..8a35516 --- /dev/null +++ b/deploy/docker-compose.yml @@ -0,0 +1,40 @@ +networks: + sig-network: + driver: bridge + +services: + sig-gateway: + image: 'sig-gateway:1.0' + container_name: sig-gateway + hostname: sig-gateway + networks: + - sig-network + ports: + - 7001:7001 + - 7101:7101 + sig-market: + image: 'sig-market:1.0' + container_name: sig-market + hostname: sig-market + networks: + - sig-network + # restart: always + sig-exchange: + image: 'sig-exchange:1.0' + container_name: sig-exchange + hostname: sig-exchange + network_mode: host + # networks: + # - sig-network + sig-trading: + image: 'sig-trading:1.0' + container_name: sig-trading + hostname: sig-trading + networks: + - sig-network + sig-admin: + image: 'sig-admin:1.0' + container_name: sig-admin + hostname: sig-admin + networks: + - sig-network diff --git a/docker-compose.yml b/docker-compose.yml index e23824d..937cc8f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,30 +1,6 @@ -# docker compose up -d sig-consul sig-kvrocks sig-postgres sig-vm sig-nats sig-clickhouse +# docker compose up -d sig-consul sig-kvrocks sig-postgres sig-vm sig-nats services: - sig-clickhouse: - image: 'clickhouse/clickhouse-server:25.10' - user: 'root' - container_name: sig-clickhouse - hostname: sig-clickhouse - environment: - - CLICKHOUSE_RUN_AS_ROOT=1 - - CLICKHOUSE_DB=sig - - CLICKHOUSE_USER=root - - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 - - CLICKHOUSE_PASSWORD=123456 - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "./fs/clickhouse/ch_data:/var/lib/clickhouse/" - - "./fs/clickhouse/ch_logs:/var/log/clickhouse-server/" - # - ./fs/clickhouse/config.d/config.xml:/etc/clickhouse-server/config.d/config.xml - # - ./fs/clickhouse/users.d/users.xml:/etc/clickhouse-server/users.d/users.xml - ports: - - '8123:8123' - - '9000:9000' - ulimits: - nofile: - soft: "262144" - hard: "262144" sig-kvrocks: image: 'apache/kvrocks:nightly' container_name: sig-kvrocks @@ -37,19 +13,6 @@ services: - "./config/kvrocks/kvrocks.conf:/var/lib/kvrocks/kvrocks.conf:ro" - "./fs/kvrocks_data:/var/lib/kvrocks" command: --bind 0.0.0.0 --dir /var/lib/kvrocks - sig-mysql: - container_name: sig-mysql - image: mysql:8.4.5 - # command: --default-authentication-plugin=mysql_native_password - # restart: always - network_mode: host - environment: - MYSQL_ROOT_PASSWORD: '123456' - MYSQL_DATABASE: sig - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "./config/mysql:/etc/mysql" - - "./fs/mysql-data:/var/lib/mysql" sig-postgres: container_name: sig-postgres image: postgres:17.5 @@ -61,34 +24,6 @@ services: volumes: - "./config/mysql:/etc/mysql" - "./fs/postgres-data:/var/lib/postgresql/data" - sig-redis: - # dragonflydb - container_name: sig-redis - image: redis:7.4 - command: ["redis-server", "/usr/local/etc/redis/redis.conf"] - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "./config/redis/redis.conf:/usr/local/etc/redis/redis.conf" - - ./fs/redis-data:/data - ports: - - "7379:6379" - sig-influxdb: - container_name: sig-influxdb - image: influxdb:2.7 - environment: - DOCKER_INFLUXDB_INIT_MODE: setup - DOCKER_INFLUXDB_INIT_USERNAME: root - DOCKER_INFLUXDB_INIT_PASSWORD: "123456789" - DOCKER_INFLUXDB_INIT_ORG: sig - DOCKER_INFLUXDB_INIT_BUCKET: kline - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "./config/influxdb:/etc/influxdb2" - - "./fs/influxdb-data:/var/lib/influxdb2" - ports: - - 8086:8086 - # DAc-Mie0PKCqsRdd5I_Hkn-Ar0XJeeQDe-Jcsoo8wmKTPpG8Hp4RrTi3RRd3LQ4GKxZbNYJTESTX6us1O9FVNw== - sig-vm: container_name: sig-vm image: victoriametrics/victoria-metrics:v1.127.0 @@ -98,28 +33,6 @@ services: # ports: # - 8428:8428 command: -dedup.minScrapeInterval=1s -retentionPeriod=99y - - sig-questdb: - container_name: sig-questdb - image: questdb/questdb:8.3.1 - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "./fs/questdb:/var/lib/questdb" - - "./fs/questdb:/conf/log.conf" - ports: - - 7900:9000 - - 7909:9009 - - 7912:8912 - - 7903:9003 - sig-etcd: - container_name: sig-etcd - image: bitnami/etcd:3.6.1 - environment: - ALLOW_NONE_AUTHENTICATION: yes - ETCD_ADVERTISE_CLIENT_URLS: http://127.0.0.1:7079 - ports: - - 7079:2379 - - 7080:2380 sig-consul: container_name: sig-consul image: consul:1.15.4 diff --git a/internal/sig/args/backtest_args.go b/internal/admin/args/backtest_args.go similarity index 100% rename from internal/sig/args/backtest_args.go rename to internal/admin/args/backtest_args.go diff --git a/internal/admin/repoitory/backtest_repository.go b/internal/admin/repoitory/backtest_repository.go new file mode 100644 index 0000000..ce6e334 --- /dev/null +++ b/internal/admin/repoitory/backtest_repository.go @@ -0,0 +1,108 @@ +package repository + +import ( + "fmt" + "math" + "sig-pub/pkg/data" + "sig-pub/pkg/storage/persist" + "sig-pub/pkg/trade" + "sig-pub/pkg/utils/conver" +) + +type BacktestRepository struct { + db *persist.DB +} + +func NewBacktestRepository(db *persist.DB) *BacktestRepository { + return &BacktestRepository{ + db: db, + } +} + +// GetBacktest 用户交易计划回测详情 +func (p *BacktestRepository) GetBacktest(userId int64, backtestId int64) (test *trade.BacktestTradingPlan, err error) { + test = new(trade.BacktestTradingPlan) + err = p.db.Select(&test, ` + select * from t_backtest_trading_plan where id = ? and user_id = ? + `, backtestId, userId) + return +} + +// ListBacktest 用户交易计划回测记录查询 +func (p *BacktestRepository) ListBacktest(userId int64, page data.Page) (total int64, backtestLogs []*trade.BacktestTradingPlan, err error) { + sqlFrom := ` + from t_backtest_trading_plan where user_id = ? + ` + err = p.db.Select(&total, fmt.Sprintf(` + select count(*) %s + `, sqlFrom), userId) + if err != nil || total == 0 { + return + } + err = p.db.Select(&backtestLogs, fmt.Sprintf(` + select * %s + order by id desc + offset ? limit ? + `, sqlFrom), userId, page.Offset, page.Limit) + return +} + +// ListBacktestTrades 交易计划回测交易单详情 +func (p *BacktestRepository) ListBacktestTrades(userId, backtestId int64, page data.Page) (total int64, tradeOrders []*trade.TradeOrder, err error) { + sqlFrom := ` + from t_backtest_trading_order + where backtest_id = (select id from t_backtest_trading_plan where id = ? and user_id = ?) + ` + err = p.db.Select(&total, fmt.Sprintf(` + select count(*) %s + `, sqlFrom), backtestId, userId) + if err != nil || total == 0 { + return + } + err = p.db.Select(&tradeOrders, fmt.Sprintf(` + select * %s + order by trade_id asc + offset ? limit ? + `, sqlFrom), backtestId, userId, page.Offset, page.Limit) + return +} + +// BacktestLogStats 交易计划回测结果统计信息 +func (p *BacktestRepository) BacktestLogStats(userId, backtestId int64) (stats *trade.BacktestTradingPlan, err error) { + stats = &trade.BacktestTradingPlan{} + err = p.db.Select(stats, ` + select * from t_backtest_trading_plan_stats + where backtest_id = (select id from t_backtest_trading_plan where id = ? and user_id = ?) + `, backtestId, userId) + return +} + +// BacktestEquities 回测记录资金曲线 +func (p *BacktestRepository) BacktestEquities(userId, backtestId int64) (times []int64, equities []float64, tradeIds []string, err error) { + var datas []map[string]any + err = p.db.Select(&datas, ` + select trade_id, ctime, equity from t_backtest_trading_order + where backtest_id = (select id from t_backtest_trading_plan where id = ? and user_id = ?) and trade_type = 2 + order by ctime, trade_id asc + `, backtestId, userId) + if err != nil { + return + } + pow := math.Pow10(2) + for _, data := range datas { + trade_id := conver.ToInt64(data["trade_id"]) + ctime := conver.ToInt64(data["ctime"]) + equity := conver.ToFloat64(data["equity"]) + equity = math.Round(equity*pow) / pow + // 同一时间两笔单 + if length := len(times); length > 0 && times[length-1] == ctime { + equities[length-1] = equity + tradeIds[length-1] += fmt.Sprintf(";%d", trade_id) + } else { + times = append(times, ctime) + equities = append(equities, equity) + tradeIds = append(tradeIds, fmt.Sprintf("%d", trade_id)) + } + } + return +} diff --git a/internal/admin/repoitory/data.go b/internal/admin/repoitory/data.go new file mode 100644 index 0000000..e8cde77 --- /dev/null +++ b/internal/admin/repoitory/data.go @@ -0,0 +1,7 @@ +package repository + +type BacktestEquity struct { + Time int64 `json:"time"` + Value float64 `json:"value"` + TradeId string `json:"tradeId"` +} diff --git a/internal/admin/repoitory/market_repository.go b/internal/admin/repoitory/market_repository.go new file mode 100644 index 0000000..84c6d82 --- /dev/null +++ b/internal/admin/repoitory/market_repository.go @@ -0,0 +1,55 @@ +package repository + +import ( + "sig-pub/pkg/data" + "sig-pub/pkg/data/entity" + "sig-pub/pkg/storage/persist" +) + +type MarketRepository struct { + db *persist.DB +} + +func NewMarketRepository(db *persist.DB) *MarketRepository { + return &MarketRepository{ + db: db, + } +} + +func (s *MarketRepository) ListAllInstanceId() (insts []string, err error) { + err = s.db.Select(&insts, `select inst_id from t_trade_instance where status != ?`, data.StatusDeleted) + return +} + +func (s *MarketRepository) ListAllInstance() (insts []*entity.TradeInstance, err error) { + err = s.db.Select(&insts, `select * from t_trade_instance where status != ?`, data.StatusDeleted) + if err != nil { + return + } + err = s.AttachInstExchanges(insts) + return +} + +func (s *MarketRepository) AttachInstExchanges(insts []*entity.TradeInstance) (err error) { + // 交易产品交易所 + var instIds []string + var instMap = make(map[string]*entity.TradeInstance, len(insts)) + for _, inst := range insts { + instIds = append(instIds, inst.InstId) + instMap[inst.InstId] = inst + } + + var instExchanges []*entity.TradeInstanceExchange + err = s.db.Select(&instExchanges, ` + select * from t_trade_instance_exchange where inst_id in ? and status != ? order by inst_id, exchange + `, instIds, data.StatusDeleted) + if err != nil { + return + } + for _, instEx := range instExchanges { + if inst, ok := instMap[instEx.InstId]; ok { + inst.Exchanges = append(inst.Exchanges, instEx) + } + } + return +} diff --git a/internal/admin/service/backtest_service.go b/internal/admin/service/backtest_service.go new file mode 100644 index 0000000..3527362 --- /dev/null +++ b/internal/admin/service/backtest_service.go @@ -0,0 +1,100 @@ +package service + +import ( + "fmt" + "net/http" + "sig-pub/internal/admin/args" + repository "sig-pub/internal/admin/repoitory" + "sig-pub/pkg/data" + "sig-pub/pkg/resp" + + "github.com/gin-gonic/gin" + "github.com/spf13/cast" +) + +type BacktestService struct { + repo *repository.BacktestRepository +} + +func NewBacktestService(repo *repository.BacktestRepository) *BacktestService { + return &BacktestService{ + repo: repo, + } +} + +func (svc *BacktestService) Route(group *gin.RouterGroup) { + group.POST("listBacktest", svc.ListBacktest) // 回测记录分页 + group.GET("getBacktest", svc.GetBacktest) // 回测记录详情 + group.POST("listBacktestTrades", svc.ListBacktestTrades) // 回测记录交易订单分页 + group.GET("testEquities", svc.TestEquities) // 回测记录资金曲线 +} + +func (svc *BacktestService) ListBacktest(ctx *gin.Context) { + page := data.PageArgs(ctx) + total, tests, err := svc.repo.ListBacktest(10001, page) + if err != nil { + ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) + return + } + ctx.JSON(http.StatusOK, resp.Success(resp.H{ + "total": total, + "tests": tests, + })) +} + +func (svc *BacktestService) GetBacktest(ctx *gin.Context) { + backtestId, err := cast.ToInt64E(ctx.Query("backtestId")) + if backtestId == 0 || err != nil { + ctx.JSON(http.StatusBadRequest, resp.Error("param backtestId format error")) + return + } + test, err := svc.repo.GetBacktest(10001, backtestId) + if err != nil { + ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) + return + } + if test == nil || test.Id == 0 { + ctx.JSON(http.StatusInternalServerError, resp.Error(fmt.Sprintf("backtest %d not exists", backtestId))) + return + } + ctx.JSON(http.StatusOK, resp.Success(test)) +} + +func (svc *BacktestService) ListBacktestTrades(ctx *gin.Context) { + page := data.PageArgs(ctx) + arg := new(args.ListBacktestLogTradesReq) + if err := ctx.ShouldBindJSON(arg); err != nil { + ctx.JSON(http.StatusBadRequest, resp.Fail(err.Error())) + return + } + + total, trades, err := svc.repo.ListBacktestTrades(10001, arg.BacktestId, page) + if err != nil { + ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) + return + } + + ctx.JSON(http.StatusOK, resp.Success(resp.H{ + "total": total, + "trades": trades, + })) +} + +// TestEquityCurve 回测记录资金曲线 +func (svc *BacktestService) TestEquities(ctx *gin.Context) { + backtestId, err := cast.ToInt64E(ctx.Query("backtestId")) + if backtestId == 0 || err != nil { + ctx.JSON(http.StatusBadRequest, resp.Error("param backtestId format error")) + return + } + times, equities, tradeIds, err := svc.repo.BacktestEquities(10001, backtestId) + if err != nil { + ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) + return + } + ctx.JSON(http.StatusOK, resp.Success(resp.H{ + "time": times, + "equity": equities, + "tradeId": tradeIds, + })) +} diff --git a/internal/admin/service/market_service.go b/internal/admin/service/market_service.go new file mode 100644 index 0000000..2a3f590 --- /dev/null +++ b/internal/admin/service/market_service.go @@ -0,0 +1,46 @@ +package service + +import ( + "net/http" + repository "sig-pub/internal/admin/repoitory" + "sig-pub/pkg/resp" + + "github.com/gin-gonic/gin" +) + +type MarketService struct { + repo *repository.MarketRepository +} + +func NewMarketService(repo *repository.MarketRepository) *MarketService { + return &MarketService{ + repo: repo, + } +} + +func (svc *MarketService) Route(group *gin.RouterGroup) { + group.GET("listInstanceId", svc.ListInstanceId) // 所有交易产品ID + group.GET("listInstance", svc.ListInstance) // 所有交易产品信息 +} + +func (svc *MarketService) ListInstanceId(ctx *gin.Context) { + instIds, err := svc.repo.ListAllInstanceId() + if err != nil { + ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) + return + } + ctx.JSON(http.StatusOK, resp.Success(instIds)) +} + +func (svc *MarketService) ListInstance(ctx *gin.Context) { + insts, err := svc.repo.ListAllInstance() + if err != nil { + ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) + return + } + + ctx.JSON(http.StatusOK, resp.Success(resp.H{ + "total": len(insts), + "insts": insts, + })) +} diff --git a/internal/admin/service/service.go b/internal/admin/service/service.go new file mode 100644 index 0000000..b2e7a71 --- /dev/null +++ b/internal/admin/service/service.go @@ -0,0 +1,17 @@ +package service + +import ( + repository "sig-pub/internal/admin/repoitory" + "sig-pub/pkg/storage/persist" + + "github.com/gin-gonic/gin" +) + +// Init services list +func Init(group *gin.RouterGroup, rdb *persist.DB) { + backtestRepo := repository.NewBacktestRepository(rdb) + marketRepo := repository.NewMarketRepository(rdb) + + NewBacktestService(backtestRepo).Route(group.Group("/backtest")) + NewMarketService(marketRepo).Route(group.Group("/market")) +} diff --git a/internal/sig/sig_server.go b/internal/admin/sig_server.go similarity index 94% rename from internal/sig/sig_server.go rename to internal/admin/sig_server.go index fd5d900..43572ff 100644 --- a/internal/sig/sig_server.go +++ b/internal/admin/sig_server.go @@ -1,9 +1,9 @@ -package sig +package admin import ( "net/http" "runtime/debug" - "sig-pub/internal/sig/service" + "sig-pub/internal/admin/service" "sig-pub/pkg/resp" "sig-pub/pkg/storage/persist" "sig-pub/pkg/zlog" diff --git a/internal/sig/repoitory/backtest_repository.go b/internal/sig/repoitory/backtest_repository.go deleted file mode 100644 index f44147f..0000000 --- a/internal/sig/repoitory/backtest_repository.go +++ /dev/null @@ -1,58 +0,0 @@ -package repository - -import ( - "fmt" - "sig-pub/pkg/data" - "sig-pub/pkg/storage/persist" - "sig-pub/pkg/trade" -) - -type BacktestRepository struct { - db *persist.DB -} - -func NewBacktestRepository(db *persist.DB) *BacktestRepository { - return &BacktestRepository{ - db: db, - } -} - -// ListBacktestLogs 用户交易计划回测记录查询 -func (p *BacktestRepository) ListBacktestLogs(userId int64, page data.Page) (backtestLogs []*trade.BacktestTradingPlan, err error) { - err = p.db.Select(&backtestLogs, ` - select * from t_backtest_trading_plan where user_id = ? - order by id desc - offset ? limit ? - `, userId, page.Offset, page.Limit) - return -} - -// BacktestLogTrades 交易计划回测交易单详情 -func (p *BacktestRepository) BacktestLogTrades(userId, backtestId int64, page data.Page) (total int, tradeOrders []*trade.TradeOrder, err error) { - sqlFrom := ` - from t_backtest_trading_order - where backtest_id = (select id from t_backtest_trading_plan where id = ? and user_id = ?) - ` - err = p.db.Select(&total, fmt.Sprintf(` - select count(*) %s - `, sqlFrom), backtestId, userId) - if err != nil || total == 0 { - return - } - err = p.db.Select(&tradeOrders, fmt.Sprintf(` - select * %s - order by trade_id asc - offset ? limit ? - `, sqlFrom), backtestId, userId, page.Offset, page.Limit) - return -} - -// BacktestLogStats 交易计划回测结果统计信息 -func (p *BacktestRepository) BacktestLogStats(userId, backtestId int64) (stats *trade.BacktestTradingPlan, err error) { - stats = &trade.BacktestTradingPlan{} - err = p.db.Select(stats, ` - select * from t_backtest_trading_plan_stats - where backtest_id = (select id from t_backtest_trading_plan where id = ? and user_id = ?) - `, backtestId, userId) - return -} diff --git a/internal/sig/repoitory/market_repository.go b/internal/sig/repoitory/market_repository.go deleted file mode 100644 index a3eebab..0000000 --- a/internal/sig/repoitory/market_repository.go +++ /dev/null @@ -1,17 +0,0 @@ -package repository - -import "sig-pub/pkg/storage/persist" - -type MarketRepository struct { - db *persist.DB -} - -func NewMarketRepository(db *persist.DB) *MarketRepository { - return &MarketRepository{ - db: db, - } -} - -func (r *MarketRepository) List() { - -} diff --git a/internal/sig/service/backtest_service.go b/internal/sig/service/backtest_service.go deleted file mode 100644 index f3ae76b..0000000 --- a/internal/sig/service/backtest_service.go +++ /dev/null @@ -1,60 +0,0 @@ -package service - -import ( - "net/http" - "sig-pub/internal/sig/args" - repository "sig-pub/internal/sig/repoitory" - "sig-pub/pkg/data" - "sig-pub/pkg/resp" - - "github.com/gin-gonic/gin" -) - -type BacktestService struct { - repo *repository.BacktestRepository -} - -func NewBacktestService(repo *repository.BacktestRepository) *BacktestService { - return &BacktestService{ - repo: repo, - } -} - -func (svc *BacktestService) Route(group *gin.RouterGroup) { - group.GET("listBacktestLog", svc.ListBacktestLog) // 回测记录 - group.POST("listBacktestLogTrades", svc.ListBacktestLogTrades) // 回测记录订单详情 -} - -func (svc *BacktestService) ListBacktestLog(ctx *gin.Context) { - page := data.PageArgs(ctx) - - logs, err := svc.repo.ListBacktestLogs(10001, page) - if err != nil { - ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) - return - } - ctx.JSON(http.StatusOK, resp.Success(resp.H{ - "total": len(logs), - "logs": logs, - })) -} - -func (svc *BacktestService) ListBacktestLogTrades(ctx *gin.Context) { - page := data.PageArgs(ctx) - arg := new(args.ListBacktestLogTradesReq) - if err := ctx.ShouldBindJSON(arg); err != nil { - ctx.JSON(http.StatusBadRequest, resp.Fail(err.Error())) - return - } - - total, trades, err := svc.repo.BacktestLogTrades(10001, arg.BacktestId, page) - if err != nil { - ctx.JSON(http.StatusInternalServerError, resp.Error(err.Error())) - return - } - - ctx.JSON(http.StatusOK, resp.Success(resp.H{ - "total": total, - "trades": trades, - })) -} diff --git a/internal/sig/service/market_service.go b/internal/sig/service/market_service.go deleted file mode 100644 index 701e16d..0000000 --- a/internal/sig/service/market_service.go +++ /dev/null @@ -1,21 +0,0 @@ -package service - -import ( - repository "sig-pub/internal/sig/repoitory" - - "github.com/gin-gonic/gin" -) - -type MarketService struct { - repo *repository.MarketRepository -} - -func NewMarketService(repo *repository.MarketRepository) *MarketService { - return &MarketService{ - repo: repo, - } -} - -func (svc *MarketService) Route(group *gin.RouterGroup) { - -} diff --git a/internal/sig/service/service.go b/internal/sig/service/service.go deleted file mode 100644 index cd3b0c5..0000000 --- a/internal/sig/service/service.go +++ /dev/null @@ -1,15 +0,0 @@ -package service - -import ( - repository "sig-pub/internal/sig/repoitory" - "sig-pub/pkg/storage/persist" - - "github.com/gin-gonic/gin" -) - -// Init services list -func Init(group *gin.RouterGroup, rdb *persist.DB) { - backtestRepository := repository.NewBacktestRepository(rdb) - - NewBacktestService(backtestRepository).Route(group.Group("/backtest")) -} diff --git a/pkg/data/entity/trade_instance.go b/pkg/data/entity/trade_instance.go index 3e8e153..bf48c28 100644 --- a/pkg/data/entity/trade_instance.go +++ b/pkg/data/entity/trade_instance.go @@ -4,7 +4,7 @@ import "github.com/lib/pq" // 交易产品基础信息 type TradeInstance struct { - InstId string `gorm:"column:inst_id;primaryKey" json:"InstId"` // 交易产品id BTC_USDT_SWAP + InstId string `gorm:"column:inst_id;primaryKey" json:"instId"` // 交易产品id BTC_USDT_SWAP InstPair string `gorm:"column:inst_pair" json:"instPair"` // 交易对 BTCUSDT InstType int32 `gorm:"column:inst_type" json:"instType"` // 交易类型: 1现货2永续合约 InstCoin string `gorm:"column:inst_coin" json:"instCoin"` // 所属币种 BTC