4
Подписаться
1271
Подписчики

Обсуждение разработки высокочастотной стратегии с точки зрения модифицированного комбайна для уборки лука-порея

Создано: 2021-03-09 13:41:54, Обновлено: 2023-09-26 20:53:41
comments   21
hits   8484

Обсуждение разработки высокочастотной стратегии с точки зрения модифицированного комбайна для уборки лука-порея

Обсуждение разработки высокочастотной стратегии с точки зрения модифицированного комбайна для уборки лука-порея

В предыдущих статьях мы проанализировали идеи и реализацию кода оригинальной точечной версии высокочастотной стратегии уборки лука-порея.

Анализ стратегии уборки лука-порея (1) Анализ стратегии уборки лука-порея (2)

Многие пользователи количественной оценки валютного круга больше обеспокоеныprint moneyСтратегия босса,print moneyСтратегия босса — торговать контрактами USDT на Binance. Из наблюдений и анализа многих последователей видно, что эта высокочастотная стратегия похожа на принцип работы комбайна для уборки лука-порея (Цао Шэнь также сказал, что принципы высокочастотных стратегий относительно близки). Но, безусловно, существуют тонкости, которые могут гарантировать, что стратегия будет иметь стабильный процент выигрышей и соответствующее соотношение прибылей и убытков.

Поэтому редактор, которому не терпелось блеснуть своим мастерством, не мог не внести некоторые изменения, хотя эффект измененной стратегии был сведен на нет стратегиями мастеров. Но это также можно рассматривать как изучение и практику высокочастотных стратегий. Заинтересованные FMZers могут обсуждать и учиться вместе.

Модифицированный комбайн для уборки лука-порея

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

Обсуждение разработки высокочастотной стратегии с точки зрения модифицированного комбайна для уборки лука-порея

Идеи модификации стратегии

Стратегия заключается в планировании использования торговли на рынке контрактов Binance USDT. Контракты Binance поддерживают односторонние позиции. Поэтому стратегия модифицирована и разработана с учетом особенностей односторонних позиций (односторонние позиции более удобны для модификации стратегии), без учета закрытия позиций, а только с учетом покупки и продажи. Эта идея ближе к точечному варианту комбайна для уборки лука-порея.

Стратегия в основном сохраняет исходные критерии оценки прорыва краткосрочного ценового тренда, а диапазон краткосрочного прорыва цены определяется параметромburstThresholdPctКонтроль, согласно этому условию суждения, краткосрочная цена равнаbull(корова), илиbear(Медведь).

Стратегия удаляет некоторые модули из исходной версии, например, модуль баланса. Самым большим изменением стало то, что заказ был изменен на размещение заказа в книге заказов и ожидание завершения транзакции. Ожидается, что он откроет позицию по более низкой цене на хаотичном рынке, где длинные и короткие игры являются ожесточенными, будет следовать краткосрочному тренду, закроет позицию, когда краткосрочный тренд развернется, и продолжит открывать позиции с обратными ордерами. .

Стратегия удаляет другие бесполезные коды, поэтому она очень короткая и простая. Хотя эта стратегия не приносит прибыли и даже приносит убытки, она представляет собой модель, которую FMZ-специалисты могут использовать для изучения высокочастотных стратегий, наблюдения за поведением высокочастотных стратегий и наблюдения за микрозаконами рынка. Алгоритмическая торговля и количественная торговля требуют большой практики, опыта и теории в качестве основы.

Пробегитесь на некоторое время

Обсуждение разработки высокочастотной стратегии с точки зрения модифицированного комбайна для уборки лука-порея

Видно, что открывать и закрывать позиции сложнее, когда рынок неактивен.

Оптимизация стратегии

В настоящее время не найдено ни одного подходящего направления оптимизации. Заинтересованные студенты могут высказаться и обсудить эту тему вместе.

Адрес стратегии: https://www.fmz.com/strategy/260806

Эта стратегия предназначена только для учебных целей, и реальная торговля может привести к убыткам, если рынок вялый.