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

Khám phá thiết kế chiến lược tần số cao từ sự thay đổi ma thuật của LeeksReaper

Tác giả:FMZ~Lydia, Tạo: 2022-11-07 18:05:04, Cập nhật: 2023-09-15 20:42:34

img

Trong các bài viết trước, chúng tôi đã phân tích ý tưởng và thực hiện mã của chiến lược tần số cao của phiên bản điểm gốc LeeksReaper.

Phân tích chiến lược của LeeksReaperhttps://www.fmz.com/bbs-topic/9725) Phân tích chiến lược của LeeksReaperhttps://www.fmz.com/bbs-topic/9733

Nhiều người sử dụng tiền kỹ thuật số chú ý nhiều hơn đến chiến lược của nhà lãnh đạo tiền in. Chiến lược của nhà lãnh đạo tiền in được giao dịch trong hợp đồng Binance USDT. Từ 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 tắc của LeeksReaper (nhà lãnh đạo Xiaocao cũng nói rằng nguyên tắc của các chiến lược tần số cao cũng tương tự). Nhưng phải có một cái gì đó tinh tế để đạt được tỷ lệ thắng ổn định và tỷ lệ lợi nhuận và lỗ thích hợp.

Vì vậy, tôi không thể không làm cho sự thay đổi ma thuật. Mặc dù tác động chiến lược của sự thay đổi ma thuật là tồi tệ hơn nhiều so với các chiến lược của các nhà lãnh đạo. Nó cũng là một thực hành học tập cho các chiến lược tần số cao. FMZer những người quan tâm sẽ thảo luận và học hỏi cùng nhau.

LeeksReaper sau sự thay đổi ma thuật.

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

img

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

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

Chiến lược về cơ bản giữ nguyên tiêu chí ban đầu của xu hướng giá ngắn hạn đột phá, được kiểm soát bởi các thông sốburstThresholdPCT, theo đó để đánh giá liệu giá ngắn hạn làbullhoặcbear.

Chiến lược loại bỏ một số mô-đun ban đầu, chẳng hạn như mô-đun cân đối. Nó dự kiến là mở một vị trí với chi phí thấp hơn trong một trò chơi dài / ngắn hỗn loạn, theo xu hướng ngắn hạn và đóng vị trí khi xu hướng ngắn hạn đảo ngược và tiếp tục mở vị trí với một lệnh chờ đảo ngược.

Chiến lược ngắn và đơn giản vì nó loại bỏ các mã vô dụng khác. Mặc dù chiến lược là một chiến lược không kiếm tiền, hoặc thậm chí mất tiền, nhưng như FMZer đang học chiến lược tần số cao, quan sát hành vi của chiến lược tần số cao, quan sát các quy luật vi mô của thị trường là một mô hình có thể được sử dụng.

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

Hiện tại, không có hướng tốt nào cho việc tối ưu hóa được tìm thấy. Một người quan tâm có thể để lại ý kiến của bạn và thảo luận cùng nhau.

Chiến lược từ:https://www.fmz.com/strategy/260806

Chiến lược này chỉ là để học hỏi, robot thực sự có thể có tổn thất khi thị trường không quá lạc quan.


Có liên quan

Thêm nữa