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사장의 전략은 바이낸스에서 USDT 계약을 거래하는 것입니다. 많은 추종자들의 관찰과 분석을 통해, 이 고주파 전략은 파 수확기의 원리와 비슷하다는 것을 알 수 있습니다(조선도 고주파 전략의 원리가 비교적 비슷하다고 말했습니다). 하지만 전략이 안정적인 승률과 적절한 손익 비율을 갖도록 보장할 수 있는 미묘한 사항도 분명히 있습니다.

그래서 자신의 실력을 과시하고 싶어 안달난 편집자는 어쩔 수 없이 약간의 수정을 가했지만, 수정된 전략의 효과는 대가들의 전략에 의해 재로 부서졌다. 하지만 이는 또한 고빈도 전략의 학습과 연습으로 간주될 수 있습니다. 관심 있는 FMZer는 함께 토론하고 배울 수 있습니다.

변형된 파 수확기

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(곰).

이 전략은 원래 버전에서 균형 모듈 등 일부 모듈을 제거했습니다. 가장 큰 변화는 주문이 주문장에 주문을 넣고 거래를 기다리는 방식으로 변경되었다는 것입니다.
롱게임과 숏게임이 치열한 혼돈스러운 시장에서 낮은 비용으로 포지션을 오픈하고, 단기추세를 따라가다가 단기추세가 반전되면 포지션을 청산하고, 역순주문으로 포지션을 계속 오픈하는 것이 기대된다. .

이 전략은 다른 쓸모없는 코드를 제거하므로 매우 짧고 간단합니다. 이 전략은 수익성이 없고 오히려 손해를 보지만, FMZer가 고빈도 전략을 배우고, 고빈도 전략의 행동을 관찰하고, 시장의 미시 법칙을 관찰하는 데 사용할 수 있는 모델입니다. 알고리즘 트레이딩과 양적 트레이딩에는 많은 연습, 경험, 이론이 기초로 필요합니다.

잠시 달리다

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)