dalam 10 log terakhir dan menghapus sisanya
LogReset ((10)
}
```Python
def main():
LogReset(10)
void main() {
LogReset(10);
}
LogVacuum()
, setelah meneleponLogReset()
fungsi untuk membersihkan log, memulihkan ruang penyimpanan yang diduduki olehSQLiteFungsi ini tidak memiliki nilai pengembalian.
Alasannya adalah bahwaSQLite
tidak merebut kembali ruang yang diduduki ketika menghapus data, sehingga Anda perlu melakukanVACUUM
untuk membersihkan tabel, dan membebaskan ruang. Ketika fungsi ini dipanggil, operasi pindahan file akan terjadi dengan penundaan yang besar. Disarankan untuk memanggilnya pada interval waktu yang tepat.
Fungsi utama antarmuka pasar:
Nama Fungsi | Deskripsi |
---|---|
GetTicker | Dapatkan data tanda kutip |
GetRecords | Dapatkan data K-line |
GetDepth | Dapatkan data buku pesanan (data kedalaman pesanan) |
GetTrades | Dapatkan catatan perdagangan terbaru di pasar |
Fungsi berikut dapat dipanggil melaluiexchange
atauexchanges[0]
objek; misalnya: fungsi, sepertiexchange.GetTicker();
atauexchanges[0].GetTicker();
, mengembalikan harga pasar dari pasangan perdagangan saat ini dan kontrak pengaturan.
Tips penting untuk memanggil fungsi API dengan akses jaringan:Saat memanggil fungsi API yang mengakses antarmuka platform (sepertiexchange.GetTicker()
, exchange.Buy(Price, Amount)
, exchange.CancelOrder(Id)
, dll), kegagalan akses mungkin disebabkan oleh berbagai alasan. oleh karena itu kita harus melakukan pemrosesan fault-tolerant untuk panggilan fungsi ini.exchange.GetTicker()
fungsi untuk memperoleh data pasar dapat, karena masalah server platform dan masalah transmisi jaringan, dll menyebabkan hasil bahwa nilai kembali dariexchange.GetTicker()
fungsi adalahnull
Kemudian, nilai kembali dariexchange.GetTicker()
harus ditangani dengan pemrosesan toleransi kesalahan.
Data yang dikembalikan olehexchange.GetTicker()
fungsi dalam kode berikut diberikan kepadaticker
variabel, dan kita perlu menangani toleransi kesalahan sebelum menggunakanticker
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");
}
}
Selain itu, untuk pengujian kinerja toleransi kesalahan strategi, FMZ secara khusus telah menambahkanmodus toleransi kesalahanbacktest. sistem backtest dapat secara acak mengembalikan beberapa panggilan API yang akan terjadi ketika jaringan diakses sesuai dengan parameter yang ditetapkan, dan mengembalikan nilai pengembalian beberapa panggilan yang gagal. Anda dapat dengan cepat menguji ketahanan program di bot.
Beralih ke halaman sistem backtest pada halaman editing strategi, kliksegitiga terbalikkontrol drop-down di sisi kanan tombol
exchange.GetTicker()
mendapatkan kutipan pasar saat ini dari pasangan perdagangan saat ini dan kontrak, dengan nilai pengembalian:Ticker
struktur.
Dalam sistem backtest,Ticker
data yang dikembalikan olehexchange.GetTicker()
fungsi, di manaHigh
danLow
adalah nilai simulasi, diambil dari waktu saat ini 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);
}
Dalam bot nyata (bukan backtest),Info
atribut dalam nilai kembali dariexchange.GetTicker()
fungsi menyimpan data asli yang dikembalikan ketika antarmuka dipanggil.
exchange.GetDepth()
mendapatkan data buku pesanan pertukaran dari pasangan perdagangan dan kontrak saat ini.Depth
structure.
Depth
struktur terdiri dari dua susunan struktur, yaituAsks[]
danBids[]
, Asks
danBids
mengandung variabel struktur berikut:
Jenis data | Nama variabel | Deskripsi |
---|---|---|
nomor | Harga | harga |
nomor | Jumlah | jumlah |
Misalnya, jika saya ingin mendapatkan harga jual kedua saat ini, saya bisa menulis kode seperti ini:
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()
mendapatkan riwayat perdagangan platform (bukan milik Anda).Trade
data yang dikembalikan tergantung pada catatan perdagangan dalam kisaran, sesuai dengan keadaan tertentu.
Data yang dikembalikan adalah array, di mana urutan waktu dari setiap elemen adalah sama dengan urutan data kembali dariexchange.GetRecords
fungsi, yaitu, elemen terakhir dari array adalah data terdekat dengan waktu saat ini.
// 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)
mengembalikan data K-line. Periode K-line ditentukan saat membuat bot; jika Anda menentukan parameter ketikaexchange.GetRecords()
jika fungsi dipanggil, data yang diperoleh akan menjadi data K-line yang sesuai dengan periode parameter. Jika tidak ada parameter yang ditentukan, data K-line dikembalikan sesuai dengan periode K-line yang ditetapkan pada parameter bot atau periode K-line yang ditetapkan pada halaman backtest.
ParameterPeriod
:
Period
hanya dapat melewati periode standar yang didefinisikan di atas, tetapi juga dapat melewati angka, dalam satuan detik.Nilai pengembalianexchange.GetRecords(Period)
Fungsi:
Nilai yang dikembalikan adalah array dariRecord
struktur, data K-line yang dikembalikan akan terkumpul dari waktu ke waktu, batas atas bar K-line terkumpul dipengaruhi olehexchange.SetMaxBarLensetting fungsi. Batas atas default adalah 5000 K-line bar ketika tidak ditetapkan. Ketika data K-Line mencapai batas akumulasi bar K-Line, akan diperbarui dengan menambahkan bar K-Line dan menghapus bar K-Line terdahulu (misalnya antrian masuk/keluar). Beberapa pertukaran tidak menyediakan antarmuka K-line, maka docker mengumpulkan data catatan transaksi pasar secara real time untuk menghasilkan K-line.
Jumlah batang K-line yang diambil ketikaGetRecords
fungsi awalnya dipanggil.
Untukexchange.GetRecords(Period)
fungsi, bot dan backtest daricryptocurrencybaik mendukung periode kustom, dan parameterPeriod
adalah jumlah detik. Misalnya:
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]);
}
PengaturanPeriod
parameter ke 5 adalah untuk meminta data K-line dengan periode 5 detik.
JikaPeriod
Parameter tidak dibagi rata dengan 60 (yaitu periode yang diwakili adalah periode menit yang tidak tersedia), lapisan bawah sistem menggunakan antarmuka yang relevan dariGetTrades
untuk memperoleh data catatan perdagangan dan mensintesis data K-line yang diperlukan.
JikaPeriod
parameter dibagi rata dengan 60, maka data K-line yang diperlukan disintesis dengan menggunakan minimal data K-line 1 menit (menggunakan periode yang lebih panjang untuk mensintesis data K-line yang diperlukan jika memungkinkan).
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()
Fungsi memiliki dua kondisi untuk mendapatkan data garis K:
Pertukaran menyediakan antarmuka data K-line. Dalam hal ini, data yang diperoleh adalah data yang dikembalikan langsung oleh pertukaran.
Pertukaran tidak menyediakan antarmuka data K-line. Program FMZ docker memperoleh catatan perdagangan terbaru dari pertukaran setiap kali program strategi memanggilexchange.GetRecords()
, yaitu, itu disebutexchange.GetTrades()
fungsi untuk mendapatkan data dan mensintesis data K-line.
Backtest tingkat simulasi dalam sistem perlu mengaturperiode garis K yang mendasarinya(ketika sistem backtesting mensimulasikan tingkat backtesting, data K-line yang sesuai digunakan untuk menghasilkan data tick sesuai dengan setperiode garis K yang mendasarinya); perlu dicatat bahwa periode data K-line yang diperoleh dalam strategi tidak dapat kurang dariperiode garis K yang mendasariKarena dalam backtest tingkat simulasi, data K-line dari setiap periode disintesis oleh data K-line yang sesuai dengan periode K-line yang mendasari dalam sistem backtest.
Di dalamcpp
bahasa, jika Anda perlu membangun data K-line Anda sendiri, ada contoh kode berikut:
#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);
}
Peraturanexchange.GetPeriod()
fungsi mengembalikan periode K-line yang ditetapkan pada halaman situs web platform FMZ ketika menjalankan strategi dibacktestdanbot. Nilai yang dikembalikan adalah bilangan bulat dalam satuan detik. Nilai yang dikembalikan: tipe numerik.
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");
}
Peraturanexchange.SetMaxBarLen(Len)
fungsi mempengaruhi dua aspek selama runtime dari strategi cryptocurrency:
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()
mengembalikan konten mentah (string) yang dikembalikan oleh yang terakhirRESTrequest, yang dapat digunakan untuk menganalisis data sendiri. Nilai yang dikembalikan: jenis string, hanya valid di lingkungan perdagangan langsung cryptocurrency. Backtest tidak mendukung fungsi.
Strategi dalamcpp
bahasa tidak mendukung fungsi.
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()
mengembalikan nilai tukar mata uang yang saat ini digunakan di bursa dan mata uang harga yang saat ini ditampilkan, dan nilai yang dikembalikan 1 menunjukkan bahwa konversi nilai tukar dinonaktifkan.
Catatan:
exchange.SetRate()
tidak dipanggil untuk menetapkan nilai tukar, nilai nilai tukar dikembalikan olehexchange.GetRate()
adalah 1 secara default, yaitu konversi nilai tukar yang saat ini ditampilkan belum ditukar.exchange.SetRate()
telah digunakan untuk menetapkan nilai nilai nilai tukar, seperti,exchange.SetRate(7)
, maka semua informasi harga dari objek pertukaran saat ini yang mewakili mata uang yang beredar di platform perdagangan, seperti penawaran, kedalaman, harga pesanan, dll, akan dikalikan dengan nilai tukar 7 yang ditetapkan sebelumnya untuk konversi.exchange
sesuai dengan pertukaran dengan USD sebagai mata uang penetapan harga, setelah panggilanexchange.SetRate(7)
, semua harga bot akan dikonversi ke harga yang dekat dengan CNY dengan mengalikan dengan 7.exchange.GetRate()
adalah 7.exchange.GetUSDCNY()
mengembalikan nilai tukar terbaru dari dolar AS (sumber data yang disediakan olehyahoo
Nilai yang dikembalikan: tipe numerik.
Peraturanexchange.SetData(Key, Value)
Fungsi ini digunakan untuk mengatur data yang dimuat pada saat strategi berjalan, yang bisa menjadi indikator ekonomi, data industri, indeks yang relevan, dll. Fungsi ini dapat digunakan untuk mengukur semua informasi yang dapat diukur untuk strategi perdagangan dan juga mendukung penggunaan sistem backtest.
Metode panggilan dariexchange.SetData(Key, Value)
Fungsi:
Tulis data langsung ke dalam strategi
Format data diperlukan sebagaidata
variabel dalam contoh berikut.
/*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);
}
}
Ketika kode uji di atas dijalankan, data yang sesuai akan diperoleh pada waktu yang sesuai, seperti yang ditunjukkan pada gambar:
Seperti yang bisa kita lihat, waktu yang sesuai dari timestamp1579622400000
adalah2020-01-22 00: 00: 00
; ketika program strategi berjalan setelah waktu ini, sebelum data timestamp berikutnya1579708800000
, yaitu sebelum waktu2020-01-23 00: 00: 00
, hubungiexchange.GetData(Source)
Semua yang diperoleh adalah isi dari[1579622400000, 123]
Saat program terus berjalan dan waktu berubah, dapatkan data potongan-potongan data seperti ini.
Minta data melalui tautan eksternal
Format data yang diminta
{
"schema":["time","data"],
"data":[
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
}
Di mana?schema
adalah format data dari setiap catatan dalam badan utama data yang dimuat, formatnya ditetapkan sebagai["time", "data"]
, yang sesuai dengandata
Atribut format data satu per satu.data
atribut menyimpan badan utama data, dan setiap potongan data terdiri dari timestamp tingkat milidetik dan konten data (konten data dapat menjadi data yang dikodekan JSON).
Program layanan untuk pengujian ditulis dalamGo
Bahasa:
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)
}
Setelah menerima permintaan, program menanggapi data:
{
"schema":["time","data"],
"data":[
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
}
Kode strategi uji:
/*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);
}
}
Peraturanexchange.GetData(Source)
fungsi digunakan untuk mendapatkan data yang dimuat olehexchange.SetData(Key, Value)
data yang diberikan oleh tautan eksternal, dapat digunakan dalam sistem backtest. data diperoleh pada satu waktu selama backtest, dan data disimpan dalam cache selama satu menit selama perdagangan yang sebenarnya.
Mendapatkan metode panggilan data yang ditulis secara langsung
/*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);
}
}
Metode panggilan data dari tautan eksternal
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"));
}
Menggunakan data dasar dari platform pusat data
Gunakanexchange.GetData(Source)
fungsi untuk mendapatkanData Dasar.
Saat meneleponexchange.GetData(Source)
fungsi, Anda dapat melewati parameter kedua untuk mengatur timeout cache dalam milidetik. Default adalah satu menit cache timeout di bot nyata. Dalam sistem backtest, ketika menggunakan antarmuka akses untuk meminta data, sistem backtest akan menambahkan parameter
Fungsi berikut dapat dipanggil melaluiexchange
atauexchanges[0]
contohnya:exchange.Sell(100, 1);
menunjukkan pesanan berikutnya adalah pesanan jual dengan harga 100 dan jumlah 1 di bursa.
exchange.Buy(Price, Amount)
digunakan untuk menempatkan pesanan beli dan mengembalikan ID order. Nilai parameter:Price
adalah harga pesanan dalam bentuk nomor, danAmount
adalah jumlah pesanan dalam jenis angka. Nilai yang dikembalikan: jenis string atau jenis numerik (jenis spesifik tergantung pada jenis pengembalian dari setiap platform pertukaran).
Nomor pesanan yang dikembalikan dapat digunakan untuk menanyakan informasi pesanan dan membatalkan pesanan.
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);
}
Perintah berjangka
Ketika menempatkan pesanan untuk berjangka, kita harus memperhatikan apakah arah perdagangan ditetapkan dengan benar. Jika arah perdagangan dan fungsi perdagangan tidak cocok, kesalahan akan dilaporkan. Jumlah pesanan yang ditempatkan di bursa berjangka cryptocurrency adalah jumlah kontrak kecuali ditentukan sebaliknya. Misalnya:
// 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);
}
Pesan kesalahan:
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
Peraturan pasar
Catatan: Antarmuka pesanan pertukaran diperlukan untuk mendukung pesanan pasar (ketika jenis pesanan adalah pesanan beli, parameter jumlah pesanan adalah jumlah dalam mata uang penawaran), dan metode pesanan pasar berjangka cryptocurrency digunakan untuk menempatkan pesanan, dan unit parameter kuantitas adalahJumlah kontrakBeberapa bursa perdagangan langsung untuk mata uang digital tidak mendukung antarmuka pesanan pasar.
// 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)
menempatkan pesanan jual dan mengembalikan ID pesanan. Nilai parameter:Price
adalah harga pesanan, jenis numerik.Amount
adalah jumlah pesanan, jenis numerik. Nilai yang dikembalikan: jenis string atau jenis numerik (jenis spesifik tergantung pada jenis pengembalian setiap pertukaran).
Nomor pesanan yang dikembalikan, yang dapat digunakan untuk menanyakan informasi pesanan dan membatalkan pesanan.
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);
}
Perintah berjangka
Saat menempatkan pesanan untuk berjangka, Anda harus memperhatikan apakah arah perdagangan ditetapkan dengan benar. Jika arah perdagangan dan fungsi perdagangan tidak cocok, kesalahan akan dilaporkan. Jumlah pesanan platform berjangka cryptocurrency adalah jumlah kontrak kecuali ditentukan sebaliknya.
Perintah pasar
Catatan: antarmuka penempatan pesanan platform diperlukan untuk mendukung pesanan pasar. (Ketika jenis pesanan adalah pesanan jual, parameter jumlah pesanan adalah jumlah koin operasi yang terjual), dan berjangka cryptocurrency menempatkan pesanan dengan bentuk pesanan pasar, dan unit parameter jumlah pesanan adalahJumlah kontrakBeberapa pertukaran mata uang digital dalam perdagangan nyata tidak mendukung antarmuka pesanan pasar.
// 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)
, tujuan dari fungsi ini adalah untuk membatalkan pesanan dengan Id. Nilai parameter:Id
adalah nomor pesanan, dalam jenis string atau tipe numerik (jenis spesifik tergantung pada jenis pengembalian ketika menempatkan pesanan pada setiap platform); nilai pengembalian: jenis bool.
Mengembalikan hasil operasi;true
berarti bahwa permintaan pembatalan pesanan telah berhasil dikirim;false
berarti bahwa permintaan perintah pembatalan gagal untuk mengirim (nilai kembali hanya menunjukkan apakah permintaan pengiriman berhasil atau tidak, jadi yang terbaik untuk memanggilexchange.GetOrders()
untuk memeriksa apakah platform membatalkan pesanan).
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);
}
Fungsi API FMZ, yang dapat menghasilkan fungsi log output, sepertiLog(...)
, exchange.Buy(Price, Amount)
danexchange.CancelOrder(Id)
. Anda dapat mengikuti parameter yang diperlukan dengan beberapa parameter output tambahan, sepertiexchange.CancelOrder(orders[j].Id, orders[j])
Dengan cara ini, itu membatalkanorders[j]
order yang disertai dengan output informasi order ini, yaituOrder
struktur dariorders[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)
mendapatkan detail pesanan sesuai dengan nomor pesanan.Id
adalah nomor deret yang akan diperoleh, danId
adalah jenis string atau numerik (jenis spesifik tergantung pada jenis pengembalian dari setiap pertukaran).Order
struktur.
(Tidak didukung oleh beberapa pertukaran)
Order
strukturAvgPrice
menunjukkan harga rata-rata yang dieksekusi (beberapa bursa tidak mendukung bidang ini; atur menjadi 0 jika mereka tidak mendukung).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()
mendapatkan semua pesanan yang belum selesai.Order
array struktur.
UntukOrder
struktur, silakan lihatexchange.GetOrder()
Ketika akun yang diwakili oleh objek pertukaranexchange
Tidak ada pesanan yang menunggu, hubungiexchange.GetOrders()
untuk mengembalikan array kosong, yaitu:[]
.
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);
}
Peraturanexchange.GetOrders()
Fungsi mendapatkan informasi pesanan yang belum selesai dari set saat inipasangan perdaganganHarus dicatat bahwa cryptocurrency berjangka memiliki perbedaan antara tidak hanya pasangan perdagangan tetapi juga kode kontrak.
// 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());
}
Informasi pesanan belum selesai yang diperoleh:
[{"Id":17116430886,"Amount":1,"Price":808.4,"DealAmount":0,"AvgPrice":0,"Status":0,"Type":1,"ContractType":"quarter"}]
Hal ini dapat dilihat bahwa dalam perdagangan cryptocurrency, pesanan yang diperoleh olehexchange.GetOrders()
hanya pesanan yang belum selesai dari kontrak yang saat ini ditetapkan.
exchange.SetPrecision(PricePrecision, AmountPrecision)
menetapkan presisi desimal harga dan jumlah urutan simbol; akan dipotong secara otomatis setelah pengaturan. Nilai parameter:PricePrecision
adalah tipe angka, digunakan untuk mengontrol jumlah tempat desimal dalam data harga;AmountPrecision
adalah tipe angka, digunakan untuk mengontrol titik desimal setelah jumlah pesanan.PricePrecision
danAmountPrecision
backtest tidak mendukung fungsi, dan keakuratan numerik backtest akan diproses secara otomatis.
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)
menetapkan nilai tukar mata uang yang beredar di bursa.Rate
adalah darinumber
Nilai pengembalian: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);
}
Catatan:
Jika Anda telah menetapkan nilai nilai nilai tukar dengan menggunakanexchange.SetRate(Rate)
, seperti 7, maka, semua informasi harga, termasuk harga pasar saat ini, kedalaman, dan harga pesanan, dari mata uang sirkulasi yang diwakili olehexchange
objek, akan dikalikan dengan nilai tukar yang ditetapkan 7 untuk konversi.
Sebagai contoh,exchange
adalah nilai tukar dalam dolar AS.exchange.SetRate(7)
disebut, semua harga perdagangan nyata akan dikalikan dengan 7 dan dikonversi ke harga yang dekat dengan CNY.
exchange.IO("api", httpMethod, resource, params, raw)
, memanggil antarmuka fungsional lain dari pertukaran. Nilai parameter:httpMehod
adalah jenis string; itu mengisi tipe permintaan, sepertiPOST
atauGET
. resource
adalah jenis string, itu mengisi jalur permintaan.params
adalah jenis string, itu mengisi parameter permintaan.raw
adalah parameter string JSON asli dan dapat dihilangkan.exchange.IO("api", httpMethod, resource, params, raw)
panggilan fungsi akan mengakses antarmuka pertukaran. Ketika terjadi kesalahan dan panggilan gagal, itu mengembalikan nilai nol (fungsi dengan permintaan jaringan, sepertiGetTicker()
danGetAccount()
, dll, mengembalikan nilai nol ketika panggilan gagal).exchange.IO("api", ...)
function.
Untuk contoh urutan batch OKX, gunakan parameterraw
untuk melewati parameter order:
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);
}
Untuk menggunakan fungsi ini, Anda perlu pergi ke pertukaran untuk memahamiAPI
antarmuka pertukaran untuk memperluas fungsi yang FMZ belum ditambahkan (Anda tidak perlu khawatir tentang proses enkripsi parameter, tanda tangan dan verifikasi ketika Anda mengirimkanPOST
FMZ telah diproses sepenuhnya di lapisan bawah, jadi Anda hanya perlu mengisi parameter yang sesuai).
Catatan:
Jika nilai kunci dalamparams
parameter (yaitu, parameter permintaan Http) adalah string, itu perlu dibungkus dengan tanda kutip tunggal (simbol'
) di kedua sisi nilai parameter.
Misalnya: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);
}
Contoh aksesOKX
antarmuka
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);
}
Data yang dikembalikan selama pengujian:
{"code":"0","data":[],"msg":""}
Pengaturan lain dariexchange.IO
Fungsi:
Ubah pasangan perdagangan dari bursa saat ini
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());
}
Dengan cara ini,Pasangan perdagangandikonfigurasiketika bot ditambahkanataubacktest dijalankanakan beralih melalui kode.
Catatan:
ETH_BTC
, yang hanya bisa beralih keLTC_BTC
, tidakLTC_USDT
.websocket
protokol mode dihidupkan pada Huobi spot exchange objek, Anda tidak dapat menggunakanexchange.IO("currency", "XXX_YYY")
untuk menukar mata uang.exchange.SetCurrency(Symbol)
fungsi untuk beralih pasangan perdagangan, dan menggunakanexchange.IO("currency","XXX_YYY")
metode untuk menjaga kompatibilitas.exchange.IO
fungsi beralih alamat basis API pertukaran (kontrak RESET; beberapa pertukaran tidak mendukung itu).
Sekarang penggunaanexchange.SetBase(Base)
fungsi telah didukung untuk beralih alamat basis API pertukaran, dan menggunakanexchange.IO("base","https://xxx.xxx.xxx")
metode untuk menjaga kompatibilitas.
Misalnya: Ketika objek pertukaran dikapsulkan, alamat dasar default adalahhttps://api.huobipro.com
, untuk beralih ke:https://api.huobi.pro
, gunakan kode berikut.
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");
}
Ubah alamat dasar kembali ke:https://api.huobipro.com
.
function main () {
exchanges[0].IO("base", "https://api.huobipro.com")
}
def main():
exchanges[0].IO("base", "https://api.huobipro.com")