Type/to search
8
Follow
1364
Followers
改良型ネギ収穫機の観点から高頻度戦略設計を議論する
HFT
Created 2021-03-09 13:41:54  Updated 2023-09-26 20:53:41
 21
 9028

img

改良型ネギ収穫機の観点から高頻度戦略設計を議論する

前回の記事では、ネギ収穫機の高頻度戦略のオリジナルスポットバージョンのアイデアとコード実装を分析しました。

ネギ収穫機戦略の分析(1)
ネギ収穫機戦略の分析(2)

コインサークルのユーザーの多くは、print moneyボスの戦略は、print moneyボスの戦略は、Binance USDT 契約で取引することです。多くのフォロワーの観察と分析から、この高頻度戦略はネギ収穫機の原理に似ていることがわかります(曹申氏も高頻度戦略の原理は比較的近いと述べています)。しかし、戦略が安定した勝率と適切な損益比率を持つことを保証できる微妙な点が確かに存在します。

そこで、自分の腕を披露したくてうずうずしていた編集者は、修正を加えざるを得ませんでしたが、修正した戦略の効果は、巨匠たちの戦略によって粉々に砕かれてしまいました。しかし、これは高頻度戦略の学習と実践とも言えます。興味のある FMZ 参加者は、一緒に議論し、学ぶことができます。

改良型ネギ収穫機

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

戦略修正のアイデア

戦略としては、Binance USDT 契約市場での取引を利用することを計画することです。Binance 契約は一方向のポジションをサポートしています。したがって、戦略は、ポジションのクローズを考慮せず、売買のみを考慮して、一方向ポジションの特性に応じて修正および設計されます(一方向ポジションは戦略修正に便利です)。このアイデアは、ネギ収穫機のスポットバージョンに近いものです。

この戦略は基本的に元の短期価格トレンドのブレイクスルー判断基準を保持し、短期価格のブレイクスルー範囲はパラメータによって決定されます。burstThresholdPct制御、この判断条件によれば、短期価格はbull(牛)、またはbear(クマ)。

この戦略では、バランス モジュールなど、元のバージョンからいくつかのモジュールを削除します。最も大きな変更点は、注文が注文簿に注文を出し、取引を待つ方式に変更されたことです。
ロングとショートの駆け引きが激しい混沌とした相場では、より低コストでポジションを開き、短期トレンドを追い、短期トレンドが反転したらポジションをクローズし、逆指値注文でポジションを開き続けることが期待される。 。

この戦略では、他の無駄なコードを削除するため、非常に短くシンプルになります。この戦略は利益を生まないどころか、損失を出すこともありますが、FMZ ユーザーが高頻度戦略を学習し、高頻度戦略の動作を観察し、市場のミクロ法則を観察するために使用できるモデルです。アルゴリズム取引と定量取引には、基礎として多くの実践、経験、理論が必要です。

しばらく走ってみる

img

市場が活発でないときは、ポジションを開いたり閉じたりすることがより困難になることがわかります。

戦略の最適化

現時点では、適切な最適化の方向性は見つかっていません。
興味のある学生はぜひ発言し、一緒に議論してください。

戦略アドレス: https://www.fmz.com/strategy/260806

この戦略は学習目的のみであり、市場が横ばいの場合、実際の取引では損失が発生する可能性があります。

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)