Phân tích chiến lược máy thu hoạch cải chuối (2)

Tác giả:Giấc mơ nhỏ, Tạo: 2020-11-16 10:03:52, Cập nhật: 2023-09-26 21:05:07

img

Phân tích chiến lược máy thu hoạch cải chuối (2)

Sau đóNội dung lênCác bạn có thể tham khảo bài viết này.

Chức năng thứ ba được thêm vào:

    self.balanceAccount = function() {
        var account = exchange.GetAccount()
        if (!account) {
            return
        }
        self.account = account
        var now = new Date().getTime()
        if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {
            self.preCalc = now
            var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))
            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }
        }
        self.btc = account.Stocks
        self.cny = account.Balance
        self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)
        var balanced = false
        
        if (self.p < 0.48) {
            Log("开始平衡", self.p)
            self.cny -= 300
            if (self.orderBook.Bids.length >0) {
                exchange.Buy(self.orderBook.Bids[0].Price + 0.00, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.01, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.02, 0.01)
            }
        } else if (self.p > 0.52) {
            Log("开始平衡", self.p)
            self.btc -= 0.03
            if (self.orderBook.Asks.length >0) {
                exchange.Sell(self.orderBook.Asks[0].Price - 0.00, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.01, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.02, 0.01)
            }
        }
        Sleep(BalanceTimeout)
        var orders = exchange.GetOrders()
        if (orders) {
            for (var i = 0; i < orders.length; i++) {
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)
                }
            }
        }
    }

Xây dựng hàmLeeksReaper()Khi tạo một đối tượng, thêm vào đối tượngbalanceAccount()Chức năng là cập nhật thông tin tài sản tài khoản, lưu trữself.accountVà chúng ta có thể tạo ra một hình ảnh.accountTính năng: Tính đến thời điểm tính toán giá trị lợi nhuận và in. Sau đó, dựa trên thông tin tài sản tài khoản mới nhất, tính toán tỷ lệ cân bằng tiền mặt (tương đương tiền mặt), khi kích hoạt ngưỡng di chuyển, thực hiện thanh toán nhỏ, để tiền tệ (tương đương tiền mặt) trở lại cân bằng. Chờ một thời gian giao dịch nhất định, sau đó hủy tất cả các đơn hàng bị treo, và trong vòng tiếp theo thực hiện chức năng này, sẽ kiểm tra lại cân bằng và xử lý tương ứng.

Chúng ta hãy xem từng câu mã của hàm này: Đầu tiên là câu đầu tiên.var account = exchange.GetAccount()là một biến địa phương được tuyên bố.account, và gọi API của nhà phát minhexchange.GetAccount()Chức năng lấy dữ liệu mới nhất của tài khoản hiện tại, gán giá trị choaccountCác biến. Rồi đánh giáaccountVà chúng ta có thể tính toán nó như sau.nullCác giá trị (ví dụ như lỗi thời gian, mạng, giao diện giao dịch, và các vấn đề khác) sẽ được trả về trực tiếp (đối vớiif (!account){...}(Trong đây)

self.account = accountĐây là một câu nói về biến địa phương.accountĐặt giá trị cho các đối tượng được tạo raaccountCác thuộc tính được sử dụng để ghi lại thông tin tài khoản mới nhất trong các đối tượng được tạo.

var now = new Date().getTime()Câu này tuyên bố một biến địa phương.now, và gọi các đối tượng thời gian ngày của ngôn ngữ JavaScriptgetTime()Chức năng trả về thời gian hiện tại.nowCác biến.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}Mã này sẽ xác định giá trị chênh lệch giữa thời gian hiện tại và thời gian cuối cùng được ghi nhận nếu vượt quá các tham sốCalcNetInterval * 1000Điều này có nghĩa là chúng ta đã có nhiều hơn so với lần cập nhật cuối cùng.CalcNetInterval * 1000MilisecondsCalcNetIntervalTrong trường hợp này, giá trị của sản phẩm được tính theo giá bán hàng được giới hạn trong điều kiện tính toán lợi nhuận.self.orderBook.Bids.length > 0Điều kiện này (thông tin sâu, phải có thông tin cấp độ hợp lệ trong danh sách thanh toán). Khi điều kiện if được kích hoạt, thực hiệnself.preCalc = nowCập nhật các biến thời gian cuối cùng của thu nhập inself.preCalcTiếp tục thời giannowTrong số đó, các doanh nghiệp có tỷ lệ tăng trưởng cao hơn so với các doanh nghiệp khác.var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks)), tức là đổi đồng tiền thành tiền theo giá mua hiện tại (tiền hóa), và cộng với số tiền trong tài khoản với các biến địa phương được gán cho tuyên bốnetĐánh giá liệu tổng giá trị ròng hiện tại có phù hợp với tổng giá trị ròng được ghi nhận lần trước không:

            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }

Nếu không,net != self.preNetThực sự, hãy sử dụngnetTính năng cập nhật biến để ghi lại giá trị ròngself.preNetVà sau đó in cái này.netDữ liệu tổng giá trị ròng cho các nhà phát minh trên biểu đồ đường cong thu nhập của robot sàn giao dịch định lượng ((có thể được truy vấn trong tài liệu API FMZ)LogProfitChức năng này).

Nếu không kích hoạt thu nhập in đúng thời điểm, hãy tiếp tục quá trình sau đây và sẽ có kết quả tương tự.account.Stocks(Số đồng có sẵn trong tài khoản hiện tại)account.Balance(Số tiền có sẵn trong tài khoản hiện tại) được ghi lại trongself.btcself.cny◎ Tính toán tỷ lệ sai lệch và ghi lại giá trịself.p

self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)

Một thuật toán rất đơn giản, tính giá trị hiện tại của đồng tiền là tỷ lệ phần trăm của tổng giá trị tài khoản.

Vậy khi nào bạn sẽ quyết định kích hoạt sự cân bằng của đồng tiền? Các tác giả ở đây sử dụng 50% lên xuống 2 điểm phần trăm như một đệm, vượt quá sự cân bằng thực hiện vùng đệm, đó là:self.p < 0.48Sự dịch chuyển cân bằng tiền xu được kích hoạt, cho rằng đồng xu ít hơn, bắt đầu mua một vị trí trên sàn, tăng giá 0.01 mỗi lần, đặt ba tờ giấy nhỏ.self.p > 0.52Sau đó, người ta sẽ bán một tờ giấy nhỏ trên sàn. Cuối cùng, chờ một thời gian nhất định theo cài đặt tham số.Sleep(BalanceTimeout)Sau đó hủy tất cả các đơn đặt hàng.

        var orders = exchange.GetOrders()                  # 获取当前所有挂单,存在orders变量
        if (orders) {                                      # 如果获取当前挂单数据的变量orders不为null
            for (var i = 0; i < orders.length; i++) {      # 循环遍历orders,逐个取消订单
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)     # 调用exchange.CancelOrder,根据orders[i].Id取消订单
                }
            }
        }

Chức năng thứ tư được thêm vào:

Trong khi đó, một người đàn ông người Việt Nam có thể nói rằng:self.poll = function() {...}Các hàm là logic chính của toàn bộ chiến lược, và trong bài viết trước, chúng tôi đã nói về,main()Các hàm bắt đầu thực hiện, vàowhileTrước khi chết, chúng ta sử dụngvar reaper = LeeksReaper()Chúng tôi đã tạo ra các đối tượng cho máy thu hoạch hạt cải, và sau đó chúng tôi đã tạo ra các đối tượng cho máy thu hoạch hạt cải.main()Gọi vòng trong hàmreaper.poll()Đó là chức năng được gọi.

self.pollCác chức năng bắt đầu thực hiện, thực hiện một số công việc chuẩn bị trước mỗi vòng lặp, và sau đó thực hiện một số công việc khác.self.numTick++Những người khác cũng có thể làm điều đó.self.updateTrades()Bạn có thể cập nhật hồ sơ giao dịch thị trường gần đây và tính toán dữ liệu sử dụng liên quan.self.updateOrderBook()Những người tham gia cuộc họp báo này đã được mời đến tham dự các cuộc họp báo trên mạng xã hội.self.balanceAccount()Theo đó, các nhà đầu tư sẽ có thể kiểm tra số tiền (được đặt) cân bằng.

        var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct   # 计算爆发价格
        var bull = false             # 声明牛市标记的变量,初始为假
        var bear = false             # 声明熊市标记的变量,初始为假
        var tradeAmount = 0          # 声明交易数量变量,初始为0

Tiếp theo là đánh giá thị trường ngắn hạn hiện tại là bò hay gấu.

        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
            tradeAmount = self.cny / self.bidPrice * 0.99
        } 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
            tradeAmount = self.btc
        }

Bạn có nhớ bài viết trước không?self.updateOrderBook()Một hàm trong đó chúng ta sử dụng một thuật toán tính phương trọng số để tạo ra một chuỗi thời gian theo thứ tự.pricesĐịnh số. Có 3 hàm mới được sử dụng trong đoạn code này._.min_.maxsliceCác hàm này cũng rất dễ hiểu.

  • _.min: là giá trị nhỏ nhất trong một mảng tham số.

  • _.max: là giá trị lớn nhất trong các mảng tham số.

  • slice: là một hàm thành viên của một đối tượng matrix JavaScript, nó trả về một phần của một matrix theo chỉ mục, ví dụ:

    function main() {
        // index     .. -8 -7 -6 -5 -4 -3 -2 -1
        var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
        Log(arr.slice(-5, -1))    // 会截取 4 ~ 1 这几个元素,返回一个新数组:[4,3,2,1]
    }
    

    img

Ở đây, điều kiện để đánh giá gấu hay bò là:

  • self.numTick > 2Để được thành lập, nghĩa là khi một vòng kiểm tra mới bùng nổ, bạn phải trải qua ít nhất ba vòng kiểm tra trước khi được kích hoạt, tránh kích hoạt ngay từ đầu.
  • Chuỗi giáself.pricesNhững con số cuối cùng, là những con số mới nhất,self.pricesĐiểm chênh lệch giá tối đa hoặc tối thiểu trong phạm vi trước trong mảngburstPriceMột số người cho rằng, "Điều này là một sự cố lớn".

Nếu tất cả các điều kiện được đáp ứng, đánh dấubullHoặcbear, chotrueVà chotradeAmountCác nhà phân tích khác cũng cho biết rằng các nhà phân tích khác cũng có thể sử dụng các phương pháp này.

Một lần nữa,self.updateTrades()Đổi mới, tính toán trong hàmself.vol, đối với các tham sốBurstThresholdVolQuyết định liệu có giảm cường độ giao dịch hay không (giảm số lượng giao dịch dự kiến).

        if (self.vol < BurstThresholdVol) {
            tradeAmount *= self.vol / BurstThresholdVol   // 缩减计划交易量,缩减为之前量的self.vol / BurstThresholdVol 倍
        }
        
        if (self.numTick < 5) {
            tradeAmount *= 0.8      // 缩减为计划的80%
        }
        
        if (self.numTick < 10) {    // 缩减为计划的80%
            tradeAmount *= 0.8
        }

Sau đó, đánh giá các tín hiệu giao dịch, khối lượng giao dịch có phù hợp hay không:

        if ((!bull && !bear) || tradeAmount < MinStock) {   # 如果非牛市并且也非熊市,或者计划交易的量tradeAmount小于参数设置的最小交易量MinStock,poll函数直接返回,不做交易操作
            return
        }

Sau khi đưa ra phán quyết trên, thực hiệnvar tradePrice = bull ? self.bidPrice : self.askPriceTheo thị trường gấu hay thị trường bò, đặt giá giao dịch và gán giá đặt hàng tương ứng.

Cuối cùng là mộtwhileChuyển vòng, và điều kiện duy nhất để dừng lại làtradeAmount >= MinStockSố lượng giao dịch được lên kế hoạch nhỏ hơn số lượng giao dịch tối thiểu. Trong vòng lặp, thực hiện các lệnh theo trạng thái thị trường bò hoặc thị trường gấu hiện tại.orderId◎ Sau mỗi vòng đặt hàngSleep(200)Chờ 200 millisecond.orderIdCó phải là true (không kích hoạt điều kiện if nếu đặt hàng thất bại và không trả lại ID đặt hàng), nếu điều kiện là true;; được gán ID đặt hàng choself.tradeOrderId

Xác định một biến để lưu trữ dữ liệu đơn đặt hàngorderĐặt giá trị ban đầu lànull│ Sau đó vòng lặp lấy dữ liệu đặt hàng của ID này, và quyết định xem lệnh có đang bị treo hay không, nếu đang bị treo, hủy lệnh của ID đó, nếu không thì thoát khỏi vòng lặp này.

                var order = null           // 声明一个变量用于保存订单数据
                while (true) {             // 一个while循环
                    order = exchange.GetOrder(orderId)    // 调用GetOrder查询订单ID为 orderId的订单数据
                    if (order) {                          // 如果查询到订单数据,查询失败order为null,不会触发当前if条件
                        if (order.Status == ORDER_STATE_PENDING) {   // 判断订单状态是不是正在挂单中
                            exchange.CancelOrder(orderId)            // 如果当前正在挂单,取消该订单
                            Sleep(200)
                        } else {                                     // 否则执行break跳出当前while循环
                            break
                        }
                    }
                }

Sau đó thực hiện các quy trình sau:

                self.tradeOrderId = 0              // 重置self.tradeOrderId
                tradeAmount -= order.DealAmount    // 更新tradeAmount,减去提单的订单已经成交的数量
                tradeAmount *= 0.9                 // 减小下单力度
                if (order.Status == ORDER_STATE_CANCELED) {     // 如果订单已经是取消了
                    self.updateOrderBook()                      // 更新订单薄等数据
                    while (bull && self.bidPrice - tradePrice > 0.1) {   // 牛市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    while (bear && self.askPrice - tradePrice < -0.1) {  // 熊市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice -= 0.1
                    }
                }

Khi quá trình thoát khỏiwhile (tradeAmount >= MinStock) {...}Khi chu kỳ này diễn ra, điều này cho thấy quá trình giao dịch bùng nổ giá đã hoàn tất. Thực thiself.numTick = 0Đặt lạiself.numTickNó là 0.

LeeksReaper()Chế độ xây dựng cuối cùng sẽselfVà chúng ta sẽ quay lại.var reaper = LeeksReaper()Và tôi sẽ trả lại cho anh ấy.reaper

Cho đến nayLeeksReaper()Chúng tôi đã phân tích một lần nữa cách các hàm cấu trúc cấu trúc đối tượng máy thu hoạch hạt cải này và các phương pháp thực hiện đối tượng máy thu hoạch hạt cải, các quy trình thực thi các hàm logic chính. Tôi tin rằng sau khi đọc bài viết này, bạn nên có một sự hiểu biết rõ ràng hơn về quy trình thuật toán chiến lược tần suất cao này.


Thêm nữa

xukittyXin vui lòng cho biết ý tưởng của bạn về việc kết hợp máy thu hoạch cải xanh và robot cao tần số của thần cỏ đã có gì không?

Mattzhang1988Một số người đã nói rằng họ không thể làm điều đó.

CyndiYY1024Có một chút không hiểu, tại sao phải duy trì sự cân bằng của đồng tiền và tiền tệ, nếu không đạt được sự cân bằng, bạn sẽ phải mua và bán. Sau đó, sau khi BalanceTimeout, bạn sẽ hủy đơn đặt hàng, không cân bằng nữa, nhưng đi vào vòng bùng nổ tiếp theo.

Sức mạnh của DamasusĐâu là lệnh dưới đây?

Eddie.Trong đám mây trước đây, xem lại FMZ một lần nữa. Theo dõi biến động giá sàn, phát hiện sự bùng nổ giá, theo hướng xu hướng, tính tỷ lệ tỷ lệ hối đoái với quy mô giao dịch như một tham chiếu. Tôi đã nói đúng không, Dream General?

xukittyXin vui lòng cho chúng tôi biết tổng thể, chương trình liên tục cân bằng đồng tiền và tiền, tính năng này được tính đến với mục đích gì?

xukittyCảm ơn Dreamz, FMZ thật sự là kho báu.

printbtcKhông hiểu.

KhoangBurstThresholdVol là gì?

Evan1987Một số người cho rằng video này là một phần của bộ phim truyền hình, nhưng không phải là một phần của bộ phim truyền hình.

rootme666, sau khi nghiên cứu, tôi có thể viết một máy thu hoạch cải giống như tiền in không?

Giấc mơ nhỏTrong một bài viết, Grasshopper đã nói rằng tần số cao cần một môi trường thị trường. Về chiến lược, máy thu hoạch rau củ và robot tần số cao của Grasshopper có cùng một ý tưởng.

Giấc mơ nhỏXin lỗi, bài viết này chủ yếu dành cho những người mới bắt đầu thực hiện quy trình, một loạt những lời vớ vẩn thực sự rất rõ ràng, bạn đã bỏ qua.

Giấc mơ nhỏtuyệt!

Giấc mơ nhỏMáy thu hoạch cải bắp nguyên bản có một mô-đun cân bằng, có thể xem xét loại bỏ.

Giấc mơ nhỏKhông lịch sự

Giấc mơ nhỏ

Giấc mơ nhỏSố lượng bùng phát, đây là một tham số chính sách, được đặt bởi con người, hãy xem chi tiết chính sách, bài viết, và bạn sẽ biết những gì biến này kiểm soát.

Giấc mơ nhỏCó lẽ nguyên tắc là tương tự.