Type/to search
8
Follow
1364
Followers
Diskussion über die Gestaltung von Hochfrequenzstrategien aus der Perspektive des modifizierten Lauchernters
HFT
Created 2021-03-09 13:41:54  Updated 2023-09-26 20:53:41
 21
 9028

img

Diskussion über die Gestaltung von Hochfrequenzstrategien aus der Perspektive des modifizierten Lauchernters

In den vorherigen Artikeln haben wir die Ideen und die Codeimplementierung der ursprünglichen Spot-Version der Hochfrequenzstrategie des Lauchernters analysiert.

Analyse der Lauchernte-Strategie (1)
Analyse der Lauchernte-Strategie (2)

Viele Nutzer der Quantifizierung des Währungskreises sind eher besorgt überprint moneyDie Strategie des Chefs,print moneyDie Strategie des Chefs besteht darin, USDT-Kontrakte auf Binance zu handeln. Aus den Beobachtungen und Analysen vieler Anhänger geht hervor, dass diese Hochfrequenzstrategie dem Prinzip eines Laucherntegeräts ähnelt (Cao Shen sagte auch, dass die Prinzipien der Hochfrequenzstrategien relativ ähnlich seien). Doch es gibt durchaus Feinheiten, die dafür sorgen können, dass die Strategie eine stabile Gewinnquote und ein entsprechendes Gewinn- und Verlustverhältnis aufweist.

Der Redakteur, der darauf brannte, seine Fähigkeiten unter Beweis zu stellen, konnte also nicht anders, als einige Änderungen vorzunehmen, obwohl die Wirkung der geänderten Strategie durch die Strategien der Meister zunichte gemacht wurde. Es kann aber auch als Lernen und Einüben von Hochfrequenzstrategien angesehen werden. Interessierte FMZer können diskutieren und gemeinsam lernen.

Modifizierter Lauch-Erntegerät

var TickInterval = 100 function LeeksReaper() { var self = {} self.numTick = 0 self.lastTradeId = 0 self.vol = 0 self.askPrice = 0 self.bidPrice = 0 self.orderBook = { Asks: [], Bids: [] } self.prices = [] self.tradeOrderId = 0 self.account = null self.buyPrice = 0 self.sellPrice = 0 self.state = 0 self.depth = null self.updateTrades = function() { var trades = _C(exchange.GetTrades) if (self.prices.length == 0) { while (trades.length == 0) { trades = trades.concat(_C(exchange.GetTrades)) } for (var i = 0; i < 15; i++) { self.prices[i] = trades[trades.length - 1].Price } } self.vol = 0.7 * self.vol + 0.3 * _.reduce(trades, function(mem, trade) { // Huobi not support trade.Id if ((trade.Id > self.lastTradeId) || (trade.Id == 0 && trade.Time > self.lastTradeId)) { self.lastTradeId = Math.max(trade.Id == 0 ? trade.Time : trade.Id, self.lastTradeId) mem += trade.Amount } return mem }, 0) } self.updateOrderBook = function() { var orderBook = _C(exchange.GetDepth) self.depth = orderBook self.buyPrice = orderBook.Bids[pendingLevel].Price self.sellPrice = orderBook.Asks[pendingLevel].Price self.orderBook = orderBook if (orderBook.Bids.length < 3 || orderBook.Asks.length < 3) { return } self.bidPrice = orderBook.Bids[0].Price * 0.618 + orderBook.Asks[0].Price * 0.382 + 0.01 self.askPrice = orderBook.Bids[0].Price * 0.382 + orderBook.Asks[0].Price * 0.618 - 0.01 self.prices.shift() self.prices.push(_N((orderBook.Bids[0].Price + orderBook.Asks[0].Price) * 0.15 + (orderBook.Bids[1].Price + orderBook.Asks[1].Price) * 0.1 + (orderBook.Bids[2].Price + orderBook.Asks[2].Price) * 0.1 + (orderBook.Bids[3].Price + orderBook.Asks[3].Price) * 0.075 + (orderBook.Bids[4].Price + orderBook.Asks[4].Price) * 0.05 + (orderBook.Bids[5].Price + orderBook.Asks[5].Price) * 0.025)) } self.updateAccount = function() { var account = exchange.GetAccount() if (!account) { return } self.account = account LogProfit(parseFloat(account.Info.totalWalletBalance), account) } self.CancelAll = function() { while (1) { var orders = _C(exchange.GetOrders) if (orders.length == 0) { break } for (var i = 0; i < orders.length; i++) { exchange.CancelOrder(orders[i].Id) } Sleep(100) } } self.poll = function() { self.numTick++ self.updateTrades() self.updateOrderBook() var pos = _C(exchange.GetPosition) var burstPrice = self.prices[self.prices.length - 1] * burstThresholdPct var bull = false var bear = false LogStatus(_D(), "\n", 'Tick:', self.numTick, 'self.vol:', self.vol, ', lastPrice:', self.prices[self.prices.length - 1], ', burstPrice: ', burstPrice) if (self.numTick > 2 && ( self.prices[self.prices.length - 1] - _.max(self.prices.slice(-6, -1)) > burstPrice || self.prices[self.prices.length - 1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length - 1] > self.prices[self.prices.length - 2] )) { bull = true } else if (self.numTick > 2 && ( self.prices[self.prices.length - 1] - _.min(self.prices.slice(-6, -1)) < -burstPrice || self.prices[self.prices.length - 1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length - 1] < self.prices[self.prices.length - 2] )) { bear = true } if (pos.length != 0) { if (pos[0].Type == PD_LONG) { self.state = 1 } else { self.state = 2 } } else { self.state = 0 } if ((!bull && !bear)) { return } if (bull) { var price = (self.state == 0 || self.state == 1) ? self.buyPrice : self.depth.Bids[coverPendingLevel].Price var amount = (self.state == 0 || self.state == 1) ? pendingAmount : pos[0].Amount exchange.SetDirection("buy") exchange.Buy(price, amount) } else if (bear) { var price = (self.state == 0 || self.state == 2) ? self.sellPrice : self.depth.Asks[coverPendingLevel].Price var amount = (self.state == 0 || self.state == 2) ? pendingAmount : pos[0].Amount exchange.SetDirection("sell") exchange.Sell(price, amount) } self.numTick = 0 Sleep(TickInterval) self.CancelAll() self.updateAccount() } while (!self.account) { self.updateAccount() Sleep(500) } Log("self.account:", self.account) return self } function main() { LogProfitReset() exchange.SetPrecision(pricePrecision, amountPrecision) exchange.SetContractType("swap") var reaper = LeeksReaper()  while (true) { reaper.poll() Sleep(100) } }

img

Ideen zur Strategieänderung

Die Strategie besteht darin, den Handel auf dem Binance USDT-Vertragsmarkt zu planen. Binance-Verträge unterstützen Einwegpositionen. Daher wird die Strategie entsprechend den Merkmalen von Einwegpositionen modifiziert und gestaltet (Einwegpositionen eignen sich besser für Strategiemodifikationen), ohne das Schließen von Positionen zu berücksichtigen, sondern nur das Kaufen und Verkaufen. Diese Idee kommt der Spot-Version des Lauch-Erntegeräts näher.

Die Strategie behält im Wesentlichen die ursprünglichen Beurteilungskriterien für den kurzfristigen Preistrenddurchbruch bei, und der kurzfristige Preisdurchbruchsbereich wird durch den Parameter bestimmtburstThresholdPctKontrolle, nach dieser Beurteilungsbedingung ist der kurzfristige Preisbull(Kuh) oderbear(Tragen).

Die Strategie entfernt einige Module aus der Originalversion, beispielsweise das Balance-Modul. Die größte Änderung besteht darin, dass die Order nun so geändert wurde, dass eine Bestellung in das Auftragsbuch eingetragen und auf die Transaktion gewartet wird.
Es wird erwartet, dass in einem chaotischen Markt, in dem die langen und kurzen Spiele heftig sind, eine Position zu geringeren Kosten eröffnet wird, dem kurzfristigen Trend folgt, die Position schließt, wenn sich der kurzfristige Trend umkehrt, und weiterhin Positionen mit umgekehrter Reihenfolge eröffnet werden. .

Die Strategie entfernt andere nutzlose Codes, sodass sie sehr kurz und einfach ist. Obwohl die Strategie nicht profitabel ist und sogar Geld verliert, ist es ein Modell, das von FMZern verwendet werden kann, um Hochfrequenzstrategien zu erlernen, das Verhalten von Hochfrequenzstrategien zu beobachten und die Mikrogesetze des Marktes zu beobachten. Algorithmischer Handel und quantitativer Handel erfordern viel Praxis, Erfahrung und Theorie als Grundlage.

Lauf eine Weile

img

Es zeigt sich, dass es schwieriger ist, Positionen zu eröffnen und zu schließen, wenn der Markt nicht aktiv ist.

Strategieoptimierung

Derzeit konnte noch keine gute Optimierungsrichtung gefunden werden.
Interessierte Studierende sind herzlich eingeladen, sich zu Wort zu melden und gemeinsam zu diskutieren.

Strategieadresse: https://www.fmz.com/strategy/260806

Diese Strategie dient ausschließlich Lernzwecken. Bei einem stagnierenden Markt kann es beim tatsächlichen Handel zu Verlusten kommen.

Related Recommendations
Comment
All comments (20)

    这里合约怎么设置杠杆倍数呢?

    5 years ago

    直接在交易所设置杠杆就可以了。

    5 years ago

    梦总,我测下这个策略,这个挂单100ms内没有成交就会被取消,我跑了一晚上(差不多5个小时吧)总共没下单且成交过5单,这要怎么修改参数吗?

    5 years ago

    可以挂单档位降低一些,但是有利有弊吧。这个高频策略需要盘面有好的深度、多空博弈激烈的场景。

    5 years ago

    梦总,你的策略在另一个平台出现了,请注意版权意识

    5 years ago

    哈哈 ,好的,感谢提醒。

    5 years ago

    当单边成交的时候,应该怎么处理啊。。。

    5 years ago

    这个能不能加一个交易量的判定,或者自动选币的判定。挂单这个挺好的

    5 years ago

    有跑起来的吗 能分享一下数据不

    5 years ago

    这个策略是教学策略,主要看下思路,仅仅是教学。

    5 years ago

    updateOrderBook 中计算price那里,原版加权之后price价格应该在盘口买n卖n的中位数附近,本文里面加权计算price之后是2倍(买卖盘口中位数附近),这里不是很懂。。

    5 years ago

    梦神能调一个可回测的,可用于现货的版本吗?多谢多谢

    5 years ago

    main:68:43 - TypeError: Cannot read property 'totalWalletBalance' of undefined
    请问小梦,这个不能回测,必须上实盘么?如何调整?先谢了!

    5 years ago

    回测不支持INFO信息

    5 years ago

    INFO 是麦语言吧。支持的

    5 years ago

    实盘跑一会的图片太皮了

    5 years ago

    !>_>! 这个只是个原型,亏钱的,学习用,只是有个研究对象而已。

    5 years ago

    tick限价单设计贼好

    5 years ago

    我也觉得限价单这个挺好……

    5 years ago

    合约的trades好像无法获取到,策略一直跑不起来,大佬是怎么跑起来的。

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)