3
tập trung vào
1444
Người theo dõi

Hướng dẫn cơ bản về cách viết chiến lược nền tảng định lượng FMZ (phải đọc)

Được tạo ra trong: 2019-08-13 17:47:27, cập nhật trên: 2021-08-06 10:29:46
comments   33
hits   69033

[TOC] Hướng dẫn này bao gồm kiến thức ban đầu về lập chiến lược, bao gồm giới thiệu API, phản hồi, biểu đồ và các nội dung khác. Sau khi học xong hướng dẫn cơ bản này, người dùng sẽ có thể sử dụng các API cơ bản một cách khéo léo, viết các chiến lược ổ cứng ổn định. Trước khi học hướng dẫn này, người dùng cần phải họcKhởi nghiệp với nền tảng định lượng của FMZ 。

Bài học cũ:Inventor Quantify (FMZ.COM) Chiến lược biên soạn hoàn toàn sử dụng Hướng dẫn 2.0 ( hướng dẫn)Trong bài viết này, chúng tôi sẽ giới thiệu một số bài viết của các blogger, trong đó có một số bài viết được liệt kê trong danh mục, và chúng tôi cũng khuyên bạn nên xem chúng.

Các hướng dẫn ban đầu về chiến lược

Ghi chú về API

Giao dịch theo chương trình là việc sử dụng chương trình kết nối thông qua API và sàn giao dịch, để thực hiện mua và bán tự động theo ý định thiết kế hoặc thực hiện các chức năng khác. API được gọi là Giao diện lập trình ứng dụng.

Hiện tại, các sàn giao dịch tiền kỹ thuật số có hai giao thức giao diện chính: REST và Websocket. Các giao thức REST cần truy cập một lần cho mỗi lần thu thập dữ liệu. Ví dụ, API của sàn giao dịch mô phỏng wex.app, mở https://api.wex.app/api/v1/public/ticker?market=BTC_USDT trực tiếp trong trình duyệt và kết quả là:

{"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"}}

Điều này cho thấy giao dịch với cặp giao dịch BTC_USDT được cập nhật và thay đổi mỗi lần cập nhật.market=Tiếp theo là tham số cặp giao dịch cụ thể, có thể sửa đổi để có được dữ liệu cặp giao dịch khác. Đối với giao diện công khai, như thị trường, tất cả mọi người có thể truy cập, do đó không cần xác minh, trong khi một số giao diện như đặt hàng và lấy tài khoản cần xác định danh tính người dùng, lúc này cần sử dụng API-KEY để ký. Websocket là mô hình đăng ký, sau khi gửi nội dung cần đăng ký, sàn giao dịch sẽ gửi dữ liệu cập nhật cho chương trình, không cần truy cập lại mỗi lần, do đó hiệu quả hơn.

Nền tảng giao dịch định lượng FMZ bao gồm các giao diện REST của các sàn giao dịch, sử dụng cách gọi và định dạng dữ liệu thống nhất, làm cho việc lập trình chiến lược trở nên đơn giản và phổ biến hơn. Nền tảng FMZ có thể hỗ trợ Websocket một cách tiện lợi, sẽ được giới thiệu chi tiết trong hướng dẫn tiếp theo.

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

Phần lớn tài liệu API của nền tảng FMZ dựa trên JavaScript, nhưng do gói, các ngôn ngữ khác nhau hầu như không khác nhau, chỉ cần chú ý đến các vấn đề về ngữ pháp. C ++ hơi đặc biệt, hướng dẫn sau này sẽ có giới thiệu chuyên dụng. Do Js tương đối đơn giản và không có vấn đề tương thích, nên sử dụng cho người mới bắt đầu.

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

#python代码
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#相应的Js代码
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

Nguồn tài nguyên

  • Tài liệu API nền tảng FMZ, hướng dẫn này không giới thiệu chi tiết về từng giao diện, cụ thể có thể tìm thấy tài liệu này: https://www.fmz.com/api
  • Nếu bạn muốn nhận tín hiệu của tradingview, bạn có thể đặt hàng trên FMZ qua bài viết này: https://www.fmz.com/digest-topic/5533
  • Javascript, Python nhanh chóng bắt đầu, viết các chiến lược đơn giản không cần phải có ngữ pháp phức tạp, chỉ cần nắm vững một số khái niệm cơ bản, bạn có thể học lập trình trong khi học hướng dẫn này: https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
  • Tài liệu Mac, rất tiện dụng cho chiến lược xu hướng.
  • Một ví dụ về gọi C++, những người quan tâm đến C++ có thể xem, nhưng vì không phải là ngôn ngữ giải thích, lập trình rất khó và không được khuyến khích sử dụng: https://www.fmz.com/strategy/61533
  • Các khóa học về giao dịch số lượng tiền tệ của NetEase Cloud, sản phẩm chính thức của FMZ, chỉ cần 20 yuan, nội dung chi tiết phong phú, phù hợp với người mới bắt đầuLiên kết khóa học
  • Một số chiến lược giảng dạy, phù hợp với giai đoạn đầu tiên, chiến lược viền cơ bản khi học:https://www.fmz.com/square/s:tag:%E6%95%99%E5%AD%A6/1
  • Các chiến lược chi tiết được giải thích tại: https://www.fmz.com/bbs/s: tag: %E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%901

Công cụ gỡ lỗi

Nền tảng FMZ định lượng cung cấp công cụ lập trình để lập trình API, https://www.fmz.com/m/debug 。 Công cụ lập trình chỉ hỗ trợ JavaScript, chỉ có thể thực hiện trong một khoảng thời gian, có thể lập trình giao diện giao dịch mà không cần tạo ổ cứng。 dữ liệu trả về sẽ được trả về như là kết quả, mã của công cụ lập trình sẽ không được lưu trữ。 Trong bài học này, bạn có thể sử dụng công cụ lập trình để thử nghiệm đồng thời。 Hướng dẫn cơ bản về cách viết chiến lược nền tảng định lượng FMZ (phải đọc)

Kiến trúc chương trình chính sách

Các chương trình chính sách, cũng như các chương trình bình thường, được thực hiện theo trình tự mã, đặc biệt là phải có một hàm chính. Vì các chính sách cần chạy không ngừng, thường thì cần một vòng lặp cộng với thời gian ngủ. Vì tất cả các giao dịch truy cập API có giới hạn tần suất, cần điều chỉnh thời gian ngủ tương ứng.

Các hàm đặc biệt khác như sau:

  • onexit() Đối với hàm quét đuôi thoát bình thường, thời gian thực hiện tối đa là 5 phút, có thể không tuyên bố, nếu vượt quá thời gian sẽ báo lỗi interrupt. Có thể sử dụng để lưu một số kết quả khi thoát khỏi chương trình.
  • onerror() Chức năng thoát khỏi trường hợp ngoại lệ, thời gian thực hiện tối đa là 5 phút, có thể không tuyên bố.
  • init ((() là hàm khởi tạo, chương trình chính sách được gọi tự động khi bắt đầu chạy, nhưng không thể tuyên bố.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

Ví dụ trước đây nếu truy cập mạng bị lỗi có thể dẫn đến việc chính sách dừng lại trực tiếp, nếu muốn một chính sách tương tự như khởi động lại tự động không dừng lại, bạn có thể sử dụng vòng lặp chủ thể chịu lỗi với chính sách cố gắng bắt giữ ((không sử dụng thử nghiệm). Tất nhiên, chỉ khi chính sách ổn định thì nên thực hiện hành động như vậy, nếu không, tất cả các lỗi sẽ không được báo cáo, khó để loại bỏ các vấn đề về chính sách.

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

API của sàn giao dịch

Các giao dịch và thiết lập cặp giao dịch

Khi gọi bất kỳ API liên quan đến sàn giao dịch nào, bạn cần phải xác định sàn giao dịch và cặp giao dịch. Nếu bạn chỉ thêm một sàn giao dịch-cặp giao dịch khi tạo ổ đĩa thực, bạn sẽ không cần phải thêm một giao dịch-cặp giao dịch.exchangeNó có nghĩa là:exchange.GetTicker()Những gì bạn nhận được sẽ là ticker giao dịch của cặp giao dịch này.

Nền tảng FMZ hỗ trợ thêm nhiều sàn giao dịch cùng một lúc - cặp giao dịch, chẳng hạn như BTC và ETH có thể hoạt động cùng một lúc trên cùng một tài khoản sàn giao dịch, cũng có thể hoạt động cùng một lúc trên BTC và ETH của một sàn giao dịch khác. Lưu ý rằng các tài khoản khác nhau trên cùng một sàn giao dịch cũng có thể được thêm vào cùng một lúc, chúng được phân biệt theo nhãn được thêm vào trang web FMZ.exchangesCác mảng được biểu thị theo thứ tự mà chúng được thêm vào khi tạo đĩa cứng:exchanges[0]exchanges[1]Các cặp giao dịch được định dạng như sau:BTC_USDTBTC là đồng tiền giao dịch, USDT là đồng tiền tính toán.

Hướng dẫn cơ bản về cách viết chiến lược nền tảng định lượng FMZ (phải đọc)

Rõ ràng, nếu chúng ta có rất nhiều cặp giao dịch, cách này sẽ rất khó khăn, và chúng ta có thể sử dụng SetCurrency để chuyển đổi các cặp giao dịch, chẳng hạn nhưexchange.SetCurrency("BTC_USDT")Lúc này,exchangeCác cặp giao dịch bị ràng buộc sẽ trở thànhBTC_USDTCác giao dịch này sẽ có hiệu lực cho đến khi có cuộc gọi thay đổi cặp giao dịch tiếp theo.Lưu ý rằng lần đo lại mới nhất hỗ trợ chuyển đổi giao dịch cặpDướ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)
  }
}

Giao diện công khai để truy cập thông tin

Như đã nêu ở trên, giao diện giao dịch thường là giao diện công khai, tất cả mọi người đều có thể truy cập. Các giao diện giao dịch thông thường có: truy cập ticker giao dịch, truy cập độ sâu, truy cập K linerecords, truy cập giao dịch giao dịch.

Các giao diện thường cóInfoCác trường, biểu thị chuỗi dữ liệu gốc được trả về bởi các sàn giao dịch, có thể được sử dụng để bổ sung thông tin bổ sung, cần phân tích trước đó, JavaScript sử dụngJSON.parse()Python sử dụng thư viện json.TimeCác trường này cho biết thời gian yêu cầu, có thể được sử dụng để đánh giá thời gian trì hoãn.

Việc truy cập và trả về không thành công bằng cách sử dụng giao diện API trên ổ cứngnullPython trở lại.None, khi sử dụng dữ liệu trong đó sẽ bị lỗi và gây ra ổ cứng dừng lại, vì vậy khả năng chấp nhận lỗi là rất quan trọng.

GetTicker

Lấy thông tin về thị trường hiện tại, có lẽ là giao diện được sử dụng phổ biến nhất, có thể tìm thấy thông tin về giá giao dịch gần đây, giá mua và bán, khối lượng giao dịch gần đây, v.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 。可以看到具体的结果。
    Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}

GetDepth

Để có được thông tin về độ sâu của bảng xếp hạng. Mặc dù GetTicker chứa mua và bán, nhưng nếu bạn muốn tìm kiếm sâu hơn, bạn có thể sử dụng giao diện này, thường có thể truy cập vào 200 bảng xếp hạng tiếp theo. Bạn có thể sử dụng giao diện này để tính toán giá đâm. Dưới đây là kết quả thực 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ụ về việc sử dụng quyền truy cập sâu vào giao dịch:

function main() {
    var depth = exchange.GetDepth()
    Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}

GetRecords

Lấy đường K, một trong những giao diện được sử dụng nhiều nhất, có thể trả về thông tin giá dài hơn một lần để tính toán cơ sở cho các chỉ số khác nhau. Chu kỳ đường K không thể được chỉ định nếu không chỉ định chu kỳ mặc định sẽ được sử dụng khi thêm ổ cứng. Chiều dài đường K không thể được chỉ định, sẽ liên tục tăng theo thời gian tích lũy, tối đa 2000 rễ, lần đầu tiên gọi khoảng 200 rễ (các sàn giao dịch khác nhau trả về khác nhau).

exchange.SetMaxBarLen(Len)Có thể thiết lập số lần đầu tiên có được K line (được hỗ trợ bởi một số sàn giao dịch) và thiết lập số lượng K line tối đa.Ví dụ:exchange.SetMaxBarLen(500)

GetRecords có thể chỉ định thời gian: PERIOD_M1:1 phút, PERIOD_M5:5 phút, PERIOD_M15:15 phút, PERIOD_M30:30 phút, PERIOD_H1:1 giờ, PERIOD_D1:1 ngày.exchange.GetRecords(PERIOD_M1)。 Sau khi nâng cấp cho người quản lý mới nhất, sẽ hỗ trợ chu kỳ tùy chỉnh, truyền trực tiếp số giây chu kỳ làm tham số, tùy chỉnh ở cấp độ phút sẽ được tổng hợp dựa trên đường K 1 phút, đường K dưới 1 phút được tổng hợp thông qua GetTrades (), tương lai hàng hóa sẽ được tổng hợp dựa trên tick,。Bạn cũng có thể gặp những điều tương tự trong hướng dẫn.PERIOD_M1Các biến toàn diện này, là biến toàn cầu mặc định của FMZ, có thể được người quan tâm tự đăng nhập vào các giá trị cụ thể của chúng, thường được sử dụng trực tiếp.

Ví dụ 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ề dòng K:

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

Lấy 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), một số sàn giao dịch không hỗ trợ.

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

Các giao diện này liên quan đến tài khoản và không thể truy cập trực tiếp, cần sử dụng chữ ký API-KEY. Nền tảng FMZ đã được xử lý tự động thống nhất ở hậu trường và có thể sử dụng trực tiếp.

Nhận tài khoản GetAccount

Nhận thông tin tài khoản. Một trong những giao diện được sử dụng phổ biến nhất, cần được gọi trước khi đặt hàng, để tránh không có số dư đầy đủ.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Trong đó, Stocks là số dư có sẵn trong đồng tiền giao dịch của cặp giao dịch, FrozenStocks là số dư đóng băng của các đơn đặt hàng chưa hoàn thành, Balance là số dư có sẵn trong đồng tiền tính toán, và FrozenBalance là số dư đóng băng. Nếu cặp giao dịch làBTC_USDTTrong trường hợp này, Stocks là BTC, còn Balance là USDT.

Lưu ý rằng kết quả trả về là kết quả của cặp giao dịch được chỉ định, thông tin về các đồng tiền khác trong tài khoản giao dịch trong trường Info, hoạt động nhiều cặp giao dịch không cần gọi nhiều lần.

Một đĩa cứng 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
    }
}

Mua dưới mua

Đơn đặt hàng dưới đây.exchange.Buy(Price, Amount)hoặcexchange.Buy(Price, Amount, Msg)Price là giá, Amount là số lượng, Msg là một chuỗi bổ sung có thể được hiển thị trong nhật ký ổ đĩa thực, không bắt buộc. Cách này là để đặt hàng, nếu không thể hoàn thành ngay lập tức, sẽ tạo ra một đơn đặt hàng chưa hoàn thành, đơn đặt hàng thành công trả về kết quả là đơn đặt hàng id, thất bại lànull, được sử dụng để kiểm tra trạng thái đơn hàng.

Nếu bạn muốn mua một đơn đặt hàng dưới giá thị trường, Price là -1, Amount là giá trị đặt hàng, nhưexchange.Buy(-1, 0.5)Giao dịch đúng.ETH_BTCMột số sàn giao dịch không hỗ trợ đơn giá thị trường và không hỗ trợ phản hồi tương lai.

Một số giao dịch tất cả các yêu cầu về giá và số lượng chính xác, có sẵn_N()Các hàm chính xác để kiểm soát. Đối với giao dịch tương lai, Buy và Sell có ý nghĩa khác, sẽ được giới thiệu riêng.

Một ví dụ về việc mua hàng khi đạt được mức 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')
}

Bán đi bán lại

Đơn mua bán dưới. Các tham số giống với Mua. Các tham số của đơn giá thị trường có ý nghĩa khác nhau, đơn giá thị trường bán như sau:exchange.Sell(-1, 0.2), đại diện cho giá thị trường bán 0.2 ETH.

GetOrder lấy đơn đặt hàng

Lấy thông tin đơn đặt hàng dựa trên id đơn đặt hàng. Giao diện thường dùng, cách gọiexchange.GetOrder(OrderId)OrderId là id đơn đặt hàng, sẽ được trả lại khi đặt hàng.Lưu ý loại đơn đặt hàngTypeCác trường và trạng thái của đơn đặt hàngStatusCác giá trị thực tế là số, đại diện cho các ý nghĩa khác nhau, nhưng không có lợi cho trí nhớ, FMZ đại diện cho các giá trị này bằng các hằng số toàn cầu, chẳng hạn như giá trị của các đơn đặt hàng chưa hoàn thànhStatusGiá trị là 0, tương đương vớiORDER_STATE_PENDINGTất cả các hằng số toàn cầu này có thể được xem trong tài liệu.◯ Trả về kết quả:

{
    "Id":125723661, //订单id
    "Amount":0.01, //订单数量
    "Price":7000, //订单价格
    "DealAmount":0, //已成交数量
    "AvgPrice":0, //成交均价
    "Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
    "Type":1,// 订单类型,0:买单, 1:卖单
    "ContractType":"",//合约类型,用于期货交易
    "Info":{} //交易所返回原始信息
    }
}

Một chiến lược để mua một số lượng tiền mã hóa nhất định:

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){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
                exchange.CancelOrder(id)
            }
        }
    }
}

GetOrders chưa hoàn thành đơn hàng

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

Ví dụ về việc hủy bỏ giao dịch hiện tại trên tất cả các đơn đặt hàng:

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)
    }
}

CancelOrder

Thu hồi đơn đặt hàng theo id.exchange.CancelOrder(OrderId)。 Phản hồi thành công trả về true, nếu không trả về false。 Lưu ý rằng lệnh đã hoàn thành sẽ bị hủy bỏ.

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

Giao dịch tương lai tiền kỹ thuật số và giao dịch tiền mặt khác nhau, các chức năng giao dịch tiền mặt trên cũng áp dụng cho hợp đồng tương lai, giao dịch một hợp đồng có chức năng độc quyền. Trước khi thực hiện giao dịch hợp đồng tương lai tiền kỹ thuật số, hãy làm quen với hoạt động thủ công trên trang web, hiểu các khái niệm cơ bản, chẳng hạn như mở kho, bán kho, toàn kho, bán kho, đòn bẩy, lỗ hổng, thu nhập nổi, tiền bảo hiểm và các khái niệm và công thức tính toán tương ứng.

Hợp đồng vĩnh viễn tương tự như hợp đồng tương lai, khác biệt là không có khái niệm đồng thời giữ nhiều khoảng trống.

Nếu sàn giao dịch đồng thời hỗ trợ giao dịch tương lai, chẳng hạn như OKEX và Huobi, bạn cần chọn riêng trong giao diện sàn giao dịch để thêm các ô OKEX và Huobi, được coi là các sàn giao dịch khác nhau trong FMZ.

SetContractType Đặt hợp đồng

Bước đầu tiên để giao dịch tương lai là thiết lập hợp đồng để giao dịch, ví dụ như hợp đồng tương lai OKEX, tạo một cặp giao dịch BTC khi tạo một bảng hoặc đánh giá lại, cũng cần thiết lập trong mã là hợp đồng trong tuần, tuần tới hoặc hàng quý. Nếu không thiết lập, nó sẽ nhắcinvalid contract typeKhác với các cặp giao dịch hiện tại, hợp đồng tương lai thường được bảo đảm bằng các loại tiền tệ giao dịch như BTC, cặp giao dịch thêm BTC thường đại diện cho cặp giao dịch BTC_USD được bảo đảm bằng BTC, nếu có hợp đồng tương lai được bảo đảm bằng USDT, việc tạo ra một cặp giao dịch BTC_USDT được thực hiện. Các hợp đồng tương lai như OKEX đồng thời tồn tại các hợp đồng gia hạn trên cơ sở đồng tiền và USDT.Sau khi thiết lập các cặp giao dịch, bạn cũng cần thiết lập các 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.

Các hợp đồng đồng tiền tệ và đồng USDT có sẵn trong các giao dịch như Binance, OKEX, HuobiDM, cần phân biệt khi thêm hợp đồng thiết lập ổ cứng. Các thiết lập cụ thể như sau:

//OKEX期货
exchange.SetContractType("swap")        // 设置为永续合约
exchange.SetContractType("this_week")   // 设置为当周合约
exchange.SetContractType("next_week")   // 设置为次周合约
exchange.SetContractType("quarter")     // 设置为季度合约

//HuobiDM
exchange.SetContractType("this_week")   // 设置为当周合约 
exchange.SetContractType("next_week")   // 设置为次周合约
exchange.SetContractType("quarter")     // 设置为季度合约
exchange.SetContractType("swap")        // 设置为永续合约

//币安期货
exchange.SetContractType("swap")   // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter")   // 设置为当季合约
exchange.SetContractType("next_quarter")  // 设置为次季合约

//BitMEX
exchange.SetContractType("XBTUSD")    // 设置为永续合约
exchange.SetContractType("XBTM19")  // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码

//GateIO
exchange.SetContractType("swap")      // 设置为永续合约,不设置默认为swap永续合约。 

//Deribit
exchange.SetContractType("BTC-27APR18")  // 具体某个时间结算的合约,详情参看Deribit官网。

GetPosition nắm giữ

Nhận danh sách thông tin về vị trí hiện tại, OKEX ((OKCOIN) tương lai có thể được truyền vào một tham số, chỉ định loại hợp đồng muốn lấy. Nếu không có vị trí, trả về danh sách trống[]Thông tin về cổ phiếu được trả về như sau, thông tin cụ thể rất nhiều, cần được kết hợp với phân tích cụ thể về giao dịch.

Loại dữ liệu Tên biến minh họa

“Object HDID Info HDID Exchange trả về cấu trúc nguyên thủy” “Number”, “Margin Level”, “Bar Size”, “OKCoin” là 10 hoặc 20, “OK Futures” trả về “Fixed 10”, vì API gốc không hỗ trợ “Amount” là số lượng dự trữ, “OKCoin” là số lượng hợp đồng. “Amount” là số lượng dự trữ, “OKCoin” là số lượng hợp đồng. Số lượng kho bị đóng băng “Điều này có nghĩa là tôi không có tiền”. Số tiền bảo lãnh bị đóng băng Số lượng và Lợi nhuận của các hợp đồng tương lai: Lãi suất của thị trường cổ phiếu, tiền kỹ thuật số: ((Đơn vị tiền kỹ thuật số: BTC/LTC, đơn vị hợp đồng tương lai truyền thống: RMB, lưu ý: OKCoin tương lai có nghĩa là thặng dư trong trường hợp toàn bộ cổ phiếu, không phải là cổ phiếu cổ phiếu, giảm cổ phiếu là cổ phiếu cổ phiếu) “const” (trong CTP) “PD_LONG” (trong CTP) “PD_SHORT” (trong CTP) “PD_LONG” (trong CTP) “PD_SHORT” (trong CTP) “PD_LONG” (trong CTP) “PD_SHORT” (trong CTP) “PD_SHORT” (trong CTP) “PD_LONG” (trong CTP) “PD_SHORT” (trong CTP) “PD_LONG” (trong CTP) “PD_SHORT” (trong CTP) “PD_LONG” (trong CTP) “PD_LONG” (trong CTP) “PD_SHORT” (trong CTP) “PD_SHORT” (trong CTP) “PD_LONG” (trong CTP) “PD_LONG” (trong CTP) “PD_LONG” (trong CTP) “PD_LONG” (trong CTP) “PD_LONG” (trong String hằngContractType hằng hàng hóa tương lai là mã hợp đồng, cổ phiếu là mã giao dịch _ cổ phiếu mã hằng, tham số cụ thể SetContractType

function main(){
    exchange.SetContractType("this_week");
    var position = exchange.GetPosition();
    if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
        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

Đầu tiên, bạn cần thiết lập kích thước và cách gọi các thanh:exchange.SetMarginLevel(10)10 là 10x đòn bẩy, kích thước đòn bẩy được hỗ trợ cụ thể, xem các sàn giao dịch tương ứng.Lưu ý: Cần thiết lập đòn bẩy ở sàn giao dịch và mã của bạn phải phù hợp với thiết lập của sàn giao dịch, nếu không bạn sẽ bị lỗiBạn có thể không cài đặt và sử dụng thanh bấm mặc định. Sau đó thiết lập hướng giao dịch, cách gọi:exchange.SetDirection(Direction)“Vì vậy, chúng tôi đã có một số quyết định khác.Không giống như hợp đồng tương lai, nếu hợp đồng thường trực không có khái niệm đồng thời giữ nhiều vị trí trống, nghĩa là không cho phép giữ một vị trí đơn lẻ, việc mở nhiều vị trí trống sẽ tự động xóa nhiều vị trí, tất cả chỉ cần thiết lậpbuysellCó sẵn. Nếu hỗ trợ giữ hai chiều, cần thiết lậpclosebuy,closebuyMối quan hệ cụ thể:

Hoạt động Các tham số của SetDirection Phương thức downorder
Tạo thêm vị trí exchange.SetDirection(“buy”) exchange.Buy()
Bình Đỗ Hương exchange.SetDirection(“closebuy”) exchange.Sell()
Khoảng trống exchange.SetDirection(“sell”) exchange.Sell()
Vốn trống exchange.SetDirection(“closesell”) exchange.Buy()

Cuối cùng là mã mở và đóng cụ thể, số lượng đặt hàng khác nhau giữa các sàn giao dịch khác nhau, ví dụ như tương lai huobi là theo số lượng, một tờ 100 đô la. Chú ý rằng đánh giá lại tương lai không hỗ trợ giá thị trường.

function main(){
    exchange.SetContractType("this_week")    // 举例设置 为OKEX期货 当周合约
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) //设置杠杆为10倍 
    exchange.SetDirection("buy") //设置下单类型为做多 
    exchange.Buy(price+10, 20) // 合约数量为20下单 
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) //查看是否有未成交订单
    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

Dưới đây là một ví dụ cụ thể về chiến lược hoàn toàn bằng phẳng

function main(){
    while(true){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){
            Log('无法获取ticker')
            return
        }
        if(!pos || pos.length == 0 ){
            Log('已无持仓')
            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 tận dụng tiền kỹ thuật số

Các giao dịch khác cũng giống như giao dịch trực tiếp.

Sử dụng exchange.IO ((“trade_margin”) để chuyển sang chế độ tài khoản bán lẻ, đặt hàng, lấy tài sản tài khoản sẽ truy cập vào giao diện đòn bẩy của sàn giao dịch. Sử dụng exchange.IO ((“trade_normal”) để chuyển sang chế độ tài khoản thông thường.

Các sàn hỗ trợ:

  • OKEX V3: Các cặp giao dịch theo mô hình tài khoản đòn bẩy khác với các cặp giao dịch thông thường, một số cặp giao dịch có thể không có.
  • Bitcoin: Các cặp giao dịch theo mô hình tài khoản đòn bẩy khác với các cặp giao dịch thông thường, một số cặp giao dịch có thể không có.
  • ZB: Tiền chỉ có thể chuyển vào QC, phân khúc giao dịch đòn bẩy, độc lập tài chính giữa các cặp giao dịch khác nhau, tức là số tiền QC dưới cặp giao dịch ETH_QC, không thể nhìn thấy 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 kỹ thuật số có sự khác biệt rất lớn. Đầu tiên, thời gian giao dịch của tương lai hàng hóa rất ngắn, giao dịch tiền kỹ thuật số 24h; thỏa thuận tương lai hàng hóa cũng không phải là REST API phổ biến; tần suất giao dịch và giới hạn số lượng giao dịch của tương lai hàng hóa, tiền kỹ thuật số rất thoải mái, v.v. Vì vậy, giao dịch tương lai hàng hóa có nhiều nơi cần chú ý đặc biệt, nên có kinh nghiệm vận hành thủ công phong phú.

Các nhà cung cấp giao dịch định lượng FMZ đã đăng ký cấp phép phần mềm cho các nhà cung cấp dịch vụ giao dịch tương lai khác nhau, người dùng có thể sử dụng trực tiếp mà không cần nộp đơn, trong khi thêm các nhà cung cấp giao dịch định lượng FMZ là tìm kiếm các nhà thám hiểm có thể thấy danh sách các ứng dụng FMZ đã được đăng ký. Bài đăng tham khảo cụ thể: https://www.fmz.com/bbs-topic/3860 。 Nếu nhà cung cấp giao dịch tương lai của bạn không còn trong danh sách, chỉ có thể tự mình đăng ký hoặc hỗ trợ lại người mở giao dịch, thường cần 2 ngày.

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

Khung chính sách

Đầu tiên, vì không phải là giao dịch 24h và cần phải hoạt động đăng nhập, trước khi thực hiện giao dịch, cần phải đánh giá trạng thái liên kết.exchange.IO("status")trueNếu không đăng nhập thành công khi gọi API, không được nhắc ‘not login’. Bạn có thể ngủ sau khi bắt đầu chiến lược ((2000), cho đăng nhập một thời gian nhất định. Bạn cũng có thể thử đăng ký lại_C(exchange.SetContractType,"MA888")Các nhà khoa học đã nghiên cứu và phát hiện ra một số nguyên tố có thể giúp đảm bảo sự thành công của cuộc hạ cánh.

Các mã mua và giao dịch của tương lai hàng hóa tương tự như tương lai tiền kỹ thuật số, đây là những điểm khác biệt và cần lưu ý.

function main(){
    _C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
    while(true){
        if(exchange.IO("status")){
            var ticker = exchange.GetTicker()
            Log("MA888 ticker:", ticker)
            LogStatus(_D(), "已经连接CTP !")//_D获取事件
        } else {
            LogStatus(_D(), "未连接CTP !")
            Sleep(1000)
        }
    }
}

Chúng tôi khuyên bạn nên sử dụng giao dịch kho hàng hóa tương lai (được giới thiệu sau), khi đó mã sẽ rất đơn giản, không cần phải xử lý các chi tiết phức tạp.

function main() {
    // 使用了商品期货类库的CTA策略框架
    $.CTA(Symbols, function(st) {
        var r = st.records
        var mp = st.position.amount
        var symbol = st.symbol
        /*
        r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
        返回值如为n: 
            n = 0 : 指全部平仓(不管当前持多持空)
            n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
            n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
            无返回值表示什么也不做
        */
        if (r.length < SlowPeriod) {
            return
        }
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        if (mp <= 0 && cross > ConfirmPeriod) {
            Log(symbol, "金叉周期", cross, "当前持仓", mp);
            return Lots * (mp < 0 ? 2 : 1)
        } else if (mp >= 0 && cross < -ConfirmPeriod) {
            Log(symbol, "死叉周期", cross, "当前持仓", mp);
            return -Lots * (mp > 0 ? 2 : 1)
        }
    });
}

Mô hình lấy dữ liệu CTP

Các giao dịch tương lai hàng hóa sử dụng giao thức CTP, tất cả các giao dịch và giao dịch chỉ được thông báo khi có thay đổi, trong khi truy vấn các đơn đặt hàng, tài khoản và vị trí là truy vấn chủ động. Vì vậy, phù hợp với chiến lược tần số cao được điều khiển bởi sự kiện viết.GetTickerGetDepthGetRecordsTất cả đều có dữ liệu được lưu trữ để có được dữ liệu mới nhất, nếu không có dữ liệu sẽ luôn chờ đợi dữ liệu, vì vậy chiến lược có thể không sử dụng Sleep. Khi có thay đổi trong tình hình, ticker, depth, records sẽ được cập nhật, trong khi đó, gọi bất kỳ giao diện nào sẽ được trả về ngay lập tức, trạng thái giao diện đã được gọi sẽ được đặt ở chế độ chờ cập nhật, lần sau gọi cùng một giao diện, sẽ chờ đợi dữ liệu mới trở lại. Một số trường hợp đóng cửa lạnh hoặc ngừng giao dịch sẽ xảy ra trong một thời gian dài, điều này cũng bình thường khi chiến lược được lưu trữ trong một thời gian dài.

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

Trong khi hoạt động với một hợp đồng, bạn có thể sử dụng chế độ mặc định. Nhưng nếu là nhiều hợp đồng, có thể một hợp đồng không cập nhật giao dịch, dẫn đến tắc nghẽn giao diện nhận giao dịch, các hợp đồng khác cũng không cập nhật giao dịch. Để giải quyết vấn đề này, bạn có thể sử dụng chế độ cập nhật ngay lập tức, nhưng không dễ dàng viết chiến lược tần số cao.exchange.IO("wait")Nếu bạn thêm nhiều đối tượng giao dịch, điều này là hiếm trong tương lai hàng hóa, bạn có thể sử dụngexchange.IO("wait_any")Chỉ số được trả về sẽ cho biết chỉ số của sàn giao dịch được trả về.

Tiếp tục tick để thay đổi.{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称} Gửi đơn hàng đến:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}

Tại 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")){ //判断链接状态
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
            _C(exchange.SetContractType, "rb888")//订阅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 tương lai hàng hóa và tiền kỹ thuật số

Cũng cần lưu ý rằng tương lai hàng hóa khác với sàn giao dịch tiền kỹ thuật số. Như GetDepth thực sự chỉ có một độ sâu ((5 độ sâu phí đắt tiền), GetTrades cũng không có lịch sử giao dịch ((tất cả dựa trên thay đổi nắm giữ mô phỏng, không có hồ sơ giao dịch thực sự).

Thiết lập hợp đồng

exchange.IO ((“instruments”): trả về danh sách tất cả các hợp đồng của sàn giao dịch (tên hợp đồng: chi tiết) dưới dạng từ điển, chỉ hỗ trợ đĩa cứng. exchange.IO ((“products”): trả về danh sách tất cả các sản phẩm của sàn giao dịch dưới dạng từ điển, chỉ hỗ trợ đĩa cứng. exchange.IO ((“subscribed”): trả về các hợp đồng đã đăng ký, cùng định dạng, chỉ hỗ trợ đĩa cứng.

Các hợp đồng CTP truyền thốngContractTypeVí dụ: ID hợp đồng.exchange.SetContractType("au1506")Các hợp đồng liên tiếp chính có mã 888 như MA888, các hợp đồng chỉ số liên tiếp là 000 như MA000, 888 và 000 chỉ hỗ trợ tradeback cho các hợp đồng ảo, các hợp đồng thực chỉ hỗ trợ lấy thực tế.Nhưng ngôn ngữ Mac có thể điều khiển hợp đồng chủ lực, chương trình sẽ tự động thay thế vị trí, tức là xóa vị trí không chủ lực và mở một vị trí mới trên vị trí chủ lực.

Nếu không đăng nhập thành công, bạn sẽ không thể thiết lập hợp đồng, nhưng nó sẽ quay trở lại ngay lập tức, vì vậy bạn có thể thử lại với _C, biết rằng đăng nhập CTP đã hoàn thành. Sau khi đăng nhập thành công, thiết lập hợp đồng lại là không tốn thời gian và không tạo ra truy cập mạng thực sự.

Bắt đầu giao dịch

SetDirectionDirection có thể lấybuy, closebuy, sell, closesellBốn tham số, hàng hóa tương lai nhiều hơnclosebuy_todayclosesell_today“Tôi không thể làm được điều đó.closebuy/closesellĐối với giao dịch tương lai, chỉ phân biệt các loại giao dịch trước và sau có thể ảnh hưởng đến phí xử lý, do đó cần ưu tiên giao dịch trước. Đối với hợp đồng tương lai truyền thống của CTP, bạn có thể thiết lập tham số thứ hai là 1 hoặc 2 hoặc 3, tương ứng với Chuỗi đầu cơ, Chuỗi lợi nhuận, Chuỗi bảo vệ, không thiết lập đầu cơ mặc định.Các hoạt động cụ thể như mua và bán, lấy vị trí, lấy lệnh, rút đơn, lấy tài khoản giống như giao dịch tương lai tiền kỹ thuật số.

Hoạt động Các tham số của SetDirection Phương thức downorder
Tạo thêm vị trí exchange.SetDirection(“buy”) exchange.Buy()
Bình Đỗ Hương exchange.SetDirection(“closebuy”) exchange.Sell()
Khoảng trống exchange.SetDirection(“sell”) exchange.Sell()
Vốn trống exchange.SetDirection(“closesell”) exchange.Buy()

Ví dụ dưới đây là hàm vị thế yên (blank position) cụ thể, lưu ý rằng ví dụ này quá đơn giản, cũng cần xem xét liệu có đang trong thời gian giao dịch, không hoàn toàn giao dịch làm thế nào để đặt đơn đặt thử, số lượng đặt hàng tối đa là bao nhiêu, tần suất quá cao, cụ thể là giá tháo hoặc mở cửa và một loạt các câu hỏi khác. Chỉ để tham khảo.Lưu trữ mở trên đĩa cứng được đề xuất sử dụng các kho lưu trữ được đóng gói trên nền tảng, https://www.fmz.com/strategy/12961。 Trong phần các thư viện, bạn có thể tìm hiểu thêm về các nguồn của các 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 ? "平今" : "平昨", '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 ? "平今" : "平昨", 'Ask', depth.Asks[0]);
        }
    }
}

Hàng hóa tương lai hỗ trợ các loại đơn đặt hàng tùy chỉnh (hỗ trợ đĩa cứng, không hỗ trợ đo đạc), sau đó chỉ định cách đặt hàng, thêm vào trong thùng_Ví dụ như sau lưng.

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

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

  • ioc Hoàn thành ngay lập tức, nếu không hủy bỏ THOST_FTDC_TC_IOC
  • gfs Phần này có hiệu lực THOST_FTDC_TC_GFS
  • gfd có hiệu lực trong ngày THOST_FTDC_TC_GFD
  • gtd có hiệu lực trước ngày được chỉ định THOST_FTDC_TC_GTD
  • gtc có hiệu lực trước khi thu hồi THOST_FTDC_TC_GTC
  • gfa Gói giá thầu có hiệu lực THOST_FTDC_TC_GFA

Giao diện dễ dàng

Cổng CTP được mở theo mặc định trên các nhà giao dịch hàng hóa tương lai, có thể được thay đổi thành giao diện EasePay nếu có yêu cầu. Qua gói FMZ, cách gọi là giống nhau. Sự khác biệt là tài khoản, đơn đặt hàng và kho đều là chế độ đẩy, do đó người quản lý sẽ duy trì dữ liệu này tại địa phương và sẽ ngay lập tức quay trở lại khi gọi giao diện tương ứng, không thực sự gửi yêu cầu.

Các loại đơn đặt hàng tùy chỉnh của giao thức EasyJet như sau:

  • gfd có hiệu lực trong ngày TAPI_ORDER_TIMEINFORCE_GFD
  • gtc TAPI_ORDER_TIMEINFORCE_GTC có hiệu lực trước khi thu hồi
  • gtd có hiệu lực trước ngày đã chỉ định TAPI_ORDER_TIMEINFORCE_GTD
  • fak bán một phần, hủy phần còn lại TAPI_ORDER_TIMEINFORCE_FAK
  • ioc Hoàn thành ngay, nếu không hủy TAPI_ORDER_TIMEINFORCE_FAK
  • TAPI_ORDER_TIMEINFORCE_FOK không hoàn thành giao dịch, hoàn toàn hủy bỏ

Hàm toàn cầu thông dụng

Log Log và WeChat

Trong giao diện đĩa cứng, Log một nhật ký, sau chuỗi ký tự thêm @, tin nhắn sẽ được đưa vào hàng đợi đẩy, sau khi ràng buộc WeChat hoặc telegram sẽ được đẩy trực tiếp.Log('推送到微信@')

Màu sắc của nhật ký cũng có thể được tùy chỉnhLog('这是一个红色字体的日志 #ff0000')#ff0000Hình 16 của màu RGB

Tất cả các tệp nhật ký tồn tại trong cơ sở dữ liệu sqlit trên ổ đĩa trong thư mục của người quản lý, 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 sao chép để phục hồi (tên cơ sở dữ liệu giống như id ổ đĩa).

LogProfit in thu nhập

Ghi lại thu nhập và vẽ đường cong thu nhập trên màn hình đĩa cứng, có thể giữ lại sau khi khởi động lại đĩa cứng.LogProfit(1000)Chú ý.LogProfitCác tham số không nhất thiết phải là thu nhập, có thể là bất kỳ số nào, cần phải tự điền.

LogStatus hiển thị (có bảng)

trạng thái ổ cứng, vì nhật ký được lưu trước và được cập nhật liên tục, nếu bạn chỉ cần hiển thị thông tin không được lưu, bạn có thể sử dụngLogStatuschức năng.LogStatusCác tham số là một chuỗi, cũng có thể được sử dụng để biểu thị thông tin bảng.

Một ví dụ về bảng hiển thị vị trí trạng thái ổ đĩa cụ thể:

”` var table = {type: ‘table’, title: