Tài nguyên đang được tải lên... tải...

Mô hình thiết kế chiến lược dYdX - Chiến lược giao dịch ngẫu nhiên

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2021-11-03 15:40:56, Cập nhật: 2023-09-15 21:02:48

img

Mô hình thiết kế chiến lược dYdX

Để đáp ứng nhu cầu của người dùng, gần đây nền tảng FMZ đã hỗ trợ sàn giao dịch phi tập trung dYdX. Những người có chiến lược có thể khai thác dYdX một cách thú vị. Cách đây rất lâu, tôi đã muốn viết một chiến lược giao dịch ngẫu nhiên, kiếm tiền và thua tiền không có mục đích là thực hành, chỉ cần dạy một chút chiến lược. Vì vậy, tiếp theo chúng tôi cùng nhau thiết kế một chiến lược sàn giao dịch ngẫu nhiên, chiến lược có hiệu quả hay không, chúng tôi có quyền và học chiến lược thiết kế.

Trước tiên là một làn sóng khai thác.

Các chiến lược khai thác trong bài viết này.

img

Bạn bè có ý tưởng chiến lược khai thác tốt cũng được chào đón để lại ý kiến!

Thiết kế chiến lược giao dịch ngẫu nhiên

Chúng ta hãy suy nghĩ một chút! Hãy lên kế hoạch thiết kế một chiến lược không nhìn vào các chỉ số, không nhìn vào giá cả, chỉ cần làm nhiều, làm trống, và tất cả những gì chúng ta làm là xác suất.

Làm nhiều điều kiện: số ngẫu nhiên từ 1 đến 50. Điều kiện làm trống: số ngẫu nhiên từ 51 đến 100.

Trong giao dịch, chúng ta sẽ thiết lập một tiêu chuẩn dừng dừng, dừng lỗ cố định như một tiêu chuẩn thua hoặc thua. Ngừng dừng là thắng, dừng lỗ là thua. Về mức độ dừng dừng, dừng lỗ phù hợp như thế nào, điều này thực sự ảnh hưởng đến tỷ lệ lỗ, đúng vậy! cũng ảnh hưởng đến tỷ lệ thắng!

Việc giao dịch không phải là không tốn kém, những yếu tố như điểm trượt, chi phí thủ tục là đủ để kéo tỷ lệ thắng của chúng tôi xuống dưới 50%. Vì vậy, tôi muốn thiết kế giao dịch đầu tiên với số lượng đơn nhỏ, có thể càng nhỏ càng nhỏ. Sau đó, nếu bạn thua, hãy tăng số lượng tiếp theo và tiếp tục đặt đơn ngẫu nhiên.

Được rồi, chiến lược chỉ đơn giản như thế thôi.

Nguồn mã thiết kế:

var openPrice = 0 
var ratio = 1
var totalEq = null 
var nowEq = null 

function cancelAll() {
    while (1) {
        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            break
        }
        for (var i = 0 ; i < orders.length ; i++) {
            exchange.CancelOrder(orders[i].Id, orders[i])
            Sleep(500)
        }
        Sleep(500)
    }
}

function main() {
    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("重置所有数据", "#FF0000")
    }

    exchange.SetContractType(ct)

    var initPos = _C(exchange.GetPosition)
    if (initPos.length != 0) {
        throw "策略启动时有持仓!"
    }
    
    exchange.SetPrecision(pricePrecision, amountPrecision)
    Log("设置精度", pricePrecision, amountPrecision)
    
    if (!IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = _C(exchange.GetAccount).Balance   // equity
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "获取初始权益失败"
            }
        } else {
            totalEq = recoverTotalEq
        }
    } else {
        totalEq = _C(exchange.GetAccount).Balance
    }
    
    while (1) {
        if (openPrice == 0) {
            // 更新账户信息,计算收益
            var nowAcc = _C(exchange.GetAccount)
            nowEq = IsVirtual() ? nowAcc.Balance : nowAcc.Balance  // equity
            LogProfit(nowEq - totalEq, nowAcc)
            
            var direction = Math.floor((Math.random()*100)+1)   // 1~50 , 51~100
            var depth = _C(exchange.GetDepth)
            if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
                Sleep(1000)
                continue 
            }
            if (direction > 50) {
                // long
                openPrice = depth.Bids[1].Price
                exchange.SetDirection("buy")
                exchange.Buy(Math.abs(openPrice) + slidePrice, amount * ratio)
            } else {
                // short
                openPrice = -depth.Asks[1].Price
                exchange.SetDirection("sell")
                exchange.Sell(Math.abs(openPrice) - slidePrice, amount * ratio)
            }       
            Log("下", direction > 50 ? "买单" : "卖单", ",价格:", Math.abs(openPrice))
            continue
        }

        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            var pos = _C(exchange.GetPosition)
            if (pos.length == 0) {
                openPrice = 0
                continue
            }
            
            // 平仓检测
            while (1) {
                var depth = _C(exchange.GetDepth)
                if (depth.Asks.length <= 2 || depth.Bids.length <= 2) {
                    Sleep(1000)
                    continue 
                }
                var stopLossPrice = openPrice > 0 ? Math.abs(openPrice) - stopLoss : Math.abs(openPrice) + stopLoss 
                var stopProfitPrice = openPrice > 0 ? Math.abs(openPrice) + stopProfit : Math.abs(openPrice) - stopProfit
                var winOrLoss = 0 // 1 win , -1 loss 
                
                // 画线
                $.PlotLine("bid", depth.Bids[0].Price)
                $.PlotLine("ask", depth.Asks[0].Price)
                
                // 止损
                if (openPrice > 0 && depth.Bids[0].Price < stopLossPrice) {
                    exchange.SetDirection("closebuy")
                    exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)
                    winOrLoss = -1
                } else if (openPrice < 0 && depth.Asks[0].Price > stopLossPrice) {
                    exchange.SetDirection("closesell")
                    exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
                    winOrLoss = -1
                }
                
                // 止盈
                if (openPrice > 0 && depth.Bids[0].Price > stopProfitPrice) {
                    exchange.SetDirection("closebuy")
                    exchange.Sell(depth.Bids[0].Price - slidePrice, pos[0].Amount)  
                    winOrLoss = 1
                } else if (openPrice < 0 && depth.Asks[0].Price < stopProfitPrice) {
                    exchange.SetDirection("closesell")
                    exchange.Buy(depth.Asks[0].Price + slidePrice, pos[0].Amount)
                    winOrLoss = 1
                }
                
                // 检测挂单
                Sleep(2000)
                var orders = _C(exchange.GetOrders)                
                if (orders.length == 0) {
                    pos = _C(exchange.GetPosition)
                    if (pos.length == 0) {
                        if (winOrLoss == -1) {
                            ratio++
                        } else if (winOrLoss == 1) {
                            ratio = 1
                        }
                        break
                    }                    
                } else {
                    // 撤销挂单
                    cancelAll()
                    Sleep(2000)
                    pos = _C(exchange.GetPosition)
                    // 撤销后更新持仓,需要再次检查
                    if (pos.length == 0) {
                        if (winOrLoss == -1) {
                            ratio++
                        } else if (winOrLoss == 1) {
                            ratio = 1
                        }
                        break
                    }    
                }
                
                var tbl = {
                    "type" : "table", 
                    "title" : "info", 
                    "cols" : ["totalEq", "nowEq", "openPrice", "bid1Price", "ask1Price", "ratio", "pos.length"], 
                    "rows" : [], 
                }
                tbl.rows.push([totalEq, nowEq, Math.abs(openPrice), depth.Bids[0].Price, depth.Asks[0].Price, ratio, pos.length])
                tbl.rows.push(["pos", "type", "amount", "price", "--", "--", "--"])
                for (var j = 0 ; j < pos.length ; j++) {
                    tbl.rows.push([j, pos[j].Type, pos[j].Amount, pos[j].Price, "--", "--", "--"])
                }
                LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
            }
        } else {
            // 撤销挂单
            // 重置openPrice
            cancelAll()
            openPrice = 0
        }
        Sleep(1000)
    }
}

Các tham số chiến lược:

img

Bạn có thể đặt tên cho công cụ này là "đánh giá kích thước" (dYdX version) hay "đánh giá kích thước" (dYdX version).

Kiểm tra lại

Đánh giá lại chỉ để tham khảo, >_

img

img

img

img

Kết thúc kiểm tra, không có BUG. Nhưng tôi cảm thấy mình có phù hợp với hệ thống kiểm tra không... T_T, thực sự đang chạy và chơi.

Chạy thật

img

img

img

Các chiến lược này chỉ dành cho mục đích học tập, tham khảo, và nghiên cứu.Không.~Không.Đừng sử dụng đĩa thật!


Có liên quan

Thêm nữa

XionglonghuiBạn có thể hỏi, liệu sàn giao dịch phi tập trung dydx hiện nay có hỗ trợ giao dịch trực tiếp không? Hay chỉ có hợp đồng vĩnh viễn? Không bao giờ sử dụng sàn giao dịch phi tập trung, nếu sàn giao dịch phi tập trung dydx hỗ trợ giao dịch trực tiếp, bạn có thể xem xét một chiến lược giao dịch lưới giao dịch trực tiếp.

hyc1743Một người da trắng, xin vui lòng hỏi tại sao anh không chạy lên.

Những nhà phát minh định lượng - những giấc mơ nhỏDYdX là công khai của tôi có một đĩa thật, hợp đồng vĩnh viễn.

Những nhà phát minh định lượng - những giấc mơ nhỏMã nguồn chiến lược chỉ là mã chiến lược, và các tham số được cấu hình trên đó. Các tham số có hình ảnh chụp trong bài viết.