trong 10 nhật ký cuối cùng và xóa phần còn lại
LogReset ((10)
}
```Python
def main():
LogReset(10)
void main() {
LogReset(10);
}
LogVacuum()
, sau khi gọiLogReset()
chức năng để xóa nhật ký, phục hồi không gian lưu trữ chiếm bởiSQLiteKhi xóa dữ liệu. Chức năng không trả về giá trị.
Lý do làSQLite
không lấy lại không gian chiếm đóng khi xóa dữ liệu, vì vậy bạn cần thực hiệnVACUUM
để dọn dẹp bảng và giải phóng không gian. Khi gọi chức năng này, hoạt động di chuyển tệp sẽ xảy ra với sự chậm trễ lớn.
Các chức năng giao diện thị trường chính:
Tên chức năng | Mô tả |
---|---|
GetTicker | Nhận dữ liệu trích dẫn |
GetRecords | Nhận dữ liệu K-line |
GetDepth | Nhận dữ liệu sổ đặt hàng (dữ liệu chiều sâu đặt hàng) |
GetTrades | Nhận các hồ sơ giao dịch mới nhất trên thị trường |
Các chức năng sau đây có thể được gọi thông quaexchange
hoặcexchanges[0]
đối tượng; ví dụ: các chức năng, nhưexchange.GetTicker();
hoặcexchanges[0].GetTicker();
, trả về giá thị trường của các cặp giao dịch hiện tại và đặt hợp đồng.
Mẹo quan trọng để gọi các hàm API với quyền truy cập mạng:Khi gọi bất kỳ hàm API nào truy cập vào giao diện nền tảng (chẳng hạn nhưexchange.GetTicker()
, exchange.Buy(Price, Amount)
, exchange.CancelOrder(Id)
, vv), sự thất bại của truy cập có lẽ là do nhiều lý do. do đó, chúng ta phải làm lỗi dung nạp xử lý cho các chức năng này gọi. ví dụ:exchange.GetTicker()
chức năng để thu thập dữ liệu thị trường có thể, do các vấn đề máy chủ nền tảng và các vấn đề truyền tải mạng, v.v.exchange.GetTicker()
chức năng lànull
Sau đó, giá trị trả về củaexchange.GetTicker()
phải được xử lý bằng cách xử lý dung nạp lỗi.
Dữ liệu được trả về bởiexchange.GetTicker()
chức năng trong mã sau được gán choticker
biến, và chúng ta cần phải đối phó với dung nạp lỗi trước khi sử dụngticker
variable.
function main() {
var ticker = exchange.GetTicker()
if(!ticker){
// Recall once, or use other processing logic
ticker = exchange.GetTicker()
}
}
def main():
ticker = exchange.GetTicker()
if not ticker:
ticker = exchange.GetTicker()
void main() {
auto ticker = exchange.GetTicker();
if(!ticker.Valid) {
ticker = exchange.GetTicker();
Log("Test");
}
}
Ngoài ra, để kiểm tra hiệu suất dung nạp lỗi của chiến lược, FMZ đã bổ sung mộtChế độ chịu lỗibacktest. Hệ thống backtest có thể ngẫu nhiên trả về một số cuộc gọi API sẽ xảy ra khi truy cập mạng theo các thông số được đặt, và trả về các giá trị trả về một số cuộc gọi thất bại. Bạn có thể nhanh chóng kiểm tra độ mạnh mẽ của chương trình trong bot.
Chuyển sang trang hệ thống backtest trên trang chỉnh sửa chiến lược, nhấp vàotam giác đảo ngượcđiều khiển thả xuống bên phải của nút
exchange.GetTicker()
Nhận được báo giá thị trường hiện tại của các cặp giao dịch và hợp đồng hiện tại, với giá trị lợi nhuận:Ticker
cấu trúc.
Trong hệ thống backtest,Ticker
dữ liệu được trả về bởiexchange.GetTicker()
chức năng, nơiHigh
vàLow
là các giá trị mô phỏng, lấy từ thời gian hiện tại của Tick
interface.
function main(){
var ticker = exchange.GetTicker()
/*
The platform interface may not be accessible due to network problems (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, ticker is null, when accessing ticker. When it is "High", it will cause an error; so when testing, ensure that you can access the platform interface
*/
Log("High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Volume:", ticker.Volume)
}
def main():
ticker = exchange.GetTicker()
Log("High:", ticker["High"], "Low:", ticker["Low"], "Sell:", ticker["Sell"], "Buy:", ticker["Buy"], "Last:", ticker["Last"], "Volume:", ticker["Volume"])
void main() {
auto ticker = exchange.GetTicker();
Log("High:", ticker.High, "Low:", ticker.Low, "Sell:", ticker.Sell, "Buy:", ticker.Buy, "Last:", ticker.Last, "Volume:", ticker.Volume);
}
Trong bot thực sự (không backtest),Info
thuộc tính trong giá trị trả về củaexchange.GetTicker()
hàm lưu trữ dữ liệu ban đầu được trả về khi giao diện được gọi.
exchange.GetDepth()
lấy dữ liệu sổ lệnh trao đổi của các cặp giao dịch và hợp đồng hiện tại.Depth
structure.
Depth
cấu trúc bao gồm hai mảng cấu trúc, cụ thể làAsks[]
vàBids[]
, Asks
vàBids
chứa các biến cấu trúc sau:
Loại dữ liệu | Tên biến | Mô tả |
---|---|---|
số | Giá cả | giá cả |
số | Số tiền | số tiền |
Ví dụ, nếu tôi muốn có được giá bán thứ hai hiện tại, tôi có thể viết mã như thế này:
function main(){
var depth = exchange.GetDepth()
/*
The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, depth is null. When accessing depth.Asks[1].Price, it will cause an error; so when testing, ensure that you can access the platform interface
*/
var price = depth.Asks[1].Price
Log("Sell 2 price is:", price)
}
def main():
depth = exchange.GetDepth()
price = depth["Asks"][1]["Price"]
Log("Sell 2 price is:", price)
void main() {
auto depth = exchange.GetDepth();
auto price = depth.Asks[1].Price;
Log("Sell 2 price is:", price);
}
exchange.GetTrades()
nhận được lịch sử giao dịch nền tảng (không phải của riêng bạn).Trade
Một số sàn giao dịch không hỗ trợ nó. Dữ liệu cụ thể được trả về phụ thuộc vào hồ sơ giao dịch trong phạm vi, theo hoàn cảnh cụ thể.
Dữ liệu được trả về là một mảng, trong đó trình tự thời gian của mỗi phần tử là giống như trình tự dữ liệu trả về củaexchange.GetRecords
hàm, nghĩa là, phần tử cuối cùng của mảng là dữ liệu gần nhất với thời gian hiện tại.
// In the simulated backtest, the data is empty; to have a trading history, there must be a real bot running
function main(){
var trades = exchange.GetTrades()
/*
The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, "trades" is null. When accessing trades[0].Id, it will cause an error; so when testing, ensure that you can access the platform interface
*/
Log("id:", trades[0].Id, "time:", trades[0].Time, "Price:", trades[0].Price, "Amount:", trades[0].Amount, "type:", trades[0].Type)
}
def main():
trades = exchange.GetTrades()
Log("id:", trades[0]["Id"], "time:", trades[0]["Time"], "Price:", trades[0]["Price"], "Amount:", trades[0]["Amount"], "type:", trades[0]["Type"])
void main() {
auto trades = exchange.GetTrades();
Log("id:", trades[0].Id, "time:", trades[0].Time, "Price:", trades[0].Price, "Amount:", trades[0].Amount, "type:", trades[0].Type);
}
exchange.GetRecords(Period)
trả về dữ liệu K-line. K-line thời gian được chỉ định khi tạo bot; nếu bạn chỉ định các thông số khiexchange.GetRecords()
Nếu không có tham số được chỉ định, dữ liệu K-line được trả về theo thời gian K-line được đặt trên các tham số bot hoặc thời gian K-line được đặt trên trang backtest.
ParameterPeriod
:
Period
chỉ có thể vượt qua các khoảng thời gian tiêu chuẩn được xác định ở trên, nhưng cũng có thể vượt qua số, trong đơn vị giây.Giá trị trả về củaexchange.GetRecords(Period)
chức năng:
Giá trị trả về là một mảng củaRecord
các cấu trúc, dữ liệu đường K được trả về sẽ được tích lũy theo thời gian, giới hạn trên của các thanh đường K tích lũy bị ảnh hưởng bởiexchange.SetMaxBarLencài đặt chức năng. giới hạn trên mặc định là 5000 thanh K-line khi không được thiết lập. Khi dữ liệu K-Line đạt đến giới hạn tích lũy thanh K-Line, nó sẽ được cập nhật bằng cách thêm thanh K-Line và xóa thanh K-Line sớm nhất (ví dụ như hàng đợi vào / ra). Một số sàn giao dịch không cung cấp giao diện K-line, sau đó docker thu thập dữ liệu ghi lại giao dịch thị trường trong thời gian thực để tạo ra K-line.
Số lượng thanh K-line lấy khiGetRecords
hàm được gọi ban đầu.
Đối vớiexchange.GetRecords(Period)
chức năng, bot và backtest củatiền điện tửcả hai hỗ trợ thời gian tùy chỉnh, và các tham sốPeriod
là số giây. Ví dụ:
function main() {
// Print K-line data with a K-line period of 120 seconds (2 minutes)
Log(exchange.GetRecords(60 * 2))
// Print K-line data with a K-line period of 5 minutes
Log(exchange.GetRecords(PERIOD_M5))
}
def main():
Log(exchange.GetRecords(60 * 2))
Log(exchange.GetRecords(PERIOD_M5))
void main() {
Log(exchange.GetRecords(60 * 2)[0]);
Log(exchange.GetRecords(PERIOD_M5)[0]);
}
Thiết lậpPeriod
tham số đến 5 là yêu cầu dữ liệu đường K với khoảng thời gian 5 giây.
NếuPeriod
tham số không được chia ngang bằng 60 (tức là khoảng thời gian đại diện là một khoảng thời gian không có sẵn phút), lớp dưới cùng của hệ thống sử dụng giao diện có liên quan củaGetTrades
để thu thập dữ liệu hồ sơ giao dịch và tổng hợp dữ liệu K-line cần thiết.
NếuPeriod
tham số được chia ngang bằng 60, sau đó dữ liệu đường K cần thiết được tổng hợp bằng cách sử dụng dữ liệu đường K tối thiểu 1 phút (sử dụng thời gian dài hơn để tổng hợp dữ liệu đường K cần thiết nếu có thể).
function main(){
var records = exchange.GetRecords(PERIOD_H1)
/*
The platform interface may not be accessible due to network reasons (even if the device's docker program can open the platform website, the API may not be accessible)
At this time, "records" is null. When accessing records[0].Time, it will cause an error; so when testing, ensure that you can access the platform interface
*/
Log("The first k-line data is, Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High)
Log("The second k-line data is, Time:", records[1].Time ,"Close:", records[1].Close)
Log("Current K-line (latest)", records[records.length-1], "Current K-line (latest)", records[records.length-2])
}
def main():
records = exchange.GetRecords(PERIOD_H1)
Log("The first k-line data is, Time:", records[0]["Time"], "Open:", records[0]["Open"], "High:", records[0]["High"])
Log("The second k-line data is, Time:", records[1]["Time"], "Close:", records[1]["Close"])
Log("Current K-line (latest)", records[-1], "Current K-line (latest)", records[-2])
void main() {
auto records = exchange.GetRecords(PERIOD_H1);
Log("The first k-line data is, Time:", records[0].Time, "Open:", records[0].Open, "High:", records[0].High);
Log("The second k-line data is, Time:", records[1].Time, "Close:", records[1].Close);
Log("Current K-line (latest)", records[records.size() - 1], "Current K-line (latest)", records[records.size() - 2]);
}
exchange.GetRecords()
hàm có hai điều kiện để thu thập dữ liệu đường K:
Sàn giao dịch cung cấp một giao diện dữ liệu đường K. Trong trường hợp này, dữ liệu thu được là dữ liệu được trao đổi trực tiếp.
Các sàn giao dịch không cung cấp một giao diện dữ liệu K-line. Chương trình FMZ docker có được các hồ sơ giao dịch mới nhất của sàn giao dịch mỗi khi các chương trình chiến lược gọiexchange.GetRecords()
, đó là, nó gọi làexchange.GetTrades()
chức năng để thu thập dữ liệu và tổng hợp dữ liệu đường K.
Các backtest ở cấp độ mô phỏng trong hệ thống cần thiết lậpKhoảng thời gian đường K cơ bản(khi hệ thống backtesting mô phỏng mức độ backtesting, dữ liệu đường K tương ứng được sử dụng để tạo dữ liệu tick theo tập hợpKhoảng thời gian đường K cơ bản); cần lưu ý rằng thời gian của dữ liệu K-line thu được trong chiến lược không thể ngắn hơnThời gian đường K cơ bảnBởi vì trong backtest cấp mô phỏng, dữ liệu đường K của mỗi giai đoạn được tổng hợp bởi dữ liệu đường K tương ứng với các giai đoạn đường K cơ bản trong hệ thống backtest.
Trongcpp
ngôn ngữ, nếu bạn cần xây dựng dữ liệu K-line của riêng bạn, có những ví dụ mã sau:
#include <sstream>
void main() {
Records r;
r.Valid = true;
for (auto i = 0; i < 10; i++) {
Record ele;
ele.Time = i * 100000;
ele.High = i * 10000;
ele.Low = i * 1000;
ele.Close = i * 100;
ele.Open = i * 10;
ele.Volume = i * 1;
r.push_back(ele);
}
// Output display: Records[10]
Log(r);
auto ma = TA.MA(r,10);
// Output display: [nan,nan,nan,nan,nan,nan,nan,nan,nan,450]
Log(ma);
}
Cácexchange.GetPeriod()
hàm trả về K-line thời gian đặt trên trang web nền tảng FMZ khi chạy các chiến lược trongbacktestvàbot. Giá trị trả về là một số nguyên trong đơn vị của giây. Giá trị trả về: loại số.
function main() {
// For example, in the backtest and bot, set the K-line period on the website page of FMZ platform to 1 hour
var period = exchange.GetPeriod()
Log("K-line period:", period / (60 * 60), "hour")
}
def main():
period = exchange.GetPeriod()
Log("K-line period:", period / (60 * 60), "hour")
void main() {
auto period = exchange.GetPeriod();
Log("K-line period:", period / (60 * 60.0), "hour");
}
Cácexchange.SetMaxBarLen(Len)
chức năng ảnh hưởng đến hai khía cạnh trong thời gian thực hiện chiến lược tiền điện tử:
function main() {
exchange.SetMaxBarLen(50)
var records = exchange.GetRecords()
Log(records.length, records)
}
def main():
exchange.SetMaxBarLen(50)
r = exchange.GetRecords()
Log(len(r), r)
void main() {
exchange.SetMaxBarLen(50);
auto r = exchange.GetRecords();
Log(r.size(), r[0]);
}
exchange.GetRawJSON()
trả về nội dung thô (dòng chuỗi) trả về bởi cuối cùngRESTyêu cầu, có thể được sử dụng để phân tích dữ liệu bởi chính bạn. Giá trị trả về: kiểu chuỗi, chỉ có giá trị trong môi trường giao dịch trực tiếp tiền điện tử. Backtest không hỗ trợ chức năng.
Chiến lược trongcpp
ngôn ngữ không hỗ trợ chức năng.
function main(){
exchange.GetAccount();
var obj = JSON.parse(exchange.GetRawJSON());
Log(obj);
}
import json
def main():
exchange.GetAccount()
obj = json.loads(exchange.GetRawJSON())
Log(obj)
void main() {
auto obj = exchange.GetAccount();
// C++ doe not support "GetRawJSON" function
Log(obj);
}
exchange.GetRate()
trả về tỷ giá hối đoái của đồng tiền hiện đang được sử dụng trong sàn giao dịch và đồng tiền định giá hiện đang được hiển thị, và giá trị trả về 1 cho thấy chuyển đổi tỷ giá hối đoái bị vô hiệu hóa. Giá trị trả về: kiểu số.
Lưu ý:
exchange.SetRate()
đã không được gọi để thiết lập tỷ giá hối đoái, giá trị tỷ giá hối đoái trả về bởiexchange.GetRate()
là 1 theo mặc định, nghĩa là chuyển đổi tỷ giá hối đoái hiện đang hiển thị chưa được trao đổi.exchange.SetRate()
đã được sử dụng để thiết lập giá trị tỷ giá hối đoái, chẳng hạn như:exchange.SetRate(7)
, sau đó tất cả thông tin giá của đối tượng trao đổi hiện tại đại diện cho tiền tệ lưu thông của nền tảng giao dịch, chẳng hạn như báo giá, chiều sâu, giá lệnh, v.v., sẽ được nhân với tỷ giá hối đoái 7 được thiết lập trước đó để chuyển đổi.exchange
tương ứng với một trao đổi với USD như là tiền tệ định giá, sau khi gọiexchange.SetRate(7)
, tất cả giá của bot sẽ được chuyển đổi sang giá gần CNY bằng cách nhân với 7.exchange.GetRate()
là 7.exchange.GetUSDCNY()
trả về tỷ giá hối đoái mới nhất của đô la Mỹ (nguồn dữ liệu được cung cấp bởiyahoo
Giá trị trả về: kiểu số.
Cácexchange.SetData(Key, Value)
chức năng được sử dụng để thiết lập dữ liệu được tải vào thời điểm chiến lược đang chạy, có thể là bất kỳ chỉ số kinh tế, dữ liệu ngành, chỉ số có liên quan, vv. Nó có thể được sử dụng để định lượng tất cả các thông tin định lượng cho các chiến lược giao dịch và cũng hỗ trợ sử dụng trong hệ thống backtest.
Phương pháp gọi củaexchange.SetData(Key, Value)
chức năng:
Viết dữ liệu trực tiếp vào chiến lược
Định dạng dữ liệu được yêu cầu nhưdata
biến trong ví dụ sau.
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
var data = [
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
exchange.SetData("test", data)
while(true) {
Log(exchange.GetData("test"))
Sleep(1000)
}
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''
def main():
data = [
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
exchange.SetData("test", data)
while True:
Log(exchange.GetData("test"))
Sleep(1000)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
void main() {
json data = R"([
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
])"_json;
exchange.SetData("test", data);
while(true) {
Log(exchange.GetData("test"));
Sleep(1000);
}
}
Khi chạy mã thử nghiệm trên, dữ liệu tương ứng sẽ được thu được tại thời điểm tương ứng, như được hiển thị trong hình:
Như chúng ta có thể thấy, thời gian tương ứng của dấu thời gian1579622400000
là2020-01-22 00: 00: 00
; khi chương trình chiến lược chạy sau thời gian này, trước khi dấu thời gian dữ liệu tiếp theo1579708800000
, tức là trước thời điểm2020-01-23 00: 00: 00
, gọi choexchange.GetData(Source)
Tất cả những gì nhận được là nội dung của[1579622400000, 123]
Khi chương trình tiếp tục chạy và thời gian thay đổi, lấy dữ liệu từng mảnh như thế này.
Yêu cầu dữ liệu thông qua các liên kết bên ngoài
Định dạng dữ liệu được yêu cầu
{
"schema":["time","data"],
"data":[
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
}
Ở đâu?schema
là định dạng dữ liệu của mỗi bản ghi trong phần chính của dữ liệu được tải, định dạng được cố định như["time", "data"]
, tương ứng vớidata
định dạng thuộc tính của dữ liệu một một.data
attribute lưu trữ cơ thể chính của dữ liệu, và mỗi mảnh dữ liệu được tạo thành từ dấu thời gian và nội dung dữ liệu ở cấp độ millisecond (nội dung dữ liệu có thể là bất kỳ dữ liệu được mã hóa JSON nào).
Chương trình dịch vụ cho thử nghiệm được viết bằngGo
ngôn ngữ:
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func Handle (w http.ResponseWriter, r *http.Request) {
defer func() {
fmt.Println("req:", *r)
ret := map[string]interface{}{
"schema": []string{"time","data"},
"data": []interface{}{
[]interface{}{1579536000000, "abc"},
[]interface{}{1579622400000, 123},
[]interface{}{1579708800000, map[string]interface{}{"price":123}},
[]interface{}{1579795200000, []interface{}{"abc", 123, map[string]interface{}{"price":123}}},
},
}
b, _ := json.Marshal(ret)
w.Write(b)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
Sau khi nhận được yêu cầu, chương trình sẽ trả lời dữ liệu:
{
"schema":["time","data"],
"data":[
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
}
Mã chiến lược thử nghiệm:
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
while(true) {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Sleep(1000)
}
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''
def main():
while True:
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Sleep(1000)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
void main() {
while(true) {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"));
Sleep(1000);
}
}
Cácexchange.GetData(Source)
chức năng được sử dụng để có được dữ liệu tải bởi cácexchange.SetData(Key, Value)
Các dữ liệu được thu được tại một thời điểm trong quá trình backtest, và dữ liệu được lưu trữ trong một phút trong quá trình giao dịch thực tế.
Nhận phương pháp gọi dữ liệu được ghi trực tiếp
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
function main() {
exchange.SetData("test", [[1579536000000, _D(1579536000000)], [1579622400000, _D(1579622400000)], [1579708800000, _D(1579708800000)]])
while(true) {
Log(exchange.GetData("test"))
Sleep(1000 * 60 * 60 * 24)
}
}
'''backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
'''
def main():
exchange.SetData("test", [[1579536000000, _D(1579536000000/1000)], [1579622400000, _D(1579622400000/1000)], [1579708800000, _D(1579708800000/1000)]])
while True:
Log(exchange.GetData("test"))
Sleep(1000 * 60 * 60 * 24)
/*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
void main() {
json arr = R"([[1579536000000, ""], [1579622400000, ""], [1579708800000, ""]])"_json;
arr[0][1] = _D(1579536000000);
arr[1][1] = _D(1579622400000);
arr[2][1] = _D(1579708800000);
exchange.SetData("test", arr);
while(true) {
Log(exchange.GetData("test"));
Sleep(1000 * 60 * 60 * 24);
}
}
Phương pháp gọi dữ liệu từ các liên kết bên ngoài
function main() {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"))
}
def main():
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"))
Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"))
void main() {
Log(exchange.GetData("http://xxx.xx.x.xx:9090/data"));
Log(exchange.GetData("https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json"));
}
Sử dụng dữ liệu cơ bản của trung tâm dữ liệu nền tảng
Sử dụngexchange.GetData(Source)
hàm để nhậnDữ liệu cơ bản.
Khi gọi choexchange.GetData(Source)
trong hệ thống backtest, khi sử dụng giao diện truy cập để yêu cầu dữ liệu, hệ thống backtest sẽ thêm các tham số
Các chức năng sau đây có thể được gọi thông quaexchange
hoặcexchanges[0]
ví dụ:exchange.Sell(100, 1);
chỉ ra lệnh tiếp theo là lệnh bán với giá 100 và số lượng 1 trên sàn giao dịch.
exchange.Buy(Price, Amount)
được sử dụng để đặt lệnh mua và trả về ID lệnh. Giá trị tham số:Price
là giá đặt hàng theo kiểu số, vàAmount
là số tiền đặt hàng theo kiểu số. Giá trị trả về: kiểu chuỗi hoặc kiểu số (loại cụ thể phụ thuộc vào loại trả về của mỗi nền tảng trao đổi).
Số đặt hàng được trả lại có thể được sử dụng để truy vấn thông tin đặt hàng và hủy đặt hàng.
function main() {
var id = exchange.Buy(100, 1);
Log("id:", id);
}
def main():
id = exchange.Buy(100, 1)
Log("id:", id)
void main() {
auto id = exchange.Buy(100, 1);
Log("id:", id);
}
Đơn đặt hàng tương lai
Khi đặt lệnh cho hợp đồng tương lai, chúng ta phải chú ý đến việc hướng giao dịch có được đặt đúng không. Nếu hướng giao dịch và chức năng giao dịch không phù hợp, sẽ báo cáo lỗi. Số lượng lệnh được đặt trên sàn giao dịch tương lai tiền điện tử là số lượng hợp đồng trừ khi được chỉ định khác. Ví dụ:
// The following is the wrong call
function main() {
exchange.SetContractType("quarter")
// Set short direction
exchange.SetDirection("sell")
// Place a buy order, and you will get an error, so you can only sell short
var id = exchange.Buy(50, 1)
// Set short direction
exchange.SetDirection("buy")
// Place a sell order, and you will get an error, so you can only buy long
var id2 = exchange.Sell(60, 1)
// Set close long position direction
exchange.SetDirection("closebuy")
// Place a buy order, and you will get an error, so you can only sell short
var id3 = exchange.Buy(-1, 1)
// Set close short position direction
exchange.SetDirection("closesell")
// Place a sell order, and you will get an error, so you can only buy long
var id4 = exchange.Sell(-1, 1)
}
# The following is the wrong call
def main():
exchange.SetContractType("quarter")
exchange.SetDirection("sell")
id = exchange.Buy(50, 1)
exchange.SetDirection("buy")
id2 = exchange.Sell(60, 1)
exchange.SetDirection("closebuy")
id3 = exchange.Buy(-1, 1)
exchange.SetDirection("closesell")
id4 = exchange.Sell(-1, 1)
// The following is the wrong call
void main() {
exchange.SetContractType("quarter");
exchange.SetDirection("sell");
auto id = exchange.Buy(50, 1);
exchange.SetDirection("buy");
auto id2 = exchange.Sell(60, 1);
exchange.SetDirection("closebuy");
auto id3 = exchange.Buy(-1, 1);
exchange.SetDirection("closesell");
auto id4 = exchange.Sell(-1, 1);
}
Thông báo lỗi:
direction is sell, invalid order type Buy
direction is buy, invalid order type Sell
direction is closebuy, invalid order type Buy
direction is closesell, invalid order type Sell
Trật tự thị trường
Lưu ý: Giao diện lệnh trao đổi được yêu cầu để hỗ trợ các lệnh thị trường (khi loại lệnh là lệnh mua, tham số số tiền đặt hàng là số tiền trong đồng tiền báo giá), và phương pháp lệnh thị trường của hợp đồng tương lai tiền điện tử được sử dụng để đặt lệnh, và đơn vị của tham số số lượng làSố lượng hợp đồngMột vài sàn giao dịch trực tiếp cho tiền kỹ thuật số không hỗ trợ giao diện lệnh thị trường.
// For example, trading pairs: ETH_BTC, bought in by market order
function main() {
// Buy a market order, and buy ETH coins equal to 0.1 BTC (quote currency)
exchange.Buy(-1, 0.1)
}
def main():
exchange.Buy(-1, 0.1)
void main() {
exchange.Buy(-1, 0.1);
}
exchange.Sell(Price, Amount)
đặt lệnh bán và trả về ID lệnh. Giá trị tham số:Price
là giá đặt hàng, kiểu số.Amount
là số tiền đặt hàng, loại số. Giá trị trả về: loại chuỗi hoặc loại số (loại cụ thể phụ thuộc vào loại trả về của mỗi sàn giao dịch).
Số đơn hàng được trả lại, có thể được sử dụng để truy vấn thông tin đơn hàng và hủy đơn hàng.
function main(){
var id = exchange.Sell(100, 1)
Log("id:", id)
}
def main():
id = exchange.Sell(100, 1)
Log("id:", id)
void main() {
auto id = exchange.Sell(100, 1);
Log("id:", id);
}
Đơn đặt hàng tương lai
Khi đặt đơn đặt hàng cho hợp đồng tương lai, bạn phải chú ý đến việc hướng giao dịch có được đặt đúng không. Nếu hướng giao dịch và chức năng giao dịch không phù hợp, sẽ báo cáo lỗi. Số tiền đặt hàng của nền tảng tương lai tiền điện tử là số hợp đồng trừ khi được chỉ định khác.
Các lệnh thị trường
Lưu ý: giao diện đặt hàng trên nền tảng được yêu cầu để hỗ trợ lệnh thị trường. (Khi loại lệnh là lệnh bán, tham số số tiền đặt hàng là số lượng coin hoạt động được bán), và tiền điện tử tương lai đặt lệnh theo hình thức lệnh thị trường, và đơn vị tham số số tiền đặt hàng làSố lượng hợp đồngMột vài sàn giao dịch tiền kỹ thuật số trong giao dịch thực không hỗ trợ giao diện lệnh thị trường.
// For example, trading pairs: ETH_BTC, sold out by market order
function main() {
// Note: Sell by a market order, and sell 0.2 ETH coins
exchange.Sell(-1, 0.2)
}
def main():
exchange.Sell(-1, 0.2)
void main() {
exchange.Sell(-1, 0.2);
}
exchange.CancelOrder(orderId)
, mục đích của chức năng này là hủy lệnh với Id. Giá trị tham số:Id
là số đơn đặt hàng, theo kiểu chuỗi hoặc kiểu số (loại cụ thể phụ thuộc vào loại trả về khi đặt đơn đặt hàng trên mỗi nền tảng); giá trị trả về: loại bool.
Trả về kết quả hoạt động;true
có nghĩa là yêu cầu hủy lệnh đã được gửi thành công;false
có nghĩa là yêu cầu hủy lệnh không gửi (giá trị trả về chỉ cho thấy liệu yêu cầu gửi có thành công hay không, vì vậy tốt nhất là gọiexchange.GetOrders()
để kiểm tra xem nền tảng có hủy lệnh hay không).
function main(){
var id = exchange.Sell(99999, 1)
exchange.CancelOrder(id)
}
def main():
id = exchange.Sell(99999, 1)
exchange.CancelOrder(id)
void main() {
auto id = exchange.Sell(99999, 1);
exchange.CancelOrder(id);
}
Chức năng API của FMZ, có thể tạo các chức năng đầu ra nhật ký, chẳng hạn nhưLog(...)
, exchange.Buy(Price, Amount)
vàexchange.CancelOrder(Id)
. Bạn có thể làm theo các tham số cần thiết với một số tham số đầu ra bổ sung, chẳng hạn nhưexchange.CancelOrder(orders[j].Id, orders[j])
Bằng cách này, nó là hủy bỏorders[j]
lệnh mà đi kèm với đầu ra của thông tin lệnh này, cụ thể làOrder
cấu trúc củaorders[j]
.
function main() {
Log("data1", "data2", "data3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...")
exchange.CancelOrder(id, "Incidental data1", data2, "...")
LogProfit(100, "Incidental data1", data2, "...")
}
def main():
Log("data1", "data2", "data3", "...")
data2 = 200
id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...")
exchange.CancelOrder(id, "Incidental data1", data2, "...")
LogProfit(100, "Incidental data1", data2, "...")
void main() {
Log("data1", "data2", "data3", "...");
int data2 = 200;
auto id = exchange.Sell(100000, 0.1, "Incidental data1", data2, "...");
exchange.CancelOrder(id, "Incidental data1", data2, "...");
LogProfit(100, "Incidental data1", data2, "...");
}
exchange.GetOrder(orderId)
Nhận chi tiết theo số thứ tự. Giá trị tham số:Id
là số thứ tự được lấy, vàId
là kiểu chuỗi hoặc số (loại cụ thể phụ thuộc vào loại trả về của mỗi sàn giao dịch).Order
cấu trúc.
(Không được hỗ trợ bởi một số sàn giao dịch)
Order
cấu trúcAvgPrice
chỉ ra giá thực hiện trung bình (một số sàn giao dịch không hỗ trợ trường này; đặt nó thành 0 nếu không hỗ trợ).function main(){
var id = exchange.Sell(1000, 1)
// The parameter id is the order number, you need to fill in the number of the order you want to query
var order = exchange.GetOrder(id)
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
order.DealAmount, "Status:", order.Status, "Type:", order.Type)
}
def main():
id = exchange.Sell(1000, 1)
order = exchange.GetOrder(id)
Log("Id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:",
order["DealAmount"], "Status:", order["Status"], "Type:", order["Type"])
void main() {
auto id = exchange.Sell(1000, 1);
auto order = exchange.GetOrder(id);
Log("Id:", order.Id, "Price:", order.Price, "Amount:", order.Amount, "DealAmount:",
order.DealAmount, "Status:", order.Status, "Type:", order.Type);
}
exchange.GetOrders()
Nhận tất cả các đơn đặt hàng chưa hoàn thành.Order
Mảng cấu trúc
Đối vớiOrder
cấu trúc, xin vui lòng tham khảoexchange.GetOrder()
Khi tài khoản được đại diện bởi đối tượng trao đổiexchange
không có lệnh chờ, gọiexchange.GetOrders()
để trả về một mảng trống, cụ thể là:[]
.
function main(){
exchange.Sell(1000, 1)
exchange.Sell(1000, 1)
var orders = exchange.GetOrders()
Log("Information for unfinished order 1, ID:", orders[0].Id, "Price:", orders[0].Price, "Amount:", orders[0].Amount,
"DealAmount:", orders[0].DealAmount, "type:", orders[0].Type)
Log("Information for unfinished order 2, ID:", orders[1].Id, "Price:", orders[1].Price, "Amount:", orders[1].Amount,
"DealAmount:", orders[1].DealAmount, "type:", orders[1].Type)
}
def main():
exchange.Sell(1000, 1)
exchange.Sell(1000, 1)
orders = exchange.GetOrders()
Log("Information for unfinished order 1, ID:", orders[0]["Id"], "Price:", orders[0]["Price"], "Amount:", orders[0]["Amount"],
"DealAmount:", orders[0]["DealAmount"], "type:", orders[0]["Type"])
Log("Information for unfinished order 2, ID:", orders[1]["Id"], "Price:", orders[1]["Price"], "Amount:", orders[1]["Amount"],
"DealAmount:", orders[1]["DealAmount"], "type:", orders[1]["Type"])
void main() {
exchange.Sell(1000, 1);
exchange.Sell(1000, 1);
auto orders = exchange.GetOrders();
Log("Information for unfinished order 1, ID:", orders[0].Id, "Price:", orders[0].Price, "Amount:", orders[0].Amount,
"DealAmount:", orders[0].DealAmount, "type:", orders[0].Type);
Log("Information for unfinished order 2, ID:", orders[1].Id, "Price:", orders[1].Price, "Amount:", orders[1].Amount,
"DealAmount:", orders[1].DealAmount, "type:", orders[1].Type);
}
Cácexchange.GetOrders()
chức năng nhận được thông tin thứ tự chưa hoàn thành của hiện tại được thiết lậpcặp giao dịchCần lưu ý rằng tương lai tiền điện tử có sự khác biệt giữa không chỉ các cặp giao dịch mà còn là mã hợp đồng.
// Test OKX contract tradings, to know whether "GetOrders" gets all unfinished contract orders
function main(){
// The next weekly buy order; the price of the order minus 50 guarantees no execution; pending orders
exchange.SetContractType("this_week")
exchange.SetDirection("buy")
var ticker = exchange.GetTicker()
Log(ticker)
exchange.Buy(ticker.Last - 50, 1)
// The next quarterly sell order; the price plus 50 guarantees that it will not be executed, and the pending order has been switched to a quarterly contract
exchange.SetContractType("quarter")
exchange.SetDirection("sell")
ticker = exchange.GetTicker()
Log(ticker)
exchange.Sell(ticker.Last + 50, 1)
// Get the unfinished orders
Log("orders", exchange.GetOrders())
}
def main():
exchange.SetContractType("this_week")
exchange.SetDirection("buy")
ticker = exchange.GetTicker()
Log(ticker)
exchange.Buy(ticker["Last"] - 50, 1)
exchange.SetContractType("quarter")
exchange.SetDirection("sell")
ticker = exchange.GetTicker()
Log(ticker)
exchange.Sell(ticker["Last"] + 50, 1)
Log("orders", exchange.GetOrders())
void main() {
exchange.SetContractType("this_week");
exchange.SetDirection("buy");
auto ticker = exchange.GetTicker();
Log(ticker);
exchange.Buy(ticker.Last - 50, 1);
exchange.SetContractType("quarter");
exchange.SetDirection("sell");
ticker = exchange.GetTicker();
Log(ticker);
exchange.Sell(ticker.Last + 50, 1);
Log("orders", exchange.GetOrders());
}
Thông tin đặt hàng chưa hoàn thành:
[{"Id":17116430886,"Amount":1,"Price":808.4,"DealAmount":0,"AvgPrice":0,"Status":0,"Type":1,"ContractType":"quarter"}]
Nó có thể được nhìn thấy rằng trong giao dịch tiền điện tử, các đơn đặt hàng nhận được bởiexchange.GetOrders()
chỉ là các đơn đặt hàng chưa hoàn thành của hợp đồng hiện tại.
exchange.SetPrecision(PricePrecision, AmountPrecision)
thiết lập độ chính xác thập phân của giá và số tiền lệnh biểu tượng; nó sẽ được cắt ngắn tự động sau khi thiết lập. Giá trị tham số:PricePrecision
là loại số, được sử dụng để kiểm soát số lượng chữ số thập phân trong dữ liệu giá;AmountPrecision
là loại số, được sử dụng để kiểm soát dấu chấm thập phân sau số tiền đặt hàng.PricePrecision
vàAmountPrecision
backtest không hỗ trợ chức năng, và độ chính xác số của backtest sẽ được xử lý tự động.
function main(){
// Set the decimal precision of the price to 2 digits, and set the precision of the quantity of the symbol order to 3 digits
exchange.SetPrecision(2, 3)
}
def main():
exchange.SetPrecision(2, 3)
void main() {
exchange.SetPrecision(2, 3);
}
exchange.SetRate(Rate)
thiết lập tỷ giá hối đoái của đồng tiền lưu thông trong sàn giao dịch. Giá trị tham số:Rate
là củanumber
Đánh giá trả về:number
type.
function main(){
Log(exchange.GetTicker())
// Set the exchange rate conversion
exchange.SetRate(7)
Log(exchange.GetTicker())
// Set to 1, without conversion
exchange.SetRate(1)
}
def main():
Log(exchange.GetTicker())
exchange.SetRate(7)
Log(exchange.GetTicker())
exchange.SetRate(1)
void main() {
Log(exchange.GetTicker());
exchange.SetRate(7);
Log(exchange.GetTicker());
exchange.SetRate(1);
}
Lưu ý:
Nếu bạn đã thiết lập giá trị tỷ giá bằng cách sử dụngexchange.SetRate(Rate)
, chẳng hạn như 7, sau đó, tất cả các thông tin giá, bao gồm cả giá thị trường hiện tại, chiều sâu và giá lệnh, của tiền tệ lưu thông đại diện cho hiện tạiexchange
đối tượng, sẽ được nhân với tỷ giá hối đoái được thiết lập của 7 để chuyển đổi.
Ví dụ,exchange
là tỷ giá hối đoái bằng đô la Mỹ.exchange.SetRate(7)
được gọi, tất cả các giá giao dịch thực tế sẽ được nhân 7 và chuyển đổi thành giá gần CNY.
exchange.IO("api", httpMethod, resource, params, raw)
, gọi các giao diện chức năng khác của trao đổi. Giá trị tham số:httpMehod
là kiểu chuỗi; nó điền vào kiểu yêu cầu, chẳng hạn nhưPOST
hoặcGET
. resource
là kiểu chuỗi, nó điền vào đường dẫn yêu cầu.params
là kiểu chuỗi, nó điền vào các tham số yêu cầu.raw
là tham số chuỗi JSON gốc và nó có thể bị bỏ qua.exchange.IO("api", httpMethod, resource, params, raw)
function call sẽ truy cập giao diện trao đổi. Khi xảy ra lỗi và cuộc gọi thất bại, nó trả về một giá trị null (chức năng với yêu cầu mạng, chẳng hạn nhưGetTicker()
vàGetAccount()
, vv, trả về giá trị null khi cuộc gọi thất bại). Chỉ giao dịch trực tiếp hỗ trợ gọiexchange.IO("api", ...)
function.
Đối với ví dụ về thứ tự lô OKX, sử dụng tham sốraw
để thông qua các thông số lệnh:
function main() {
var arrOrders = [
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
]
// Call exchange.IO to directly access the platform batch ordering interface
var ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", JSON.stringify(arrOrders))
Log(ret)
}
import json
def main():
arrOrders = [
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
]
ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", json.dumps(arrOrders))
Log(ret)
void main() {
json arrOrders = R"([
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"},
{"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"2","posSide":"long"}
])"_json;
auto ret = exchange.IO("api", "POST", "/api/v5/trade/batch-orders", "", arrOrders.dump());
Log(ret);
}
Để sử dụng chức năng này, bạn cần phải đi đến trao đổi để hiểuAPI
giao diện của trao đổi để mở rộng các chức năng mà FMZ đã không thêm (bạn không phải lo lắng về quá trình mã hóa tham số, chữ ký và xác minh khi bạn gửi mộtPOST
FMZ đã xử lý hoàn toàn ở lớp dưới, vì vậy bạn chỉ cần điền vào các thông số tương ứng).
Lưu ý:
Nếu giá trị khóa trongparams
tham số (tức là, các tham số yêu cầu HTTP) là một chuỗi, nó cần phải được bọc với dấu ngoặc kép đơn (biểu tượng'
) ở cả hai bên của giá trị tham số.
Ví dụ:bitfinex
exchange.
var amount = 1
var price = 10
var basecurrency = "ltc"
function main () {
// Notice that amount.toString() and price.toString() both have a ' character on the left and right
var message = "symbol=" + basecurrency + "&amount='" + amount.toString() + "'&price='" + price.toString() + "'&side=buy" + "&type=limit"
var id = exchange.IO("api", "POST", "/v1/order/new", message)
}
amount = 1
price = 10
basecurrency = "ltc"
def main():
message = "symbol=" + basecurrency + "&amount='" + str(amount) + "'&price='" + str(price) + "'&side=buy" + "&type=limit"
id = exchange.IO("api", "POST", "/v1/order/new", message)
void main() {
auto amount = 1.0;
auto price = 10.0;
auto basecurrency = "ltc";
string message = format("symbol=%s&amount=\"%.1f\"&price=\"%.1f\"&side=buy&type=limit", basecurrency, amount, price);
auto id = exchange.IO("api", "POST", "/v1/order/new", message);
}
Ví dụ về truy cậpOKX
giao diện:
function main(){
var ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
Log(ret)
}
def main():
ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT")
Log(ret)
void main() {
auto ret = exchange.IO("api", "GET", "/api/v5/trade/orders-pending", "instType=SPOT");
Log(ret);
}
Dữ liệu được trả về trong quá trình thử nghiệm:
{"code":"0","data":[],"msg":""}
Các thiết lập khác củaexchange.IO
chức năng:
Chuyển đổi các cặp giao dịch của sàn giao dịch hiện tại
exchange.IO("currency", "ETH_BTC")
function main() {
// For example, set the current trading pair of the exchange object on the bot to BTC_USDT, and print the current trading pair market
Log(exchange.GetTicker())
// Switch trading pair to LTC_BTC
exchange.IO("currency", "LTC_BTC")
Log(exchange.GetTicker())
}
def main():
Log(exchange.GetTicker())
exchange.IO("currency", "LTC_BTC")
Log(exchange.GetTicker())
void main() {
Log(exchange.GetTicker());
exchange.IO("currency", "LTC_BTC");
Log(exchange.GetTicker());
}
Bằng cách này,các cặp giao dịchcấu hìnhkhi bot được thêm vàohoặcbacktest được chạysẽ được chuyển qua các mã.
Lưu ý:
ETH_BTC
, mà chỉ có thể được chuyển sangLTC_BTC
, khôngLTC_USDT
.websocket
chế độ giao thức được chuyển đổi trên các đối tượng trao đổi giao ngay Huobi, bạn không thể sử dụngexchange.IO("currency", "XXX_YYY")
để chuyển đổi tiền tệ.exchange.SetCurrency(Symbol)
chức năng để chuyển đổi các cặp giao dịch, và sử dụngexchange.IO("currency","XXX_YYY")
phương pháp để duy trì tính tương thích.exchange.IO
chức năng chuyển đổi địa chỉ cơ sở API trao đổi (hợp đồng RESET; một số trao đổi không hỗ trợ điều đó).
Bây giờ việc sử dụngexchange.SetBase(Base)
chức năng đã được hỗ trợ để chuyển đổi địa chỉ cơ sở API trao đổi, và sử dụngexchange.IO("base","https://xxx.xxx.xxx")
phương pháp để duy trì tính tương thích.
Ví dụ: Khi đối tượng trao đổi được đóng gói, địa chỉ cơ sở mặc định làhttps://api.huobipro.com
, để chuyển sang:https://api.huobi.pro
, sử dụng mã sau.
function main () {
// exchanges[0] is the first exchange object added when the bot is added
exchanges[0].IO("base", "https://api.huobi.pro")
}
def main():
exchanges[0].IO("base", "https://api.huobi.pro")
void main() {
exchanges[0].IO("base", "https://api.huobi.pro");
}
Chuyển địa chỉ cơ sở trở lại:https://api.huobipro.com
.
function main () {
exchanges[0].IO("base", "https://api.huobipro.com")
}
def main():
exchanges[0].IO("base", "https://api.huobipro.com")