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

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

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); // Set a global variable num, with a value of 1 second 
    _G("num", "ok"); // Change a global variable num, whose value is the string "ok"
    _G("num", null); // Delete the global variable num 
    _G("num"); // Return the value of the global variable num; if it does not exist, return null

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

_N

Khi đặt hàng, các chính xác của giá và khối lượng thường cần phải được kiểm soát; FMZ đã xây dựng trong chức năng _N để xác định các vị trí thập phân được lưu; ví dụ, kết quả của_N(4.253,2)là 4,25.

_C

Việc gọi API nền tảng không thể đảm bảo truy cập thành công mỗi lần, và _C là một hàm thử lại tự động. Nó sẽ luôn gọi các hàm được chỉ định cho đến khi nó trả về thành công (chức năng sẽ thử lại nếu nó trả về null hoặc false); ví dụ,_C(exchange.GetTicker), với khoảng thời gian thử lại mặc định là 3 giây, và bạn có thể gọi chức năng _CDelay để điều khiển khoảng thời gian thử lại, chẳng hạn như _CDelay(1000), có nghĩa là thay đổi khoảng thời gian thử lại chức năng _C thành 1 giây.GetTicker(), exchange.GetDepth, GetTrade, GetRecords, GetAccount, GetOrdersGetOrderđể ngăn chặn sự gián đoạn chương trình do lỗi truy cập.

CancelOrderkhông thể sử dụng chức năng _C, bởi vì có nhiều lý do khác nhau cho sự thất bại trong việc hủy lệnh. Nếu một lệnh đã được thực hiện, thì hủy lệnh sẽ trả về thất bại, và sử dụng chức năng _C sẽ dẫn đến việc cố gắng lại mọi lúc. Chức năng _C cũng có thể truyền vào các tham số và cũng được sử dụng trong 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) // Pass in the parameters
}

_D

Gọi_D()sẽ trả về chuỗi thời gian hiện tại, chẳng hạn như:2019-08-15 03:46:14. Nếu nó được gọi trong quá trình backtest, thời gian backtest sẽ được trả về. Bạn có thể sử dụng hàm _D để đánh giá thời gian, chẳng hạn như:_D().slice(11) > '09:00:00':. _D(timestamp, fmt), sẽ chuyển đổi dấu thời gian ms thành một chuỗi thời gian, chẳng hạn như_D(1565855310002). Các tham số fmt là định dạng thời gian, và mặc định làyyyy-MM-dd hh:mm:ss.

Chức năng chỉ số TA

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

Trước khi sử dụng các chức năng chỉ số, tốt nhất là đánh giá chiều dài của đường K. Khi chiều dài đường K trước đó không thể đáp ứng thời gian cần thiết để tính toán, kết quả lànullVí dụ, nếu chiều dài đường K đầu vào là 100 và khoảng thời gian để tính toán MA là 10, thì 9 giá trị đầu tiên đều là không, và tính toán sau các giá trị hình thành 9 sẽ được thực hiện bình thường.

JavaScript cũng hỗ trợ toàn bộ talib, như một thư viện của bên thứ ba, với phương thức gọi nhưtalib.CCI(records)Vui lòng tham khảohttp://ta-lib.org/function.html. Đối với Python, bạn có thể tự cài đặt thư viện talib. Do nhu cầu biên dịch, bạn không thể đơn giản sử dụng pip để cài đặt. Bạn có thể tự tìm kiếm phương pháp cài đặt.

Các chức năng chỉ số không chỉ có thể truyền dữ liệu đường K, mà còn truyền bất kỳ mảng

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 thường được sử dụng trong JavaScript

Ở đây chúng tôi giới thiệu một số chức năng JavaScript thường được sử dụng trong các bot.

  • Date.now()trả về dấu thời gian hiện tại;
  • parseFloat()chuyển chuỗi thành số, chẳng hạn nhưparseFloat("123.21");
  • parseInt()chuyển chuỗi thành số nguyên;
  • num.toString()chuyển số thành chuỗi, với biến số num;
  • JSON.parse()định dạng chuỗi Json, chẳng hạn nhưJSON.parse(exchange.GetRawJSON());
  • JavaScript có các chức năng toán học của riêng nó, chẳng hạn như các hoạt động toán học phổ biến, bao gồmMath.max(), Math.abs()v.v.; tham chiếu:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;
  • Thư viện toán học của bên thứ ba được FMZ sử dụng; tham khảo:https://mathjs.org/ ;
  • Thư viện nhấn mạnh JavaScript của bên thứ ba được sử dụng bởi FMZ, được khuyến khích có kiến thức và làm cho các hoạt động Js tedious thuận tiện hơn; tham chiếu:https://underscorejs.org/.

Mô hình

Có rất nhiều tình huống cần được xem xét khi viết một hàm chiến lược bot. Ví dụ, một hàm đơn giản như mua 5 coin, chúng ta cần xem xét: Số dư hiện tại có đủ không? Giá lệnh là bao nhiêu? Độ chính xác là gì? Bạn có cần chia lệnh để tránh ảnh hưởng đến thị trường? Làm thế nào để xử lý các lệnh chưa hoàn thành? Và một số chi tiết như vậy. Trong các chiến lược khác nhau, các hàm này giống nhau, vì vậy bạn có thể tạo ra chúng thành một mẫu. Theo các mẫu chính thức, người dùng cũng có thể viết các chiến lược mẫu của riêng họ. Ở đây chúng tôi sẽ giới thiệu một số thư viện lớp mẫu được sử dụng rất phổ biến được chính thức phát hành bởi FMZ, để người dùng có thể nhanh chóng viết các chiến lược của riêng họ.

Thư viện giao dịch tiền điện tử JavaScript và thư viện giao dịch tương lai hàng hóa được xây dựng theo mặc định và không cần phải sao chép.https://www.fmz.com/square/20/1) Sao chép và lưu thư viện mẫu, và kiểm tra thư viện để sử dụng khi tạo chiến lược của riêng bạn.

Các chức năng mẫu JavaScript đều bắt đầu với$, trong khi Python tất cả bắt đầu vớiext.

Thư viện giao dịch tiền điện tử

Địa chỉ mã nguồn:https://www.fmz.com/strategy/10989Thực hiện chức năng cụ thể có thể trực tiếp tham chiếu đến mã nguồn.

Nhập tài khoản:

$.GetAccount(e)

Log($.GetAccount()); // Obtain the account information, with fault tolerance function 
Log($.GetAcccount(exchanges[1]));

Đặt & hủy đặt hàng:

$.Buy/Sell(e, amount)
$.Buy(0.3); // The main platform buys 0.3 coin
$.Sell(0.2); // The main platform sells 0.2 coin
$.Sell(exchanges[1], 0.1); // The secondary platform sells 0.1 coin
$.CancelPendingOrders(e, orderType)

$.CancelPendingOrders(); // Cancel all entrusted orders of the main platform 
$.CancelPendingOrders(ORDER_TYPE_BUY); // Cancel all buy orders of the main platform
$.CancelPendingOrders(exchanges[1]); // Cancel all orders of the secondary platform
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // Cancel all sell orders of the secondary platforom 

Hãy phán xét thập 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])
If n = 0, it means that the current prices of exactly 15-period EMA and 30-period EMA are equal. 
If n > 0, such as 5, it means that the 15-period EMA up-crosses the 30-period EMA by 5 periods (Bar)
If n < 0, such as -12, it means that the 15-period EMA down-crosses the 30-period EMA by 12 periods (Bar)
If it is not an array passed to the Cross, the function automatically obtains the K-line for moving average calculation.
If an array is passed to Cross, compare directly.

Chức năng $.withdraw ((e, tiền tệ, địa chỉ, số tiền, phí, mật khẩu):

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

Thư viện giao dịch tương lai hàng hóa

Đối với việc sử dụng thư viện giao dịch tương lai hàng hóa là rất ổn định, nó được khuyến cáo.https://www.fmz.com/strategy/12961Thực hiện chức năng cụ thể có thể trực tiếp tham chiếu đến mã nguồn.

Thư viện CTA

  • Bot sẽ tự động lập bản đồ chỉ số cho hợp đồng liên tục chính;
  • nó sẽ tự động xử lý chuyển động;
  • bạn có thể chỉ định bản đồ cho backtest, chẳng hạn như rb000/rb888, đó là để lập bản đồ k-line của chỉ số rb để giao dịch hợp đồng liên tục chính;
  • nó cũng có thể được gán cho các hợp đồng khác; ví dụ, rb000/MA888 là để xem dòng K của chỉ số rb để giao dịch hợp đồng liên tục chính MA.
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("Golden cross period", cross, "the moment position", mp);
            return 1
        } else if (mp >= 0 && cross < -2) {
            Log("Death cross period", cross, "the moment position", mp);
            return -1
        }
    });
}

Đưa ra ví dụ về 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"));
    // Multiple varieties use the trading queue to complete the non-blocking trading task
    var q = $.NewTaskQueue();
    q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
        Log(task.desc, ret)
    })
    while (true) {
        // Call "poll" to execute the unfinished tasks in the spare time
        q.poll()
        Sleep(1000)
    }
}

Thư viện vẽ

Đối với các chức năng thô để vẽ rất phức tạp, sẽ được giới thiệu trong hướng dẫn tiếp theo, chúng tôi khuyên người mới bắt đầu sử dụng thư viện vẽ, để vẽ biểu đồ đường rất đơn giản và biểu đồ đường k, vv. Thư viện vẽ đơn giản đã được xây dựng trong FMZ, có thể được nhìn thấy trên trang chỉnh sửa chiến lược; nếu thư viện chưa được xây dựng, người dùng cần sao chép và lưu, để kiểm tra và sử dụng thư viện trong chiến lược.

img

Địa chỉ sao chép của thư viện vẽ phiên bản Javascript:https://www.fmz.com/strategy/27293Địa chỉ sao chép của thư viện vẽ phiên bả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) // You can draw two lines at the samw time, "Last" is the name of the line
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

Cài đặt tham số chiến lược

Dưới Edit Strategy, có các cài đặt tham số chiến lược, tương đương với các biến toàn cầu của chiến lược, và có thể được truy cập ở bất kỳ vị trí nào trong mã. Các tham số chiến lược có thể được sửa đổi trên trang bot, và chúng sẽ có giá trị sau khi khởi động lại. Do đó, một số biến có thể được đặt vào các tham số, và các tham số có thể được sửa đổi mà không cần sửa đổi chiến lược.
img

  • Tên biến: cụ thể là số, chuỗi và combox vv trong hình trên,có thể được sử dụng trực tiếp trong nhóm chiến lược.
  • Mô tả: tên của một tham số trên giao diện chiến lược, thuận tiện hơn cho người dùng để hiểu ý nghĩa của tham số.
  • Nhận xét: lời giải thích chi tiết về một tham số, sẽ được hiển thị tương ứng khi chuột được đặt trên tham số.
  • Loại: loại của một tham số, sẽ được giới thiệu chi tiết sau.
  • Chế độ mặc định: mặc định của một tham số.

Nó rất dễ dàng để hiểu và kiểu chuỗi và kiểu số. đó là các loại được sử dụng rất phổ biến. Hộp combo sẽ hiển thị các tùy chọn trong hộp trên giao diện tham số. Ví dụ, bạn có thể đặt tham số SYMBOL nhưBTC|USDT|ETHtrong hộp combo; nếu bạn chọn USDT trong hộp trên trang, giá trị SYMBOL trong chiến lược là chỉ số USDT 1.

Có nhiều thông số cho cài đặt; tham khảo:https://www.fmz.com/api.

Chiến lược Backtest

Khi định lượng của một chiến lược được hoàn thành, bạn có thể kiểm tra nó bằng dữ liệu lịch sử, để kiểm tra tình hình lợi nhuận của chiến lược trong ngày lịch sử. Tất nhiên, kết quả backtest chỉ để tham khảo. Nền tảng FMZ Quant hỗ trợ các backtests của cryptocurrency spot và tương lai, BitMEX hợp đồng vĩnh cửu, tương lai hàng hóa, trong đó chỉ hỗ trợ tiền điện tử chính thống. Các backtest Javascript được chạy trên trình duyệt; các backtest Python là trên docker, và nền tảng của chúng tôi cung cấp các dockers công cộng cho người dùng.

Cơ chế Baktest

Cơ chế kiểm tra ngược trên thanh dựa trên đường K, nghĩa là mỗi đường K sẽ tạo ra một điểm trong thời gian để kiểm tra ngược. Vào thời điểm đó, bạn có thể có được thông tin bao gồm giá mở, đóng, giá cao nhất và giá thấp nhất và khối lượng giao dịch của đường K hiện tại, cũng như thông tin đường K lịch sử trước thời điểm đó. Khuyết điểm của cơ chế này rất rõ ràng: chỉ có một lần mua có thể được tạo ra trên một đường K; thường là giá được đề cập là giá đóng của đường K. Ngoài ra, một đường K chỉ có thể có được bốn giá, cụ thể là giá đóng, mở, giá cao nhất và giá thấp nhất; thông tin, bao gồm cách thay đổi giá trong một đường K và liệu giá cao nhất hoặc giá thấp nhất thay đổi trước, không thể có được. Hãy lấy thử nghiệm đường K một giờ làm ví dụ. Thông tin chắc chắn được thu thập trong vài giây, và các lệnh sẽ được thực hiện trong cơ chế giao dịch ngược đường K sau khi kết thúc và lợi thế của nó không dễ hiểu và nhanh chóng.

Các backtest trên FMZ có hai loại, cụ thể là các backtest mức mô phỏng và các backtest mức thị trường thực tế. Các backtest mức mô phỏng có thể tạo ra các tick mô phỏng theo các giai đoạn đường K dưới lớp, và mỗi giai đoạn đường K dưới lớp sẽ tạo ra 14 điểm thời gian backtest.Tuy nhiên, các thử nghiệm backtest thị trường thực sẽ thực sự thu thập tick, mỗi vài giây, và bây giờ nó hỗ trợ độ sâu thực tế (bao gồm 20 cấp độ), và thực tế thực hiện thương mại bởi tarde.Khối lượng ngày là khá lớn, và tốc độ backtest là rất chậm, do đó, backtest không thể chạy trong một thời gian dài. cơ chế FMZ backtest có thể nhận ra nhiều giao dịch của khởi động trên một K-line, để ngăn chặn tình huống mà giao dịch chỉ có thể được thực hiện bởi giá đóng, và cũng ngày càng nhắm mục tiêu và chăm sóc tốc độ backtest.https://www.fmz.com/bbs-topic/9126.

Khung của backtest và bot là giống nhau, cả hai là một vòng lặp vô hạn. Bởi vì backtest là để nhảy đến các điểm backtest khác nhau, backtest có thể được chạy mà không cần sử dụng Sleep, và nó sẽ tự động nhảy đến thời điểm tiếp theo khi một vòng lặp kết thúc. Tuy nhiên, Python, do cơ chế chương trình, cần một hạn chếSleep(10), để tránh bị mắc kẹt.

Khớp với Backtest

Động cơ backtest sẽ phù hợp với giá lệnh đặt bởi người dùng và giá thị trường tại thời điểm backtest. Nếu giá mua cao hơn giá bán, giá bán sẽ được thực hiện. Nếu giao dịch không thể được thực hiện, một lệnh đang chờ sẽ được tạo ra. Trượt cần được thêm để đảm bảo giao dịch. Nếu vị trí không thể mở hoặc đóng trong thời gian backtest, hãy kiểm tra xem vị trí có bị đóng băng do các lệnh chưa hoàn thành hay không.

Cài đặt trang backtest

img

  • 1.chọn trang của Backtest, ở bên trái là trang Edit Strategy;
  • 2. thời gian bắt đầu và thời gian kết thúc của backtest; đối với dữ liệu có thể không đầy đủ, backtest có thể bắt đầu trực tiếp từ thời điểm dữ liệu tồn tại;
  • 3.thời gian mặc định của backtestingGetRecords()chức năng; bạn cũng có thể chỉ định một tham số thời gian trong mã;
  • 4.chọn cơ chế backtest;
  • 5. hiển thị hoặc ẩn nhiều cài đặt backtest;
  • 6.các mục nhật ký tối đa, các mục nhật ký lợi nhuận và các mục nhật ký biểu đồ, để ngăn chặn trình duyệt bị hỏng do số lượng dữ liệu khổng lồ;
  • 7. thời gian được tạo ra bởi tick dưới lớp theo đường K;
  • 8.điểm trượt;
  • 9. dung nạp lỗi, sẽ mô phỏng tình huống khi yêu cầu API là sai, và kiểm tra khả năng dung nạp lỗi của chiến lược;
  • 10.có nên vẽ biểu đồ thị trường không; nếu sử dụng chức năng chỉ số TA trong bài kiểm tra sau, chức năng sẽ tự động hiển thị trong biểu đồ, và mua và bán cũng sẽ được đánh dấu;
  • 11.Định lệ phí dịch vụ;
  • 12.các nền tảng bổ sung - cặp giao dịch & tài sản;
  • 13. cài đặt tham số backtest; nếu các tham số là số và cũng hỗ trợ tối ưu hóa một phím, các tham số sẽ tự động đi qua trong một phạm vi nhất định trong backtest.

Sự khác biệt giữa Bot & Backtest

  • 1.các báo giá thị trường duy nhất hợp lệ trong backtest chỉ từ GetTicker và GetRecords; những người khác như GetDepth và GetTrades không thực (kích thước dữ liệu rất lớn, và mặc dù backtest trên thị trường thực hiện hỗ trợ dữ liệu đã có, nó chỉ hỗ trợ dữ liệu mới nhất);
  • 2.các nền tảng được thêm vào trong backtest là tất cả các tài khoản tách biệt; quyền chuyển đổi các cặp giao dịch không được hỗ trợ; do đó, bạn không thể vận hành hai cặp giao dịch trong một tài khoản;
  • 3.netwrok yêu cầu không thể được sử dụng trong backtest;
  • 4.IOkhông thể sử dụng mở rộng trong backtest và chỉ có thể vận hành các API cơ bản;
  • 5.chỉ có dữ liệu tiêu chuẩn có thể được thu thập trong backtest, và dữ liệu, như Info liên quan đến bot không tồn tại;
  • 6.nghiễu hành có thể không được thực hiện trong backtest, và chú ý đến tình hình các đơn đặt hàng bị đóng băng;
  • 7.inkiểm tra lại các hợp đồng tương lai hàng hóa, trật tự thị trường không được hỗ trợ.

Chiến lược Chế độ chấp nhận lỗi & Những sai lầm phổ biến

Như chúng tôi đã đề cập trước đó, Sử dụng một giao diện API trong bot có thể không truy cập và trở lạinull; nếu bạn vẫn sử dụng dữ liệu của nó, một lỗi sẽ được báo cáo và bot sẽ dừng lại.

Những cách phổ biến để chấp nhận lỗi lầm

Nguyên nhân phổ biến:

  • Lỗi truy cập mạng API; thời gian hết truy cập giao diện trả về nunll và sẽ báo cáo lỗi.

  • Lỗi giới hạn nền tảng, chẳng hạn như giới hạn ip, độ chính xác lệnh, tần suất truy cập, lỗi tham số, thiếu tài sản, thất bại giao dịch thị trường, hủy lệnh được thực hiện, v.v.; chi tiết có thể được truy vấn trong tài liệu API theo các mã sai.

  • Lỗi dữ liệu trả về nền tảng; nó xảy ra đôi khi, chẳng hạn như trả về độ sâu không, thông tin tài khoản bị trì hoãn và trạng thái đặt hàng bị trì hoãn, v.v.

  • Lỗi logic của chương trình.

Trước khi bạn sử dụng dữ liệu được trả về của API, bạn nên đánh giá liệu dữ liệu có không, và các phương pháp phổ biến được giới thiệu như sau:

//1.judge the data is null and handle 
var ticker = exchange.GetTicker();
while(ticker == null){
     Log('ticker obtain error');
     ticker = exchange.GetTicker();
 }
 Log(ticker.Last);
 // 2. judge the data is not null, and use 
 var ticker = exchange.GetTicker();
 if(!ticker){
     Log(ticker.Last);
 }
 // 3.retry _C() function 
 var ticker = _C(exchange.GetTicker);
 Log(ticker.Last);
 // 4.try cache fault tolerance
 try{
     var ticker = exchange.GetTicker();
     Log(ticker.Last);
 }
 catch(err){
     Log('ticker obtain error');
 } 

Nếu bạn muốn có được thông tin về lỗi, bạn có thể sử dụngGetLastError(), và các chuỗi thông tin lỗi lần cuối sẽ được trả về, và các lỗi có thể được xử lý bởi sự khác biệt.

Câu hỏi thường gặp

Tóm tắt lỗi phổ biến trong các bài đăng trên cùng của diễn đàn:https://www.fmz.com/bbs-topic/9158Ở đây chúng tôi giới thiệu nó một cách ngắn gọn; bạn có thể sử dụng ctrl + F để tìm kiếm, khi bạn có vấn đề.

Làm thế nào để triển khai docker?

Có một giới thiệu chi tiết về nó trong phần thêm một docker.

Tôi có thể nhờ ai đó viết chiến lược cho tôi không?

trênhttps://www.fmz.com/markets, có một số người cung cấp dịch vụ viết chiến lược cho người khác, hoặc bạn có thể hỏi trong các nhóm trò chuyện; lưu ý rằng các dịch vụ như vậy sẽ được liên hệ bởi chính bạn, và bạn nên nhận thức được rằng rủi ro cũng sẽ được chịu bởi chính bạn.

Tất cả các giao diện nhắc thời gian hết khi truy cập

nó đề cập đến thời gian hết của giao diện nền tảng được truy cập; nếu thời gian hết xảy ra thỉnh thoảng, nó không phải là một vấn đề; nếu thời gian hết được yêu cầu mọi lúc, điều đó có nghĩa là không thể truy cập tất cả các mạng và cần một máy chủ ở nước ngoài.

ERR_INVALID_POSITION

Nếu backtest báo cáo một lỗi, nó thường là một lỗi viết; khi bạn cố gắng đặt lệnh để đóng một vị trí, khi không có vị trí hoặc khối lượng vị trí không đủ, một lỗi sẽ được báo cáo.

Biểu tượng không được thiết lập

Không có hợp đồng được thiết lập trong mã, trong các thử nghiệm hậu quả của nền tảng tương lai.

BITMEX 429error,{error:{message:Rate limit exceeded retry in 1 seconds......}}

Tần số truy cập của giao diện nền tảng quá cao.

{status:6004,msg:timestampisoutofrange}

Thời gian của máy chủ vượt quá phạm vi thời gian cập nhật máy chủ và thời gian vượt quá không thể quá dài.

GetOrder ((455284455): Lỗi: ID đơn đặt hàng không hợp lệ hoặc đơn đặt hàng bị hủy.

Nếu lệnh của một nền tảng bị hủy bỏ, nền tảng sẽ không lưu trữ thông tin đặt hàng nữa, do đó thông tin không thể được lấy.

GetOrders: 400: {code:-1121,msg:Invalid symbol.}

Cặp giao dịch không hợp lệ; kiểm tra xem cài đặt cặp giao dịch có sai không.

Khởi khóa bí mật thất bại

Việc phân tích APIKEY thất bại. Nếu mật khẩu FMZ đã được sửa đổi sau khi APIKEY được cấu hình, hãy thử thêm một trang nền tảng trên FMZ và cấu hình lại nền tảng APIKEY.

Chữ ký không hợp lệ: thời gian nộp không hợp lệ hoặc định dạng thời gian không chính xác

đề nghị bạn sử dụng máy chủ Linux, hoặc cài đặt phần mềm đồng bộ hóa thời gian trên các hệ thống Windows nơi xảy ra vấn đề này.

Tại sao docker vẫn không thể truy cập API nền tảng khi một proxy toàn cầu được thiết lập?

Proxy toàn cầu không có cổng mạng proxy docker. Do vấn đề chậm trễ, tốt nhất là triển khai cổng docker của máy chủ nước ngoài.

Làm thế nào để lưu một chiến lược tại địa phương, không để tải nó lên FMZ?

Sử dụng Python, và bạn có thể nhập các tập tin địa phương, lưu chiến lược thường được viết bởi FMZ API như một tập tin và đặt nó vào đường dẫn thực thi trên máy chủ của riêng bạn, và bạn có thể trực tiếp đọc và thực thi nó.

#!python2.7

def run(runfile):
      with open(runfile,"r") as f:
            exec(f.read())
            
def main():
    run('my.py')

Làm thế nào để testnet của một nền tảng hoặc làm thế nào để thay đổi địa chỉ cơ sở API?

Sử dụng exchange.SetBase() để chuyển trực tiếp sang địa chỉ cơ sở API tương ứng. Ví dụ:

exchange.SetBase("https://www.okex.me")

Thêm nữa