Récemment, j'ai découvert que Binance a un marché de monnaie STORJ est très étrange involontairement quand je regardais le marché, le volume de négociation est très grand, et la fréquence de négociation est très rapide, la ligne K spécifique d'une minute du graphique suivant, nous pouvons voir que le volume de négociation de chaque minute sont cohérents, et la ligne K minute peut être vu dans une longue ligne d'ombre inférieure.
Observez avec Binance 1-seconde K-line, j'ai découvert la fin de l'histoire, quelqu'un est commercialisé 10 000-20 000 STORJs tous les 5-7s, indépendamment du coût, et brisant un petit trou dans la ligne K directement, tandis que le prix se rétablit à court terme. Cette opération a été évidemment causée par un robot sur une commission d'iceberg. Cette opération de vente a duré très longtemps, totalisant un niveau estimé à 10 millions de dollars, et dans de nombreux cas a causé un glissement allant jusqu'à 0,1%, ce qui signifie que l'exécuteur de cette stratégie a perdu des dizaines de milliers de dollars en glissement sur le commerce seulement. Mais avec une telle opération mécanique et un trading actif, il y avait une opportunité claire de faire du scalping sur le marché.
Un simple changement à la stratégie HF spot d'origine, et en quelques minutes j'ai eu ce bot qui se spécialise dans l'exploitation de cette vente stupide de commissions d'iceberg.
Puisque le marché vend au prix du marché toutes les quelques secondes, nous avons juste besoin de trouver la profondeur de 10k dans le carnet d'ordres d'achat et accrocher l'ordre devant elle. Ainsi, lorsque l'iceberg vend, une forte probabilité que le robot de fabrication de marché peut simplement recevoir, et à ce moment-là, la transaction est très active, la baisse momentanée du prix a également déclenché certains ordres d'achat. De la même manière, les ordres de vente suspendus peuvent être jetés dans la tendance, donc des opérations répétées. La fréquence des transactions est très élevée, même si chaque fois le rendement n'est pas assez grand, le rendement total est également substantiel. Bien sûr, la prémisse de tout est d'avoir un compte à faible frais, si les frais d'achat et de vente sont à la fois 0,1%, l'espace n'est pas suffisant pour payer les frais.
La stratégie fonctionne comme suit, au début, aucun des bénéfices n'était imprimé, alors je l'ai changé cet après-midi, et j'ai imprimé les bénéfices, les robots de vente fous ont changé le volume à environ 5000 à la fois, donc c'est passé le moment optimal pour l'arbitrage. Je fais probablement 100-200U par heure au début, la clé est sans risque et à faible coût. D'un autre côté, la commission de l'iceberg a en fait beaucoup de compétences, si vous savez écrire une stratégie, vous pouvez passer dix minutes sur FMZ pour écrire la stratégie de la commission de l'iceberg qui observe la profondeur de l'ordre d'achat pour décider de la taille et du prix de l'ordre, observe la taille de l'ordre d'achat actif pour ajuster la taille de l'ordre en attente et prendre le marché et d'autres caractéristiques de surveillance, économisant facilement des dizaines de milliers de dollars.
Le code de la stratégie est très simple, seulement 80 lignes, qui convient aux débutants, voici quelques-uns des paramètres tels que la précision de l'ordre et ainsi de suite écrit fixé dans le programme, vous pouvez modifier les paramètres comme suit.
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()
}
}