
В предыдущих статьях мы проанализировали идеи и реализацию кода оригинальной точечной версии высокочастотной стратегии уборки лука-порея.
Анализ стратегии уборки лука-порея (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
Эта стратегия предназначена только для учебных целей, и реальная торговля может привести к убыткам, если рынок вялый.