Các loại tiền tương lai kỹ thuật số

Tác giả:Giấc mơ nhỏ, Tạo: 2021-07-02 14:35:34, Cập nhật: 2023-09-21 21:09:56

img

Các loại tiền tương lai kỹ thuật số

Gần đây, các chiến lược loại Martin được thảo luận nhiều hơn trong nhóm chính thức của FMZ, và không có nhiều chiến lược Martin về hợp đồng tiền kỹ thuật số trên nền tảng. Vì vậy, tôi đã tận dụng cơ hội này để thiết kế một chiến lược loại Martin tương lai tiền kỹ thuật số đơn giản. Tại sao gọi là chiến lược loại Martin, bởi vì các chiến lược tiềm năng không nhỏ, nó không hoàn toàn phù hợp với chiến lược Martin.

Bài viết này chủ yếu hướng đến việc học hỏi từ việc thiết kế chiến lược kiểu Martin, và ý tưởng chiến lược đã rõ ràng, vì chúng tôi là những người dùng FMZ, chúng tôi đã xem xét nhiều hơn về thiết kế chiến lược.

Truy cập quyền lợi chung

Khi thiết kế chiến lược tương lai tiền kỹ thuật số, dữ liệu này thường được sử dụng để tính tổng lợi nhuận. Vì tính lợi nhuận, đặc biệt là khi tính lợi nhuận lơ lửng.exchange.GetAccount()Có được là tài sản có sẵn và tài sản bị đóng băng. Trên thực tế, hầu hết các sàn giao dịch tương lai tiền kỹ thuật số đều cung cấp dữ liệu tổng quyền lợi, nhưng FMZ không có một gói thống nhất về tính chất này.

Vì vậy, chúng tôi tạo ra dữ liệu này dựa trên các chức năng thiết kế khác nhau của các sàn giao dịch:

// OKEX V5 获取总权益
function getTotalEquity_OKEX_V5() {
    var totalEquity = null 
    var ret = exchange.IO("api", "GET", "/api/v5/account/balance", "ccy=USDT")
    if (ret) {
        try {
            totalEquity = parseFloat(ret.data[0].details[0].eq)
        } catch(e) {
            Log("获取账户总权益失败!")
            return null
        }
    }
    return totalEquity
}

// 币安期货
function getTotalEquity_Binance() {
    var totalEquity = null 
    var ret = exchange.GetAccount()
    if (ret) {
        try {
            totalEquity = parseFloat(ret.Info.totalWalletBalance)
        } catch(e) {
            Log("获取账户总权益失败!")
            return null
        }
    }
    return totalEquity
}

Trong mãtotalEquitySau đó, chúng ta viết một hàm khác để gọi đầu vào và gọi hàm tương ứng theo tên giao dịch.

function getTotalEquity() {
    var exName = exchange.GetName()
    if (exName == "Futures_OKCoin") {
        return getTotalEquity_OKEX_V5()
    } else if (exName == "Futures_Binance") {
        return getTotalEquity_Binance()
    } else {
        throw "不支持该交易所"
    }
}

Thiết kế một số chức năng hỗ trợ

Trước khi thiết kế các hàm chính, logic chính. Chúng ta cũng cần chuẩn bị một số chức năng phụ trợ.

  • Loại bỏ tất cả các danh sách hiện tại

    function cancelAll() {
        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, orders[i])
                Sleep(500)
            }
            Sleep(500)
        }
    }
    

    Chức năng này chắc chắn quen thuộc với những người thường đọc mã mẫu chính sách trên quảng trường chính sách FMZ, nhiều chính sách đã sử dụng thiết kế tương tự.

  • Hoạt động đặt hàng tương lai

    function trade(distance, price, amount) {
        var tradeFunc = null 
        if (distance == "buy") {
            tradeFunc = exchange.Buy
        } else if (distance == "sell") {
            tradeFunc = exchange.Sell
        } else if (distance == "closebuy") {
            tradeFunc = exchange.Sell
        } else {
            tradeFunc = exchange.Buy
        }
        exchange.SetDirection(distance)
        return tradeFunc(price, amount)
    }
    
    function openLong(price, amount) {
        return trade("buy", price, amount)
    }
    
    function openShort(price, amount) {
        return trade("sell", price, amount)
    }
    
    function coverLong(price, amount) {
        return trade("closebuy", price, amount)
    }
    
    function coverShort(price, amount) {
        return trade("closesell", price, amount)
    }
    

    Các giao dịch tương lai có bốn hướng: mở dài, mở ngắn, đóng dài, đóng ngắn. Vì vậy, chúng tôi đã thiết kế bốn chức năng đặt hàng tương ứng với các hoạt động này. Nếu chỉ xem xét đặt hàng, có một vài yếu tố cần thiết: hướng, đặt hàng giá, đặt hàng số lượng. Vì vậy, chúng tôi đã thiết kế một chương trình tên là:tradeCác hàm sẽ xử lý khi方向(distance)下单价格(price)下单量(amount)Các hoạt động này được thực hiện trong thời gian nhất định. Các hàm được gọi cuối cùng là openLong, openShort, coverLong, coverShort.tradeChức năng hoàn thành chức năng thực tế, đó là đặt hàng trên sàn giao dịch tương lai theo hướng, giá, số lượng đã thiết lập.

Chức năng chủ

Ý tưởng chiến lược rất đơn giản, với giá hiện tại để treo bán một khoảng cách nhất định dưới đường cơ sở, đặt hàng mua một khoảng cách nhất định. Khi giao dịch được thực hiện, hủy tất cả các đơn đặt hàng còn lại, sau đó treo một đơn đặt hàng ngang hàng mới theo giá đang nắm giữ ở một khoảng cách nhất định, treo đặt hàng tăng theo giá hiện tại sau khi được cập nhật, nhưng không tăng gấp đôi số lượng đặt hàng.

  • Công việc ban đầu Vì chúng ta cần hai biến toàn cầu để ghi lại ID đơn hàng.

    var buyOrderId = null
    var sellOrderId = null
    

    Sau đó, các tùy chọn sử dụng ổ đĩa OKEX_V5 được thiết kế trong các thông số giao diện chính sách, vì vậy cần phải xử lý một số điều trong mã:

    var exName = exchange.GetName()    
    // 切换OKEX V5模拟盘
    if (isSimulate && exName == "Futures_OKCoin") {
        exchange.IO("simulate", true)
    }
    

    Các tùy chọn để đặt lại tất cả thông tin cũng được thiết kế trong các thông số giao diện, vì vậy mã cũng có xử lý tương ứng:

    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("重置所有数据", "#FF0000")
    }
    

    Chúng ta chỉ chạy theo một hợp đồng vĩnh cửu, vì vậy ở đây viết chết, chỉ được thiết lập như một hợp đồng vĩnh cửu.

    exchange.SetContractType("swap")
    

    Sau đó, chúng ta cũng phải xem xét các vấn đề về độ chính xác giá đặt hàng, độ chính xác số lượng đặt hàng, nếu độ chính xác không được thiết lập tốt, độ chính xác bị mất trong quá trình tính toán chiến lược, nhiều số lượng nhỏ của dữ liệu dễ dàng gây ra sự từ chối của giao diện giao dịch khi đặt hàng.

    exchange.SetPrecision(pricePrecision, amountPrecision)
    Log("设置精度", pricePrecision, amountPrecision)
    

    Khả năng khôi phục dữ liệu đơn giản

    if (totalEq == -1 && !IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = getTotalEquity()
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "获取初始权益失败"
            }
        } else {
            totalEq = recoverTotalEq
        }
    }
    

    Bạn có thể đặt các tham số nếu bạn muốn chỉ định tổng quyền lợi của tài khoản ban đầu khi chính sách chạy.totalEqNếu tham số này được đặt là -1, chính sách sẽ đọc dữ liệu tổng quyền lợi được lưu trữ, nếu không có dữ liệu tổng quyền lợi được lưu trữ, đó là tổng quyền lợi ban đầu với tổng quyền lợi được đọc hiện tại như là tiến độ hoạt động của chính sách, sau đó tổng quyền lợi tăng sẽ báo hiệu tăng, tổng quyền lợi giảm sẽ báo hiệu mất. Nếu đọc đến dữ liệu tổng quyền lợi, sử dụng dữ liệu này sẽ tiếp tục hoạt động.

  • Lý thuyết chính Sau khi hoàn thành công việc ban đầu, cuối cùng tôi đã đến phần logic chính của chiến lược, và để dễ dàng giải thích, tôi đã viết hướng dẫn trực tiếp trong chú thích mã.

      while (1) {                                  // 策略主要逻辑设计为一个死循环
          var ticker = _C(exchange.GetTicker)      // 首先读取当前行情信息,主要用到最新成交价
          var pos = _C(exchange.GetPosition)       // 读取当前持仓数据
          if (pos.length > 1) {                    // 判断持仓数据,由于这个策略的逻辑,是不太可能同时出现多空持仓的,所以发现同时出现多空持仓就抛出错误
              Log(pos)
              throw "同时有多空持仓"                  // 抛出错误,让策略停止
          }
          // 根据状态而定
          if (pos.length == 0) {                    // 根据持仓状态做出不同操作,pos.length == 0是当没有持仓时
              // 未持仓了,统计一次收益
              if (!IsVirtual()) {
                  var currTotalEq = getTotalEquity()
                  if (currTotalEq) {
                      LogProfit(currTotalEq - totalEq, "当前总权益:", currTotalEq)
                  }
              }
    
              buyOrderId = openLong(ticker.Last - targetProfit, amount)       // 挂开多仓的买单
              sellOrderId = openShort(ticker.Last + targetProfit, amount)     // 挂开空仓的卖单
          } else if (pos[0].Type == PD_LONG) {   // 有多头持仓,挂单位置、数量有所不同
              var n = 1
              var price = ticker.Last
              buyOrderId = openLong(price - targetProfit * n, amount)
              sellOrderId = coverLong(pos[0].Price + targetProfit, pos[0].Amount)
          } else if (pos[0].Type == PD_SHORT) {   // 有空头持仓,挂单位置、数量有所不同
              var n = 1
              var price = ticker.Last
              buyOrderId = coverShort(pos[0].Price - targetProfit, pos[0].Amount)
              sellOrderId = openShort(price + targetProfit * n, amount)
          }
    
          if (!sellOrderId || !buyOrderId) {   // 如果有一边挂单失败就取消所有挂单,重来
              cancelAll()
              buyOrderId = null 
              sellOrderId = null
              continue
          } 
    
          while (1) {  // 挂单完成,开始监控订单
              var isFindBuyId = false 
              var isFindSellId = false
              var orders = _C(exchange.GetOrders)
              for (var i = 0 ; i < orders.length ; i++) {
                  if (buyOrderId == orders[i].Id) {
                      isFindBuyId = true 
                  }
                  if (sellOrderId == orders[i].Id) {
                      isFindSellId = true 
                  }               
              }
              if (!isFindSellId && !isFindBuyId) {    // 检测到买卖单都成交了
                  cancelAll()
                  break
              } else if (!isFindBuyId) {   // 检测到买单成交
                  Log("买单成交")
                  cancelAll()
                  break
              } else if (!isFindSellId) {  // 检测到卖单成交
                  Log("卖单成交")
                  cancelAll()
                  break
              }
              LogStatus(_D())
              Sleep(3000)
          }
          Sleep(500)
      }
    

Tất cả logic và thiết kế đã được giải thích.

Kiểm tra lại

Trong khi đó, một người phụ nữ khác cũng đã bị ảnh hưởng bởi những hành động của người khác.

img

img

Như bạn có thể thấy, chiến lược kiểu Martin vẫn có một số rủi ro.

Khả năng chơi OKEX V5

img

Địa chỉ chiến lược:https://www.fmz.com/strategy/294957

Các chiến thuật được sử dụng chủ yếu để học tập, vàng thật bạc cẩn thận ~!


Có liên quan

Thêm nữa

Lisa20231Tôi muốn hỏi về điều này. if (!isFindSellId &&!isFindBuyId) { // phát hiện tất cả các đơn đặt hàng đã được giao dịch Khi phát hiện đơn đặt hàng, nếu bạn nhanh chóng đặt và thả chốt và đồng thời thực hiện giao dịch mua bán, bạn có thể phát hiện ra lỗi không?

Neo1898Một cách khác là mô hình hợp đồng là toàn bộ hoặc từng cổ phiếu được thiết lập thế nào?

Neo1898Nếu như đã có một hợp đồng, tại sao không có một hợp đồng gấp đôi được thiết lập? Mua bán là gấp đôi?

Những đám mây nhẹNhờ đó, cuối cùng tôi đã hiểu được tất cả. Sau đó học cách kiểm soát danh sách, sau đó viết một Martin hai bên. Trong hai ngày, tôi đã viết 580 dòng. Xin cảm ơn bạn.

hk lượng/upload/asset/1a9ebf427c4e2cbf1c327.png Không, không, không, không.

Giấc mơ có giá trị 8 chữ sốNếu

Giấc mơ có giá trị 8 chữ sốTổng quyền sở hữu

khôngCó cần phải dừng lại không?

btcrobotMartin, đếm lại, trở lại 0.

wqyBạn không thấy nó ở số đơn giản = =, và n luôn bằng 1.

LvdaleiChiến lược là mở nhiều không gian hay mở một mình?

Giấc mơ nhỏKhông đưa ra sai lầm; vẫn hủy tất cả các đơn đặt hàng, thoát khỏi vòng lặp hiện tại, và tiếp tục gắn đơn đặt hàng logic; ngay lập tức giao dịch được thực hiện, tương đương với ăn lợi nhuận chênh lệch giá.

Giấc mơ nhỏThông thường, bạn nên sử dụng toàn bộ kho.

Giấc mơ nhỏĐộng lực có thể được thiết lập cụ thể trên sàn giao dịch, tùy theo sở thích rủi ro của riêng bạn.

Giấc mơ nhỏToàn là 666!

Giấc mơ nhỏNếu biến isFindBuyId không phù hợp thì nó sẽ là isNotFindBuyId.

Giấc mơ nhỏChiến thuật này không được thiết kế để dừng lỗ. Vì vậy, đường cong chạy ra có thể được nhìn thấy là một đường đi lên.

Giấc mơ nhỏHa-ha, nơi ở của Martin. Bài viết này chủ yếu là thiết kế chiến lược giảng dạy mà không cần chú ý nhiều.

Giấc mơ nhỏChữ N đó được dùng để thay đổi sau khi làm, ví dụ như nghĩ về n lần khoảng cách đóng gói, tạm thời có thể được định nghĩa là 1⁄2.

Giấc mơ nhỏNhững người khác cũng có thể làm điều đó.