Recentemente, eu descobri que Binance tem uma moeda mercado STORJ é muito estranho involuntariamente quando eu estava assistindo o mercado, o volume de negociação é muito grande, ea frequência de negociação é muito rápido, o específico de um minuto K-linha do gráfico a seguir, podemos ver que o volume de negociação de cada minuto são consistentes, e o minuto K-linha pode ser visto em uma longa linha de sombra inferior.
Observe com Binance 1-segundo K-line, eu descobri o final da história, alguém é comercializado 10 000-20 000 STORJs a cada 5-7s, independentemente do custo, e quebrando um pequeno buraco na linha K diretamente, enquanto o preço se recupera no curto prazo. Esta operação foi obviamente causada por um robô em uma comissão de iceberg. Esta operação de venda durou muito tempo, totalizando um nível estimado de US $ 10 milhões, e em muitos casos causou deslizamento de até 0,1%, o que significa que o executor desta estratégia perdeu dezenas de milhares de dólares em deslizamento apenas no comércio. Mas com uma operação tão mecânica e negociação ativa, havia uma oportunidade clara para fazer scalping no mercado.
Uma simples mudança para a estratégia original de spot HF, e em poucos minutos eu tenho este bot que se especializa em explorar esta venda sem cérebro de comissões de iceberg.
Uma vez que o mercado vende em preço de mercado a cada poucos segundos, precisamos apenas encontrar a profundidade de 10k no livro de ordens de compra e pendurar a ordem na frente dele. Assim, quando o iceberg vende, uma alta probabilidade de que o robô de fabricação de mercado apenas possa receber, e neste momento a transação é muito ativa, o declínio momentâneo do preço também desencadeou algumas ordens de compra. Da mesma forma, as ordens de venda penduradas podem ser jogadas na tendência, então operações repetidas. A frequência de transações é muito alta, mesmo que cada vez que o rendimento não seja muito grande, o retorno total também seja substancial.
A estratégia está funcionando da seguinte forma, no início, nenhum dos lucros estava sendo impresso, então eu mudei esta tarde, e imprimi os lucros, os robôs de venda loucos mudaram o volume para cerca de 5000 de cada vez, então já passou o momento ideal para arbitragem. Eu provavelmente estou fazendo 100-200U por hora no início, a chave é livre de risco e baixo custo. Do outro lado, a comissão do iceberg realmente tem muitas habilidades, se você sabe como escrever uma estratégia, você pode passar dez minutos no FMZ para escrever a estratégia da comissão do iceberg que observa a profundidade da ordem de compra para decidir o tamanho e o preço da ordem, observa o tamanho da ordem de compra ativa para ajustar o tamanho da ordem pendente e tomar o mercado e outras características de monitoramento, economizando dezenas de milhares de dólares facilmente.
O código da estratégia é muito simples, apenas 80 linhas, que é adequado para iniciantes, aqui estão alguns dos parâmetros, tais como precisão de ordem e assim por diante escrito fixado no programa, você pode alterar os parâmetros como se segue.
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 //Subtract your own pending orders here
}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) //Guaranteed at the market
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
var log_account_time = 0
function main() {
CancelPendingOrders()
while (true) {
OnTick()
}
}