Type/to search
3
Follow
1505
Followers
Cómo explotar robots de venta sin sentido con una estrategia de alta frecuencia en 80 líneas de código
HFT
Created 2023-12-24 21:37:45  Updated 2023-12-26 15:40:23
 7
 5969

img

Observación de oportunidades

Recientemente, descubrí accidentalmente que el mercado de STORJ, una moneda de Binance, es muy extraño. El volumen de operaciones es muy grande y la frecuencia de operaciones es muy rápida. La línea K específica de un minuto es la siguiente. Puedes ver que El volumen de operaciones por minuto es bastante consistente y se puede ver una sombra inferior larga en la línea de minutos.
img
Al observar la línea K de 1 segundo de Binance, encontramos una pista. Alguien vendería entre 10 000 y 20 000 STORJ cada 5 o 7 segundos, sin importar el costo, y chocaría directamente con un pequeño agujero en la línea K. Se recuperaría en el interior. Esta operación fue obviamente realizada por un robot encargado por Iceberg. Esta operación de venta duró mucho tiempo y el monto total se estimó en decenas de millones de dólares. En muchos casos, el deslizamiento causado alcanzó 1/1000, lo que significa que el ejecutor de esta estrategia perdió decenas de miles de dólares. Solo por el deslizamiento de la transacción. Dólar. Sin embargo, estas operaciones mecánicas y transacciones activas crean oportunidades obvias para la creación de mercado y el scalping.
img

Con solo modificar la estrategia spot original de alta frecuencia, solo tomó unos minutos crear este robot que explota específicamente la venta sin sentido de órdenes iceberg.

Pensamiento estratégico

Dado que habrá ventas en el mercado cada pocos segundos, solo necesitamos encontrar una profundidad de 10 000 en el libro de órdenes de compra y colocar la orden por adelantado. De esta manera, cuando se vende este iceberg, existe una alta probabilidad de que el robot creador de mercado pueda recibirlo. En este momento, el comercio es muy activo y la caída instantánea del precio también desencadena algunas órdenes de compra. El mismo principio se aplica para colocar órdenes de venta y venderlas en consecuencia. Repita la operación. La frecuencia de las transacciones es muy alta, y aunque la tasa de retorno cada vez no es grande, el beneficio total sigue siendo considerable. Por supuesto, la premisa de todo es tener una cuenta con comisiones de transacción bajas. Si las comisiones de transacción por compra y venta son del 0,1%, entonces este espacio no es suficiente para pagar las comisiones de transacción.

Rendimiento de la estrategia

El funcionamiento de la estrategia es el siguiente. Al principio, no se imprimían las ganancias. Lo cambié esta tarde e imprimí las ganancias. El loco robot de ventas ha cambiado la cantidad a aproximadamente 5000 cada vez, por lo que el mejor período de arbitraje ya pasó. Al principio, puedes ganar entre 100 y 200 USD por hora. La clave es que no implica riesgos y es de bajo costo. Mirándolo desde el otro lado, en realidad hay muchas técnicas para órdenes iceberg. Si sabe cómo escribir una estrategia, puede escribir una en FMZ en solo una docena de minutos. Observe la profundidad de las órdenes de compra para determinar el tamaño de la orden y Precio y observar el tamaño de las órdenes de compra activas para ajustar el tamaño de las órdenes pendientes. Y la estrategia de confianza del iceberg con características como ocupar el mercado puede ahorrar fácilmente decenas de miles de dólares.

img

Código fuente de la estrategia

El código de estrategia es muy simple, sólo 80 líneas. Adecuado para principiantes. Algunos parámetros, como la precisión simple, están codificados en el programa. Puede modificarlos usted mismo. Los parámetros necesarios se muestran en la siguiente figura. Se recomienda guardarlos para usarlos en el futuro en caso de que el par de operaciones de intercambio Tiene otra transacción loca. Puedes cobrarles intereses en cualquier momento.
img

function CancelPendingOrders() { var orders = _C(exchange.GetOrders) for (var j = 0; j < orders.length; j++) { exchange.CancelOrder(orders[j].Id, orders[j]) } } function onexit(){ CancelPendingOrders() } function GetPrice(Type, Depth) { var sumAmount = 0 var checkAmount = Type == "Buy" ? CheckBuyAmount : CheckSellAmount var deep = Type == "Buy" ? Depth.Bids : Depth.Asks for(var i = 0; i < Math.min(20, deep.length); i++) { if(Type == "Buy" && deep[i].Price == lastBuyPrice && buyId){ sumAmount += deep[i].Amount - amountBuy //这里要减去自己的挂单 }else if(Type == "Sell" && deep[i].Price == lastSellPrice && sellId){ sumAmount += deep[i].Amount - amountSell }else{ sumAmount += deep[i].Amount } if(sumAmount >= checkAmount){ return deep[i].Price } } return deep[19].Price } function OnTick() { var depth = _C(exchange.GetDepth) var buyPrice = _N(Math.min(GetPrice("Buy", depth) + 0.0001, depth.Asks[0].Price-0.0001) , 4) //保证在盘口 var sellPrice = _N(Math.max(GetPrice("Sell", depth) - 0.0001, depth.Bids[0].Price+0.0001), 4) LogStatus('buy_price:'+buyPrice, ' sell price: '+sellPrice) if ((sellPrice - buyPrice) < DiffPrice) { buyPrice = 0 } if(sellPrice != lastSellPrice && sellId){ exchange.CancelOrder(sellId); sellId = 0 lastSellPrice = 0 } if(buyPrice != lastBuyPrice && buyId){ exchange.CancelOrder(buyId); buyId = 0 lastBuyPrice = 0 } var acc = _C(exchange.GetAccount) if(account.Stocks+account.FrozenStocks != acc.Stocks+acc.FrozenStocks){ LogProfit((acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance - 2000) Log('free '+acc.Stocks, ' lock: '+ acc.FrozenStocks, ' total: ' , (acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance) } account = acc amountBuy = _N(Math.min(account.Balance / buyPrice - 0.1, Amount), 0) amountSell = _N(account.Stocks, 0) if (sellPrice > 0 && amountSell > 40 && sellId == 0) { sellId = exchange.Sell(_N(sellPrice,4), amountSell) lastSellPrice = sellPrice } if (buyPrice>0 && amountBuy > 40 && buyId == 0) { buyId = exchange.Buy(_N(buyPrice,4), amountBuy) lastBuyPrice = buyPrice } Sleep(Interval) } var account = {Stocks:0, FrozenStocks:0, Balance:0, FrozenBalance:0} var buyId = 0 var sellId = 0 var lastBuyPrice = 0 var lastSellPrice = 0 var amountSell = 0 var amountBuy = 0 function main() { CancelPendingOrders() while (true) { OnTick() } }
Comment
All comments (7)

    复刻出来了,测试中,感觉还是能赚的都

    10 months ago

    期货能用这个策略吗

    a year ago

    草神,跑的这个策略手续费是多少

    2 years ago

    这个是0手续费

    2 years ago

    小草老师请教一下,这个策略生效的情况下,是不是每个轮训开始,经常能看到撤销之前的两个订单失败的消息(也就是说明买卖单都生效了),才说明策略是有效的

    2 years ago

    撤销失败是成交了,赚钱了才能说明有效

    2 years ago

    哦哦谢谢,另外就是还想向您请教下参数的问题。像这种高频策略如何优化参数。例如我看您分享的2014年的策略,默认的轮训间隔达到了3500ms,如果是高频的话,轮训间隔是不是应该短一点比较好。但是太短的话成交也挺难的,如果太长的话,收市场波动的影响就很大了,如果持仓后没有能够在利润点卖出去,就可能亏损。这块我不是太明白。。

    2 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)