Type/to search
3
Follow
1505
Followers
Wie Sie gedankenlose Verkaufsroboter mit einer Hochfrequenzstrategie in 80 Codezeilen ausnutzen
HFT
Created 2023-12-24 21:37:45  Updated 2023-12-26 15:40:23
 7
 5969

img

Chancenbeobachtung

Als ich mir kürzlich den Markt ansah, stellte ich zufällig fest, dass der Markt für STORJ, eine Münze auf Binance, sehr seltsam war. Das Handelsvolumen war sehr groß und die Handelsfrequenz sehr schnell. Die spezifische einminütige K-Linie ist wie folgt. Sie können sehen, dass das Handelsvolumen pro Minute ziemlich konstant ist und auf der Minutenlinie ein langer unterer Schatten zu sehen ist.
img
Durch die Beobachtung der 1-Sekunden-K-Linie von Binance haben wir einen Hinweis gefunden. Jemand würde alle 5-7 Sekunden 10.000 bis 20.000 STORJ verkaufen, unabhängig vom Preis, und direkt auf ein kleines Loch in der K-Linie treffen. Es wird sich im Inneren erholen. Dieser Vorgang wurde offensichtlich von einem von Iceberg in Auftrag gegebenen Roboter durchgeführt. Diese Verkaufsoperation dauerte sehr lange und der Gesamtbetrag wurde auf mehrere zehn Millionen Dollar geschätzt. In vielen Fällen erreichte der verursachte Slippage 1/1000, was bedeutet, dass der Ausführende dieser Strategie Zehntausende von Dollar verlor nur aufgrund des Scheiterns der Transaktion. Dollar. Solche mechanischen Vorgänge und aktiven Transaktionen schaffen jedoch offensichtliche Möglichkeiten für Market Making und Scalping.
img

Durch eine einfache Modifizierung der ursprünglichen Spot-Hochfrequenzstrategie dauerte es nur wenige Minuten, diesen Roboter zu erstellen, der gezielt den gedankenlosen Verkauf von Iceberg-Orders ausnutzt.

Strategisches Denken

Da es alle paar Sekunden zu Marktverkäufen kommt, müssen wir nur eine Tiefe von 10.000 im Kaufauftragsbuch finden und die Bestellung davor platzieren. Auf diese Weise besteht eine hohe Wahrscheinlichkeit, dass der Market-Making-Roboter diesen Eisberg erhalten kann, wenn er verkauft wird. Zu diesem Zeitpunkt ist der Handel sehr aktiv und der sofortige Preisrückgang löst auch einige Kaufaufträge aus. Der Dasselbe Prinzip gilt für das Platzieren von Verkaufsaufträgen und deren entsprechenden Verkauf. Wiederholen Sie den Vorgang. Die Transaktionsfrequenz ist sehr hoch und auch wenn die Rendite jedes Mal nicht hoch ist, ist der Gesamtgewinn immer noch beträchtlich. Voraussetzung für alles ist natürlich, dass das Konto niedrige Transaktionsgebühren hat. Wenn die Transaktionsgebühren für Kauf und Verkauf 0,1 % betragen, reicht dieser Platz nicht aus, um die Transaktionsgebühren zu bezahlen.

Strategieleistung

Die Strategieleistung ist wie folgt. Zu Beginn wurden die Gewinne nicht gedruckt. Ich habe es heute Nachmittag geändert und die Gewinne gedruckt. Der verrückte Verkaufsroboter hat die Menge jedes Mal auf etwa 5.000 geändert, sodass die beste Arbitrageperiode vorbei ist. Zu Beginn können Sie etwa 100-200U pro Stunde verdienen. Der Schlüssel ist, dass es risikolos und kostengünstig ist. Wenn man es von der anderen Seite betrachtet, gibt es tatsächlich viele Techniken für Eisberg-Orders. Wenn Sie wissen, wie man eine Strategie schreibt, können Sie in nur einem Dutzend Minuten eine auf FMZ schreiben. Beobachten Sie die Tiefe der Kaufaufträge, um die Auftragsgröße zu bestimmen und Preis und beobachten Sie die Größe aktiver Kaufaufträge, um die Größe ausstehender Aufträge anzupassen. Und die Eisberg-Anvertrauensstrategie mit Merkmalen wie der Besetzung des Marktes kann leicht Zehntausende von Dollar sparen.

img

Strategie-Quellcode

Der Strategiecode ist sehr einfach, nur 80 Zeilen. Geeignet für Anfänger. Einige Parameter wie die einfache Genauigkeit sind im Programm fest codiert. Sie können sie selbst ändern. Die erforderlichen Parameter sind in der folgenden Abbildung dargestellt. Es wird empfohlen, sie für die zukünftige Verwendung zu speichern, falls das Börsenhandelspaar hat eine weitere verrückte Transaktion. Sie können ihnen jederzeit Zinsen berechnen.
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)