¿Qué es esto? En 2020, escribí un artículo sobre estrategias de alta frecuencia, y en ese artículo, me refería a las estrategias de alta frecuencia.https://www.fmz.com/digest-topic/6228Aunque recibieron mucha atención, no escribieron en profundidad. Pasaron más de dos años y el mercado también cambió. Después de la publicación del artículo, mi estrategia de alta frecuencia generó ganancias estables durante mucho tiempo, pero las ganancias lentas disminuyeron gradualmente o incluso se suspendieron.
Las cuentas con comisiones de retorno, por ejemplo, en el caso de la moneda china, la comisión de retorno de los fabricantes es de 5 por ciento de las 100.000, si el volumen de operaciones diarias es de 100 millones de U, la comisión de retorno es de 5000 U. Por supuesto, el tomador también se basa en la tasa VIP, por lo que si la estrategia no necesita pagar, la categoría VIP no tiene gran influencia en la estrategia de alta frecuencia. En general, los intercambios de diferentes grados tienen diferentes tasas de retorno, que necesitan mantener un alto volumen de transacciones.
La velocidad. La política de alta frecuencia se llama alta frecuencia porque es rápida. Unirse a un servidor de color de intercambio para obtener la menor demora y la conexión más estable también es una de las condiciones para el volumen interno.
El mercado adecuado. El comercio de alta frecuencia se conoce como la perla del comercio cuantitativo, y creo que muchos operadores programados lo han intentado, pero la mayoría de las personas deberían detenerse porque no ganan dinero y no encuentran una dirección para mejorar, la principal razón debería ser encontrar el mercado de operaciones equivocado. La etapa inicial de la estrategia debe buscar un mercado relativamente fácil para ganar dinero para operar, de modo que sea beneficioso y tenga una mejor retroalimentación que favorezca el progreso de la estrategia.
Enfrentarse a la competencia. Cualquier mercado de operaciones es dinámico, no hay estrategias de negociación que puedan ser una vez y para siempre, el comercio de alta frecuencia es más evidente, entrar en este mercado es competir directamente con un grupo de los operadores más inteligentes y diligentes. En un mercado de cero y juego, más ganas que los demás, menos ganas.
Las estrategias de alta frecuencia se dividen en varias.
Mi estrategia es una combinación de tendencias y vendedores, primero juzgar la tendencia, luego hacer el pedido, vender el pedido inmediatamente después de la transacción, sin mantener el inventario, a continuación se presenta el código de la estrategia combinada.
El siguiente código, basado en la arquitectura de los contratos perpetuos de Binance, se suscribe principalmente a la información de posición y al flujo de órdenes de operaciones de profundidad del websocket. Debido a que la información del mercado y la información de la cuenta son suscripciones separadas, se necesita leer constantemente para determinar si se obtiene la información más reciente, aquí se utiliza EventLoop (1000), evitando un ciclo muerto directo y reduciendo la carga del sistema. EventLoop (1000) se bloquea con WSS o envía tareas de retorno simultáneas con un tiempo superior a 1000 ms.
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 se mencionó anteriormente, mi estrategia de alta frecuencia requiere determinar la tendencia antes de ejecutar la compra. Juzgar la tendencia a corto plazo se basa principalmente en los datos de transacción por transacción, es decir, aggTrade en la suscripción, que incluye la dirección de la transacción, el precio, la cantidad, el tiempo de transacción, etc. Las principales referencias de compra son la profundidad y el volumen de transacción.
//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;
Si el precio de venta más reciente es mayor que el precio promedio de la orden de venta, el precio de compra más reciente es mayor que el precio promedio de la orden de compra, el valor de la compra de intervalo fijo es mayor que el valor de la orden de venta, entonces se decide si es positivo o negativo en el corto plazo.
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]
}
Aquí, tomando el viejo pensamiento, se repite la profundidad hasta la cantidad requerida, aquí se supone que se puede negociar un pago de 10 monedas en 1s, sin tener en cuenta el nuevo pedido, el precio del pedido de venta se establece en la posición en la que el pedido de 10 monedas choca. ¿Cuánta ventana de tiempo precisa se necesita establecer?
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Ratio representa una proporción fija, es decir, el volumen de compra representa una proporción fija del número de pedidos vendidos recientemente. Esta estrategia se adapta a su tamaño de pedido según la actividad de compra y venta actual.
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)
}
Donde avg_diff es la diferencia del precio medio de la cuenta, sólo cuando el precio de compra y venta es mayor que un determinado valor multiplicado por este valor y se paga en el momento oportuno, si se mantiene un pedido vacío, también se estabilizará, evitando el recibo a largo plazo.
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()]})
*/
el mztcoin¿Cuál es la lógica de la venta? ¿Cuál es la lógica de la venta? ¿Cuál es la lógica de la venta?
el mztcoinEl dios de la hierba es agresivo
El DangoDios de la hierba
77924998¿Cuál es el servidor de AWS que usa Grasshopper?
¿Qué quieres decir?La fuerza de la fuerza.
¿Qué es eso?¿Por qué Grasshopper no ofrece un programa de alta frecuencia pagado?
Mi corazón todavía está.¿Será útil esta estrategia si se puede hacer una copia?
Escrito por TradeManLlamando a Grasshopper, con la esperanza de enseñar más, aprender a entrar en el comercio de alta frecuencia
# Una ola en la ventana #El hombre de las calles
No hay nada.¡El dios de la hierba es fuerte!
Cuantificación de orcsEl hombre de las calles
Las hierbasEs muy difícil y no tiene mucho sentido.