Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Your Name committed Oct 20, 2023
1 parent 9daa799 commit c029680
Show file tree
Hide file tree
Showing 13 changed files with 241 additions and 50 deletions.
5 changes: 3 additions & 2 deletions cmd/haobase/clearing/clearing.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ func Run() {
}

func run_clearing(symbol string) {
go watch_redis_list(symbol)
//成交日志队列
go watch_tradeok_list(symbol)
}

func watch_redis_list(symbol string) {
func watch_tradeok_list(symbol string) {
key := types.FormatTradeResult.Format(symbol)
app.Logger.Infof("监听%s成交日志,等待结算...", symbol)
for {
Expand Down
2 changes: 2 additions & 0 deletions cmd/haobase/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/yzimhao/trading_engine/cmd/haobase/base"
"github.com/yzimhao/trading_engine/cmd/haobase/base/varieties"
"github.com/yzimhao/trading_engine/cmd/haobase/clearing"
"github.com/yzimhao/trading_engine/cmd/haobase/orders"
"github.com/yzimhao/trading_engine/cmd/haobase/www"
"github.com/yzimhao/trading_engine/utils/app"
"github.com/yzimhao/trading_engine/utils/app/config"
Expand Down Expand Up @@ -74,6 +75,7 @@ func main() {

initDemoBaseData()
clearing.Run()
orders.Run()
www.Run()
return nil
},
Expand Down
137 changes: 115 additions & 22 deletions cmd/haobase/orders/cancel_order.go
Original file line number Diff line number Diff line change
@@ -1,54 +1,147 @@
package orders

import (
"encoding/json"
"fmt"
"time"

"github.com/gomodule/redigo/redis"
"github.com/gookit/goutil/arrutil"
"github.com/yzimhao/trading_engine/cmd/haobase/assets"
"github.com/yzimhao/trading_engine/cmd/haobase/base"
"github.com/yzimhao/trading_engine/cmd/haobase/message"
"github.com/yzimhao/trading_engine/cmd/haobase/message/ws"
"github.com/yzimhao/trading_engine/cmd/haomatch/matching"
"github.com/yzimhao/trading_engine/types"
"github.com/yzimhao/trading_engine/utils/app"
"github.com/yzimhao/trading_engine/utils/app/config"
)

func cancel_order(symbol, order_id string) (order *Order, err error) {
func SubmitOrderCancel(order_id string) error {
rdc := app.RedisPool().Get()
defer rdc.Close()

db := app.Database().NewSession()
defer db.Close()

var order Order
has, _ := db.Table(new(UnfinishedOrder)).Where("order_id=?", order_id).Get(&order)
if has {
cancel := matching.StructCancelOrder{
Side: order.OrderSide,
OrderId: order.OrderId,
}
rdc.Do("rpush", types.FormatCancelOrder.Format(order.Symbol), cancel.Json())
}

return nil
}

func Run() {
//监听取消订单队列
local_config_symbols := config.App.Local.Symbols
db_symbols := base.NewTSymbols().All()
for _, item := range db_symbols {
if len(local_config_symbols) > 0 && arrutil.Contains(local_config_symbols, item.Symbol) || len(local_config_symbols) == 0 {
go watch_cancel_order_list(item.Symbol)
}
}

}

func watch_cancel_order_list(symbol string) {
key := types.FormatCancelResult.Format(symbol)
app.Logger.Infof("监听%s取消订单队列...", symbol)
for {
func() {
rdc := app.RedisPool().Get()
defer rdc.Close()

if n, _ := redis.Int64(rdc.Do("LLen", key)); n == 0 {
time.Sleep(time.Duration(50) * time.Millisecond)
return
}

raw, _ := redis.Bytes(rdc.Do("Lpop", key))
app.Logger.Infof("收到 %s 取消订单: %s", symbol, raw)
var data matching.StructCancelOrderResult
json.Unmarshal(raw, &data)
go cancel_order(symbol, data.OrderId, 0)
}()

}
}

func cancel_order(symbol, order_id string, retry int) {
lock := GetLock(ClearingLock, order_id)
wait := 10

app.Logger.Infof("取消订单%s lock: %d retry: %d", order_id, lock, retry)
if lock > 0 && retry <= wait*2 {
//等待10s 还是有锁,记录下订单,退出取消逻辑
time.Sleep(time.Duration(500) * time.Millisecond)
cancel_order(symbol, order_id, retry+1)
return
}
if lock > 0 && retry > wait*2 {
app.Logger.Errorf("取消%s订单%s失败", symbol, order_id)
return
}

db := app.Database().NewSession()
defer db.Close()

err = db.Begin()
var item Order

err := db.Begin()
if err != nil {
return nil, err
app.Logger.Errorf(err.Error())
return
}

defer func() {
if err != nil {
app.Logger.Errorf("取消订单 %s 失败 %s", order_id, err.Error())
db.Rollback()
} else {
db.Commit()
if err := db.Commit(); err != nil {
app.Logger.Errorf("取消订单 %s 失败 %s", order_id, err.Error())
} else {
//取消成功websocket发送消息给前端
to := fmt.Sprintf("user.%s", item.UserId)
message.Publish(ws.MsgBody{
To: to,
Response: ws.Response{
Type: types.MsgUserOrderCancel.Format(symbol),
Body: map[string]string{
"order_id": order_id,
},
},
})
}
}
}()
//todo 订单锁

app.Logger.Infof("[orders] %s cancel: %s", symbol, order_id)

order = &Order{
Symbol: symbol,
OrderId: order_id,
Status: OrderStatusCancel,
}
//更新订单状态
_, err = db.Table(new(UnfinishedOrder)).Where("order_id=?", order_id).Delete()
tablename := GetOrderTableName(symbol)
_, err = db.Table(tablename).Where("order_id=?", order_id).Get(&item)
if err != nil {
return nil, err
return
}
_, err = db.Table(GetOrderTableName(symbol)).Where("order_id=?", order_id).Cols("status").Update(order)
_, err = db.Table(new(UnfinishedOrder)).Where("order_id=?", order_id).Delete()
if err != nil {
return nil, err
return
}

_, err = db.Table(order.TableName()).Where("order_id=?", order_id).Get(order)
//更新订单状态
item.Status = OrderStatusCancel
_, err = db.Table(tablename).Where("order_id=?", order_id).Cols("status").Update(item)
if err != nil {
return nil, err
return
}

//解除订单冻结金额
_, err = assets.UnfreezeAllAssets(db, order.UserId, order.OrderId)
_, err = assets.UnfreezeAllAssets(db, item.UserId, item.OrderId)
if err != nil {
return nil, err
return
}
return order, nil
}
6 changes: 5 additions & 1 deletion cmd/haobase/www/order/order_cancel.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package order

import (
"github.com/gin-gonic/gin"
"github.com/yzimhao/trading_engine/cmd/haobase/orders"
"github.com/yzimhao/trading_engine/utils"
)

Expand All @@ -16,6 +17,9 @@ func Cancel(ctx *gin.Context) {
return
}

//todo
if err := orders.SubmitOrderCancel(req.OrderId); err != nil {
utils.ResponseFailJson(ctx, err.Error())
return
}
utils.ResponseOkJson(ctx, "")
}
9 changes: 2 additions & 7 deletions cmd/haobase/www/order/order_unfinished.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,10 @@ func Unfinished(ctx *gin.Context) {
limit := utils.S2Int(ctx.Query("limit"))
symbol := ctx.Query("symbol")

cfg, err := base.NewTSymbols().Get(symbol)
if err != nil {
utils.ResponseFailJson(ctx, "不存在的交易对")
return
}

db := app.Database().NewSession()
defer db.Close()

var rows []orders.Order
rows := make([]orders.Order, 0)
query := db.Table(new(orders.UnfinishedOrder))

if symbol != "" {
Expand All @@ -31,6 +25,7 @@ func Unfinished(ctx *gin.Context) {
query.Where("user_id=?", user_id).OrderBy("create_time desc").Limit(limit).Find(&rows)

for i, v := range rows {
cfg, _ := base.NewTSymbols().Get(v.Symbol)
rows[i] = v.FormatDecimal(cfg.PricePrecision, cfg.QtyPrecision)
}

Expand Down
10 changes: 5 additions & 5 deletions cmd/haomatch/matching/tengine.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ func (t *tengine) pull_cancel_order() {

raw, _ := redis.Bytes(rdc.Do("LPOP", key)) // rdc.LPop(cx, key).Bytes()

var data cancel_order
var data StructCancelOrder
err := json.Unmarshal(raw, &data)
if err != nil {
app.Logger.Warnf("%s 解析json: %s 错误: %s", key, raw, err)
Expand Down Expand Up @@ -279,15 +279,15 @@ func (t *tengine) monitor_result() {
go func() {
key := types.FormatCancelResult.Format(t.symbol)

data := map[string]any{
"order_id": uniq,
"cancel": "success",
data := StructCancelOrderResult{
OrderId: uniq,
Status: "success",
}

rdc := app.RedisPool().Get()
defer rdc.Close()

raw, _ := json.Marshal(data)
raw := data.Json()
if _, err := rdc.Do("RPUSH", key, raw); err != nil { //rdc.RPush(cx, key, raw).Err()
app.Logger.Warnf("%s队列RPush: %s %s", key, raw, err)
}
Expand Down
19 changes: 17 additions & 2 deletions cmd/haomatch/matching/var.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,27 @@ type Order struct {
At int64 `json:"at"`
}

type cancel_order struct {
func (o *Order) Json() []byte {
raw, _ := json.Marshal(o)
return raw
}

type StructCancelOrder struct {
Side trading_core.OrderSide `json:"side"`
OrderId string `json:"order_id"`
}

func (o *Order) Json() []byte {
func (o *StructCancelOrder) Json() []byte {
raw, _ := json.Marshal(o)
return raw
}

type StructCancelOrderResult struct {
OrderId string `json:"order_id"`
Status string `json:"status"`
}

func (o *StructCancelOrderResult) Json() []byte {
raw, _ := json.Marshal(o)
return raw
}
32 changes: 30 additions & 2 deletions document/order_unfinshed.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

##### 3) 接口描述:

> 获取交易对的所有当前挂单
> 获取还未完全成交的订单列表
##### 4) 请求参数:
> 需要登陆
Expand All @@ -29,7 +29,35 @@
##### 5) 请求返回结果:

```
[]
{
"data": [
{
"symbol": "usdjpy",
"order_id": "A23102015240522027723",
"order_side": "sell",
"order_type": "limit",
"price": "1.000",
"quantity": "10.00",
"finished_qty": "0.00",
"finished_amount": "0.000",
"status": "new",
"create_time": 1697786645236014000
},
{
"symbol": "usdjpy",
"order_id": "A23102015240331493947",
"order_side": "sell",
"order_type": "limit",
"price": "1.000",
"quantity": "10.00",
"finished_qty": "0.00",
"finished_amount": "0.000",
"status": "new",
"create_time": 1697786643331832000
}
],
"ok": 1
}
```


Expand Down
6 changes: 5 additions & 1 deletion example/demo.html
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@
<td>{% d.price %}</td>
<td>{% d.quantity %} / <span class="qty_ok">{% d.finished_qty %}</span> / <span>{% d.finished_amount %}</span> </td>
<td>{% d.create_time %}</td>
<td style="text-align: center;">
<a href="javascript:;" class="cancel-order" title="撤单"><i class="layui-icon">&#x1006;</i></a>
</td>
</tr>
</script>

Expand Down Expand Up @@ -139,7 +142,7 @@
<div class="layui-card">
<div class="layui-card-header">
<b>模拟下单</b>
<span class="assets" style="margin-left: 20px;">持有资产: <b class="list">USD=0.00</b></span>
<span class="assets" style="margin-left: 20px;"><b>{{ .symbol | upper }}</b> 持有资产: <b class="list">USD=0.00</b></span>
</div>
<div class="layui-card-body">

Expand All @@ -154,6 +157,7 @@
<th>价格</th>
<th>挂单量/已成交/成交额</th>
<th>时间</th>
<th>操作</th>
</tr>
</table>
</div>
Expand Down
6 changes: 6 additions & 0 deletions example/example.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,12 @@ func startWeb(host string) {
"unsafe": func(str string) template.HTML {
return template.HTML(str)
},
"upper": func(str string) string {
return strings.ToUpper(str)
},
"lower": func(str string) string {
return strings.ToLower(str)
},
})

web.LoadHTMLGlob("./*.html")
Expand Down
Loading

0 comments on commit c029680

Please sign in to comment.