Trong các bài viết trước, chúng tôi đã phân tích ý tưởng và thực hiện mã của chiến lược tần số cao của phiên bản điểm gốc LeeksReaper.
Phân tích chiến lược của LeeksReaperhttps://www.fmz.com/bbs-topic/9725) Phân tích chiến lược của LeeksReaperhttps://www.fmz.com/bbs-topic/9733)
Nhiều người sử dụng tiền kỹ thuật số chú ý nhiều hơn đến chiến lược của nhà lãnh đạo tiền in. Chiến lược của nhà lãnh đạo tiền in được giao dịch trong hợp đồng Binance USDT. Từ quan sát và phân tích của nhiều người theo dõi có thể thấy rằng chiến lược tần số cao này tương tự như nguyên tắc của LeeksReaper (nhà lãnh đạo Xiaocao cũng nói rằng nguyên tắc của các chiến lược tần số cao cũng tương tự). Nhưng phải có một cái gì đó tinh tế để đạt được tỷ lệ thắng ổn định và tỷ lệ lợi nhuận và lỗ thích hợp.
Vì vậy, tôi không thể không làm cho sự thay đổi ma thuật. Mặc dù tác động chiến lược của sự thay đổi ma thuật là tồi tệ hơn nhiều so với các chiến lược của các nhà lãnh đạo. Nó cũng là một thực hành học tập cho các chiến lược tần số cao. FMZer những người quan tâm sẽ thảo luận và học hỏi cùng nhau.
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)
}
}
Chiến lược là có kế hoạch giao dịch trên thị trường hợp đồng Binance USDT, hỗ trợ các vị trí một chiều. Do đó, chiến lược được sửa đổi theo các đặc điểm của vị trí một chiều (vị trí một chiều thuận tiện hơn để sửa đổi chiến lược), chúng tôi không xem xét đóng vị trí, chúng tôi chỉ xem xét bán và mua. Ý tưởng gần gũi hơn với phiên bản trực tiếp của LeeksReaper.
Chiến lược về cơ bản giữ nguyên tiêu chí ban đầu của xu hướng giá ngắn hạn đột phá, được kiểm soát bởi các thông sốburstThresholdPCT
, theo đó để đánh giá liệu giá ngắn hạn làbull
hoặcbear
.
Chiến lược loại bỏ một số mô-đun ban đầu, chẳng hạn như mô-đun cân đối. Nó dự kiến là mở một vị trí với chi phí thấp hơn trong một trò chơi dài / ngắn hỗn loạn, theo xu hướng ngắn hạn và đóng vị trí khi xu hướng ngắn hạn đảo ngược và tiếp tục mở vị trí với một lệnh chờ đảo ngược.
Chiến lược ngắn và đơn giản vì nó loại bỏ các mã vô dụng khác. Mặc dù chiến lược là một chiến lược không kiếm tiền, hoặc thậm chí mất tiền, nhưng như FMZer đang học chiến lược tần số cao, quan sát hành vi của chiến lược tần số cao, quan sát các quy luật vi mô của thị trường là một mô hình có thể được sử dụng.
Hiện tại, không có hướng tốt nào cho việc tối ưu hóa được tìm thấy. Một người quan tâm có thể để lại ý kiến của bạn và thảo luận cùng nhau.
Chiến lược từ:https://www.fmz.com/strategy/260806
Chiến lược này chỉ là để học hỏi, robot thực sự có thể có tổn thất khi thị trường không quá lạc quan.