[TOC] Em 2020, escrevi um artigo sobre estratégias de alta frequência.https://www.fmz.com/digest-topic/6228Apesar de ter recebido muita atenção, não escrevi em profundidade. Mais de dois anos se passaram e o mercado também mudou. Após o lançamento do artigo, minha estratégia de alta frequência ganhou dinheiro estável por um longo tempo, mas os lucros lentamente diminuíram e até mesmo foram interrompidos.
A taxa de comissão é de 5 por cento das centenas de milhares de euros, se o volume de negociação é de 100 milhões de euros por dia. Claro que o tomador é baseado em taxas VIP, então se a estratégia não precisa ser paga, o nível VIP não tem grande impacto sobre a estratégia de alta frequência. Em geral, diferentes níveis de negociação têm taxas de comissão diferentes e precisam manter taxas de negociação mais altas.
Velocidade. A política de alta freqüência é chamada de alta freqüência porque é rápida. A adesão ao servidor colo da bolsa, para obter o menor atraso e a conexão mais estável, também é um dos requisitos do interior. O tempo interno da política também deve ser o menor possível.
O mercado adequado. O comércio de alta frequência é conhecido como a pérola do comércio quantitativo. Acredito que muitos comerciantes programados já tentaram, mas a maioria deve parar porque não ganha dinheiro e não consegue encontrar uma direção para melhorar. A principal razão deve ser encontrar o mercado de negociação errado.
Enfrentar a concorrência. O mercado de qualquer negociação é dinâmico, não há estratégias de negociação que possam ser de uma vez por todas, o comércio de alta frequência é mais evidente, entrar neste mercado é competir diretamente com um grupo de comerciantes mais inteligentes e mais diligentes. Em um mercado zero e brincalhão, você ganha mais do que os outros ganham menos.
A estratégia de alta frequência é dividida em vários tipos
Minha estratégia é uma combinação de tendências e mercado, primeiro julgar a tendência, depois colocar a ordem, vender imediatamente após a transação, sem manter a posição de estoque.
O código abaixo é baseado em uma estrutura de contratos perpétuos baseada no Bitcoin, que subscreve principalmente o fluxo de transações de ordens de profundidade do websocket, bem como informações de posição. Como as informações de mercado e de conta são assinadas separadamente, é necessário usar o read (-1) para determinar se há acesso a informações atualizadas, onde o EventLoop (1000) é usado, evitando um ciclo morto direto, reduzindo o ônus do sistema.
var datastream = null
var tickerstream = null
var update_listenKey_time = 0
function ConncetWss(){
if (Date.now() - update_listenKey_time < 50*60*1000) {
return
}
if(datastream || tickerstream){
datastream.close()
tickerstream.close()
}
//需要APIKEY
let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY)
let listenKey = JSON.parse(req).listenKey
datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
//Symbols是设定的交易对
let trade_symbols_string = Symbols.toLowerCase().split(',')
let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
tickerstream = Dial(wss_url+"|reconnect=true", 60)
update_listenKey_time = Date.now()
}
function ReadWss(){
let data = datastream.read(-1)
let ticker = tickerstream.read(-1)
while(data){
data = JSON.parse(data)
if (data.e == 'ACCOUNT_UPDATE') {
updateWsPosition(data)
}
if (data.e == 'ORDER_TRADE_UPDATE'){
updateWsOrder(data)
}
data = datastream.read(-1)
}
while(ticker){
ticker = JSON.parse(ticker).data
if(ticker.e == 'aggTrade'){
updateWsTrades(ticker)
}
if(ticker.e == 'depthUpdate'){
updateWsDepth(ticker)
}
ticker = tickerstream.read(-1)
}
makerOrder()
}
function main() {
while(true){
ConncetWss()
ReadWss()
worker()
updateStatus()
EventLoop(1000)
}
}
Como mencionado anteriormente, a minha estratégia de alta frequência requer a determinação da tendência e a execução de compras. A determinação da tendência de curto prazo é baseada principalmente nos dados de transação por transação, ou seja, o aggTrade na assinatura, que inclui a direção, o preço, o volume, o tempo de transação, etc. As principais referências de compras são a profundidade e o volume de transações. Os indicadores a serem considerados em detalhes abaixo, a maioria dos indicadores são divididos em dois grupos de compras e vendas e são estatísticas dinâmicas em uma determinada janela de tempo, a janela de tempo da minha estratégia é de menos de 10 segundos.
//bull代表短期看涨,bear短期看跌
let bull = last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear = last_sell_price < avg_sell_price && last_buy_price < avg_buy_price &&
avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;
Se o preço de venda mais recente for maior que o preço médio da encomenda, o preço de compra mais recente for maior que o preço médio da encomenda e o valor da encomenda de intervalo fixo for maior do que o valor da encomenda, então julgue se é positivo no curto prazo.
function updatePrice(depth, bid_amount, ask_amount) {
let buy_price = 0
let sell_price = 0
let acc_bid_amount = 0
let acc_ask_amount = 0
for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
acc_bid_amount += parseFloat(depth.bids[i][1])
acc_ask_amount += parseFloat(depth.asks[i][1])
if (acc_bid_amount > bid_amount && buy_price == 0) {
buy_price = parseFloat(depth.bids[i][0]) + tick_size
}
if (acc_ask_amount > ask_amount && sell_price == 0) {
sell_price = parseFloat(depth.asks[i][0]) - tick_size
}
if (buy_price > 0 && sell_price > 0) {
break
}
}
return [buy_price, sell_price]
}
Aqui, ainda assim, tomando o pensamento antigo, a profundidade de repetição para a quantidade necessária, aqui, assumindo que o pagamento de 10 reais pode ser feito dentro de 1s, sem considerar o novo pedido, o preço do pedido de venda é definido como o local onde o pedido de 10 reais é atingido.
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Ratio representa uma proporção fixa, representando o volume de compra como uma proporção fixa do número de pedidos vendidos recentemente. Esta estratégia pode se adaptar para ajustar o tamanho do pedido de acordo com a atividade atual de compra e venda.
if(bull && (sell_price-buy_price) > N * avg_diff) {
trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) > N * avg_diff) {
trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
trade('sell', sell_price, position.amount)
}
A diferença é a diferença do preço médio de transação, e só é paga quando o preço da compra e venda é maior do que um certo múltiplo deste valor e quando o preço é bom. Se houver um pedido vazio, também será estabilizado, evitando o recibo de longo prazo. O pedido pode ser feito apenas por um fabricante, garantindo a transação do pedido.
var tasks = []
var jobs = []
function worker(){
let new_jobs = []
for(let i=0; i<tasks.length; i++){
let task = tasks[i]
jobs.push(exchange.Go.apply(this, task.param))
}
_.each(jobs, function(t){
let ret = t.wait(-1)
if(ret === undefined){
new_jobs.push(t)//未返回的任务下次继续等待
}
})
jobs = new_jobs
tasks = []
}
/*
需要的任务参数写在param里
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
"symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
amount+"&price="+price+"&newClientOrderId=" + UUID() +"×tamp="+Date.now()]})
*/
mztcoinPergunte a Grasshopper, qual é a lógica da venda? A venda imediata após a transação, sem armazenamento de estoque, significa que a listagem no mesmo ciclo de for, qual o preço da venda, sem transação?
mztcoinDeus da Erva
DANGOUO deus das ervas
77924998Qual é o servidor AWS usado pela Grasshopper?
XukittyO que é o que você quer?
BvxiaokO Grasshopper é um programa de alta frequência pago.
Eu ainda tenho o coração.A estratégia de fazer cópias é útil?
Escrito por TradeManA primeira coisa que eu faço é chamar o Grasshopper, para que ele possa ensinar mais e aprender a entrar em negociações de alta frequência.
♪ Uma onda no sopro do vento ♪O que é que ele faz?
FmzeroO deus da grama é arrogante!
Quantificação de óculosO que é que ele faz?
Ervas daninhasÉ muito difícil, não faz muito sentido.