Type/to search
3
Follow
1505
Followers
Comment exploiter les robots de vente inconscients avec une stratégie à haute fréquence en 80 lignes de code
HFT
Created 2023-12-24 21:37:45  Updated 2023-12-26 15:40:23
 7
 5969

img

Observation d'opportunité

Récemment, alors que je regardais le marché, j'ai découvert par hasard que le marché de STORJ, une pièce de monnaie sur Binance, était très étrange. Le volume de négociation était très important et la fréquence de négociation était très rapide. La ligne K spécifique d'une minute est le suivant. Vous pouvez voir que le volume de transactions par minute est assez constant et qu'une longue ombre inférieure peut être vue sur la ligne des minutes.
img
En observant la ligne K d'une seconde de Binance, nous avons trouvé un indice. Quelqu'un vendrait 10 000 à 20 000 STORJ toutes les 5 à 7 secondes, quel que soit le coût, et frapperait directement un petit trou dans la ligne K. Il se rétablira à l'intérieur. Cette opération a visiblement été provoquée par un robot commandé par Iceberg. Cette opération de vente a duré très longtemps et le montant total a été estimé à plusieurs dizaines de millions de dollars. Dans de nombreux cas, le glissement causé a atteint 1/1000, ce qui signifie que l'exécutant de cette stratégie a perdu des dizaines de milliers de dollars juste à cause du glissement de la transaction. Dollar. Cependant, de telles opérations mécaniques et transactions actives créent des opportunités évidentes de market making et de scalping.
img

En modifiant simplement la stratégie spot haute fréquence d'origine, il n'a fallu que quelques minutes pour créer ce robot qui exploite spécifiquement la vente insensée d'ordres iceberg.

Réflexion stratégique

Comme il y aura des ventes sur le marché toutes les quelques secondes, nous devons seulement trouver une profondeur de 10 000 dans le carnet d'ordres d'achat et placer l'ordre devant. De cette façon, lorsque cet iceberg est vendu, il y a une forte probabilité que le robot market-making puisse le recevoir. À ce moment-là, le trading est très actif et la chute instantanée des prix déclenche également des ordres d'achat. Le même principe s'applique à la passation d'ordres de vente et à leur vente en conséquence. Répétez l'opération. La fréquence des transactions est très élevée, et même si le taux de rendement à chaque fois n'est pas élevé, le bénéfice total est tout de même considérable. Bien entendu, le principe de base est d'avoir un compte avec des frais de transaction faibles. Si les frais de transaction pour l'achat et la vente sont de 0,1 %, alors cet espace n'est pas suffisant pour payer les frais de transaction.

Performance de la stratégie

La performance de la stratégie est la suivante. Au début, les bénéfices n'étaient pas imprimés. Je l'ai changé cet après-midi et j'ai imprimé les bénéfices. Le robot de vente fou a changé la quantité à environ 5 000 à chaque fois, donc la meilleure période d'arbitrage est passée. Au début, vous pouvez gagner environ 100 à 200 U par heure. L'essentiel est que cela ne présente aucun risque et que cela coûte peu cher. En regardant les choses de l'autre côté, il existe en fait de nombreuses techniques pour les ordres iceberg. Si vous savez comment rédiger une stratégie, vous pouvez en rédiger une sur FMZ en seulement une douzaine de minutes. Observez la profondeur des ordres d'achat pour déterminer la taille de l'ordre et prix et observer la taille des ordres d'achat actifs pour ajuster la taille des ordres en attente. Et la stratégie de confiance iceberg avec des caractéristiques telles que l'occupation du marché peut facilement économiser des dizaines de milliers de dollars.

img

Code source de la stratégie

Le code de stratégie est très simple, seulement 80 lignes. Convient aux débutants. Certains paramètres tels que la précision simple sont codés en dur dans le programme. Vous pouvez les modifier vous-même. Les paramètres requis sont ceux indiqués dans la figure ci-dessous. Il est recommandé de les enregistrer pour une utilisation ultérieure au cas où la paire de trading en bourse a une autre transaction folle. Vous pouvez leur facturer des intérêts à tout moment.
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)