
Nos artigos anteriores, analisamos as ideias e a implementação do código da versão spot original da estratégia de alta frequência do colhedor de alho-poró.
Análise da estratégia da colheitadeira de alho-poró (1) Análise da estratégia da colheitadeira de alho-poró (2)
Muitos usuários da quantificação do círculo monetário estão mais preocupados comprint moneyA estratégia do chefe,print moneyA estratégia do chefe é negociar contratos Binance USDT. A partir de observações e análises de muitos seguidores, pode-se ver que essa estratégia de alta frequência é semelhante ao princípio de uma colheitadeira de alho-poró (Cao Shen também disse que os princípios das estratégias de alta frequência são relativamente próximos). Mas definitivamente há sutilezas que podem garantir que a estratégia tenha uma taxa de vitória estável e uma relação de lucros e perdas apropriada.
Então, o editor, ansioso para mostrar suas habilidades, não pôde deixar de fazer algumas modificações, embora o efeito da estratégia modificada tenha sido esmagado até as cinzas pelas estratégias dos mestres. Mas também pode ser considerado como um aprendizado e prática de estratégias de alta frequência. FMZers interessados podem discutir e aprender juntos.
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)
}
}

A estratégia é planejar usar negociação no mercado de contratos USDT da Binance. Os contratos da Binance suportam posições unidirecionais. Portanto, a estratégia é modificada e desenhada de acordo com as características das posições unidirecionais (posições unidirecionais são mais convenientes para modificação da estratégia), sem considerar o fechamento de posições, considerando apenas a compra e a venda. Essa ideia está mais próxima da versão pontual da colhedora de alho-poró.
A estratégia basicamente retém os critérios originais de julgamento de rompimento da tendência de preço de curto prazo, e a faixa de rompimento do preço de curto prazo é determinada pelo parâmetroburstThresholdPctControle, de acordo com esta condição de julgamento, o preço de curto prazo ébull(vaca), oubear(Urso).
A estratégia remove alguns módulos da versão original, como o módulo de equilíbrio. A maior mudança é que a ordem foi alterada para colocar uma ordem no livro de ordens e aguardar a conclusão da transação. Espera-se abrir uma posição a um custo menor em um mercado caótico onde os jogos longos e curtos são ferozes, seguir a tendência de curto prazo, fechar a posição quando a tendência de curto prazo se reverter e continuar a abrir posições com ordens reversas .
A estratégia remove outros códigos inúteis, por isso é muito curta e simples. Embora a estratégia não seja lucrativa e até mesmo cause prejuízos, é um modelo que pode ser usado por FMZers para aprender estratégias de alta frequência, observar o comportamento de estratégias de alta frequência e observar as microleis do mercado. A negociação algorítmica e a negociação quantitativa exigem muita prática, experiência e teoria como base.

Pode-se observar que é mais difícil abrir e fechar posições quando o mercado não está ativo.
Atualmente, nenhuma boa direção de otimização foi encontrada. Os alunos interessados são bem-vindos para falar e discutir juntos.
Endereço estratégico: https://www.fmz.com/strategy/260806
Essa estratégia serve apenas para fins de aprendizado, e a negociação real pode resultar em perdas se o mercado estiver estável.