Browse Source

admin deploy

main
strange 8 months ago
parent
commit
7f8461baff
  1. 2
      .gitignore
  2. 10
      Dockerfile
  3. 6
      README.md
  4. 7
      build-all.sh
  5. 21
      build.sh
  6. 4
      cmd/admin/main.go
  7. 40
      deploy/docker-compose.yml
  8. 89
      docker-compose.yml
  9. 0
      internal/admin/args/backtest_args.go
  10. 108
      internal/admin/repoitory/backtest_repository.go
  11. 7
      internal/admin/repoitory/data.go
  12. 55
      internal/admin/repoitory/market_repository.go
  13. 100
      internal/admin/service/backtest_service.go
  14. 46
      internal/admin/service/market_service.go
  15. 17
      internal/admin/service/service.go
  16. 4
      internal/admin/sig_server.go
  17. 58
      internal/sig/repoitory/backtest_repository.go
  18. 17
      internal/sig/repoitory/market_repository.go
  19. 60
      internal/sig/service/backtest_service.go
  20. 21
      internal/sig/service/market_service.go
  21. 15
      internal/sig/service/service.go
  22. 2
      pkg/data/entity/trade_instance.go

2
.gitignore vendored

@ -28,3 +28,5 @@ Thumbs.db
/api/pb
/fs
/run/*
/config/production

10
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"]

6
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
- 参数遍历回测

7
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

21
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"

4
cmd/sig-admin/main.go → 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)
}

40
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

89
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

0
internal/sig/args/backtest_args.go → internal/admin/args/backtest_args.go

108
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
}

7
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"`
}

55
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
}

100
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,
}))
}

46
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,
}))
}

17
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"))
}

4
internal/sig/sig_server.go → 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"

58
internal/sig/repoitory/backtest_repository.go

@ -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
}

17
internal/sig/repoitory/market_repository.go

@ -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() {
}

60
internal/sig/service/backtest_service.go

@ -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,
}))
}

21
internal/sig/service/market_service.go

@ -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) {
}

15
internal/sig/service/service.go

@ -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"))
}

2
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

Loading…
Cancel
Save