avatar of 发明者量化-小小梦 发明者量化-小小梦
tập trung vào tin nhắn riêng tư
4
tập trung vào
1271
Người theo dõi

Thảo luận về thiết kế chiến lược tần số cao từ góc nhìn của máy thu hoạch tỏi tây đã được cải tiến

Được tạo ra trong: 2021-03-09 13:41:54, cập nhật trên: 2023-09-26 20:53:41
comments   21
hits   8484

Thảo luận về thiết kế chiến lược tần số cao từ góc nhìn của máy thu hoạch tỏi tây đã được cải tiến

Thảo luận về thiết kế chiến lược tần số cao từ góc nhìn của máy thu hoạch tỏi tây đã được cải tiến

Trong các bài viết trước, chúng tôi đã phân tích các ý tưởng và triển khai mã của phiên bản gốc của chiến lược thu hoạch tỏi tây tần suất cao.

Phân tích Chiến lược thu hoạch tỏi tây (1) Phân tích Chiến lược thu hoạch tỏi tây (2)

Nhiều người sử dụng định lượng vòng tròn tiền tệ quan tâm nhiều hơn đếnprint moneyChiến lược của ông chủ,print moneyChiến lược của ông chủ là giao dịch hợp đồng USDT trên Binance. Qua quan sát và phân tích của nhiều người theo dõi, có thể thấy rằng chiến lược tần số cao này tương tự như nguyên lý của máy gặt tỏi tây (Cao Shen cũng cho biết nguyên lý của chiến lược tần số cao tương đối gần nhau). Nhưng chắc chắn có những điều tinh tế có thể đảm bảo rằng chiến lược này có tỷ lệ chiến thắng ổn định và tỷ lệ lợi nhuận/thua lỗ phù hợp.

Vì vậy, biên tập viên đang nóng lòng muốn thể hiện kỹ năng của mình không thể không thực hiện một số sửa đổi, mặc dù hiệu quả của chiến lược đã sửa đổi đã bị chiến lược của các bậc thầy nghiền nát thành tro bụi. Nhưng nó cũng có thể được coi là việc học và thực hành các chiến lược tần số cao. Những người FMZ quan tâm có thể thảo luận và học hỏi cùng nhau.

Máy gặt tỏi tây cải tiến

var TickInterval = 100

function LeeksReaper() {
    var self = {}
    self.numTick = 0
    self.lastTradeId = 0
    self.vol = 0
    self.askPrice = 0
    self.bidPrice = 0
    self.orderBook = {
        Asks: [],
        Bids: []
    }
    self.prices = []
    self.tradeOrderId = 0
    self.account = null
    self.buyPrice = 0
    self.sellPrice = 0
    self.state = 0
    self.depth = null

    self.updateTrades = function() {
        var trades = _C(exchange.GetTrades)
        if (self.prices.length == 0) {
            while (trades.length == 0) {
                trades = trades.concat(_C(exchange.GetTrades))
            }
            for (var i = 0; i < 15; i++) {
                self.prices[i] = trades[trades.length - 1].Price
            }
        }
        self.vol = 0.7 * self.vol + 0.3 * _.reduce(trades, function(mem, trade) {
            // Huobi not support trade.Id
            if ((trade.Id > self.lastTradeId) || (trade.Id == 0 && trade.Time > self.lastTradeId)) {
                self.lastTradeId = Math.max(trade.Id == 0 ? trade.Time : trade.Id, self.lastTradeId)
                mem += trade.Amount
            }
            return mem
        }, 0)

    }
    self.updateOrderBook = function() {
        var orderBook = _C(exchange.GetDepth)
        self.depth = orderBook
        self.buyPrice = orderBook.Bids[pendingLevel].Price
        self.sellPrice = orderBook.Asks[pendingLevel].Price
        self.orderBook = orderBook
        if (orderBook.Bids.length < 3 || orderBook.Asks.length < 3) {
            return
        }
        self.bidPrice = orderBook.Bids[0].Price * 0.618 + orderBook.Asks[0].Price * 0.382 + 0.01
        self.askPrice = orderBook.Bids[0].Price * 0.382 + orderBook.Asks[0].Price * 0.618 - 0.01
        self.prices.shift()
        self.prices.push(_N((orderBook.Bids[0].Price + orderBook.Asks[0].Price) * 0.15 +
            (orderBook.Bids[1].Price + orderBook.Asks[1].Price) * 0.1 +
            (orderBook.Bids[2].Price + orderBook.Asks[2].Price) * 0.1 +
            (orderBook.Bids[3].Price + orderBook.Asks[3].Price) * 0.075 +
            (orderBook.Bids[4].Price + orderBook.Asks[4].Price) * 0.05 +
            (orderBook.Bids[5].Price + orderBook.Asks[5].Price) * 0.025))
    }

    self.updateAccount = function() {
        var account = exchange.GetAccount()
        if (!account) {
            return
        }
        self.account = account
        LogProfit(parseFloat(account.Info.totalWalletBalance), account)
    }

    self.CancelAll = function() {
        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)
            }
            Sleep(100)
        }
    }

    self.poll = function() {
        self.numTick++
        self.updateTrades()
        self.updateOrderBook()
        var pos = _C(exchange.GetPosition)

        var burstPrice = self.prices[self.prices.length - 1] * burstThresholdPct
        var bull = false
        var bear = false
        LogStatus(_D(), "\n", 'Tick:', self.numTick, 'self.vol:', self.vol, ', lastPrice:', self.prices[self.prices.length - 1], ', burstPrice: ', burstPrice)

        if (self.numTick > 2 && (
                self.prices[self.prices.length - 1] - _.max(self.prices.slice(-6, -1)) > burstPrice ||
                self.prices[self.prices.length - 1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length - 1] > self.prices[self.prices.length - 2]
            )) {
            bull = true
        } else if (self.numTick > 2 && (
                self.prices[self.prices.length - 1] - _.min(self.prices.slice(-6, -1)) < -burstPrice ||
                self.prices[self.prices.length - 1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length - 1] < self.prices[self.prices.length - 2]
            )) {
            bear = true            
        }

        if (pos.length != 0) {
            if (pos[0].Type == PD_LONG) {
                self.state = 1
            } else {
                self.state = 2
            }
        } else {
            self.state = 0
        }


        if ((!bull && !bear)) {
            return
        }

        if (bull) {
            var price = (self.state == 0 || self.state == 1) ? self.buyPrice : self.depth.Bids[coverPendingLevel].Price
            var amount = (self.state == 0 || self.state == 1) ? pendingAmount : pos[0].Amount
            exchange.SetDirection("buy")
            exchange.Buy(price, amount)
        } else if (bear) {
            var price = (self.state == 0 || self.state == 2) ? self.sellPrice : self.depth.Asks[coverPendingLevel].Price
            var amount = (self.state == 0 || self.state == 2) ? pendingAmount : pos[0].Amount
            exchange.SetDirection("sell")
            exchange.Sell(price, amount)                    
        }
        self.numTick = 0
        Sleep(TickInterval)
        self.CancelAll()
        self.updateAccount()
    }

    while (!self.account) {
        self.updateAccount()
        Sleep(500)
    }
    Log("self.account:", self.account)

    return self
}

function main() {
    LogProfitReset()
    exchange.SetPrecision(pricePrecision, amountPrecision)
    exchange.SetContractType("swap")
    var reaper = LeeksReaper()  
    while (true) {
        reaper.poll()
        Sleep(100)
    }
}

Thảo luận về thiết kế chiến lược tần số cao từ góc nhìn của máy thu hoạch tỏi tây đã được cải tiến

Ý tưởng sửa đổi chiến lược

Chiến lược là lên kế hoạch sử dụng giao dịch trên thị trường hợp đồng Binance USDT. Hợp đồng Binance hỗ trợ các vị thế một chiều. Do đó, chiến lược được sửa đổi và thiết kế theo đặc điểm của vị thế một chiều (vị thế một chiều thuận tiện hơn cho việc sửa đổi chiến lược), không xét đến việc đóng vị thế, chỉ xét đến việc mua và bán. Ý tưởng này gần giống với phiên bản thu hoạch tỏi tây tại chỗ.

Chiến lược này về cơ bản vẫn giữ nguyên tiêu chí đánh giá đột phá xu hướng giá ngắn hạn ban đầu và phạm vi đột phá giá ngắn hạn được xác định bởi tham sốburstThresholdPctKiểm soát, theo điều kiện phán đoán này, giá ngắn hạn làbull(bò), hoặcbear(Con gấu).

Chiến lược này loại bỏ một số mô-đun khỏi phiên bản gốc, chẳng hạn như mô-đun cân bằng. Thay đổi lớn nhất là lệnh đã được thay đổi thành đặt lệnh trong sổ lệnh và chờ giao dịch hoàn tất. Dự kiến ​​sẽ mở một vị thế với chi phí thấp hơn trong một thị trường hỗn loạn, nơi các trò chơi dài hạn và ngắn hạn diễn ra khốc liệt, theo xu hướng ngắn hạn, đóng vị thế khi xu hướng ngắn hạn đảo ngược và tiếp tục mở các vị thế với các lệnh đảo ngược. .

Chiến lược này loại bỏ các mã vô dụng khác nên rất ngắn gọn và đơn giản. Mặc dù chiến lược này không có lợi nhuận và thậm chí còn thua lỗ, nhưng đây là mô hình mà các FMZer có thể sử dụng để tìm hiểu các chiến lược tần suất cao, quan sát hành vi của các chiến lược tần suất cao và quan sát các quy luật vi mô của thị trường. Giao dịch thuật toán và giao dịch định lượng đòi hỏi rất nhiều thực hành, kinh nghiệm và lý thuyết làm cơ sở.

Chạy một lúc

Thảo luận về thiết kế chiến lược tần số cao từ góc nhìn của máy thu hoạch tỏi tây đã được cải tiến

Có thể thấy rằng việc mở và đóng vị thế sẽ khó khăn hơn khi thị trường không hoạt động.

Tối ưu hóa chiến lược

Hiện tại vẫn chưa tìm được hướng tối ưu hóa tốt. Những sinh viên quan tâm có thể phát biểu và thảo luận cùng nhau.

Địa chỉ chiến lược: https://www.fmz.com/strategy/260806

Chiến lược này chỉ nhằm mục đích học hỏi và giao dịch thực tế có thể dẫn đến thua lỗ nếu thị trường đi ngang.