/BandBinance

币安吃波段尝试

Primary LanguageGo

安装好go环境

# 下载依赖
go mod tidy
go mod download 
# 设置自己的ak sk

# 设置自己的飞书告警链接

# 打包
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app/CreateBuyOrderAPP CreateBuyOrderAPP.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app/CreateSellOrderAPP CreateSellOrderAPP.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app/CancelBuyOrderAPP CancelBuyOrderAPP.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app/UpdateSellOrderAPP UpdateSellOrderAPP.go

# 运行二进制程序


均是实盘交易

修改说明

go1.16版本中time包不支持 UnixMilli 已将其改为 ..UnixNano() / 1e6

数据迁移 将 store/*.go 中 init() 做了合并, 并补上了 TradeOrder 表的迁移

func init() {
    err := DB.AutoMigrate(&domain.GridSymbolConfig{})
    if err != nil {
        panic(err)
    }
    err = DB.AutoMigrate(&domain.GridTrade{})
    if err != nil {
        panic(err)
    }
    err = DB.AutoMigrate(&domain.TradeOrder{})
    if err != nil {
        panic(err)
    }
}

添加了 钉钉通知 notify/DDNotify.go

将 UpdateSellOrderAPP.go 中 time.sleep 修改为了 time.NewTicker 用于当for中的任务耗时较长时 任务的周期时长不会随之增加

将 strategy/Grid.go 中:

ProcessGridTrades 方法里全部使用配置项symbolConfig  删除了参数 grid *domain.Grid
方法调用者中删除了newGrid()
step2: 调用 GetTrades 的地方直接使用了 ProcessGridTrades 删除了 GetTrades
step3: ProcessGridTrades 频繁调用 使用了sync.Once 保证只执行一次

部分 exchange.go 中 priceMap等map类型的读取只需要读锁 lockPriceMap.RLock() 可提高并发时的效率

exchange.go中UpdateBalance()里 个人觉得 for i := range balances 前不需要用len() 判断对象的长度 如果len为0 会自动跳过for循环

添加了config.yaml 作为配置文件 使得程序在打包后也可以更改一些参数的配置

取消订单中 3小时以前 的写法有点繁琐 替换为了 time.Now().Add(-3 * time.Hour)

小结

关于代码修改:大致读完了4个app的流程并顺手改了些代码  其中有一些是运行逻辑问题 但大部分只是个人习惯... 
改动比较大 不一定对 可能也有我理解不到位的地方 如果有问题还望指出

关于策略: 看了代码后对网格的理解更进了一步 大致的理解是:
    在一定价格区间内 按照等百分比划定区间 
    价格触发区间下限的时候买入 若成功则挂一个区间上限价格的卖出单

    优点:价格上下波动时有部分可观收益
    缺点:遇到单边行情 损失会比较大

关于改进:   
    对于网格打算将基础货币由busd改为任意币种 比如做eth和btc间的 
    将增加多币种的动态平衡策略