고주파 전략 설계에 대한 토론 마법적으로 변형 된 수익 모집기

저자:니나바다스, 창작: 2022-04-25 11:49:11, 업데이트: 2022-04-25 12:04:06

고주파 전략 설계에 대한 토론 마법적으로 변형 된 수익 모집기

이전 기사에서 우리는 고주파 수익 수확 전략의 원래 스팟 버전의 아이디어와 코드 구현을 분석했습니다.

수익 수확자 분석 (1) 이윤 수확자 분석 (2)

양적 암호화폐의 많은 사용자들은인쇄금이 전략은인쇄금Binance USDT 계약에서 거래됩니다. 많은 추종자들의 관찰과 분석에서, 고주파 전략은 이윤 수확자의 원칙과 유사하다는 것을 알 수 있습니다 (Xiaocao 마스터는 또한 고주파 전략의 원칙이 이윤 수확자의 원칙과 유사하다고 말했습니다). 그러나 전략이 안정적인 승률과 적절한 이익-손실 비율을 가질 수 있도록하는 약간의 미묘함이 있어야합니다.

따라서, 나는 너무 흥분해서 전략을 마법으로 수정하고 싶었지만, 마법으로 수정된 전략 결과와 효과조차도 마스터가 개발한 전략에 비해 아무것도 아니었습니다. 그러나 그것은 또한 고주파 전략에 대한 학습 연습입니다. 관심있는 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

수정 아이디어

이 전략은 일방적 포지션을 지원하는 바이낸스 USDT 계약 시장에서 거래 할 계획입니다. 따라서 전략은 일방적 포지션의 특성에 따라 수정되고 설계됩니다 (일방적 포지션은 전략 변경에 더 편리하며), 구매 및 판매를 고려할 필요가 있습니다. 포지션을 닫는 것에 대해 생각할 필요가 없습니다. 이러한 사고 방식은 또한 수익 수확기의 현장 버전에 더 가깝습니다.

이 전략은 기본적으로 원래의 단기 가격 트렌드 브레이크아웃 기준을 유지하며, 단기 가격 브레이크아웃 범위는 매개 변수burstThresholdPct. 단기 가격에 대한 기준에 따라bull또는bear.

이 전략은 원본에서 몇 가지 모듈을 제거합니다. 균형 모듈과 같이. 상당히 큰 수정은 주문을 주문서에서 미뤄지고 실행을 기다리는 주문으로 변경하는 것입니다. 혼란스러운 시장에서 비교적 낮은 비용으로 포지션을 열고 긴 짧은 게임을 열고 단기 트렌드를 따라 단기 트렌드가 뒤집어지면 포지션을 닫고 그 후 반대의 대기 주문과 오픈 포지션을 계속할 것으로 예상됩니다.

전략은 다른 쓸모없는 코드를 제거하므로 매우 짧고 간단합니다. 전략은 손실에도 불구하고 수익성이없는 전략이지만 FMZer가 고주파 전략, 고주파 전략의 행동을 관찰하고 시장의 현미경 규칙을 관찰하는 매우 쉽고 유용한 모델입니다. 프로그래밍 및 양적 거래는 많은 연습, 경험 및 이론을 기반으로해야합니다.

봇을 실행합니다.

img

시장 상황이 활성화되지 않을 때 포지션을 열고 닫는 것이 더 어렵다는 것을 알 수 있습니다.

전략 최적화

현재는 최적화 방향이 제대로 밝혀지지 않았습니다. 관심 있는 학생은 적극적으로 목소리를 내고 함께 토론할 수 있습니다.

전략 주소:https://www.fmz.com/strategy/260806

이 전략은 연구용일 뿐입니다. 시장이 평평할 때, 로봇으로 실행하면 손실이 발생할 수 있습니다.


더 많은