En los últimos dos días, al ver el mercado, se encontró que Binance tiene un mercado de Bitcoin STORJ. Es extraño, el volumen de transacciones es grande y la frecuencia de transacciones es muy rápida, la siguiente gráfica de la línea K específica de un minuto, se puede ver que el volumen de transacciones es el mismo por minuto y en la línea de minutos se puede ver una línea de sombra larga.Observando la línea K de un segundo de Binance, se descubre que hay una trampa en la que alguien vende entre 20 000 y 20 000 STORJ cada 5-7 s, sin tener en cuenta los costos, y se abre un pequeño pozo directamente en la línea K, y el precio se recupera en el corto plazo. Esta operación fue evidentemente causada por un robot encargado por la montaña de hielo.
En cuestión de minutos, el robot encargado de explotar y vender este iceberg sin cerebro cambió la estrategia de alta frecuencia de la actualidad.
Dado que el precio de mercado se vende cada pocos segundos, solo tenemos que encontrar 10.000 profundidades en el libro de compras y colgar la unidad en la parte delantera. Así, cuando se vende esta montaña de hielo, hay una alta probabilidad de que el robot de mercado pueda recibirlo, y las transacciones son muy activas, la caída instantánea de los precios también provocó algunas compras, la misma lógica de colgar y vender una sola orden de venta, así de repetidas operaciones. La frecuencia de las transacciones es muy alta, incluso si el rendimiento de cada vez no es grande.
La estrategia es la siguiente, al principio no se imprimieron ganancias, esta tarde se cambiaron, se imprimieron ganancias, el robot de venta frenética ha cambiado la cantidad de cada vez para alrededor de 5000, por lo que ha pasado el período de ventaja óptima. Al principio, probablemente se puede extraer 100-200U por hora, la clave es que no haya riesgo, bajo costo.
El código de la estrategia es muy simple, sólo 80 líneas. Para los principiantes, algunos parámetros como la precisión de la siguiente palabra están escritos en el programa, se puede cambiar por sí mismo, los parámetros necesarios se muestran a continuación, se recomienda guardar en reserva, en caso de que el intercambio negocie con los comerciantes que vuelven a emerger, y cobrarles intereses en cualquier momento.
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()
}
}
punto de controlDios mío, ¿cuánto cuesta esta táctica de correr?
yc123hSi esta estrategia es efectiva, por favor, si al comienzo de cada turno de entrenamiento, se ve a menudo el mensaje de dos pedidos fallidos antes de la revocación (es decir, que las compras y ventas están en vigor), entonces la estrategia es efectiva.
Las hierbasEsto es cero gastos.
yc123hGracias, también quiero preguntarte por los parámetros. Como esta estrategia de alta frecuencia, cómo optimizar los parámetros. Por ejemplo, vi la estrategia que compartiste en 2014, el intervalo de entrenamiento por defecto alcanzó los 3500 ms, si es de alta frecuencia, el intervalo de entrenamiento debería ser un poco más corto.
Las hierbasEl fracaso de la revocación es un trato, ganar dinero para demostrar que funciona.