Type/to search
3
Follow
1504
Followers
Hướng dẫn cơ bản về cách viết chiến lược nền tảng định lượng FMZ (phải đọc)
Tutorials
Created 2019-08-13 17:47:27  Updated 2026-01-27 17:22:09
 33
 71696

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

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

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

Ghi chú về API

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

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

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

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

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

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

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

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

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

Nguồn tài nguyên

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

Công cụ gỡ lỗi

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

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

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

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

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

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

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

API của sàn giao dịch

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

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

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

img

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

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

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

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

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

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

GetTicker

Lấy thông tin về thị trường hiện tại, có lẽ là giao diện được sử dụng phổ biến nhất, có thể tìm thấy thông tin về giá giao dịch gần đây, giá mua và bán, khối lượng giao dịch gần đây, v.v.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}

function main() { var ticker = exchange.GetTicker() Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。 Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy) }

GetDepth

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

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

Ví dụ về việc sử dụng quyền truy cập sâu vào giao dịch:

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

GetRecords

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

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

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

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

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

Ví dụ về dòng K:

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

GetTrades

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

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

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

Nhận tài khoản GetAccount

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

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

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

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

Mua dưới mua

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

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

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

Một ví dụ về việc mua hàng khi đạt được mức giá tương ứng:

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

Bán đi bán lại

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

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

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

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

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

function main(){ while(true){ var amount = exchange.GetAccount().Stocks var ticker = exchange.GetTicker() var id = null if(5-amount>0.01){ id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2)) }else{ Log('Job completed') return //return the main function, bot will stop } Sleep(3000) //Sleep 3000ms if(id){ var status = exchange.GetOrder(id).Status if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。 exchange.CancelOrder(id) } } } }

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

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

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

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

CancelOrder

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

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

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

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

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

SetContractType Đặt hợp đồng

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

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

//OKEX期货 exchange.SetContractType("swap") // 设置为永续合约 exchange.SetContractType("this_week") // 设置为当周合约 exchange.SetContractType("next_week") // 设置为次周合约 exchange.SetContractType("quarter") // 设置为季度合约 //HuobiDM exchange.SetContractType("this_week") // 设置为当周合约 exchange.SetContractType("next_week") // 设置为次周合约 exchange.SetContractType("quarter") // 设置为季度合约 exchange.SetContractType("swap") // 设置为永续合约 //币安期货 exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续 exchange.SetContractType("quarter") // 设置为当季合约 exchange.SetContractType("next_quarter") // 设置为次季合约 //BitMEX exchange.SetContractType("XBTUSD") // 设置为永续合约 exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码 //GateIO exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。 //Deribit exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。

GetPosition nắm giữ

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

Loại dữ liệuTên biếnminh họa

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

function main(){ exchange.SetContractType("this_week"); var position = exchange.GetPosition(); if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错 Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:", position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType) } }

Tiền tương lai mở và đóng

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

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

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

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

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

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

Giao dịch tận dụng tiền kỹ thuật số

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

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

Các sàn hỗ trợ:

  • OKEX V3: Các cặp giao dịch theo mô hình tài khoản đòn bẩy khác với các cặp giao dịch thông thường, một số cặp giao dịch có thể không có.
  • Bitcoin: Các cặp giao dịch theo mô hình tài khoản đòn bẩy khác với các cặp giao dịch thông thường, một số cặp giao dịch có thể không có.
  • ZB: Tiền chỉ có thể chuyển vào QC, phân khúc giao dịch đòn bẩy, độc lập tài chính giữa các cặp giao dịch khác nhau, tức là số tiền QC dưới cặp giao dịch ETH_QC, không thể nhìn thấy trong BTC_QC
  • FCoin
  • Binance

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

Giao dịch tương lai hàng hóa và giao dịch tương lai tiền kỹ thuật số có sự khác biệt rất lớn. Đầu tiên, thời gian giao dịch của tương lai hàng hóa rất ngắn, giao dịch tiền kỹ thuật số 24h; thỏa thuận tương lai hàng hóa cũng không phải là REST API phổ biến; tần suất giao dịch và giới hạn số lượng giao dịch của tương lai hàng hóa, tiền kỹ thuật số rất thoải mái, v.v. Vì vậy, giao dịch tương lai hàng hóa có nhiều nơi cần chú ý đặc biệt, nên có kinh nghiệm vận hành thủ công phong phú.

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

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

Khung chính sách

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

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

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

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

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

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

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

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

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

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

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

function on_tick(symbol){ Log("symbol update") exchange.SetContractType(symbol) Log(exchange.GetTicker()) } function on_order(order){ Log("order update", order) } function main(){ while(true){ if(exchange.IO("status")){ //判断链接状态 exchange.IO("mode", 0) _C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。 _C(exchange.SetContractType, "rb888")//订阅rb while(true){ var e = exchange.IO("wait") if(e){ if(e.event == "tick"){ on_tick(e.Symbol) }else if(e.event == "order"){ on_order(e.Order) } } } }else{ Sleep(10*1000) } } }

Sự khác biệt giữa tương lai hàng hóa và tiền kỹ thuật số

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

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

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

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

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

Bắt đầu giao dịch

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

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

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

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

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

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

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

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

Giao diện dễ dàng

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

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

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

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

Log Log và WeChat

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

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

Tất cả các tệp nhật ký tồn tại trong cơ sở dữ liệu sqlit trên ổ đĩa trong thư mục của người quản lý, có thể được tải xuống và mở bằng phần mềm cơ sở dữ liệu, hoặc có thể được sao chép để phục hồi (tên cơ sở dữ liệu giống như id ổ đĩa).

LogProfit in thu nhập

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

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

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

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

var table = {type: 'table', title: '持仓信息', 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ủ đi.

Các tham số là số mili giây, nhưSleep(1000)Một giây để ngủ. Do hạn chế tần suất truy cập của tất cả các giao dịch, chiến lược chung là phải thêm thời gian ngủ vào vòng tròn chết.

_G Lưu dữ liệu

Sau khi khởi động lại ổ cứng, chương trình sẽ bắt đầu lại, và nếu muốn lưu lại một số thông tin lâu dài, bạn có thể sử dụng các tính năng này._GNó rất tiện dụng và có thể lưu các nội dung được sắp xếp theo chuỗi JSON._GChức năng được viết ở đây.onexit()Trong đó, mỗi khi dừng chiến lược, nó sẽ tự động lưu thông tin cần thiết.
Nếu bạn muốn lưu trữ nhiều dữ liệu định dạng hơn, bạn có thể sử dụng các công cụ khác._Chức năng G không có nhiều ứng dụng, 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

Để kiểm soát chính xác giá cả và số lượng khi đặt hàng, FMZ có chức năng _N được xây dựng để xác định các số ký hiệu nhỏ, chẳng hạn như_N(4.253,2)Kết quả là 4,25.

_C. Tự động thử lại

Các API của các sàn giao dịch không đảm bảo rằng mọi lần truy cập đều thành công, và các API của các sàn giao dịch không đảm bảo rằng mọi lần truy cập đều thành công._C là một hàm tự động thử lại. Nó sẽ gọi hàm được chỉ định cho đến khi nó trả về thành công (các hàm trả về null hoặc false sẽ thử lại), chẳng hạn như_C(exchange.GetTicker), khoảng thời gian thử lại mặc định là 3 giây, bạn có thể gọi hàm_CDelay để kiểm soát khoảng thời gian thử lại, ví dụ như_CDelay(1000), thay đổi hàm_C với khoảng thời gian thử lại là 1 giây, khuyến nghịGetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderTất cả đều được sử dụng với C_error để ngăn chặn sự cố truy cập gây ra sự gián đoạn của chương trình.

CancelOrderKhông thể sử dụng hàm _C, vì có nhiều lý do khiến việc rút đơn bị thất bại. Nếu một đơn đã giao, thì việc rút đơn sẽ trở lại thất bại, sử dụng hàm _C sẽ dẫn đến việc cố gắng lại liên tục.

_Chức năng C cũng có thể được truyền vào các tham số và đượ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) //传入参数 }

_D hàm ngày

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

_D(timestamp,fmt), thì sẽ chuyển mms thành một chuỗi thời gian, như_D(1565855310002)。fmt tham số là định dạng thời gian, mặc địnhyyyy-MM-dd hh:mm:ss

Hàm chỉ số TA

Đối với một số hàm chỉ số phổ biến, chẳng hạn như MA\MACD\KDJ\BOLL, các chỉ số được sử dụng thường xuyên, nền tảng FMZ được tích hợp trực tiếp, 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 hàm chỉ số, tốt nhất nên đánh giá chiều dài K. Khi chiều dài K trước đó không đáp ứng được chu kỳ cần thiết để tính toán, kết quả sẽ lànull。 Nếu chiều dài dòng K đầu vào là 100 và tính toán chu kỳ của MA là 10, thì 9 giá trị đầu tiên là null, sau đó được tính toán bình thường。

JavaScript cũng hỗ trợ full-talib, được hỗ trợ bởi các thư viện bên thứ ba, nhưtalib.CCI(records)。 tham khảo http://ta-lib.org/function.html 。 Python có thể tự cài đặt thư viện talib, không thể cài đặt đơn giản bằng cách sử dụng pip vì cần biên dịch, có thể tự tìm cách cài đặt。

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

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

Chức năng thường dùng của JavaScript

Dưới đây là một số hàm JavaScript thường được sử dụng trên máy tính.

  • Date.now()Quay trở lại khung giờ hiện tại
  • parseFloat()Chuyển chuỗi chữ cái thành số, ví dụ:parseFloat("123.21")
  • parseInt()Chuyển đổi chuỗi thành số nguyên
  • num.toString()Chuyển số thành chuỗi, số thành biến số
  • JSON.parse()Định dạng chuỗi Json, chẳng hạn nhưJSON.parse(exchange.GetRawJSON())
  • JavaScript có hàm Math library như sau:Math.max(),Math.abs()Các thao tác toán học thường được sử dụng, tham khảo: https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • Thư viện toán học của bên thứ ba JavaScript được FMZ trích dẫn, tham khảo: https://mathjs.org/
  • FMZ trích dẫn thư viện underscore JavaScript của bên thứ ba, được khuyến khích để dễ dàng sử dụng nhiều Js, tham khảo: https://underscorejs.org/

Thư viện mẫu

Có rất nhiều điều cần xem xét khi viết một chức năng chiến lược trên ổ cứng, chẳng hạn như mua một chức năng đơn giản như 5 đồng, chúng ta cần xem xét: có đủ số dư hiện tại không? giá đặt hàng là bao nhiêu? độ chính xác là bao nhiêu? không cần phải phân tách đơn đặt hàng để tránh va chạm vào thị trường? không hoàn thành đơn đặt hàng làm thế nào để xử lý? vv Các chi tiết. Trong các chiến lược khác nhau, các chức năng này là như nhau, có thể làm thành một mẫu.

Các thư viện giao dịch tiền tệ kỹ thuật số và các thư viện giao dịch hàng hóa tương lai được xây dựng theo mặc định và 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 quảng trường chiến lược tại https://www.fmz.com/square/20/1 . Sao chép và lưu các thư viện mẫu và chọn các thư viện để sử dụng khi tạo chiến lược của riêng bạn.

Các hàm mẫu JavaScript được sử dụng$Bắt đầu với Python.extBắt đầu.

Thư viện giao dịch tiền tệ kỹ thuật số

Mã nguồn: https://www.fmz.com/strategy/10989 , đã được tích hợp sẵn, không cần sao chép. Các phương pháp thực hiện các chức năng cụ thể có thể tham khảo trực tiếp mã nguồn.

Nhận tài khoản:

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

Quay lại đơn hàng:

$.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); // 取消第二个交易所所有的卖单

Phân tích:

$.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的是数组, 则直接进行比较

$.withdraw(e, currency, address, amount, fee, password) hàm rút tiền:

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

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

Thư viện giao dịch tương lai hàng hóa sử dụng ổn định, khuyến cáo sử dụng. Địa chỉ mã nguồn: https://www.fmz.com/strategy/12961 。 Đã được tích hợp sẵn, không cần sao chép.

Thư viện CTA

  • Đĩa cứng sẽ tự động lập bản đồ chỉ số cho dòng điện chính
  • Nó sẽ tự động xử lý chuyển nhượng
  • Đánh giá có thể chỉ định bản đồ ví dụ như rb000/rb888 là bản đồ giao dịch chỉ số rb vào chuỗi chính
  • Nó có thể được chuyển sang các hợp đồng khác, ví dụ như rb000/MA888 là nhìn vào đường K của chỉ số rb để giao dịch 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("金叉周期", cross, "当前持仓", mp); return 1 } else if (mp >= 0 && cross < -2) { Log("死叉周期", cross, "当前持仓", mp); return -1 } }); }

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

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ì chức năng bản vẽ nguyên bản khá phức tạp, sẽ được giới thiệu trong hướng dẫn tiếp theo, nên người mới sử dụng thư viện bản vẽ trực tiếp, bản vẽ đường nét rất đơn giản, bản vẽ đường nét K, v.v.

img

Javascript bản vẽ đồ họa thư viện sao chép địa chỉ: https://www.fmz.com/strategy/27293
Phản hồi thư viện lớp phác họa Python

Ví dụ:

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

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

Bên dưới chỉnh sửa chính sách có thiết lập tham số chính sách, tương đương với biến toàn cầu của chính sách, có thể 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 trên giao diện ổ cứng, có hiệu lực sau khi khởi động lại. Do đó, một số biến có thể được thiết lập làm tham số, cũng có thể thay đổi tham số mà không cần sửa đổi chính sách.
img

  • Tên biến: tức là số, chuỗi, combox trong biểu đồ trên, có thể được sử dụng trực tiếp trong nhóm chiến lược.
  • mô tả: Các tham số được đặt tên trong giao diện chính sách để giúp hiểu ý nghĩa của tham số.
  • Ghi chú: Giải thích chi tiết về tham số, mô tả sẽ được hiển thị khi chuột dừng lại trên tham số.
  • kiểu: Loại tham số này được mô tả chi tiết dưới đây.
  • Tiền địnhGiá trị mặc định của tham số này là:

Loại chuỗi và loại số dễ hiểu và cũng là loại được sử dụng nhiều nhất. Hộp kéo dưới sẽ hiển thị các hộp kéo dưới có thể chọn trong giao diện tham số, như giá trị tham số SYMBOL của hộp kéo dưới có thể được đặt làBTC|USDT|ETHNếu bạn chọn USDT trong mục kéo xuống của trang tham số, thì giá trị của SYMBOL trong chính sách là chỉ số 1 của USDT. Chọn tùy chọn là một ô có thể chọn, chọn true, nếu không là false.

Các tham số còn có thể được cài đặt nhiều hơn nữa, tham khảo https://www.fmz.com/bbs-topic/1306

Kiểm tra lại chiến lược

Sau khi hoàn thành việc định lượng một chiến lược, bạn có thể sử dụng dữ liệu lịch sử để kiểm tra chiến lược của mình và 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ả phản hồi chỉ dùng để tham khảo. Nền tảng định lượng FMZ hỗ trợ phản hồi tiền mặt, tương lai, hợp đồng thường trực BitMEX và tương lai hàng hóa của tiền kỹ thuật số, trong đó tiền kỹ thuật số chủ yếu hỗ trợ các loại chính thống.
Javascript phản hồi được thực hiện trong trình duyệt, Python phản hồi cần trên máy chủ, có thể sử dụng nền tảng cung cấp máy chủ công cộng. Mac phản hồi ngôn ngữ và nhiều tham số cần thiết để thiết lập, tham khảo tài liệu Mac ngôn ngữ.

Cơ chế phản hồi

Cơ chế đo lường onbar dựa trên K-line, nghĩa là mỗi K-line tạo ra một điểm thời gian đo lường, tại điểm thời gian này, thông tin như giá cao, thấp, và khối lượng giao dịch của K-line hiện tại có thể được lấy, cũng như thông tin K-line lịch sử trước thời điểm này. Nhược điểm của cơ chế này rất rõ ràng: trên một K-line, chỉ có thể tạo ra một giao dịch mua và bán, thường dựa trên giá đóng cửa của K-line. Và một K-line chỉ có thể nhận được bốn giá cao, thấp, và không có thông tin về việc giá trong một K-line thay đổi như thế nào, giá cao nhất xảy ra trước, giá thấp nhất xảy ra trước hoặc các thông tin khác.

FMZ nền tảng phản hồi phân giải phản hồi mô phỏng và phản hồi ở mức độ thực. Tiếp tục phản hồi mô phỏng sẽ tạo ra 14 điểm thời gian phản hồi trên mỗi chu kỳ K-line dưới, dựa trên các tick mô phỏng được tạo ra dựa trên chu kỳ K-line dưới.**Trong khi đó, mức độ của đĩa thật là những tick được thu thập thực sự, khoảng vài giây một lần, hiện tại hỗ trợ một phần độ sâu thực sự (có 20 file), giao dịch thực tế theo từng dòng.**Lượng dữ liệu rất lớn, tốc độ tra lại chậm, do đó không thể tra lại thời gian đặc biệt dài. Cơ chế tra lại của FMZ có thể giúp chiến lược giao dịch nhiều lần trên một đường K, tránh tình huống chỉ có thể thu hồi giao dịch, chính xác hơn và tính đến tốc độ tra lại.

Khung chính sách của quay lại giống như ổ đĩa, là một vòng lặp chết. Vì quay lại là nhảy vào các điểm quay lại khác nhau, tại thời điểm này có thể không sử dụng Sleep, và khi kết thúc một vòng quay sẽ tự động nhảy đến thời điểm tiếp theo.Sleep(10)Để tránh bị mắc kẹt.

Ảnh chụp lại

Động cơ kiểm tra lại sẽ dựa trên giá đặt hàng của người dùng và giá thầu tại thời điểm kiểm tra lại, nếu giá mua cao hơn bán một, để bán một giao dịch. Nếu không thể giao dịch, sẽ tạo ra danh sách treo. Để đảm bảo giao dịch cần phải tăng điểm trượt. Nếu không mở kho hoặc không mở ra khi kiểm tra lại, kiểm tra xem có lệnh chưa giao dịch gây ra đóng băng vị trí không.

Thiết lập trang phản hồi

img

    1. Lựa chọn trang tra cứu, bên trái là trang chỉnh sửa chính sách.
    1. Thời gian bắt đầu và kết thúc thu thập dữ liệu, do dữ liệu không đầy đủ, thu thập dữ liệu có thể bắt đầu từ thời gian có dữ liệu.
    1. Đánh giá lạiGetRecords()Tính chu kỳ mặc định của hàm, bạn cũng có thể chỉ định tham số chu kỳ trong mã.
    1. Lựa chọn cơ chế phản hồi
    1. Hiển thị hoặc ẩn các thiết lập phản hồi.
    1. Số lượng dữ liệu nhật ký tối đa, số lượng dữ liệu thu nhập, số lượng dữ liệu biểu đồ, v.v., để ngăn chặn quá nhiều dữ liệu dẫn đến máy duyệt bị ngắt.
    1. Tick gốc được tạo ra dựa trên chu kỳ K-line.
    1. Điểm giao dịch:
    1. Chấp nhận lỗi, mô phỏng các yêu cầu API bị lỗi, kiểm tra khả năng chấp nhận lỗi của chính sách.
    1. Có vẽ biểu tượng thị trường không, nếu sử dụng hàm chỉ số TA trong phản hồi, nó sẽ tự hiển thị trên biểu tượng và mua bán cũng sẽ được đánh dấu.
    1. Thiết lập phí xử lý
    1. Thêm sàn giao dịch - cặp giao dịch và tài sản.
    1. Thiết lập tham số phản hồi, nếu tham số là số cũng hỗ trợ tham số tối ưu hóa một phím, tự động đi qua tham số phản hồi theo một phạm vi nhất định.

Khác biệt của phản hồi với đĩa cứng

    1. Chỉ có GetTicker và GetRecords có hiệu quả trong việc tra lại, các dữ liệu khác như độ sâu và lịch sử giao dịch đều không thực sự ((Vì số lượng dữ liệu quá lớn, tra lại ở mức đĩa cứng hiện đã hỗ trợ các dữ liệu này, nhưng chỉ có dữ liệu gần đây).)
  • Các giao dịch được thêm vào là các tài khoản độc lập, hiện tại không hỗ trợ chuyển đổi cặp giao dịch. Do đó, không thể hoạt động hai cặp giao dịch trong một tài khoản.
    1. Không thể sử dụng yêu cầu mạng trong phản hồi.
    1. Trả lời không thể sử dụng mở rộng IO, chỉ có thể vận hành các API cơ bản nhất.
    1. Chỉ có thể lấy dữ liệu theo tiêu chuẩn, không có dữ liệu trên đĩa cứng như Info.
    1. Có thể không có giao dịch trong lần đánh giá lại, hãy chú ý đến việc đóng băng đơn đặt hàng.
    1. Đánh giá tương lai hàng hóa không hỗ trợ giá thị trường.

Chính sách chấp nhận lỗi và những sai lầm thường gặp

Như đã đề cập ở trên, việc truy cập vào một giao diện API trên ổ cứng có thể bị thất bại và quay trở lại.nullTrong trường hợp này, nếu bạn sử dụng dữ liệu trong đó, nó sẽ bị lỗi và khiến ổ cứng ngừng hoạt động, vì vậy bạn cần phải có một chiến lược dung nạp lỗi.

Phương pháp chấp nhận lỗi phổ biến

Những sai lầm phổ biến:

  • Lỗi truy cập mạng API, truy cập giao diện quá giờ sẽ trả về null, khi đó sử dụng sẽ báo lỗi.
  • Các lỗi hạn chế của sàn giao dịch, chẳng hạn như hạn chế ip, độ chính xác đặt hàng, tần số truy cập, lỗi tham số, tài sản không đủ, thị trường không thể giao dịch, hủy bỏ đơn đặt hàng đã hoàn thành, v.v.
  • Các giao dịch trả về dữ liệu sai, đôi khi xảy ra, chẳng hạn như trả về độ sâu trống, thông tin tài khoản bị trì hoãn, trạng thái lệnh bị trì hoãn.
  • Lỗi logic của chương trình

Trước khi sử dụng API để trả về dữ liệu, bạn cần phải đánh giá xem nó là null hay không. Dưới đây là các phương pháp được sử dụng thường xuyên trong tập trung:

//1.判断为null进行处理 var ticker = exchange.GetTicker(); while(ticker == null){ Log('ticker 获取出错'); ticker = exchange.GetTicker(); } Log(ticker.Last); // 2.判断不为null再进行引用 var ticker = exchange.GetTicker(); if(!ticker){ Log(ticker.Last); } // 3._C()函数重试 var ticker = _C(exchange.GetTicker); Log(ticker.Last); // 4. try catch容错 try{ var ticker = exchange.GetTicker(); Log(ticker.Last); } catch(err){ Log('ticker 获取出错'); }

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

FAQ

Có rất nhiều lỗi phổ biến được tóm tắt trong các bài đăng trên diễn đàn: https://www.fmz.com/bbs-topic/1427 。 Một số sẽ được tóm tắt ở đây, nếu bạn gặp vấn đề, bạn có thể tìm kiếm theo Ctrl+F dưới đây。

Làm thế nào để đặt người giám hộ?

Bạn có thể xem thêm chi tiết trong phần thêm người quản lý.

Có thể có một chiến lược sao chép không?

Một số người trên https://www.fmz.com/markets cung cấp dịch vụ viết lách hoặc tham khảo ý kiến trong nhóm, bạn cần liên hệ và chịu rủi ro.

Truy cập tất cả các giao diện báo lỗi

Có nghĩa là truy cập vào giao diện giao dịch bị trễ thời gian, nếu thỉnh thoảng xảy ra không phải là vấn đề, nếu liên tục nhắc nhở rằng mạng không thể truy cập, cần sử dụng máy chủ ở nước ngoài.

ERR_INVALID_POSITION lỗi

Hệ thống phản hồi báo cáo lỗi, thường lập trình lỗi cho chiến lược, cố gắng giảm giá khi không có hoặc không đủ số lượng nắm giữ, sẽ gây ra lỗi này.

symbol not set

Đánh giá giao dịch tương lai, không có hợp đồng trong mã, xem chức năng exchange.SetContractType

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

Giao diện giao dịch có tần suất truy cập quá cao.

{"status":6004,"msg":"timestamp is out of range"}

Máy chủ thời gian vượt quá phạm vi cần cập nhật thời gian máy chủ, không thể bị lệch quá lớn

GetOrder(455284455): Error: invalid order id or order cancelled.

Một số giao dịch đã hủy đơn đặt hàng, và giao dịch không duy trì thông tin về đơn đặt hàng và không thể truy cập được.

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

Gặp giao dịch không hợp lệ, kiểm tra xem có phải thiết lập cặp giao dịch sai không.

Secret key decrypt failed

Không thể giải mã API KEY, nếu đã thay đổi mật khẩu FMZ sau khi cài đặt APIKEY, hãy thử thêm trang giao dịch trên FMZ và cài đặt lại giao dịch APIKEY.

Signature not valid: Invalid submission time or incorrect time format [[Thời gian gửi không hợp lệ hoặc định dạng thời gian sai]

Chúng tôi khuyên bạn nê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 có vấn đề này.

Tại sao lại thiết lập một đại lý toàn cầu mà người quản lý lại không thể truy cập vào API của sàn giao dịch?

Đại diện toàn cầu không có cổng mạng của đại diện lưu trữ, vì vấn đề về độ trễ, nên lưu trữ trên máy chủ ở nước ngoài

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

Sử dụng Python có thể nhập các tệp cục bộ, lưu các chính sách được viết theo API của FMZ thành các tệp và đặt chúng dưới đường thực thi trên máy chủ của riêng bạn để đọc trực tiếp.

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

Cách sử dụng mạng thử nghiệm của sàn giao dịch hoặc thay đổi địa chỉ cơ sở API

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

exchange.SetBase("https://www.okex.me")
Related Recommendations
Comment
All comments (27)

    api

    3 years ago

    如何在本地实现策略运行呢?我写了一个简单的Log输出语句,并且按照文末的操作。
    第一步,先用一台笔记本作为服务器,运行托管者程序;
    第二步,写一个简单的Log输出信息的test.py程序(FMZ 的API接口函数);
    第三步,按文末那样,写个runfile,通过run.py调用test.py运行。 img

    4 years ago

    我买的网易云量化交易课程怎么没了,现在去哪里看

    5 years ago

    谢谢

    5 years ago

    many

    5 years ago

    hi

    5 years ago

    学习ing

    5 years ago

    有一个小的文字错误,GetAccount 获取账户 介绍中,FrozenStocks应该是冻结余额而不是可用余额吧

    5 years ago

    改了

    5 years ago

    有没有做BTB的实盘教程,

    a year ago

    大佬麻烦问下咱们有官方交流群吗?有时候遇到问题不知道该在哪提问

    5 years ago

    加首页微信,拉你入群

    5 years ago

    加我进群,我的实盘执行不起来

    a year ago

    getorder outtime 获取订单超时,okex的交易所,怎么办

    5 years ago

    再次获取

    5 years ago

    担保资产率获取不到吗,到0%会被强制平仓的担保资产率

    5 years ago

    原始信息里有,可以用GetRawJSON或者查看字段里的info信息

    5 years ago

    我是看1分钟k线图操作的,所以Python死循环的sleep time 可以设置为0.1s,也就是sleep(100)吗,我看你其中写过一个sleep(10),也就是0.1s不会超过huobi HM的API限制吗?

    6 years ago

    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")

    这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多

    6 years ago

    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")

    这儿我试了OKex的永续合约,如果设置成 sell,直接开空了,平不是平多

    6 years ago

    有些永续合约允许双向持仓的,需要设置平仓。我更新一下,原来只有bitmex

    6 years ago

    不错不错,还有管理回复。。我发现代码里好多拼写错误,哈哈

    6 years ago

    GetOrders 的代码里面有两个拼写错误。。。一个是 function写成了 fuction,另一个是for循环的条件里 ; 打成了 ,

    6 years ago

    嗯嗯,已改正,感谢指出错误

    6 years ago

    是我错了。。。
    exchange.Buy(-1, 0.5),交易对是ETH_BTC,市价单代表买入0.5BTC的ETH
    exchange.Buy(price, 0.5),如果是这种限价单,则代表用price的价格买入 0.5ETH

    6 years ago

    exchange.Buy(-1, 0.5),交易对是ETH_BTC,则代表市价买入0.5BTC的ETH

    这里应该是【代表市价买入0.5ETH】

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)