Thiết kế chiến lược đầu cơ tiền mặt cho tiền kỹ thuật số (2)

Tác giả:Giấc mơ nhỏ, Tạo: 2021-07-30 16:36:48, Cập nhật: 2023-09-20 10:36:43

img

Thiết kế chiến lược đầu cơ tiền mặt cho tiền kỹ thuật số (2)

Trong bài viết trước, chúng ta đã cùng nhau thực hiện một chiến lược bảo hiểm đơn giản, và sau đó chúng ta sẽ học cách nâng cấp chiến lược này. Thay đổi chiến lược sẽ không lớn, nhưng các chi tiết thay đổi cần được chú ý. Các định nghĩa ở một số nơi trong mã và những thay đổi trước đó cần được hiểu rõ hơn.

Cần nâng cấp chiến lược này

  • Chuyển đổi giao dịch giao dịch trực tiếp đối tượng đòn bẩy Sự thay đổi này chỉ liên quan đến ổ đĩa thực, một số giao dịch hiện tại có tất cả các giao diện dẫn đầu hiện tại được đóng gói trên FMZ. Đối với các đối tượng giao dịch được đóng gói trực tiếp trên FMZ và hỗ trợ dẫn đầu hiện tại, bạn có thể chuyển đổi trực tiếp.
  • Thêm biểu đồ chênh lệch Tăng biểu đồ chênh lệch hiển thị vì chỉ vẽA交易所->B交易所B交易所->A交易所Chúng tôi sử dụng một đường thẳng để tạo ra một đường thẳng và tạo ra một đường thẳng.画线类库Và chúng tôi đã cùng nhau học cách sử dụng FMZ.模版类库Các chức năng.
  • Chức năng bảo hiểm một bên Sự thay đổi này có thể được gọi là tương đối lớn, bởi vì trong giao dịch đầu cơ cụ thể, việc đảo ngược hoàn toàn chênh lệch giữa hai sàn giao dịch rất khó. Hầu hết thời gian, giá của một sàn giao dịch duy trì cao hơn giá của sàn giao dịch khác. Vào thời điểm này, nếu tài sản của chúng ta đã được đầu cơ hoàn toàn (tức là tiền ở sàn giao dịch giá thấp, tiền ở sàn giao dịch giá cao), đầu cơ bị đình trệ và không thể phụ thuộc vào lợi nhuận biến động của chênh lệch giá nữa.
  • Các tham số như đường chênh lệch giá bảo hiểm tương tác Tăng tính năng tương tác cho chính sách, có thể sửa đổi đường kích hoạt chênh lệch trong thời gian thực.
  • Lưu ý thông tin về thanh trạng thái, hiển thị bằng hình thức bảng Bạn có thể sử dụng một số hình ảnh để hiển thị dữ liệu.

Chúng ta hãy thực hiện từng thiết kế một.

Chuyển đổi giao dịch giao dịch trực tiếp đối tượng đòn bẩy

Sử dụng mã để chuyển sang mô hình đòn bẩy tiền mặt bằng ví dụ:exchanges[i].IO, nhập tham sốtrade_normalChuyển sang đòn bẩy, truyền vàotrade_super_marginChuyển sang full lever, không hỗ trợ kiểm tra lại.

TrongmainTăng giai đoạn chuẩn bị cho việc bắt đầu hàm:

    // 切换杠杆模式
    for (var i = 0 ; i < exchanges.length ; i++) {   // 遍历检测所有添加的交易所对象
        if (exchanges[i].GetName() == "Binance" && marginType != 0) {   // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
            if (marginType == 1) {
                Log(exchanges[i].GetName(), "设置为杠杆逐仓")
                exchanges[i].IO("trade_normal")
            } else if (marginType == 2) {
                Log(exchanges[i].GetName(), "设置为杠杆全仓")
                exchanges[i].IO("trade_super_margin")
            }
        }
    }

Ở đây, chỉ thêm mã cho mô hình đòn bẩy chuyển đổi đồng xu cho tiền mặt đồng xu, vì vậy việc đặt chuyển đổi trên các tham số chính sách cũng chỉ có hiệu quả đối với tiền mặt đồng xu.

Thêm biểu đồ chênh lệch

Sử dụng mẫu hình đã đóng gói rất đơn giản.画线类库◎ Có thể tìm kiếm trực tiếp trên quảng trường chiến lược của nền tảng FMZ.

img

Bạn có thể tham khảo thêm tại đây:https://www.fmz.com/strategy/27293Bạn có thể chuyển sang trang sao chép mẫu này.

img

Bạn có thể nhấp vào nút để sao chép thư viện mẫu này vào thư viện chính sách của mình.

img

Sau đó, trong trang chỉnh sửa chính sách, bạn có thể chọn thư mục mẫu cần sử dụng trong cửa sổ mẫu. Sau khi chọn, hãy lưu chính sách, chính sách sẽ tham khảo mẫu này. Đây chỉ là một hướng dẫn đơn giản về việc sử dụng thư mục mẫu, vì vậy bạn không cần phải lặp lại các hoạt động.画线类库Những người tham gia vào cuộc thảo luận đã được trích dẫn.

Chúng tôi chủ yếu học cách sử dụng nó.画线类库Chế độ này được sử dụng để vẽ các biểu đồ.

img

Chúng tôi đang lên kế hoạchA->BNhững người dân Việt Nam đang sống trong tình trạng khó khăn.B->ACác đường chênh lệch, các đường kích hoạt chênh lệch đều được vẽ. Bạn cần vẽ hai đường cong (mức chênh lệch hiện tại từ A đến B, B đến A), hai đường ngang (mức chênh lệch kích hoạt giá), như hình trên.

Vì chúng ta phải thiết kế một cách đơn phương, và chúng ta phải làm điều đó một cách đơn giản.A->BB->ACác thiết kế khác nhau trong bài viết trước đây không thể được sử dụng. Bài trước:

      var targetDiffPrice = hedgeDiffPrice
      if (diffAsPercentage) {
          targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
      }

Chỉ có một sự khác biệt kích hoạt.targetDiffPrice‖ Vì vậy, ở đây chúng ta sẽ thay đổi mã, thay đổi các tham số đầu tiên.

img

Sau đó, thay đổi mã:

        var targetDiffPriceA2B = hedgeDiffPriceA2B
        var targetDiffPriceB2A = hedgeDiffPriceB2A
        if (diffAsPercentage) {
            targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
            targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
        }

Điều này có nghĩa là giá cả sẽ giảm so với trước đây.targetDiffPriceMột trở thành hai.targetDiffPriceA2BtargetDiffPriceB2A‖ Sau đó, bạn có thể vẽ dữ liệu này trên biểu đồ bằng cách sử dụng hàm vẽ đường trong thư viện lớp vẽ đường.

        // 画图
        $.PlotHLine(targetDiffPriceA2B, "A->B")  // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
        $.PlotHLine(targetDiffPriceB2A, "B->A")

Khi chiến lược được thực hiện, biểu đồ này cho thấy:

img

Tiếp theo, vẽ đường cong chênh lệch thời gian thực, để tránh đường vẽ quá nhiều. Đặt mã của đường cong vẽ dữ liệu chênh lệch thời gian thực vào kiểm tra cân bằng.

        if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
            nowAccs = _C(updateAccs, exchanges)
            var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
            cancelAll()
            if (isBalance) {
                lastKeepBalanceTS = ts
                if (isTrade) {
                    var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
                    isTrade = false 
                }                
            }

            $.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price)  // 画实时差价曲线
            $.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price)  // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
        }

Điều này chỉ cho phép bạn vẽ 4 dòng mã biểu đồ, cho phép chính sách hiển thị biểu đồ khi chạy.

Chức năng bảo hiểm một bên

Trong bài viết trên, chúng tôi đã đề cập đến việc các đường dẫn kích hoạt chênh lệch giá đã được thay đổi thành hai đường, kiểm soát riêng biệt.A->BNhững người tham gia vào cuộc họp này nói rằng:B->AĐiều này không thể sử dụng thuật toán giá đặt hàng trước đó, thay thế cho cách giảm giá giao dịch.

        if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) {          // A -> B 盘口条件满足            
            var priceSell = depthA.Bids[0].Price - slidePrice
            var priceBuy = depthB.Asks[0].Price + slidePrice
            var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
            if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
                Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks)  // 提示信息
                hedge(exB, exA, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        } else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) {   // B -> A 盘口条件满足
            var priceBuy = depthA.Asks[0].Price + slidePrice
            var priceSell = depthB.Bids[0].Price - slidePrice
            var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
            if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
                Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks)  // 提示信息
                hedge(exA, exB, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        }

Vì giá mua bán đã được chia ra thành hai dữ liệu, chúng ta có thể tính toán các hàm đầu cơ.hedgeNhững điều này cũng cần phải được sửa đổi.

function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
    var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
    var sellRoutine = sellEx.Go("Sell", priceSell, amount)
    Sleep(500)
    buyRoutine.wait()
    sellRoutine.wait()
}

Có một số điều chỉnh nhỏ dựa trên những thay đổi này, không được mô tả ở đây, bạn có thể xem mã cụ thể.

Các tham số như đường chênh lệch giá bảo hiểm tương tác

Thêm sự tương tác cho các chiến lược, cho phép các chiến lược có thể sửa đổi đường kích hoạt chênh lệch trong thời gian thực. Đây là nhu cầu thiết kế cho một chiến lược bán tự động, được thực hiện cùng với đây như một ví dụ giảng dạy. Thiết kế giao tiếp chính sách cũng rất đơn giản, đầu tiên là thêm điều khiển tương tác vào chính sách trên trang chỉnh sửa chính sách.

img

Thêm hai điều khiển, một tên là A2B và một tên là B2A. Khi nhập số vào hộp đầu vào của điều khiển, bấm vào nút nhập bên phải hộp. Nó sẽ ngay lập tức gửi lệnh cho chính sách, ví dụ: nhập số vào hộp đầu vào.123Nhấp vàoA2BSau khi nhấn nút này, bạn sẽ được lệnh ngay lập tức đến chính sách.

A2B:123

Khám phá, xử lý mã tương tác trên thiết kế trong mã chiến lược.

        // 交互
        var cmd = GetCommand()   // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
        if (cmd) {               // 检测到有交互指令,例如:A2B:123
            Log("接收到命令:", cmd)
            var arr = cmd.split(":")   // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
            if (arr[0] == "A2B") {     // 判断触发的交互控件是不是A2B
                Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageB2A = parseFloat(arr[1])     // 修改触发差价线
                } else {
                    hedgeDiffPriceA2B = parseFloat(arr[1])          // 修改触发差价线
                }
            } else if (arr[0] == "B2A") {           // 检测到触发的控件是B2A     
                Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageA2B = parseFloat(arr[1])
                } else {
                    hedgeDiffPriceB2A = parseFloat(arr[1])
                }
            }
        }

Lưu ý thông tin về thanh trạng thái, hiển thị bằng hình thức bảng

Để hiển thị dữ liệu trạng thái có nhiều quy định hơn, dễ quan sát hơn.

        var tbl = {
            "type" : "table", 
            "title" : "数据", 
            "cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"], 
            "rows" : [], 
        }
        tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
        tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])

        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")

img

Kiểm tra lại

Trả lời chỉ là một chiến lược thử nghiệm, chức năng phát hiện ban đầu, nhiều BUG trong giai đoạn kiểm tra lại thực sự có thể được thử nghiệm. Không cần phải quan tâm nhiều đến kết quả trả lời, chiến lược cuối cùng vẫn cần đạn thật trong môi trường thực tế.

img

img

Nguồn mã chiến lược:https://www.fmz.com/strategy/302834


Có liên quan

Thêm nữa

15570686905Chiến lược giao dịch này được thêm vào chức năng hợp đồng, tốt hơn hết là thêm vào hợp đồng lâu dài, hợp đồng tỷ lệ giao dịch.

Những đám mây nhẹĐánh giá lại main:127:9 - TypeError: Cannot read property 'SetPrecision' of undefined Chiến lược bảo hiểm hiện tại với các đồng tiền khác nhau Ver1.1

Giấc mơ nhỏĐược rồi, có cơ hội cho bài học.

Những đám mây nhẹTôi hiểu rồi, cảm ơn bạn rất nhiều.

Giấc mơ nhỏBạn cần thêm hai đối tượng giao dịch.