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')
}
}
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.
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
, GetOrders
vàGetOrder
để ngăn chặn sự gián đoạn chương trình do lỗi truy cập.
CancelOrder
khô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
}
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
.
Đố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ànull
Ví 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)
}
}
Ở đâ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())
;Math.max()
, Math.abs()
v.v.; tham chiếu:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;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
.
Đị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, "***")
Đố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
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)
}
}
Đố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.
Đị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)
}
}
Dưới
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|ETH
trong 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.
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ế 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(10)
, để tránh bị mắc kẹt.
Độ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.
GetRecords()
chức năng; bạn cũng có thể chỉ định một tham số thời gian trong mã;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.
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.
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")