[TOC] Ich habe 2020 einen Artikel über die Hochfrequenzstrategie geschrieben.https://www.fmz.com/digest-topic/6228Auch wenn ich viel Aufmerksamkeit erhielt, war ich nicht sehr tiefgreifend. Es sind noch mehr als zwei Jahre vergangen, und der Markt hat sich geändert. Nach der Veröffentlichung des Artikels konnte ich lange Zeit mit meiner High-Frequency-Strategie stabil Geld verdienen, aber die langsam abnehmenden Gewinne fielen allmählich ab und wurden sogar einmal eingestellt. In den letzten Monaten habe ich mich wieder umgestaltet und kann jetzt noch etwas Geld verdienen.
Die Kommissionsquote ist bei 100 Mio. U pro Tag bei 5000 U höher als bei 100 Mio. U pro Tag. Natürlich ist der Taker immer noch auf VIP-Rate basiert, also wenn die Strategie nicht bezahlt werden muss, hat die VIP-Rate keinen großen Einfluss auf die High-Frequency-Strategie. Im Allgemeinen müssen an verschiedenen Börsen verschiedene Raten unterschiedliche Kommissionsraten aufrechterhalten werden, die eine hohe Transaktionsrate erfordern.
Geschwindigkeit. Die Hochfrequenzpolitik wird auch als Hochfrequenzpolitik bezeichnet, weil sie sehr schnell ist. Der Beitritt zum Colo-Server der Börse, der die geringste Verzögerung und die stabilste Verbindung ermöglicht, ist auch eine Bedingung für die Involver. Die interne Verzögerung der Politik sollte so gering wie möglich sein.
Der richtige Markt. Hochfrequenzhandel wird als Perle des quantitativen Handels bezeichnet. Ich glaube, dass viele programmatisierte Händler versucht haben, aber die meisten sollten aufhören, weil sie kein Geld verdienen und keine Richtung zur Verbesserung finden. Der Hauptgrund sollte sein, dass sie den falschen Markt gefunden haben.
Im Wettbewerb stehen. Jeder Markt ist dynamisch veränderlich, keine Handelsstrategie kann ein für alle Mal sein. Hochfrequenz-Handel ist viel deutlicher, wenn man in diesen Markt eintritt, ist man direkt mit einer Gruppe der klügsten und fleißigsten Trader im Wettbewerb. In einem Markt mit null Spielern ist man weniger als alle anderen. Je später man eintritt, desto schwieriger ist es.
Hochfrequenz-Strategien werden in verschiedene Arten eingeteilt.
Meine Strategie ist eine Kombination von Trend und Markt, vorher die Tendenz zu bestimmen, dann die Bestellung zu hängen, sofort nach der Transaktion zu hängen und zu verkaufen, ohne Lagerbestände zu halten.
Die folgende Code-Architektur basiert auf der Basis von Binance Perpetual Contracts und unterzeichnet hauptsächlich Websocket-Depth-Depth-Order-Flow-Trades-Märkte und Positionspositionsinformationen. Da Markt- und Kontoinformationen getrennt abonniert sind, muss immer wieder mit Read (−1) beurteilt werden, ob aktuelle Informationen eingeholt werden. Hier wird mit EventLoop (−1000) vermieden, der einen direkten Todeszyklus verhindert und die Systembelastung reduziert. EventLoop (−1000) wird blockiert, wenn es WSSs oder gleichzeitige Aufgaben gibt, die über 1000 ms zurückkehren.
var datastream = null
var tickerstream = null
var update_listenKey_time = 0
function ConncetWss(){
if (Date.now() - update_listenKey_time < 50*60*1000) {
return
}
if(datastream || tickerstream){
datastream.close()
tickerstream.close()
}
//需要APIKEY
let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY)
let listenKey = JSON.parse(req).listenKey
datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
//Symbols是设定的交易对
let trade_symbols_string = Symbols.toLowerCase().split(',')
let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
tickerstream = Dial(wss_url+"|reconnect=true", 60)
update_listenKey_time = Date.now()
}
function ReadWss(){
let data = datastream.read(-1)
let ticker = tickerstream.read(-1)
while(data){
data = JSON.parse(data)
if (data.e == 'ACCOUNT_UPDATE') {
updateWsPosition(data)
}
if (data.e == 'ORDER_TRADE_UPDATE'){
updateWsOrder(data)
}
data = datastream.read(-1)
}
while(ticker){
ticker = JSON.parse(ticker).data
if(ticker.e == 'aggTrade'){
updateWsTrades(ticker)
}
if(ticker.e == 'depthUpdate'){
updateWsDepth(ticker)
}
ticker = tickerstream.read(-1)
}
makerOrder()
}
function main() {
while(true){
ConncetWss()
ReadWss()
worker()
updateStatus()
EventLoop(1000)
}
}
Wie ich bereits erwähnt habe, erfordert meine Hochfrequenzstrategie, dass ich den Trend vorher bestimme und dann den Kauf ausführe. Die Beurteilung des kurzfristigen Trends basiert hauptsächlich auf den Transaktionsdaten pro Stück, d.h. dem AggTrade im Abonnement, der Transaktionsrichtung, Preis, Menge, Transaktionszeit usw. beinhaltet.
//bull代表短期看涨,bear短期看跌
let bull = last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear = last_sell_price < avg_sell_price && last_buy_price < avg_buy_price &&
avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;
Wenn der letzte Verkaufspreis größer ist als der durchschnittliche Verkaufspreis, der letzte Kaufpreis größer ist als der durchschnittliche Kaufpreis und der Wert des festen Intervallkaufs größer ist als der Wert des Verkaufsauftrags, wird ein kurzfristiger Aufschwung beurteilt.
function updatePrice(depth, bid_amount, ask_amount) {
let buy_price = 0
let sell_price = 0
let acc_bid_amount = 0
let acc_ask_amount = 0
for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
acc_bid_amount += parseFloat(depth.bids[i][1])
acc_ask_amount += parseFloat(depth.asks[i][1])
if (acc_bid_amount > bid_amount && buy_price == 0) {
buy_price = parseFloat(depth.bids[i][0]) + tick_size
}
if (acc_ask_amount > ask_amount && sell_price == 0) {
sell_price = parseFloat(depth.asks[i][0]) - tick_size
}
if (buy_price > 0 && sell_price > 0) {
break
}
}
return [buy_price, sell_price]
}
Hier geht es immer noch um die alte Idee, die Tiefe bis zur gewünschten Menge zu wiederholen. Hier wird angenommen, dass innerhalb von 1s eine Zahlung von 10 Münzen getätigt werden kann.
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Ratio stellt einen festen Prozentsatz dar, bei dem die Bestellmenge der Anzahl der kürzlich verkauften Bestellungen in einem festen Prozentsatz liegt. Diese Strategie kann sich an die Bestellgröße anhand der aktuellen Verkaufsaktivität anpassen.
if(bull && (sell_price-buy_price) > N * avg_diff) {
trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) > N * avg_diff) {
trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
trade('sell', sell_price, position.amount)
}
Der Durchschnittsdifferenzpreis ist der Differenzpreis, der nur dann bezahlt wird, wenn der Verkaufs- und Kaufpreis größer als ein bestimmtes Multiplikatorwert ist. Wenn Sie einen leeren Auftrag halten, wird dieser auch ausgeglichen und vermeiden Sie eine langfristige Rechnung. Der Auftrag kann nur vom Maker ausgeführt werden, um die Transaktion zu gewährleisten.
var tasks = []
var jobs = []
function worker(){
let new_jobs = []
for(let i=0; i<tasks.length; i++){
let task = tasks[i]
jobs.push(exchange.Go.apply(this, task.param))
}
_.each(jobs, function(t){
let ret = t.wait(-1)
if(ret === undefined){
new_jobs.push(t)//未返回的任务下次继续等待
}
})
jobs = new_jobs
tasks = []
}
/*
需要的任务参数写在param里
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
"symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
amount+"&price="+price+"&newClientOrderId=" + UUID() +"×tamp="+Date.now()]})
*/
mztcoinWas ist die Logik des Verkaufs, wenn Sie eine For-Liste haben, die sofort nach der Transaktion verkauft wird, ohne Lagerbestände zu haben?
mztcoinDie Grasherzen
DANGOUDie Gräsergötter
77924998Welche AWS-Server benutzt Grasshopper?
- Ich weiß nicht.Die Gewalttätige
- Ich weiß nicht.Grasshopper hat ein kostenpflichtiges Hochfrequenzprogramm entwickelt.
Mein Herz ist immer noch da.Kann man sich diese Strategie nutzen, wenn man sie kopieren kann?
Schriftsteller: TradeManIch habe mich in den letzten paar Jahren in der Schule umgewandelt, um zu lernen, wie man in den Hochfrequenz-Handelsgeschäften einsteigt.
Eine Welle in der WindschleifeDie Bullen
fmzeroDer Grasgott ist so hartnäckig!
Ock-QuantitätDie Bullen
Das GrasEs ist schwer zu sehen, es macht keinen Sinn.