FMZ định lượng nền tảng chiến lược viết hướng dẫn cho người mới bắt đầu (cần xem)

Tác giả:Cỏ nhỏ, Tạo: 2019-08-13 17:47:27, Cập nhật: 2021-08-06 10:29:46

[TOC] Hướng dẫn này bao gồm kiến thức ban đầu về viết chính sách, bao gồm giới thiệu, kiểm tra, biểu đồ và các nội dung khác của API. Sau khi học các 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 thành thạo để viết các chính sách thực tế ổn định.Người phát minh FMZ sử dụng nền tảng định lượng 。

Bài học cũ:Các nhà phát minh định lượng (FMZ.COM) chiến lược viết bằng cách sử dụng đầy đủ hướng dẫn 2.0 (trình hướng dẫn)Các bạn có thể tham khảo các bài viết trên trang web của chúng tôi.

Thông tin sơ bộ về chiến lược

API giới thiệu

Giao dịch theo chương trình là việc kết nối một chương trình với một sàn giao dịch thông qua API để tự động mua bán hoặc thực hiện các chức năng khác theo ý định của thiết kế. API được gọi chung là Application Programming Interface.

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. REST chỉ cần truy cập một lần mỗi lần thu thập dữ liệu. Ví dụ như API của sàn giao dịch wex.app, hãy mở trực tiếp trong trình duyệt https://api.wex.app/api/v1/public/ticker?market=BTC_USDT và nhận được kết quả:

{"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ạn có thể xem thị trường mới nhất giao dịch với cặp BTC_USDT, thay đổi mỗi lần cập nhật.market=Sau đó là các tham số giao dịch cụ thể, có thể được sửa đổi để có được dữ liệu giao dịch khác. Đối với giao diện công khai, chẳng hạn như thị trường, tất cả mọi người đều có thể truy cập, do đó không cần xác minh, trong khi một số giao diện như lệnh dưới đây và truy cập tài khoản cần xác định danh tính người dùng, khi đó cần phải sử dụng API-KEY để ký. Websocket là chế độ đă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 phải truy cập lại mỗi lần, do đó hiệu quả hơn.

FMZ Quantitative Trading Platform đã đóng gói các giao diện REST của các sàn giao dịch, sử dụng các cách gọi và định dạng dữ liệu thống nhất để viết các chính sách đơn giản hơn và phổ biến hơn.

Ngôn ngữ khác nhau

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

Vì Python có các phiên bản khác nhau, bạn có thể 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 ngữ pháp ES6, thú vị để tìm hiểu. Dưới đây là các mã Python và Javascript có cùng chức năng, chỉ có sự khác biệt ngữ 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ẽ xem xét các 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

  • Các tài liệu API nền tảng FMZ, hướng dẫn này sẽ không giới thiệu chi tiết về từng giao diện, cụ thể có thể xem 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 để đặt hàng trên FMZ, bạn có thể tham khảo bài viết này:https://www.fmz.com/digest-topic/5533
  • Javascript, Python để bắt đầu nhanh chóng, viết một chiến lược đơn giản không cần 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ắt đầu, bạn có thể học lập trình bên cạnh, học hướng dẫn này:https://www.fmz.com/bbs-topic/382 https://www.fmz.com/bbs-topic/417
  • Các tài liệu về ngôn ngữ Ma là rất thuận tiện cho các chiến lược xu hướng.https://www.fmz.com/bbs-topic/2569
  • Một ví dụ về một cuộc gọi C++ có thể được xem bởi những người quan tâm đến C++, nhưng vì không phải là ngôn ngữ giải thích, việc debugging là khó khăn và không nên sử dụng:https://www.fmz.com/strategy/61533
  • NetEasy Cloud Classroom Currency Quantitative Trading Currency Currency, FMZ Official Output, chỉ cần 20 đô la, nội dung chi tiết phong phú, từ nông sâu, phù hợp cho người mới bắt đầuLiên kết chương trình
  • Một số chiến lược giảng dạy phù hợp cho việc bắt đầu học, viết và học tập cơ bản:https://www.fmz.com/square/s:tag:教学/1
  • Các nguồn mã chi tiết về chiến lược:https://www.fmz.com/bbs/s:tag:源码解析/1

Công cụ chỉnh sửa

FMZ Quantified Platform cung cấp các công cụ debugging cho các giao diện API.https://www.fmz.com/m/debugCác công cụ debugging chỉ hỗ trợ JavaScript và chỉ có thể thực hiện trong một thời gian, bạn có thể debugging giao diện sàn giao dịch mà không cần tạo ổ đĩa thực. Dữ liệu return sẽ được trả về như là kết quả, mã của công cụ debugging sẽ không được lưu.img

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

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

Các chức năng khác có vai trò đặc biệt là:

  • onexit ((() là một chức năng thoát khỏi trình duyệt thông thường với thời gian thực thi tối đa 5 phút, có thể không tuyên bố, nếu quá giờ báo cá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 ((() là một hàm thoát ngoại lệ, có thời gian thực hiện tối đa 5 phút và có thể không được tuyên bố.
  • init ((() là một hàm khởi tạo mà các chương trình chính sách sẽ tự động gọi 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ể khiến chính sách dừng ngay lập tức, nếu muốn một chính sách giống như tự động khởi động sẽ không dừng lại, bạn có thể sử dụng chính sách thực đĩa để thử catch vòng lặp lỗi chủ sở hữu. Tất nhiên, chỉ nên thực hiện điều này khi chính sách ổn định, nếu không sẽ không trả lại tất cả các lỗi, khó sắp xếp các vấn đề 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 giao dịch giới thiệu

Setting sàn giao dịch và cặp giao dịch

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

Nền tảng FMZ hỗ trợ đồng thời thêm nhiều cặp giao dịch giao dịch, ví dụ như bạn có thể đồng thời vận hành BTC và ETH của cùng một tài khoản giao dịch, hoặc đồng thời vận hành BTC của một sàn giao dịch và ETH của sàn giao dịch khác. Lưu ý rằng các tài khoản khác nhau của cùng một sàn giao dịch cũng có thể được thêm 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ị bằng cách thêm theo thứ tự tạo đĩa thực.exchanges[0]exchanges[1]... và như vậy. Các cặp giao dịch được định dạng nhưBTC_USDTBitcoin là đồng tiền giao dịch và USDT là đồng tiền định giá.

img

Rõ ràng, điều này sẽ rất khó khăn nếu chúng ta giao dịch với nhiều cặp, tại thời điểm này bạn có thể sử dụng SetCurrency để chuyển đổi các cặp giao dịch nhưexchange.SetCurrency("BTC_USDT")Trong thời gian này.exchangeCác cặp giao dịch bị ràng buộc sẽ thay đổi theoBTC_USDTTrong khi đó, các đối tượng khác cũng có thể tham gia vào các cuộc gọi này.Lưu ý rằng kiểm tra lại hỗ trợ giao dịch chuyển đổi mới nhấtMột ví dụ cụ thể được nêu dưới đây.

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

Truy cập vào giao diện công khai như thị trường

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

Các giao diện thường cóInfoCác trường, biểu thị các chuỗi dữ liệu nguyên bản được trao đổi, có thể được sử dụng để bổ sung thêm thông tin, cần phân tích trước đó, sử dụng JavaScriptJSON.parse()Python sử dụng thư viện json.TimeCác trường cho biết thời gian của yêu cầu, được sử dụng để xác định thời gian trì hoãn.

Có thể truy cập thất bại và quay trở lại bằng cách sử dụng API trên ổ đĩa thực.nullPython trở lạiNoneKhi sử dụng dữ liệu trong đó sẽ báo cáo lỗi và dẫn đến ổ đĩa thực dừng lại, vì vậy chấp nhận lỗi là rất quan trọng.

GetTicker

Nhận thị trường hiện tại, có lẽ là giao diện được sử dụng phổ biến nhất, bạn có thể xem giá giao dịch cuối cùng, giá mua bán, số 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

Nhận thông tin sâu về danh mục đặt hàng. Mặc dù GetTicker chứa mua và bán một lần, nhưng nếu bạn muốn truy vấn danh mục đặt hàng sâu hơn, bạn có thể sử dụng giao diện này, thường có thể tìm thấy 200 danh mục đặt hàng đầu tiên. Bạn có thể sử dụng giao diện này để tính giá cú sốc. Dưới đây là kết quả trả về 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
}

Một ví dụ về việc mua bán bằng cách sử dụng quyền truy cập sâu:

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

GetRecords

Nhận K-line, 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á lâu hơn một lần, tính toán cơ sở cho các chỉ số khác nhau. K-line cycle nếu không chỉ định sẽ hiển thị các chu kỳ mặc định khi sử dụng thêm đĩa thực. K-line length cannot be specified, will continue to increase over time accumulation, up to 2000 bits, the first call will be about 200 bits (different exchanges return different); the last K-line is the latest K-line, so the data will constantly change as the trend progresses, the first K-line is the oldest data.

exchange.SetMaxBarLen(Len)Bạn có thể đặt số lần đầu tiên lấy K-line (một số sàn giao dịch hỗ trợ) và đặt số lượng K-line tối đa.Ví dụ:exchange.SetMaxBarLen(500)

GetRecords có thể chỉ định chu kỳ: 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 các nhà quản lý mới nhất, sẽ hỗ trợ các chu kỳ tùy chỉnh, chuyển trực tiếp số giây chu kỳ như một 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 sẽ đượ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 dấu chấm.Hãy chú ý rằng bạn cũng sẽ gặp phải những vấn đề tương tự trong bài học này.PERIOD_M1Các biến số này được viết bằng chữ số lớn, chúng là các biến số toàn cầu mặc định của FMZ, những người quan tâm có thể tự đăng nhập các giá trị cụ thể của chúng, thường được sử dụng trực tiếp.

Một ví dụ về dữ liệu được 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ề đườ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

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

Truy cập tài khoản để giao dịch

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

GetAccount Nhập tài khoản

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 phải gọi trước khi đặt hàng để tránh thiếu số dư. Trả về kết quả như:{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Trong đó Stocks là số dư tiền tệ giao dịch có sẵn của cặp giao dịch, FrozenStocks là số dư tiền tệ đóng băng cho các đơn đặt hàng chưa được thực hiện, Balance là số tiền có sẵn của đồng tiền định giá, FrozenBalance là số dư tiền tệ đóng băng nếu giao dịch đúng.BTC_USDTTrong khi đó, trong các tài khoản khác, Stocks là BTC và Balance là USDT.

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

Một tấm bảng hiển thị giá trị giao dịch hiện tại đối với tổng giá trị:

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

Đặt mua

Đơn xin trả tiền.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ể hiển thị trong nhật ký thực, không phải là bắt buộc.null, được sử dụng để truy vấn trạng thái đặt hàng.

Nếu bạn muốn trả giá thị trường, Price là -1, Amount là giá trị đặt hàng, ví dụ:exchange.Buy(-1, 0.5)Đúng vậy.ETH_BTCCác sàn giao dịch không hỗ trợ bảng giá thị trường và các sàn giao dịch tương lai cũng không hỗ trợ.

Các giao dịch một phần tất cả các yêu cầu về độ chính xác về giá cả và số lượng, có sẵn_N()Chức năng chính xác để kiểm soát. Các nghĩa khác cho giao dịch tương lai mua và bán sẽ được giới thiệu riêng.

Một ví dụ về việc mua hàng với mức giá phù hợp:

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

Sell Bán xuống

Đơn bán dưới↑ tham số giống như Buy↑ tham số của đơn giá thị trường có ý nghĩa khác nhau, giá bán thị trường nhưexchange.Sell(-1, 0.2)Trong khi đó, các nhà đầu tư đã bán 0.2ETH tại thị trường.

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

Nhận thông tin đặt hàng dựa trên ID đặt hàng.exchange.GetOrder(OrderId), OrderId là Orderid, được trả về khi đặt hàng.Chú ý đến loại đơn đặt hàngTypeCác trường và trạng thái đặt hàngStatusCác giá trị thực tế là các con số, đại diện cho các ý nghĩa khác nhau, nhưng không thuận 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ư các đơn đặt hàng chưa hoàn thành.StatusVà giá trị của nó 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ố tiền 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 đơn đặt hàng chưa hoàn thành

Nhận danh sách các 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 hoàn thành, trả về mảng trống.

Ví dụ về việc hủy giao dịch hiện tại cho 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

Theo ID đặt hàng, hủy đặt hàng.exchange.CancelOrder(OrderId)⇒ Quay lại thành công trả về true, nếu không trả về false. ⇒ Lưu ý rằng đơn đặt hàng đã hoàn thành hoàn toàn sẽ bị hủy bỏ.

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

Giao dịch tương lai tiền kỹ thuật số khác với giao dịch hiện tại, các chức năng giao dịch hiện tại trên cũng áp dụng cho giao dịch tương lai, giao dịch tương lai đơn có chức năng riêng. Trước khi thực hiện giao dịch tương lai tiền kỹ thuật số, bạn nên làm quen với các 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ư giao dịch mở, giao dịch chung, giao dịch toàn bộ, giao dịch một lần, đòn bẩy, giao dịch chung, lỗ lãi lỏng, thu nhập nổi, tiền bảo hiểm và các công thức tính toán tương ứng.

Hợp đồng không đổi và hợp đồng tương lai tương tự nhau, nhưng khác biệt là không có khái niệm giữ nhiều không gian cùng một lúc.

Nếu một sàn giao dịch hỗ trợ giao dịch tương lai hiện tại, chẳng hạn như giao dịch tương lai OKEX và giao dịch tương lai Huobi, thì cần phải chọn riêng trong giao diện sàn giao dịch để thêm giao dịch tương lai OKEX và giao dịch tương lai Huobi. FMZ coi đó là một sàn giao dịch khác với giao dịch hiện tại.

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

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

Các hợp đồng Bitcoin, OKEX, HuobiDM và các hợp đồng USDT cần được phân biệt khi thêm hợp đồng thiết lập trên thực tế.

//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 giữ

Nhận danh sách thông tin nắm giữ 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 để có được. Nếu không có nắm giữ, trả về danh sách trống[]⇒ Thông tin nắm giữ được trả về như sau, thông tin cụ thể rất nhiều, cần 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 Giải thích
đối tượng Thông tin Các sàn giao dịch trở lại cấu trúc ban đầu
số Mức ký quỹ Kích thước của tỷ lệ cược, OKCoin là 10 hoặc 20, OK tương lai toàn bộ mô hình giao dịch trở lại là cố định 10, vì API gốc không hỗ trợ
số Số tiền Số lượng nắm giữ, OKCoin cho biết số lượng hợp đồng (tổng số lớn hơn 1)
số Số lượng đóng băng Số lượng đóng băng vị trí
số Giá cả Giá trung bình
số Lãi suất Tự đóng băng tiền bảo lãnh
số Lợi nhuận Tiền tương lai hàng hóa: Lợi nhuận thị trường cổ phiếu, tiền kỹ thuật số: ((Đơn vị tiền kỹ thuật số: BTC/LTC, đơn vị tiền tương lai truyền thống: RMB, lưu ý: OKCoin tương lai nói về việc thực hiện thặng dư trong trường hợp toàn bộ cổ phiếu, không phải là lỗ cổ phiếu, theo từng cổ phiếu nói về lỗ cổ phiếu)
const Loại PD_LONG cho nhiều vị trí (của CTP là closebuy_today), PD_SHORT cho một vị trí trống (của CTP là closeesell_today), PD_LONG_YD cho một vị trí trống hôm qua (của CTP là closebuy), PD_SHORT_YD cho một vị trí trống hôm qua (của CTP là closeesell)
chuỗi ContractType Tiền tương lai hàng hóa là mã hợp đồng, cổ phiếu là mã sàn giao dịch _ mã cổ phiếu là mã sàn giao dịch, kiểu truyền 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 cửa

Trước tiên, bạn cần phải đặt kích thước và cách gọi.exchange.SetMarginLevel(10)Trong khi đó, các sàn giao dịch khác cũng có thể sử dụng các loại giao dịch khác nhau, trong đó 10 là 10 lần đòn bẩy, và kích thước đòn bẩy cụ thể được hỗ trợ.Chú ý là cần phải đặt đòn bẩy trên sàn giao dịch, trong mã phải phù hợp với sàn giao dịch, nếu không sẽ có lỗi.Bạn cũng có thể không cài đặt, sử dụng bàn đòn mặc định. Sau đó, đặt hướng giao dịch, cách gọi:exchange.SetDirection(Direction), tương ứng với giao dịch mở, ** không giống như giao dịch tương lai, nếu hợp đồng vĩnh viễn không đồng thời nắm giữ khái niệm nhiều chỗ trống, tức là không cho phép giữ một cổ phiếu duy nhất, làm nhiều thời gian mở sẽ tự động đặt nhiều chỗ trống, tất cả chỉ cần đặtbuysellNếu hỗ trợ giữ hai chiều, cần thiết lậpclosebuy,closebuy◦** Liên hệ cụ thể:

Hoạt động SetDirection tham số Chức năng phụ
Quay nhiều hơn exchange.SetDirection ((buy) trao đổi.Buy ((()
Địa ngục exchange.SetDirection ((closebuy) trao đổi.Bán.
Kho trống exchange.SetDirection ((sell) trao đổi.Bán.
Cửa hàng trống exchange.SetDirection ((closesell) trao đổi.Buy ((()

Cuối cùng là mã giao dịch giao dịch cụ thể, số lượng đơn đặt hàng khác nhau trên các sàn giao dịch khác nhau, chẳng hạn như giao dịch tương lai huobi là theo số tờ, một tờ 100 đô la.

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 của tất cả các sàn giao dịch.

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

Đòn bẩy tiền kỹ thuật số

Các giao dịch trực tiếp cũng có thể được chuyển sang tài khoản có lợi trong mã hóa.

Sử dụngexchange.IO("trade_margin") Chuyển sang chế độ tài khoản nhị phân, đặt hàng, lấy tài sản tài khoản sẽ truy cập giao diện dẫn đầu của sàn giao dịch. Sử dụngexchange.IO("trade_normal") Chuyển sang chế độ tài khoản thông thường.

Các sàn giao dịch được 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.
  • Tiền mã hóa: 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: Số tiền chỉ có thể được chuyển sang QC, sàn giao dịch đòn bẩy, số tiền độc lập 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ể 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ố rất khác nhau. Thứ nhất, giao dịch tương lai hàng hóa là ngắn, giao dịch tiền kỹ thuật số 24h; giao thức tương lai hàng hóa cũng không phải là REST API phổ biến; giao dịch tương lai hàng hóa có tần suất giao dịch và giới hạn số lượng đơn hàng treo, tiền kỹ thuật số rất lỏng lẻo, vv.https://www.fmz.com/bbs-topic/325❖ Công ty tương lai hàng hóa thêm:https://www.fmz.com/bbs-topic/371

Các hợp đồng tương lai hàng hóa và vào tháng 6 năm 2019 thực hiện quản lý giao dịch tương lai, cá nhân lập trình người dùng cá nhân cần mở cửa các nhà giao dịch tương lai của ứng dụng mã ủy quyền (thông mẫu thông tin cụ thể yêu cầu có thể được gửi trên nhóm WeChat hoặc nhóm QQ), thường mất 4-5 ngày, các bước khá phức tạp. FMZ định lượng nền tảng như các nhà cung cấp giao dịch lập trình đã nộp đơn xin mã ủy quyền phần mềm cho các dịch vụ tương lai, người dùng có thể sử dụng trực tiếp mà không cần nộp đơn, trong thêm các nhà giao dịch tương lai là tìm kiếm các trang web có thể xem danh sách các trang web mà FMZ đã nộp đơn.https://www.fmz.com/bbs-topic/3860◦ Nếu nhà giao dịch 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ở lại tài khoản tại nhà giao dịch đượ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ố dịch vụ, chẳng hạn như giao dịch tương lai lớn, đã mua phiên bản tổ chức của nền tảng FMZ, có thể được sử dụng cho người dùng, người mở sẽ tự động trở thành VIP và chi phí thủ tục được giảm thiểu.https://www.fmz.com/bbs-topic/506

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ố 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ể thực hiện, chẳng hạn như tổng hợp tick tần số cao.https://www.fmz.com/bbs-topic/1184

Khung chiến lược

Trước tiên, vì không phải là giao dịch 24h và cần phải có hành động nhập, cần phải xác định trạng thái liên kết trước khi giao dịch được thực hiện.exchange.IO("status")ĐểtrueNếu bạn không đăng nhập thành công, hãy gọi API, không nhắc nhở nút đăng nhập. Bạn có thể ngủ sau khi chính sách bắt đầu._C(exchange.SetContractType,"MA888")Một số người nói rằng, "Điều này sẽ đảm bảo sự thành công của chuyến đổ bộ".

Việc mua và giao dịch các hợp đồng tương lai hàng hóa cũng giống như hợp đồng tương lai tiền kỹ thuật số.

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 kho lưu trữ giao dịch hàng hóa tương lai (được giới thiệu sau đây), trong đó mã sẽ rất đơn giản, không cần phải xử lý các chi tiết phức tạp.https://www.fmz.com/strategy/57029

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 thu thập dữ liệu CTP

Tiền tương lai hàng hóa sử dụng giao thức CTP, tất cả các thị trường và giao dịch chỉ được thông báo khi có thay đổi, trong khi yêu cầu đặt hàng, tài khoản, giữ là yêu cầu chủ động. Vì vậy, phù hợp với các chính sách tần số cao được điều khiển bởi sự kiện.GetTickerGetDepthGetRecordsTất cả các dữ liệu được lưu trữ để có được dữ liệu mới nhất, khi 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ó sự thay đổi trong thị trường, ticker, depth, records đều được cập nhật, trong đó bất kỳ giao diện nào được gọi sẽ được trả về ngay lập tức, trạng thái giao diện đã được gọi được đặt trong chế độ chờ cập nhật, lần gọi tiếp theo cùng một giao diện, sẽ đợi cho dữ liệu mới trở lại. Một số hợp đồng đóng cửa lạnh hoặc tình huống dừng đập sẽ xảy ra trong một thời gian dài không giao dịch, đây là một trường hợp bình thường mà chiến lược bị chặn trong một thời gian dài.

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

Khi điều hành một hợp đồng duy nhất, 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 thị trường, dẫn đến việc truy cập giao diện thị trường bị tắc nghẽn, và các hợp đồng khác cũng không cập nhật thị trường. Để 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 chính sách tần suất cao.exchange.IO("wait")Nếu bạn thêm nhiều đối tượng giao dịch, điều này rất hiếm trong tương lai hàng hóa, bạn có thể sử dụngexchange.IO("wait_any")Trong khi đó, chỉ số được trả về sẽ chỉ ra chỉ số của sàn giao dịch được trả về.

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

Khi đó, 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ố

Ngoài ra, cần lưu ý sự khác biệt giữa tương lai hàng hóa và sàn giao dịch tiền kỹ thuật số. Ví dụ như GetDepth thực sự chỉ có một độ sâu (chi phí độ sâu 5 độ đắt tiền), GetTrades cũng không truy cập lịch sử giao dịch (tất cả đều được mô phỏng dựa trên sự thay đổi của cổ phiếu, 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 trên sàn giao dịch {Contract name: details} dạng từ điển, chỉ hỗ trợ thực tế.exchange.IO("products"): Trả về danh sách tất cả các sản phẩm trên sàn giao dịch {tên sản phẩm: chi tiết} dạng từ điển, chỉ hỗ trợ đĩa thực.exchange.IO("subscribed"): Trả lại hợp đồng đã đăng ký thị trường, định dạng tương tự, chỉ hỗ trợ đĩa thực.

CTP tương lai truyền thốngContractTypeTrong khi đó, các công ty khác cũng có thể sử dụng ID hợp đồng để xác định số lượng hợp đồng của họ.exchange.SetContractType("au1506") Các chi tiết về hợp đồng được trả lại sau khi thiết lập thành công, chẳng hạn như ít nhất một lần mua bao nhiêu, phí thủ tục, thời gian giao hàng, vv. Khi đăng ký nhiều hợp đồng, chỉ gửi yêu cầu đăng ký thực sự lần đầu tiên, sau đó chỉ chuyển giao dịch ở cấp mã, không tốn thời gian. Hợp đồng liên tục chính là mã 888 như MA888, hợp đồng chỉ số liên tục là 000 như MA000, 888 và 000 chỉ hỗ trợ xem lại giao dịch hợp đồng ảo, đĩa thực chỉ hỗ trợ nhận giao dịch.Tuy nhiên, ngôn ngữ Mac có thể vận hành các hợp đồng chủ lực, chương trình sẽ tự động chuyển đổi, tức là làm phẳng các vị trí không chủ lực và mở một vị trí mới trên vị trí chủ lực.

Không đăng nhập thành công không thể thiết lập hợp đồng, nhưng cũng sẽ trở lại ngay lập tức, vì vậy bạn có thể thử lại bằng _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 lại hợp đồng không tốn thời gian và không tạo ra truy cập mạng thực sự.

Mở giao dịch

SetDirectionDIRECTION có thể lấybuy, closebuy, sell, closesellBốn yếu tố, nhiều hơn các hợp đồng tương lai hàng hóaclosebuy_todayclosesell_todayNhững người đang ở trong tình trạng như thế, họ đang ở trong tình trạng như thế.closebuy/closesellĐối với tương lai CTP, bạn có thể thiết lập tham số thứ hai là 1 hoặc 2 hoặc 3 tùy chọn, tương ứng là 1 hoặc 2 hoặc 3 tùy chọn, tương ứng là 1 hoặc 2 hoặc 3 tùy chọn.Các hoạt động cụ thể như mua bán, lấy vị trí, lấy lệnh, rút tiền, lấy tài khoản và các giao dịch tương lai tiền kỹ thuật số tương tự như các giao dịch tương lai tiền kỹ thuật số.

Hoạt động SetDirection tham số Chức năng phụ
Quay nhiều hơn exchange.SetDirection ((buy) trao đổi.Buy ((()
Địa ngục exchange.SetDirection ((closebuy) trao đổi.Bán.
Kho trống exchange.SetDirection ((sell) trao đổi.Bán.
Cửa hàng trống exchange.SetDirection ((closesell) trao đổi.Buy ((()

Ví dụ dưới đây là một chức năng giao dịch cụ thể, lưu ý rằng ví dụ này quá đơn giản, cũng cần xem xét một loạt các câu hỏi như liệu có phải trong thời gian giao dịch, làm thế nào để đặt lại đơn đặt hàng chưa hoàn thành, số lượng đặt hàng tối đa là bao nhiêu, tần suất có quá cao hay không, cụ thể là giá trượt hoặc thanh toán. Chỉ để tham khảo.Trong khi đó, các nhà đầu tư thực sự khuyên bạn nên sử dụng thư viện lớp được đóng gói tốt trên nền tảng.https://www.fmz.com/strategy/12961Các mục trong thư viện có những thông tin cụ thể và đề nghị bạn học mã nguồn 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]);
        }
    }
}

Tiền tương lai hàng hóa hỗ trợ các loại đơn đặt hàng tùy chỉnh (hỗ trợ thực, không hỗ trợ kiểm tra lại), sau đó chỉ định theo cách , thêm sau _ như

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

Những hậu quả cụ thể là:

  • ioc hoàn thành ngay lập tức, nếu không sẽ hủy bỏ THOST_FTDC_TC_IOC
  • gfs Phần này hiệu quả THOST_FTDC_TC_GFS
  • gfd có hiệu lực vào ngày đó THOST_FTDC_TC_GFD
  • gtd có hiệu lực trước ngày xác định THOST_FTDC_TC_GTD
  • gtc có hiệu lực trước khi hủy bỏ THOST_FTDC_TC_GTC
  • gfa Đặt giá hợp đồng hiệu lực THOST_FTDC_TC_GFA

Giao diện dễ dàng

Theo mặc định, các nhà giao dịch tương lai hàng hóa sẽ mở giao diện CTP, nếu có yêu cầu, bạn có thể thay đổi sang giao diện Easy Transaction. Thông qua FMZ, gói, cách gọi giống nhau. Sự khác biệt là tài khoản, đơn đặt hàng, giữ đề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ẽ trả lại ngay lập tức 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 Etsy là như sau:

  • gfd có hiệu lực trong ngày TAPI_ORDER_TIMEINFORCE_GFD
  • TAPI_ORDER_TIMEINFORCE_GTC có hiệu lực trước khi gtc bị hủy
  • gtd có hiệu lực trước ngày xác định TAPI_ORDER_TIMEINFORCE_GTD
  • fak phần giao dịch, hủy phần còn lại TAPI_ORDER_TIMEINFORCE_FAK
  • ioc hoàn thành ngay lập tức, nếu không sẽ hủy TAPI_ORDER_TIMEINFORCE_FAK
  • fok không thể hoàn tất giao dịch, tất cả đều bị hủy TAPI_ORDER_TIMEINFORCE_FOK

Các hàm toàn cầu thường được sử dụng

Log log và WeChat

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

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

Tất cả các tệp nhật ký đều tồn tại trong cơ sở dữ liệu sqlit trên ổ đĩa thực 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 sử dụng để sao chép sao lưu và khôi phục (tên cơ sở dữ liệu giống với ID ổ đĩa thực).

LogProfit in thu nhập

Ghi lại thu nhập, và vẽ đường cong thu nhập trên giao diện ổ đĩa thực, cũng có thể được giữ lại sau khi ổ đĩa thực được khởi động.LogProfit(1000)Hãy chú ý nhé.LogProfitCác tham số không nhất thiết phải là lợi nhuận, có thể là bất kỳ con số nào, cần tự điền.

LogStatus Bảng trạng thái hiển thị (có bảng)

trạng thái đĩa thực, vì nhật ký Log được lưu trước và luôn được làm mới, bạn có thể sử dụng nó nếu bạn cần một thông tin chỉ hiển thị không được lưuLogStatusChức năng.LogStatusCác tham số của bảng là các chuỗi và 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 thực cụ thể:

var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; 
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格) 
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现 
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里 
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表

Ngủ

Các tham số là số millisecond, ví dụ:Sleep(1000)Để ngủ một giây. Do các giao dịch bị hạn chế về tần số truy cập tất cả, một chiến lược thông thường là bao gồm thời gian ngủ trong chu kỳ chết.

_G lưu dữ liệu

Khi ổ đĩa thực được khởi động lại, chương trình sẽ được khởi động lại, và nếu bạn muốn lưu một số thông tin lâu dài, bạn có thể sử dụng nó để thực hiện các hoạt động khác nhau._GMột phần của nó là một phần của một tập tin JSON, và nó rất dễ sử dụng và có thể lưu trữ nội dung được sắp xếp theo JSON._GCác hàm được viết ởonexit()Trong đó, mỗi khi ngừng chính sách, 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, hàm _G không phù hợp, bạn có thể sử dụng Python để viết trực tiếp vào cơ sở dữ liệu.

function onexit(){
    _G('profit', profit)
}
function main(){
    _G("num", 1); // 设置一个全局变量num, 值为1 s
    _G("num", "ok"); // 更改一个全局变量num, 值为字符串ok 
    _G("num", null); // 删除全局变量 num 
    _G("num"); // 返回全局变量num的值,如果不存在返回null

    var profit = 0
    if(_G('profit')){
        profit = _G('profit')
    }
}

_N hàm độ chính xác

Trong khi đặt hàng, thường là để kiểm soát giá cả và số lượng chính xác, FMZ tích hợp chức năng N để xác định lưu trữ các chữ số nhỏ như_N(4.253,2)Kết quả là 4.25.

_C Tự động thử lại

Việc gọi API giao dịch là, không đảm bảo mọi lần truy cập đều thành công, _C là một hàm tự động thử lại. Sẽ liên tục gọi hàm chỉ định cho đến khi trả về thành công (như hàm trả về null hoặc false sẽ thử lại)._C(exchange.GetTicker), mặc định interval thử lại là 3 giây, bạn có thể gọi chức năng _CDelay để kiểm soát interval thử lại, ví dụ như _CDelay ((1000), đề nghị thay đổi interval thử lại của chức năng _C thành 1 giây.GetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderTất cả đều sử dụng _C để chấp nhận lỗi và ngăn chặn sự cố truy cập gây ra sự gián đoạn chương trình.

CancelOrderKhông thể sử dụng hàm _C, vì có nhiều lý do cho sự thất bại thu hồi, nếu một đơn hàng đã được giao dịch, thì việc thu hồi sẽ trả lại thất bại, sử dụng hàm _C sẽ dẫn đến cố gắng lại liên tục.

Chức năng _C cũng có thể truyền các tham số và cũng được sử dụng cho các hàm tùy chỉnh.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}

Chức năng _Date

Gọi trực tiếp_D()Trả về một chuỗi thời gian hiện tại như:2019-08-15 03:46:14│ Nếu gọi lại trong kiểm tra, trả lại thời gian kiểm tra. Bạn có thể sử dụng hàm _D để xác định thời gian, ví dụ:_D().slice(11) > '09:00:00':

_D(timestamp,fmt), sẽ chuyển các dấu thời gian của ms thành các chuỗi thời gian, như_D(1565855310002)│fmt là định dạng thời gian, mặc địnhyyyy-MM-dd hh:mm:ss

Các hàm chỉ số TA

Đối với một số chức năng chỉ số phổ biến, chẳng hạn như các chỉ số phổ biến như MA\MACD\KDJ\BOLL, nền tảng FMZ được tích hợp trực tiếp, các chỉ số cụ thể được hỗ trợ có thể xem tài liệu API.

Trước khi sử dụng hàm chỉ số, tốt nhất là xác định chiều dài của đường K. Khi chiều dài đường K trước không đáp ứng chu kỳ cần tính toán, kết quả là:nullNếu chiều dài của dòng K được nhập là 100 và chu kỳ của phép tính MA là 10, thì 9 giá trị đầu tiên là không, và sau đó là phép tính bình thường.

JavaScript cũng hỗ trợ Talib đầy đủ, hỗ trợ thư viện của bên thứ ba, gọi nhưtalib.CCI(records)◄ tham khảohttp://ta-lib.org/function.html│ Đối với Python, bạn có thể tự cài đặt thư viện talib, vì cần biên dịch, không thể cài đặt đơn giản bằng pip, bạn có thể tự tìm cách cài đặt.

Chức năng chỉ số có thể truyền dữ liệu k-line vào bất kỳ mảng nào

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    if (records && records.length > 9) {
        var ma = TA.MA(records, 14)
        Log(ma)
    }
}

Các hàm JavaScript phổ biến

Dưới đây là một số chức năng JavaScript phổ biến trên máy tính.

  • Date.now()Trở lại thời gian hiện tại
  • parseFloat()Chúng ta có thể chuyển đổi các chuỗi thành các số, ví dụ:parseFloat("123.21")
  • parseInt()Chuyển các chuỗi thành số nguyên
  • num.toString()Chuyển số thành chuỗi và số thành biến số
  • JSON.parse()Định dạng các chuỗi Json như:JSON.parse(exchange.GetRawJSON())
  • JavaScript tự mang các hàm trong thư viện Math nhưMath.max(),Math.abs()Các hoạt động toán học thường được sử dụng, ví dụ:https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • FMZ tham khảo thư viện toán học JavaScript của bên thứ ba, tham khảo:https://mathjs.org/
  • FMZ đề cập đến thư viện underscore JavaScript của bên thứ ba, khuyến cáo tìm hiểu, giúp điều hành nhiều Js khó khăn, tham khảo:https://underscorejs.org/

Thư viện mẫu

Viết một chức năng chiến lược thực tế là rất nhiều trường hợp cần phải xem xét, chẳng hạn như mua 5 đồng một chức năng đơn giản như vậy, chúng ta phải xem xét: số dư hiện tại là đủ? giá đặt hàng là bao nhiêu? độ chính xác là bao nhiêu? không cần phải phân chia đơn đặt hàng để tránh thị trường sốc?

JavaScript thư viện giao dịch tiền kỹ thuật số và thư viện giao dịch tương lai hàng hóa được tích hợp mặc định, không cần sao chép. Các thư viện mẫu khác có thể được tìm thấy tại Strategy Squarehttps://www.fmz.com/square/20/1Bạn có thể sao chép và lưu thư viện lớp mẫu và chọn thư viện mà bạn muốn sử dụng khi tạo chính sách của riêng bạn.

Các chức năng mẫu JavaScript đều được sử dụng$Python bắt đầu bằngextBắt đầu.

Bộ sưu tập giao dịch tiền kỹ thuật số

Địa chỉ mã nguồn:https://www.fmz.com/strategy/10989, đã được tích hợp, không cần phải sao chép. Các cách triển khai của các hàm cụ thể có thể trực tiếp tham khảo mã nguồn.

Nhập tài khoản:

$.GetAccount(e)

Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));

Các đơn xin được thu hồi:

$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)

$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单

Đánh giá:

$.Cross(periodA, periodB) / $.Cross(arr1, arr2);

var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较

Chức năng rút tiền (e, currency, address, amount, fee, password):

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Bộ sưu tập giao dịch tương lai hàng hóa

Sử dụng thư viện giao dịch tương lai hàng hóa ổn định, khuyến cáo sử dụng.https://www.fmz.com/strategy/12961⇒ Đã được tích hợp, không cần phải sao chép.

CTA

  • Các ổ đĩa thực sẽ tự động lập bản đồ các chỉ số vào các liên tục chính.
  • sẽ tự động xử lý các dịch vụ di chuyển
  • Có thể xác định bản đồ như rb000/rb888, đó là bản đồ các giao dịch chỉ số rb đến chuỗi chính.
  • Nó cũng có thể được lập bản đồ cho các hợp đồng khác, ví dụ như rb000/MA888, đó là các đường K của chỉ số rb để giao dịch MA chủ lực liên tục.
function main() {
    $.CTA("rb000,M000", function(r, mp) {
        if (r.length < 20) {
            return
        }
        var emaSlow = TA.EMA(r, 20)
        var emaFast = TA.EMA(r, 5)
        var cross = $.Cross(emaFast, emaSlow);
        if (mp <= 0 && cross > 2) {
            Log("金叉周期", cross, "当前持仓", mp);
            return 1
        } else if (mp >= 0 && cross < -2) {
            Log("死叉周期", cross, "当前持仓", mp);
            return -1
        }
    });
}

Ví dụ gọi thư viện

function main() {
    var p = $.NewPositionManager();
    p.OpenShort("MA609", 1);
    p.OpenShort("MA701", 1);
    Log(p.GetPosition("MA609", PD_SHORT));
    Log(p.GetAccount());
    Log(p.Account());
    Sleep(60000 * 10);
    p.CoverAll("MA609");
    LogProfit(p.Profit());
    Log($.IsTrading("MA609"));
    // 多品种时使用交易队列来完成非阻塞的交易任务
    var q = $.NewTaskQueue();
    q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
        Log(task.desc, ret)
    })
    while (true) {
        // 在空闲时调用poll来完成未完成的任务
        q.poll()
        Sleep(1000)
    }
}

Thư viện đồ họa

Vì các chức năng đồ họa nguyên bản phức tạp hơn, sẽ được giới thiệu trong hướng dẫn sau, người mới giới thiệu sử dụng thư viện đồ họa trực tiếp, đồ họa đường viền rất đơn giản, K đường viền, v.v. FMZ tích hợp thư viện loại đơn giản, có thể thấy trên trang chỉnh sửa chính sách, nếu không có tích hợp, người dùng phải tự sao chép và lưu để chọn tham chiếu trong chính sách.

img

Địa chỉ sao chép thư mục Javascript:https://www.fmz.com/strategy/27293Địa chỉ sao chép thư viện Python:https://www.fmz.com/strategy/39066

Ví dụ cụ thể:

function main() {
    while (true) {
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

Cài đặt các tham số chính sách

Dưới đây là cài đặt tham số chính sách, tương đương với các biến toàn cầu của chính sách, có thể được truy cập ở bất kỳ vị trí nào trong mã. Các tham số chính sách có thể được sửa đổi trong giao diện thực và có hiệu lực khi khởi động lại. Vì vậy, một số biến có thể được đặt thành tham số mà không cần sửa đổi chính sách.img

  • Tên biến: đó là number, string, combox, v.v. trong biểu đồ trên, có thể được sử dụng trực tiếp trong nhóm chính sách.
  • Mô tả: tên của tham số trong giao diện chính sách, giúp bạn hiểu ý nghĩa của tham số.
  • Nhận xét: giải thích chi tiết về tham số, mô tả sẽ hiển thị tương ứng khi chuột dừng lại trên tham số.
  • Loại: loại của tham số này, được giới thiệu chi tiết dưới đây.
  • Định giá mặc định: giá trị mặc định của tham số này.

Loại chuỗi và loại số rất dễ hiểu và cũng là loại phổ biến nhất. Bấm thả sẽ hiển thị các tùy chọn thả trong giao diện tham số, ví dụ như bạn có thể đặt giá trị tham số SYMBOL của thả làBTC|USDT|ETH, Nếu chọn USDT trong lần kéo xuống trang tham số, giá trị SYMBOL trong chính sách là chỉ mục 1 của USDT. Chọn dấu ngoặc là một hộp chọn, dấu ngoặc là true, nếu không là false.

Các tham số có rất nhiều tùy chọn để cài đặt.https://www.fmz.com/bbs-topic/1306

Chiến lược kiểm tra lại

Sau khi hoàn thành công việc định lượng một chiến lược, bạn có thể kiểm tra chiến lược của mình bằng dữ liệu lịch sử để xem chiến lược của bạn có lợi nhuận như thế nào trong dữ liệu lịch sử. Tất nhiên, kết quả kiểm tra lại chỉ để tham khảo. FMZ Quantify hỗ trợ kiểm tra lại các loại tiền kỹ thuật số hiện tại, tương lai, BitMEX Forever Contract Commodities, tương lai, trong đó tiền kỹ thuật số chủ yếu hỗ trợ các loại tiền chính thống. Javascript được kiểm tra trong trình duyệt, Python cần kiểm tra trên máy chủ, có thể sử dụng nền tảng để cung cấp một máy chủ công cộng.

Cơ chế kiểm tra lại

Cơ chế onbar là dựa trên K-line, mỗi K-line tạo ra một điểm thời gian để truy cập thông tin về giá bán, khối lượng giao dịch, và trước đó.


Thêm nữa

gaoencheernấm

Khoa họcLàm thế nào để thực hiện chính sách hoạt động tại địa phương? Tôi đã viết một câu lệnh xuất bản Log đơn giản và làm theo các thao tác ở cuối câu. Bước đầu tiên là sử dụng máy tính xách tay làm máy chủ và chạy chương trình quản trị. Bước thứ hai là viết một chương trình test.py đơn giản để xuất thông tin Log (phương thức giao diện API của FMZ); Bước thứ ba, như ở cuối văn bản, viết một runfile và chạy bằng cách gọi test.py qua run.py. /upload/asset/1add39483ef82d45b3ce3.png

gyp9Tôi đã mua một khóa học định lượng giao dịch trên đám mây dễ dàng, và bây giờ tôi đang ở đâu?

MonuRajaknhiều

MonuRajakChào.

Anh trai tôiHọc tập

wqyCó một lỗi nhỏ trong văn bản, GetAccount lấy tài khoản. Trong giới thiệu, FrozenStocks nên là cân bằng đóng băng chứ không phải cân bằng có sẵn.

Trung úy Gia.getorder outtime, giao dịch của okx, làm thế nào

Khẩu thuật cao cấp của 12 cây gỗKhông có khả năng có được tỷ lệ tài sản bảo đảm, 0% sẽ bị buộc phải cân bằng tỷ lệ tài sản bảo đảm

Shifeng2020Tôi đang xem 1 phút k biểu đồ hoạt động, vì vậy thời gian ngủ của vòng chết Python có thể được thiết lập là 0.1s, đó là sleep ((100) Tôi thấy bạn đã viết một sleep ((10) trong đó, đó là 0.1s không vượt quá giới hạn API của huobi HM?

Đền Đông gióexchange.SetDirection (("closebuy"); // nếu là hợp đồng vĩnh viễn, hãy đặt trực tiếp exchange.SetDirection (("sell") Ở đây tôi đã thử OKex, một hợp đồng vĩnh cửu, nếu bạn đặt nó thành sell, nó sẽ mở ngay lập tức.

Đền Đông gióexchange.SetDirection (("closebuy"); // nếu là hợp đồng vĩnh viễn, hãy đặt trực tiếp exchange.SetDirection (("sell") Ở đây tôi đã thử OKex, một hợp đồng vĩnh cửu, nếu bạn đặt nó thành sell, nó sẽ mở ngay lập tức.

Đền Đông gióCó hai lỗi chính tả trong mã của GetOrders. Một là function được viết thành fuction, và một là trong điều kiện của vòng lặp for;

Đền Đông gióTôi đã sai rồi. exchange.Buy ((-1, 0.5), cặp giao dịch là ETH_BTC, đơn giá thị trường đại diện cho việc mua 0.5BTC ETH exchange.Buy ((price, 0.5)), nếu đó là danh sách giới hạn, đại diện cho việc mua 0.5ETH với giá của price

Đền Đông gióexchange.Buy ((-1, 0.5), cặp giao dịch là ETH_BTC, đại diện cho việc mua ETH với giá thị trường là 0.5BTC Đây nên là đồng xu đại diện cho giá thị trường mua 0.5ETH đồng xu.

gyp9Cảm ơn.

Cỏ nhỏCác bài học được đăng trên trang web của chúng tôi là: https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2

Cỏ nhỏThêm WeChat vào trang chủ, kéo bạn vào nhóm.

wqyBạn có gặp vấn đề không biết phải hỏi ở đâu?

Cỏ nhỏThay đổi

Cỏ nhỏLấy lại

Cỏ nhỏBạn có thể sử dụng GetRawJSON hoặc xem thông tin trong trường thông tin.

Đền Đông gióTôi thấy rất nhiều lỗi chính tả trong mã, haha.

Cỏ nhỏỒ, đã sửa, cảm ơn đã chỉ ra lỗi.

Cỏ nhỏMột số hợp đồng vĩnh cửu cho phép giữ hai chiều, cần thiết để thiết lập ngang hàng. Tôi cập nhật, ban đầu chỉ có bitmex.