Hướng dẫn cơ bản cho nền tảng FMZ Quant Strategy Writing

Tác giả:Ninabadass, Tạo: 2022-03-18 09:00:46, Cập nhật: 2022-04-02 11:48:15

[TOC] Bài hướng dẫn này chứa kiến thức cơ bản về viết chiến lược, bao gồm giới thiệu API, backtest, biểu đồ và hơn thế nữa. Sau khi học bài hướng dẫn cơ bản này, người dùng sẽ có thể sử dụng API cơ bản một cách thành thạo và viết một chiến lược bot ổn định. Trước khi học bài hướng dẫn, bạn cần phải học cách sử dụngBắt đầu FMZ Quant Platform.

Bài hướng dẫn phiên bản cũ:FMZ Quant (FMZ.COM) Hướng dẫn viết chiến lược 2.0 (Hướng dẫn); có rất nhiều chỉ mục bài viết trong hướng dẫn, được khuyến cáo đọc.

Hướng dẫn sơ bộ về viết chiến lược

API giới thiệu

Giao dịch chương trình là sử dụng các chương trình để kết nối với các nền tảng thông qua API để đạt được việc mua và bán tự động hoặc các chức năng khác theo ý định thiết kế.

Hiện tại, có hai giao thức giao diện chính cho các nền tảng tiền điện tử: REST và Websocket. Mỗi lần giao thức REST thu thập dữ liệu, nó cần được truy cập một lần. Hãy lấy API của nền tảng mô phỏng Wex.app làm ví dụ. Mở [link] (https://api.wex.app/api/v1/public/ticker?market=BTC_USDT) trực tiếp trong trình duyệt và bạn có thể nhận được kết quả như sau:

{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}

Bằng cách này, bạn có thể thấy rằng giao dịch sau báo giá thị trường mới nhất của cặp giao dịch BTC_USDT, sẽ thay đổi mỗi khi nó được làm mới; market=" được theo sau bởi các tham số cặp giao dịch cụ thể, có thể được sửa đổi để có được dữ liệu cặp giao dịch khác. Đối với các giao diện công cộng, chẳng hạn như báo giá thị trường, mọi người có thể có được chúng, do đó không cần xác minh. Tuy nhiên, một số giao diện cần xác định danh tính của người dùng khi đặt đơn đặt hàng hoặc có tài khoản. Trong trường hợp này, cần API-KEY để đăng ký. Websocket là chế độ đăng ký. Sau khi gửi nội dung cần đăng ký, nền tảng sẽ gửi dữ liệu cập nhật cho chương trình, và nó không cần phải được xem lại mỗi lần, vì vậy nó hiệu quả hơn.

Nền tảng giao dịch FMZ Quant bao gồm giao diện REST của mọi nền tảng, và sử dụng một cách thống nhất để gọi và định dạng dữ liệu thống nhất, làm cho việc viết chiến lược đơn giản hơn và chung hơn.

Ngôn ngữ lập trình khác nhau

Hầu hết các phần của tài liệu API nền tảng FMZ sử dụng JavaScript làm ví dụ, nhưng do việc đóng gói, hầu như không có sự khác biệt giữa các ngôn ngữ khác nhau, và bạn chỉ cần chú ý đến các vấn đề cú pháp. C++" là một chút đặc biệt, và các hướng dẫn trong tương lai sẽ có một phần giới thiệu chuyên ngành. Vì Js tương đối đơn giản và không có vấn đề về tính tương thích, nên khuyến cáo cho người mới bắt đầu sử dụng. Nền tảng FMZ Quant hỗ trợ đầy đủ Python, và có thể cài đặt tự do các gói khác nhau. Nó được khuyến cáo cho người dùng có nền tảng lập trình nhất định. Đối với người dùng không muốn học ngôn ngữ lập trình và chỉ muốn viết chiến lược, nền tảng FMZ cũng hỗ trợ nhanh chóng Mylanguage, về cơ bản tương thích với các ngôn ngữ lập trình Webstock, và nó được khuyến cáo cho những người có kinh nghiệm liên quan. Nhược điểm là Webstock không giống với các ngôn ngữ lập trình mạnh mẽ và linh hoạt. Do đó, không cần nỗ lực lớn để học các ngôn ngữ lập trình như các chiến lược lập

Vì Python có các phiên bản khác nhau, nó có thể được chỉ định ở đầu chương trình, chẳng hạn như:#!Python2#!Python3. Lưu ý rằng JavaScript gần đây đã nâng cấp cú pháp ES6 của nó, và những người quan tâm có thể tìm hiểu về nó. Các mã Python và Javascript với các chức năng tương tự được hiển thị dưới đây. Có thể thấy rằng chỉ có sự khác biệt cú pháp, vì vậy tài liệu API chỉ đưa ra ví dụ về Javascript, và hướng dẫn này cũng sẽ tính đến các trường hợp sử dụng đặc biệt của Python.

#python code
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#the corresponding Js code
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

Các khuyến nghị tài nguyên

  • Bài hướng dẫn này sẽ không cung cấp giới thiệu chi tiết về mỗi giao diện trong tài liệu API nền tảng FMZ, vì vậy bạn có thể kiểm trabài viết này để biết thêm chi tiết.
  • Nếu bạn muốn nhận tín hiệu tradingview và đặt hàng trên FMZ, bạn có thể tham khảobài viết này.
  • Để bắt đầu nhanh Javascript và Python, viết các chiến lược đơn giản không cần cú pháp phức tạp, nhưng chỉ cần một số khái niệm cơ bản; bạn có thể nghiên cứu hướng dẫn trong khi bạn đang học cách lập trình (https://www.fmz.com/bbs-topic/9123, https://www.fmz.com/bbs-topic/9124).
  • Tài liệu MylanguageMylanguage vẫn rất thuận tiện cho các chiến lược xu hướng.
  • Đây là một ví dụ gọi của C ++. Những người quan tâm đến C ++ có thể có một cái nhìn.ví dụkhông được khuyến cáo.
  • Khóa học giao dịch định lượng tiền điện tử của NetEase Cloud Classroom, chính thức được sản xuất bởi FMZ, chỉ cần 20 nhân dân tệ, với nội dung chi tiết phong phú, từ đơn giản đến sâu sắc, phù hợp cho người mới bắt đầu!courselink
  • Đây làmột số chiến lược giảng dạyBạn có thể thử viết các chiến lược trong khi bạn đang học những điều cơ bản.
  • Giải thích chi tiết về mã nguồn chiến lược:liên kết.

Công cụ gỡ lỗi

Nền tảng FMZ Quant cung cấpDebug Toolcho việc gỡ lỗi giao diện API. Công cụ gỡ lỗi chỉ hỗ trợ JavaScript và chỉ có thể được thực hiện trong một khoảng thời gian; giao diện nền tảng có thể được gỡ lỗi mà không cần tạo bot; dữ liệu trả về sẽ được trả về như là kết quả, và mã của công cụ gỡ lỗi sẽ không được lưu. Khi bạn làm việc thông qua hướng dẫn này, bạn có thể thử nghiệm với công cụ gỡ lỗi cùng một lúc.img

Khung chương trình chiến lược

Chương trình chiến lược giống như một chương trình bình thường, được thực hiện theo các lệnh mã. Phần đặc biệt là phải có hàm main. Vì chiến lược cần chạy không bị gián đoạn, thường cần một vòng lặp cộng với thời gian ngủ. Bởi vì tần suất truy cập của API nền tảng bị giới hạn, thời gian ngủ cần phải được điều chỉnh phù hợp. Khung này là việc thực hiện điển hình ở khoảng thời gian cố định, và bạn cũng sử dụng Websocket để viết các chiến lược dựa trên sự kiện. Ví dụ, thực thi ngay lập tức miễn là độ sâu thay đổi, sẽ được giới thiệu trong hướng dẫn nâng cao.

Các chức năng khác với các hành động đặc biệt được hiển thị như sau:

  • onexit() là một chức năng xuất phát bình thường; thời gian thực thi tối đa của nó là 5 phút; nó có thể không được xác định; nếu thời gian đã hết, sẽ báo cáo lỗi ngắt.
  • onerror() là một hàm thoát bất thường; thời gian thực thi tối đa của nó là 5 phút; nó có thể không được xác định.
  • init() là một hàm khởi tạo; chương trình chiến lược của nó sẽ được gọi tự động khi nó bắt đầu chạy; nó có thể không được xác định.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

Trong ví dụ trước đây, nếu có một lỗi trong truy cập mạng, chiến lược có thể dừng trực tiếp. Nếu bạn muốn một chiến lược tương tự như khởi động lại tự động và sẽ không dừng lại, bạn có thể sử dụng vòng lặp chính chịu lỗi trong chiến lược bot (không sử dụng try cho backtest). Tất nhiên, điều này chỉ được khuyến cáo khi chiến lược ổn định, nếu không tất cả các lỗi sẽ không được báo cáo, khiến việc tìm lỗi trong chiến lược trở nên khó khăn.

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

Bước giới thiệu API nền tảng

Đặt nền tảng và cặp giao dịch

Khi gọi bất kỳ API liên quan đến nền tảng nào, bạn cần xác định nền tảng và cặp giao dịch. Nếu chỉ có một cặp giao dịch nền tảng được thêm vào khi tạo bot, hãy sử dụngexchangeVí dụ, những gìexchange.GetTicker()sẽ nhận được là ticker thị trường của cặp giao dịch này.

Nền tảng FMZ Quant hỗ trợ thêm nhiều đối tượng đối lượng giao dịch trao đổi cùng một lúc. Ví dụ, bạn có thể vận hành BTC và ETH của cùng một tài khoản nền tảng cùng một lúc, hoặc bạn có thể vận hành BTC của một sàn giao dịch và ETH của một sàn giao dịch khác cùng một lúc. Lưu ý rằng các tài khoản khác nhau trên cùng một nền tảng cũng có thể được thêm cùng một lúc, và chúng được phân biệt theo các nhãn được thêm vào trang web FMZ. Khi có nhiều đối tượng đối lượng giao dịch trao đổi , sử dụngexchangesmảng để đại diện cho họ, cụ thể làexchanges[0]exchanges[1]... và vân vân, theo thứ tự thêm khi bot được tạo ra.BTC_USDT, tiền cũ BTC là đồng tiền giao dịch, và USDT là đồng tiền báo giá.

img

Trong trường hợp này, chúng ta có thể sử dụng SetCurrency để chuyển đổi các cặp giao dịch, nhưexchange.SetCurrency("BTC_USDT"); sau đó, cặp giao dịch bị ràng buộcexchangetrở thànhBTC_USDT, sẽ duy trì hiệu lực cho đến lần gọi tiếp theo để thay đổi cặp giao dịch.Lưu ý rằng backtest hỗ trợ chuyển đổi các cặp giao dịch gần đâyDưới đây là một ví dụ cụ thể:

var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
  for(var i=0;i<symbols.length;i++){
      exchange.SetCurrency(symbols[i])
      var ticker = exchange.GetTicker()
      var amount = _N(buyValue/ticker.Sell, 3)
      exchange.Buy(ticker.Sell, amount)
      Sleep(1000)
  }
}

Nhận giao diện công cộng

Như đã đề cập trong ví dụ trước, giao diện thị trường thường là giao diện công cộng, có thể truy cập bởi tất cả mọi người. Các giao diện thị trường phổ biến là: GetTicker, GetDepth, GetRecords và GetTrades. Giá cả thị trường là cơ sở cho chiến lược để đưa ra phán quyết giao dịch. Sau đó, tôi sẽ giới thiệu chúng từng cái một. Tốt hơn là tự thử chúng trong Debug Tool. Nếu bạn cần một lời giải thích chi tiết, bạn có thể kiểm tra nó trong tài liệu API.

Mỗi giao diện thường có mộtInfotrường, đại diện cho chuỗi dữ liệu ban đầu được trả về bởi nền tảng, và có thể được sử dụng để bổ sung thông tin bổ sung. Nó cần phải được phân tích trước khi sử dụng. JavaScript sử dụngJSON.parse(), trong khi Python sử dụng thư viện json.Timetrường chỉ ra thời gian của yêu cầu, có thể được sử dụng để đánh giá sự chậm trễ.

khi sử dụng bất kỳ API trong bot, truy cập có thể thất bại và trở lạinull, và Python trả vềNone. Tại thời điểm này, dữ liệu đang sử dụng sẽ báo cáo một lỗi và làm cho bot dừng lại, vì vậy dung nạp lỗi là rất quan trọng.

GetTicker

GetTicker có lẽ là giao diện được sử dụng phổ biến nhất. Bạn có thể tìm thấy giá cuối cùng được thực hiện, giá mua1 và giá bán1, và khối lượng giao dịch gần đây nhất. Trước khi đặt lệnh, giá được thực hiện có thể được xác định theo thông tin ticker. Ví dụ về bot trả về:{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}.

function main() {
    var ticker = exchange.GetTicker()
    Log(ticker) //return ticker in the debugging tool, and you can see the specific result
    Log('Last time executed price:',ticker.Last, 'Buy1 price:', ticker.Buy)
}

GetDepth

GetDepth để có được thông tin sâu về các lệnh đang chờ. Mặc dù GetTicker bao gồm giá mua 1 và bán 1, nếu bạn muốn truy vấn các lệnh đang chờ sâu hơn, bạn có thể sử dụng giao diện này, để kiểm tra lên và xuống 200 lệnh đang chờ. Giá sốc có thể được tính bằng cách sử dụng giao diện này. Dưới đây là kết quả trả về thực tế. Trong số đó, Asks đại diện cho lệnh bán đang chờ, và mảng là Sell1, Sell2... Vì vậy, giá cũng tăng theo lượt. Bids đại diện cho lệnh mua đang chờ, và mảng là buy1, buy2... Giá giảm theo lượt.

{
    "Info":null,
    "Asks":[
        {"Price":5866.38,"Amount":0.068644},
        {"Price":5866.39,"Amount":0.263985},
        ......
        ]
    "Bids":[
        {"Price":5865.13,"Amount":0.001898},
        {"Price":5865,"Amount":0.085575},
        ......
        ],
    "Time":1530241857399
}

Ví dụ sử dụng GetDepth cho Ask & Bids:

function main() {
    var depth = exchange.GetDepth()
    Log('Buy 1 price:', depth.Bids[0].Price, 'Sell 1 price:', depth.Asks[0].Price)
}

GetRecords

GetRecords là một trong những giao diện được sử dụng phổ biến nhất, có thể trả về thông tin giá trong một khoảng thời gian dài tại một thời điểm, đó là cơ sở để tính toán các chỉ số khác nhau. Nếu thời gian đường K không được chỉ định, có nghĩa là sử dụng thời gian mặc định khi thêm một bot. Chiều dài của đường K không thể được chỉ định, và nó sẽ tiếp tục tăng theo thời gian. Số tối đa là 2000, và trong cuộc gọi đầu tiên số là khoảng 200 (các nền tảng khác nhau trả về số khác nhau).

exchange.SetMaxBarLen(Len)có thể đặt số lượng K-line được mua lần đầu tiên (được hỗ trợ bởi một số nền tảng), và đặt số lượng tối đa của K-line.Ví dụ:exchange.SetMaxBarLen(500).

GetRecords có thể chỉ định các khoảng thời gian như PERIOD_M1: 1 phút, PERIOD_M5: 5 phút, PERIOD_M15: 15 phút, PERIOD_M30: 30 phút, PERIOD_H1: 1 giờ và PERIOD_D1: 1 ngày.exchange.GetRecords(PERIOD_M1). Sau khi nâng cấp docker mới nhất, nó sẽ hỗ trợ tùy chỉnh các khoảng thời gian, chỉ cần vượt qua số thứ hai của khoảng thời gian như một tham số.Lưu ý rằng cũng có những biến số chữ cái lớn nhưPERIOD_M1trong hướng dẫn. Chúng là các biến toàn cầu mặc định của FMZ. Nếu bạn quan tâm, bạn có thể log các giá trị cụ thể của chúng bởi chính mình, và bạn có thể sử dụng chúng trực tiếp trong thông thường.

Ví dụ về dữ liệu trả về:

[
    {"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
    {"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
    {"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
    ......
]

Ví dụ về K-line lặp lại:

function main(){
    var close = []
    var records = exchange.GetRecords(PERIOD_H1)
    Log('total bars: ', records.length)
    for(var i=0;i<records.length;i++){
        close.push(records[i].Close)
    }
    return close
}

GetTrades

GetTrades có được dữ liệu giao dịch trong một khoảng thời gian nhất định (không phải dữ liệu giao dịch của riêng bạn), không được hỗ trợ bởi một số nền tảng.

Nhận tài khoản để giao dịch

Các giao diện đó liên quan đến tài khoản, vì vậy chúng không thể được lấy trực tiếp. Để lấy chúng, bạn cần sử dụng API-KEY để đăng nhập. Sau khi xử lý nền tảng FMZ tự động thống nhất, bạn có thể sử dụng trực tiếp chúng.

GetAccount

GetAccount để có được thông tin tài khoản. Là một trong những giao diện được sử dụng phổ biến nhất, nó cần phải được gọi trước khi đặt đơn đặt hàng, để tránh không đủ số dư. Kết quả trả về giống như:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Trong đó Stocks là số dư có sẵn của đồng tiền giao dịch của cặp giao dịch, FrozenStocks là số dư bị đóng băng của các lệnh chưa được thực hiện, Balance là số tiền có sẵn của đồng tiền báo giá và FrozenBalance là số dư bị đóng băng. Nếu cặp giao dịch làBTC_USDT, Stock đề cập đến BTC, và Balance đề cập đến USDT.

Lưu ý rằng kết quả trả lại là kết quả của cặp giao dịch được chỉ định, và thông tin về các loại tiền tệ khác trong tài khoản giao dịch nằm trong trường Info, vì vậy bạn không cần phải gọi nhiều lần, khi bạn vận hành nhiều cặp giao dịch.

Một bot liên tục in tổng giá trị của cặp giao dịch hiện tại:

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var account = exchange.GetAccount()
        var price = ticker.Buy
        var stocks = account.Stocks + account.FrozenStocks
        var balance = account.Balance + account.FrozenBalance
        var value = stocks*price + balance
        Log('Account value is: ', value)
        LogProfit(value)
        Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
        //when run in debug tool, add a break here
    }
}

Lệnh mua

Các phương pháp gọi bao gồmexchange.Buy(Price, Amount)exchange.Buy(Price, Amount, Msg), trong đó Price chỉ ra giá, Amount là số tiền, Msg là một chuỗi thêm có thể được hiển thị trong nhật ký bot, nhưng không cần thiết. Các phương pháp này là các đơn đặt hàng đang chờ xử lý. Nếu lệnh không thể được thực hiện hoàn toàn ngay lập tức, một đơn đặt hàng chưa hoàn thành sẽ được tạo ra; ID đơn đặt hàng được trả về nếu đơn đặt hàng được đặt thành công vànullsẽ được trả lại nếu lệnh không thành công, được sử dụng để truy vấn trạng thái lệnh.

Nếu bạn muốn đặt lệnh mua ở giá thị trường, Giá là -1, và Số tiền là giá trị của lệnh.exchange.Buy(-1, 0.5); nếu cặp giao dịch làETH_BTCMột số nền tảng không hỗ trợ lệnh thị trường, cũng không kiểm tra lại tương lai.

Một số nền tảng có các yêu cầu chính xác cho giá cả và số tiền có thể được điều khiển bằng chức năng chính xác_N()Đối với giao dịch tương lai, BuySell có ý nghĩa khác, sẽ được giới thiệu đặc biệt.

Một ví dụ về mua một khi đạt đến giá tương ứng:

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Sell
        if(price >= 7000){
            exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
            break
        }
        Sleep(3000)//Sleep 3000ms
    }
    Log('done')
}

Đơn đặt hàng

Lệnh bán. Các thông số giống như Buy. Các thông số của lệnh thị trường có ý nghĩa khác nhau. Một lệnh bán thị trường, chẳng hạn nhưexchange.Sell(-1, 0.2), có nghĩa là bán 0.2ETH với giá thị trường.

GetOrder

Khi giao diện chung này gọi phương thứcexchange.GetOrder(OrderId), OrderId là mã lệnh, sẽ được trả về khi đặt lệnh.Typevà giá trị thực tế của lệnhStatusFMZ sử dụng hằng số toàn cầu để đại diện cho các giá trị này.Statusgiá trị của một đơn đặt hàng chưa hoàn thành là 0, tương đương vớiORDER_STATE_PENDING. Tất cả các hằng số toàn cầu này có thể được xem trong tài liệu... Kết quả trả về:

{
    "Id":125723661, //Order id
    "Amount":0.01, //Order ammount 
    "Price":7000, //Order price 
    "DealAmount":0, //Executed amount 
    "AvgPrice":0, //executed average price
    "Status":0, //0: not completely executed; 1: executed; 2: canceled 
    "Type":1,//Order type; 0: buy order; 1: sell order 
    "ContractType":"",//contract type, used in futures trading
    "Info":{} //the platform returns the raw information
    }
}

Một chiến lược để mua một số tiền cụ thể:

function main(){
    while(true){
        var amount = exchange.GetAccount().Stocks
        var ticker = exchange.GetTicker()
        var id = null
        if(5-amount>0.01){
            id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
        }else{
            Log('Job completed')
            return //return the main function, bot will stop
        }
        Sleep(3000) //Sleep 3000ms
        if(id){
            var status = exchange.GetOrder(id).Status
            if(status == 0){ //Here you can aslo use "status == ORDER_STATE_PENDING" to judge 
                exchange.CancelOrder(id)
            }
        }
    }
}

GetOrders

GetOrder lấy danh sách tất cả các lệnh chưa hoàn thành của cặp giao dịch hiện tại. Nếu không có lệnh chưa hoàn thành, trả về một mảng trống. Kết quả cụ thể của danh sách lệnh, chẳng hạn như GetOrder.

Ví dụ về việc hủy tất cả các lệnh của cặp giao dịch hiện tại:

function CancelAll(){
    var orders = exchange.GetOrders()
    for(var i=0;i<orders.length;i++){
        exchange.CancelOrder(orders[i].Id) // cancel order by orderID
    }
}
function main(){
    CancelAll()
    while(true){
        //do something
        Sleep(10000)
    }
}

Hủy lệnh

Theo ID đơn đặt hàng, hủy đơn đặt hàng.exchange.CancelOrder(OrderId). Nếu hủy thành công, trả về true; nếu không, trả về false.

Hợp đồng tương lai và hợp đồng vĩnh viễn

Đối với tiền điện tử, giao dịch tương lai khác với giao dịch tại chỗ. Các chức năng trên của giao dịch tại chỗ cũng áp dụng cho giao dịch tương lai, và giao dịch tương lai duy nhất có các chức năng riêng của nó. Trước khi tiến hành giao dịch chương trình giao dịch tương lai tiền điện tử, bạn nên quen thuộc với các hoạt động thủ công trên trang web và hiểu các khái niệm cơ bản, chẳng hạn như mở, đóng, chéo, cô lập, đòn bẩy, thu nhập và lỗ gần, thu nhập nổi, biên và các khái niệm khác, cũng như các công thức tính toán tương ứng. Các hướng dẫn tương ứng có thể được tìm thấy trên các nền tảng tương lai khác nhau, và bạn cần phải tự học chúng.

Hợp đồng vĩnh viễn tương tự như hợp đồng tương lai, nhưng sự khác biệt là không có khái niệm nắm giữ các vị trí dài và ngắn cùng một lúc.

Nếu nền tảng hỗ trợ cả hợp đồng tương lai và giao ngay, chẳng hạn như hợp đồng tương lai của OKEX và Huobi, bạn cần chọn OKEX FuturesHuobi Futures riêng biệt trên giao diện nền tảng để thêm, vì các nền tảng tương lai đó được coi là các nền tảng khác với các nền tảng giao ngay trên FMZ.

SetContractType

Bước đầu tiên trong giao dịch tương lai là thiết lập hợp đồng được giao dịch. lấy OKEX tương lai làm ví dụ, chọn một cặp giao dịch BTC khi tạo bot hoặc backtesting, và bạn cũng cần thiết lập hợp đồng hàng tuần, tuần sau hoặc hàng quý trong mã. Nếu nó không được thiết lập, nó sẽ nhắcinvalid contract type. Khác với các cặp giao dịch tại chỗ, các hợp đồng tương lai thường sử dụng tiền tệ giao dịch như BTC như biên độ. Thêm BTC vào một cặp giao dịch thường đại diện cho một cặp giao dịch BTC_USD sử dụng BTC như biên độ. Nếu có hợp đồng tương lai với USDT như biên độ, cần phải tạo một bot để thêm cặp giao dịch BTC_USDT. Ví dụ, các hợp đồng vĩnh cửu như Binance OKEX Futures, với cả hợp đồng biên độ tiền điện tử và USDT.Sau khi thiết lập cặp giao dịch, bạn cũng phải thiết lập loại hợp đồng cụ thể, chẳng hạn như vĩnh viễn, hàng tuần, tuần sau, v.v. Sau khi thiết lập hợp đồng, bạn có thể thực hiện các hoạt động như nhận báo giá thị trường, mua và bán.

Binance, OKEX, HuobiDM, v.v. có cả hợp đồng ký quỹ tiền điện tử và hợp đồng ký quỹ USDT, cần phải phân biệt khi thêm bot và thiết lập hợp đồng. Các cài đặt cụ thể như sau:

//OKEX Futures
exchange.SetContractType("swap")        // set to perpetual contract
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract 
exchange.SetContractType("quarter")     // set to quarterly contract

//HuobiDM
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract
exchange.SetContractType("quarter")     // set to quarterly contract 
exchange.SetContractType("swap")        // set to perpetual contract

//Binance Futures
exchange.SetContractType("swap")   // set to perpetual contract, and notice that crypto-margined and USDT-margined contracts are all in the perpetual contract
exchange.SetContractType("quarter")   // set to quarterly contract
exchange.SetContractType("next_quarter")  // set to next quarter contract

//BitMEX
exchange.SetContractType("XBTUSD")    // set to perpetual contract
exchange.SetContractType("XBTM19")  // the contract settled at a specific time; for more details, please log in BitMEX to check each contract code

//GateIO
exchange.SetContractType("swap")      // set to perpetual contract, and do not set the default as swap perpetual contract 
//Deribit
exchange.SetContractType("BTC-27APR18")  // the contract settled at a specific time; for more details, please log in Deribit to check out 

GetPosition

Để có được danh sách thông tin vị trí hiện tại, OKEX (OKCOIN) tương lai có thể vượt qua trong một tham số để chỉ định các loại hợp đồng để được thu được.[], nếu không có vị trí. Thông tin vị trí được trả về như sau. Có rất nhiều thông tin cụ thể, cần phải được phân tích kết hợp với cặp giao dịch.

Loại dữ liệu Tên biến Mô tả
đối tượng Thông tin cấu trúc thô mà nền tảng trả về
số Mức ký quỹ kích thước đòn bẩy; OKCoin là 10 hoặc 20, và vị trí chéo của tương lai OK trả về 10 (định), cho API thô không hỗ trợ
số Số tiền Số lượng vị trí; OKCoin chỉ số số lượng hợp đồng (tổng số trên 1)
số Số lượng đóng băng Số lượng vị trí bị đóng băng
số Giá cả Giá trung bình vị trí
số Lãi suất biên đóng băng
số Lợi nhuận tương lai hàng hóa: lợi nhuận và lỗ của vị trí đánh dấu thị trường; tiền điện tử: đơn vị tiền điện tử: BTC / LTC, đơn vị tương lai truyền thống: RMB (lưu ý:Trong trường hợp vị trí chéo của hợp đồng tương lai OKCoin, nó đề cập đến lợi nhuận và lỗ thực hiện, không phải lợi nhuận và lỗ của vị trí. Dưới vị trí cô lập, nó đề cập đến lợi nhuận và lỗ của vị trí.)
const Loại PD_LONG là vị trí dài (CTP sử dụng closebuy_today để đóng một vị trí); PD_SHORT là vị trí ngắn (CTP sử dụng closesell_today để đóng một vị trí); trong tương lai CTP, PD_LONG_YD chỉ ra vị trí dài ngày hôm qua (mà sử dụng closebuy để đóng vị trí); PD_SHORT_YD là vị trí ngắn ngày hôm qua (mà sử dụng closesell để đóng vị trí)
chuỗi ContractType hàng hóa tương lai là mã hợp đồng, và cổ phiếu là nền tảng code_stock code; các thông qua loại tham số cụ thể của SetContractType
function main(){
    exchange.SetContractType("this_week");
    var position = exchange.GetPosition();
    if(position.length>0){ //especially pay attention to judging the length of position before call, or an error will occur
        Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
            position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
    }
}

Tiền tương lai mở và đóng các vị trí

Trước hết, bạn cần thiết lập kích thước đòn bẩy; phương pháp gọi:exchange.SetMarginLevel(10), trong đó 10 có nghĩa là 10 lần đòn bẩy, và kích thước đòn bẩy cụ thể được hỗ trợ có thể được kiểm tra trên các nền tảng tương ứng,Lưu ý rằng đòn bẩy nên được thiết lập trong nền tảng và mã nên phù hợp với các thiết lập được thiết lập trên nền tảng, nếu không sẽ xảy ra lỗiBạn cũng có thể để nó không đặt và sử dụng đòn bẩy mặc định. Sau đó, thiết lập hướng giao dịch; phương pháp gọi:exchange.SetDirection(Direction), tương ứng với các vị trí mở và đóng.Không giống như hợp đồng tương lai, nếu một hợp đồng vĩnh viễn không giữ các khái niệm của dài và ngắn cùng một lúc, đó là một vị trí duy nhất không được phép. khi bạn hoạt động mở ngắn trên một vị trí dài, vị trí dài sẽ được tự động đóng, vì vậy bạn chỉ cần thiết lậpbuysellNếu nó hỗ trợ hai hướng vị trí, bạn cần phải thiết lậpclosebuy, closesell.Các mối quan hệ cụ thể:

Hoạt động SetDirection Parameters Chức năng đặt lệnh
Khả năng mở exchange.SetDirection ((buy) trao đổi.Buy ((()
Đóng vị trí dài exchange.SetDirection ((closebuy) trao đổi.Bán.
Khả năng mở ngắn exchange.SetDirection ((sell) trao đổi.Bán.
Khóa vị trí ngắn exchange.SetDirection ((closesell) trao đổi.Buy ((()

Cuối cùng, có mã cụ thể cho các vị trí mở và đóng. Số lượng lệnh được đặt khác nhau từ nền tảng này sang nền tảng khác. Ví dụ, hợp đồng tương lai Huobi dựa trên số lượng hợp đồng, và một hợp đồng là 100 đô la Mỹ. Lưu ý rằng backtest tương lai không hỗ trợ lệnh thị trường.

function main(){
    exchange.SetContractType("this_week")    // for example, set OKEX futures to weekly contract 
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) // set to 10 times of leverage  
    exchange.SetDirection("buy") // set the order type as buy long 
    exchange.Buy(price+10, 20) // set contract quantity as 20 orders
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) // check out if there is any unfinished order 
    exchange.SetDirection("closebuy"); // if it is a perpetual contract, directly set exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

Cho một ví dụ chiến lược cụ thể về các vị trí đóng cửa đầy đủ như sau:

function main(){
    while(true){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){
            Log('not able to obtain ticker')
            return
        }
        if(!pos || pos.length == 0 ){
            Log('no position')
            return
        }
        for(var i=0;i<pos.length;i++){
            if(pos[i].Type == PD_LONG){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closebuy')
                exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
            }
            if(pos[i].Type == PD_SHORT){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closesell')
                exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
            }
        }
        var orders = exchange.Getorders()
        Sleep(500)
        for(var j=0;j<orders.length;j++){
            if(orders[i].Status == ORDER_STATE_PENDING){
                exchange.CancelOrder(orders[i].Id)
            }
        }
    }
}

Giao dịch đòn bẩy tiền điện tử

Giao dịch đòn bẩy tiền điện tử cần chuyển sang tài khoản đòn bẩy trong mã, và các phần khác giống như giao dịch tại chỗ.

Sử dụngexchange.IO("trade_margin") để chuyển sang chế độ tài khoản đòn bẩy; đặt lệnh và nhận tài sản tài khoản sẽ truy cập vào giao diện đòn bẩy của nền tảng. Sử dụngexchange.IO("trade_normal") để chuyển trở lại chế độ tài khoản thông thường.

Các nền tảng được hỗ trợ:

  • OKEX V3: Các cặp giao dịch của chế độ tài khoản đòn bẩy khác với các cặp giao dịch thông thường và một số cặp giao dịch có thể không tồn tại.
  • Huobi: các cặp giao dịch của chế độ tài khoản đòn bẩy khác với các cặp giao dịch thông thường, và một số cặp giao dịch có thể không tồn tại.
  • ZB: tài sản chỉ có thể được chuyển giao trong QC. Trong lĩnh vực giao dịch đòn bẩy, tài sản giữa các cặp giao dịch khác nhau là độc lập, nghĩa là số lượng coin QC dưới cặp giao dịch ETH_QC không hiển thị trong BTC_QC.
  • FCoin
  • Binance

Giao dịch tương lai hàng hóa

Giao dịch tương lai hàng hóa và giao dịch tương lai tiền điện tử khá khác nhau. Trước hết, thời gian giao dịch tương lai hàng hóa rất ngắn, nhưng tiền điện tử được giao dịch trong 24 giờ; giao thức tương lai hàng hóa không phải là một API REST thường được sử dụng; tần suất giao dịch và số lượng đơn đặt hàng đang chờ của tương lai hàng hóa bị giới hạn, nhưng của tiền điện tử rất lỏng lẻo, v.v. Do đó, có nhiều điểm cần chú ý đặc biệt khi giao dịch tương lai hàng hóa, và nó được khuyến cáo cho những người có kinh nghiệm phong phú trong các hoạt động thủ công. FMZ hiện hỗ trợ robot mô phỏng tương lai hàng hóa, và bạn có thể tham khảo:https://www.fmz.com/bbs-topic/325Để thêm các công ty tương lai hàng hóa:https://www.fmz.com/bbs-topic/371

Các hợp đồng tương lai hàng hóa đã thực hiện giám sát minh bạch vào tháng 6 năm 2019; đối với chương trình cá nhân, người dùng cá nhân cần phải mở tài khoản để nộp đơn xin mã ủy quyền cho các nhà môi giới tương lai (mẫu thông tin ứng dụng cụ thể có thể được gửi đến nhóm WeChat hoặc nhóm QQ), thường mất 4-5 ngày; các thủ tục khá phức tạp. Là một nhà cung cấp giao dịch theo chương trình, nền tảng FMZ đã nộp đơn xin mã ủy quyền phần mềm từ các nhà cung cấp dịch vụ tương lai khác nhau. Người dùng có thể sử dụng chúng trực tiếp mà không cần nộp đơn. Khi thêm một nhà môi giới tương lai Quant, hãy tìm kiếm see through để xem danh sách mà FMZ đã nộp đơn.https://www.fmz.com/bbs-topic/3860Nếu nhà môi giới tương lai của bạn không còn trong danh sách, bạn chỉ có thể tự nộp đơn hoặc mở tài khoản mới của một nhà môi giới được hỗ trợ, thường mất 2 ngày. FMZ có mối quan hệ hợp tác sâu sắc với một số nhà cung cấp dịch vụ; ví dụ, Guotai Junan Hongyuan Futures đã mua phiên bản tổ chức của nền tảng FMZ, có thể được sử dụng bởi người dùng của mình, và người dùng tự động trở thành VIP khi mở tài khoản và phí dịch vụ được giảm thiểu.https://www.fmz.com/bbs-topic/506.

Do lợi thế của cấu trúc nền tảng FMZ Quant, người dùng cũng có thể thêm nhiều tài khoản môi giới tương lai và thực hiện một số chức năng mà các phần mềm giao dịch tương lai hàng hóa khác không thể hoàn thành, chẳng hạn như tổng hợp tick tần số cao; bạn có thể tham khảo:https://www.fmz.com/bbs-topic/1184

Khung chiến lược

Trước hết, vì nó không phải là giao dịch 24h và đòi hỏi một hoạt động đăng nhập, cần phải đánh giá tình trạng liên kết trước khi giao dịch.exchange.IO("status")true, mà inidcates kết nối thành công với nền tảng. Nếu API được gọi khi đăng nhập không thành công, not login không được nhắc. Bạn có thể thêm Sleep (2000) sau khi chiến lược bắt đầu, cho nó một thời gian nhất định để đăng nhập. Bạn cũng có thể thử lại để đăng ký_C(exchange.SetContractType,"MA888"), mà sẽ đảm bảo một đăng nhập thành công.

Các mã mua bán và giao dịch giá thị trường của hợp đồng tương lai hàng hóa giống như hợp đồng tương lai tiền điện tử.

function main(){
    _C(exchange.SetContractType,"MA888") //If you do not log in successfully, you cannot subscribe to the contract, so better to try again
    while(true){
        if(exchange.IO("status")){
            var ticker = exchange.GetTicker()
            Log("MA888 ticker:", ticker)
            LogStatus(_D(), "Already connected with CTP !")//_D obtain event
        } else {
            LogStatus(_D(), "Not connected with CTP !")
            Sleep(1000)
        }
    }
}

Bạn nên sử dụng thư viện tương lai hàng hóa để giao dịch (sẽ được mô tả sau), mã sẽ rất đơn giản vào thời điểm này và không cần phải xử lý các chi tiết tẻ nhạt.https://www.fmz.com/strategy/57029

function main() {
    // Use the CTA strategy framework of commodity futures library 
    $.CTA(Symbols, function(st) {
        var r = st.records
        var mp = st.position.amount
        var symbol = st.symbol
        /*
        "r" represents K-line, "mp" indicates the position amount of the current variety; positive number means long position, negative number means short position, and 0 means no position; "symbol" is the variety name
        if the return value is n: 
            n = 0 : full close positions (no matter now they are long or short)
            n > 0 : if right now long positions are held, add n long positions; if now they are short positions, close n short posiitons; if n is over the position amount right now, reverse to open long positions 
            n < 0 : if right now short positions are held, add n short positions; if now they are long positions, close n long posiitons; if -n is over the position amount right now, reverse to open short positions 
        */
        if (r.length < SlowPeriod) {
            return
        }
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        if (mp <= 0 && cross > ConfirmPeriod) {
            Log(symbol, "Golden Cross Period", cross, "the moment position", mp);
            return Lots * (mp < 0 ? 2 : 1)
        } else if (mp >= 0 && cross < -ConfirmPeriod) {
            Log(symbol, "Death Cross Period", cross, "the moment position", mp);
            return -Lots * (mp > 0 ? 2 : 1)
        }
    });
}

Các phương thức thu thập dữ liệu CTP

Tiền tương lai hàng hóa sử dụng giao thức CTP, và tất cả các báo giá thị trường và thực thi lệnh sẽ chỉ được thông báo sau khi có thay đổi, trong khi các truy vấn về lệnh, tài khoản và vị trí là các truy vấn hoạt động. Do đó, nó phù hợp để viết các chiến lược tần số cao dựa trên sự kiện.GetTicker, GetDepthGetRecords, tất cả cần phải có dữ liệu được lưu trữ tạm để có được dữ liệu mới nhất. Nếu không có dữ liệu, nó sẽ chờ cho đến khi có dữ liệu, vì vậy không cần thiết cho chiến lược sử dụng Sleep. Khi có thay đổi báo giá thị trường, ticker, độ sâu và hồ sơ sẽ được cập nhật. Tại thời điểm này, gọi bất kỳ giao diện nào trong số này sẽ quay trở lại ngay lập tức, và trạng thái của giao diện được gọi sẽ được đặt thành chế độ wait for update. Lần tiếp theo khi gọi cùng một giao diện, nó sẽ đợi cho đến khi có dữ liệu mới được trả lại. Một số hợp đồng không phổ biến hoặc giới hạn giá sẽ gây ra không giao dịch trong một thời gian dài, có nghĩa là chiến lược đã bị mắc kẹt trong một thời gian dài, cũng bình thường.

Nếu bạn muốn có được dữ liệu mỗi khi bạn nhận được báo giá thị trường, ngay cả khi nó là dữ liệu cũ, bạn có thể chuyển sang chế độ cập nhật ngay lập tức của báo giá thị trườngexchange.IO("mode", 0). Tại thời điểm này, chiến lược không thể được viết như một sự kiện điều khiển, và một sự kiện SLeep cần phải được thêm để tránh một vòng lặp vô hạn nhanh chóng. Một số chiến lược không thường xuyên có thể sử dụng chế độ này, và thiết kế chiến lược là đơn giản.exchange.IO("mode", 1)để chuyển trở lại chế độ cache mặc định.

Khi vận hành một hợp đồng duy nhất, sử dụng chế độ mặc định. Tuy nhiên, nếu có nhiều hợp đồng, có thể một trong các hợp đồng không cập nhật báo giá thị trường, dẫn đến việc chặn giao diện để có được báo giá thị trường, và các bản cập nhật báo giá của các hợp đồng khác cũng không thể có được. Để giải quyết vấn đề này, chế độ cập nhật ngay lập tức có thể được sử dụng, nhưng không thuận tiện để viết các chiến lược tần số cao.exchange.IO("wait")Nếu nhiều đối tượng trao đổi được thêm vào, mà là hiếm trong tương lai hàng hóa, bạn có thể sử dụngexchange.IO("wait_any"), và Index được trả lại sẽ chỉ ra chỉ số nền tảng được trả lại.

Đẩy thay đổi thị trường:{Event:"tick", Index: platform index (in the order of the platforms added in the bot), Nano: event of nanosecond-level time, Symbol: contract name}Đẩy lệnh:{Event:"order", Index:Exchange index, Nano:Event of nanosecond-level time, Order:Order information (same as GetOrder)}

Vào thời điểm này, cấu trúc chiến lược có thể được viết như sau:

function on_tick(symbol){
    Log("symbol update")
    exchange.SetContractType(symbol)
    Log(exchange.GetTicker())
}

function on_order(order){
    Log("order update", order)
}

function main(){
    while(true){
        if(exchange.IO("status")){ //Judge the link status 
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//Subscribe to MA; only the subscription request for the first time is ture, and the later ones are program switches, which do not consume time
            _C(exchange.SetContractType, "rb888")//Subscribe to rb
            while(true){
                var e = exchange.IO("wait")
                if(e){
                    if(e.event == "tick"){
                        on_tick(e.Symbol)
                    }else if(e.event == "order"){
                        on_order(e.Order)
                    }
                }
           }
        }else{
            Sleep(10*1000)
        }
    }
}

Sự khác biệt giữa hợp đồng tương lai hàng hóa và tiền điện tử

Cũng lưu ý sự khác biệt giữa hợp đồng tương lai hàng hóa và nền tảng tiền điện tử. Ví dụ, GetDepth thực sự chỉ có một mức độ chiều sâu (5 mức độ chiều sâu đắt tiền), và GetTrades không thể lấy lịch sử giao dịch (tất cả đều được mô phỏng dựa trên thay đổi vị trí, và không có hồ sơ giao dịch thực tế). Hợp đồng tương lai hàng hóa có cơ chế giới hạn giá. Khi giới hạn cao, giá của lệnh bán chiều sâu để bán một là giá giới hạn, và khối lượng lệnh là 0. Khi giới hạn thấp, giá của lệnh mua để mua một là giá giới hạn, và khối lượng lệnh là 0.

Hợp đồng đặt

exchange.IO("công cụ"): nó trả về danh sách tất cả các hợp đồng trên nền tảng {tên hợp đồng: chi tiết} dưới dạng từ điển, và chỉ hỗ trợ robot.exchange.IO("sản phẩm"): nó trả về danh sách tất cả các mặt hàng trên nền tảng {tên hợp đồng: chi tiết} dưới dạng từ điển và chỉ hỗ trợ bot.exchange.IO("đăng ký"): nó trả về các báo giá thị trường đã đăng ký trên nền tảng dưới dạng từ điển và chỉ hỗ trợ bot.

CácContractTypecủa tương lai CTP truyền thống đề cập đến ID hợp đồng, đó là nhạy cảm với chữ cái lớn.exchange.SetContractType("au1506"). Sau khi hợp đồng được thiết lập thành công, nó sẽ trả về thông tin chi tiết của hợp đồng, chẳng hạn như số tiền mua tối thiểu, phí dịch vụ, thời gian giao hàng, v.v. Khi đăng ký nhiều hợp đồng, chỉ lần đầu tiên yêu cầu đăng ký thực sự được gửi, và sau đó cặp giao dịch chỉ được chuyển đổi ở mức mã, không mất thời gian. Hợp đồng liên tục chính là mã 888, chẳng hạn như MA888, hợp đồng tỷ lệ liên tục là 000, chẳng hạn như MA000; 888 và 000 là giao dịch hợp đồng ảo chỉ hỗ trợ backtest, và robot thực sự chỉ hỗ trợ báo giá thị trường.Tuy nhiên, Mylanguage có thể vận hành hợp đồng chính, và chương trình sẽ tự động thay đổi các vị trí, tức là đóng các vị trí không chính và mở các vị trí mới trên các vị trí chính.

Login không thành công không thể thiết lập hợp đồng, nhưng sẽ trở lại ngay lập tức, vì vậy bạn có thể thử bằng _c một lần nữa, để biết đăng nhập CTP đã hoàn thành. Sau khi đăng nhập thành công, nó không tiêu thụ bất kỳ thời gian để thiết lập hợp đồng, và sẽ không có quyền truy cập mạng thực sự.

Vị trí mở & Vị trí đóng

Hướng dẫn củaSetDirectioncó thể nhận được bốn thông số:buy, closebuy, sell, closesellCác hợp đồng tương lai hàng hóa có nhiềuclosebuy_todayclosesell_today, cho thấy đóng các vị trí hiện tại; mặc định làclosebuy/ closesell, cho thấy đóng các vị trí ngày hôm qua; chỉ có các loại của Sàn giao dịch tương lai Thượng Hải được chia thành đóng ngày hôm nay và đóng ngày hôm qua, có thể ảnh hưởng đến phí dịch vụ, do đó, cần phải ưu tiên đóng các vị trí ngày hôm qua. Đối với tương lai truyền thống CTP, bạn có thể đặt tham số thứ hai là 1 hoặc 2 hoặc 3, tương ứng là suy đoán, trọng tài và phòng hộ. Nếu không đặt, mặc định là suy đoán.Các hoạt động cụ thể như mua và bán, nhận vị trí, nhận lệnh, hủy lệnh và nhận tài khoản giống như giao dịch tương lai tiền điện tử, vì vậy vui lòng tham khảo phần trước.

Hoạt động SetDirection Parameters Chức năng đặt lệnh
Khả năng mở exchange.SetDirection ((buy) trao đổi.Buy ((()
Đóng vị trí dài exchange.SetDirection ((closebuy) trao đổi.Bán.
Khả năng mở ngắn exchange.SetDirection ((sell) trao đổi.Bán.
Khóa vị trí ngắn exchange.SetDirection ((closesell) trao đổi.Buy ((()

Ví dụ sau đây là một chức năng vị trí đóng cụ thể. Lưu ý rằng ví dụ này quá đơn giản. Bạn cũng nên xem xét liệu nó có nằm trong thời gian giao dịch, làm thế nào để thử lại lệnh đang chờ nếu nó không được hoàn thành hoàn toàn, khối lượng lệnh tối đa là bao nhiêu, tần suất có quá cao và liệu đó là giá trượt hay giá thị trường v.v. Chỉ để tham khảo,nó là một gói thư viện của các nền tảng được đề xuất để mở và đóng các vị trí trong robot thực sự:https://www.fmz.com/strategy/12961Có một phần giới thiệu cụ thể trong phần thư viện, và cũng được khuyến cáo nghiên cứu mã nguồn của thư viện.

function Cover(contractType, amount, slide) {
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].ContractType != contractType) {
            continue;
        }
        var depth = _C(e.GetDepth);
        if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
            exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
            exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "Close today" : "Close yesterday", 'Bid', depth.Bids[0]);
        } else {
            exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
            exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "Close today" : "Close yesterday", 'Ask', depth.Asks[0]);
        }
    }
}

Hàng hóa tương lai hỗ trợ các loại lệnh tùy chỉnh (hỗ trợ cho robot, nhưng không phải cho backtest), được chỉ định bằng hậu tố, được thêm vào _, chẳng hạn như:

exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")

Các hậu tố cụ thể:

  • ioc hoàn thành ngay lập tức, hoặc hủy THOST_FTDC_TC_IOC
  • gfs hợp lệ trong nút THOST_FTDC_TC_GFS
  • Gfd có giá trị trong ngày THOST_FTDC_TC_GFD
  • gtd có hiệu lực trước ngày chỉ định THOST_FTDC_TC_GTD
  • gtc có hiệu lực trước khi hủy THOST_FTDC_TC_GTC
  • gfa hợp lệ trong đấu giá THOST_FTDC_TC_GFA

Giao diện Esunny

Theo mặc định, các giao diện mở trong các nhà môi giới tương lai hàng hóa đều là giao diện CTP. Nếu cần thiết, chúng có thể được thay thế bằng giao diện Esunny. Thông qua việc đóng gói FMZ, phương pháp triệu hồi giống nhau. Sự khác biệt là tài khoản, lệnh và vị trí đều ở chế độ đẩy, vì vậy docker sẽ duy trì dữ liệu này tại địa phương và sẽ quay lại ngay lập tức khi giao diện tương ứng được gọi, mà không thực sự thực hiện yêu cầu.

Các loại đơn đặt hàng tùy chỉnh là:

  • gfd có giá trị trong ngày TAPI_ORDER_TIMEINFORCE_GFD
  • gtc hợp lệ trước khi hủy TAPI_ORDER_TIMEINFORCE_GTC
  • gtd có giá trị trước ngày được chỉ định TAPI_ORDER_TIMEINFORCE_GTD
  • fak Một phần được thực hiện, hủy phần còn lại TAPI_ORDER_TIMEINFORCE_FAK
  • ioc thực hiện ngay lập tức, hoặc hủy TAPI_ORDER_TIMEINFORCE_FAK
  • fok không được thực hiện hoàn toàn, hủy tất cả TAPI_ORDER_TIMEINFORCE_FOK

Các chức năng toàn cầu thường được sử dụng

Log - Log & WeChat Push

Khi đăng một bản ghi nhật ký trên giao diện bot, và thêm ký tự @ sau chuỗi, tin nhắn sẽ nhập vào hàng đợi đẩy, và nó sẽ được đẩy trực tiếp sau khi ràng buộc với WeChat hoặc telegram, chẳng hạn nhưLog('Push to WeChat@').

Màu log cũng có thể được tùy chỉnh, chẳng hạn nhưLog('this is a log in red font #ff0000'). #ff0000là con số mười sáu của màu RGB, cho thấy tất cả các tệp nhật ký được lưu trữ trong cơ sở dữ liệu SqLit của bot trong thư mục nơi docker nằm, có thể được tải xuống và mở bằng phần mềm cơ sở dữ liệu, hoặc có thể được sử dụng để sao chép sao lưu và khôi phục (tên cơ sở dữ liệu và ID bot là giống nhau).

LogProfit - Lợi nhuận in

Nó ghi lại lợi nhuận, và vẽ đường cong lợi nhuận trên giao diện bot, có thể được giữ lại sau khi bot được khởi động lại.LogProfit(1000)Lưu ý rằng tham số củaLogProfitkhông nhất thiết là lợi nhuận, và nó có thể là bất kỳ số và cần phải được điền vào bởi chính mình.

LogStatus - Hiển thị trạng thái (bao gồm bảng)

Nếu trạng thái bot, vì nhật ký sẽ được lưu trước và cập nhật liên tục, cần thông tin chỉ để hiển thị không để lưu, bạn có thể sử dụngLogStatusCác tham số củaLogStatuslà chuỗi, mà cũng có thể được sử dụng để đại diện cho thông tin bảng.

Một ví dụ về bảng hiển thị vị trí bot thực cụ thể:

var table = {type: 'table', title: 'position information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; 
LogStatus('`' + JSON.stringify(table) + '`'); // After serialization, JSON will be added the character "'" on both sides, which is regarded as a comlpex messag format (now supporting tables)
LogStatus('The first line information\n`' + JSON.stringify(table) + '`\nthe third line information'); // the table information can be displayed in multiple lines
LogStatus('`' + JSON.stringify([table, table]) + '`'); // Multiple tables are supported to be displayed at the same time, which will be displayed in one group by TAB  
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // Multiple tables are displayed up and down by arrangement 

Ngủ đi

Parameter của nó là số millisecond, chẳng hạn như:Sleep(1000)Do tần số truy cập hạn chế của tất cả các nền tảng, thời gian ngủ nên được thêm vào vòng lặp vô hạn trong các chiến lược chung.

_G

Sau khi bot khởi động lại, chương trình sẽ khởi động lại._Glà rất thuận tiện và thực tế, và nó có thể lưu các nội dung JSON nối tiếp._Ghàm được viết bằngonexit(), để mỗi khi chiến lược được dừng lại, thông tin cần thiết sẽ được lưu tự động. Nếu bạn muốn lưu nhiều dữ liệu định dạng hơn, chức năng _G không phù hợp, nhưng


Thêm nữa