dalam 10 log terakhir dan membersihkan selebihnya
LogReset ((10)
}
```Python
def main():
LogReset(10)
void main() {
LogReset(10);
}
LogVacuum()
, selepas memanggilLogReset()
fungsi untuk membersihkan log, memulihkan ruang simpanan yang diduduki olehSQLiteFungsi ini tidak mempunyai nilai pulangan.
Sebabnya ialahSQLite
tidak mengambil semula ruang yang diduduki apabila memadam data, jadi anda perlu melakukanVACUUM
untuk membersihkan jadual, dan membebaskan ruang. Apabila fungsi ini dipanggil, operasi pemindahan fail akan berlaku dengan kelewatan yang besar. Adalah disyorkan untuk memanggilnya pada selang masa yang sesuai.
Fungsi antara muka pasaran utama:
Nama Fungsi | Penerangan |
---|---|
GetTicker | Dapatkan data tanda kutip |
GetRecords | Dapatkan data K-line |
GetDepth | Dapatkan data buku pesanan (data kedalaman pesanan) |
GetTrades | Dapatkan rekod perdagangan terkini di pasaran |
Fungsi berikut boleh dipanggil melaluiexchange
atauexchanges[0]
objek; contohnya: fungsi, sepertiexchange.GetTicker();
atauexchanges[0].GetTicker();
, mengembalikan sebut harga pasaran pasangan dagangan semasa dan kontrak penetapan.
Petua penting untuk memanggil fungsi API dengan akses rangkaian:Apabila memanggil mana-mana fungsi API yang mengakses antara muka platform (sepertiexchange.GetTicker()
, exchange.Buy(Price, Amount)
, exchange.CancelOrder(Id)
, dan lain-lain), kegagalan akses mungkin disebabkan oleh pelbagai sebab. oleh itu, kita mesti melakukan pemprosesan toleransi ralat untuk panggilan fungsi ini.exchange.GetTicker()
fungsi untuk mendapatkan data pasaran boleh, disebabkan oleh masalah pelayan platform dan masalah penghantaran rangkaian, dll menyebabkan nilai pulanganexchange.GetTicker()
fungsi ialahnull
. Kemudian, nilai pulanganexchange.GetTicker()
mesti ditangani dengan pemprosesan toleransi ralat.
Data yang dikembalikan olehexchange.GetTicker()
fungsi dalam kod berikut diberikan kepadaticker
pemboleh ubah, dan kita perlu berurusan dengan toleransi ralat 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");
}
}
Di samping itu, untuk ujian prestasi toleransi kegagalan strategi, FMZ secara khusus telah menambah satumod toleransi ralatbacktest. Sistem backtest boleh secara rawak mengembalikan beberapa panggilan API yang akan berlaku apabila rangkaian diakses mengikut parameter yang ditetapkan, dan mengembalikan nilai pulangan beberapa panggilan yang gagal. Anda boleh dengan cepat menguji ketahanan program dalam bot.
Bertukar ke halaman sistem backtest pada halaman penyuntingan strategi, kliksegitiga terbalikkawalan drop-down di sebelah kanan butang
exchange.GetTicker()
mendapat sebut harga pasaran semasa pasangan dagangan semasa dan kontrak, dengan nilai pulangan:Ticker
struktur.
Dalam sistem backtest,Ticker
data yang dikembalikan olehexchange.GetTicker()
fungsi, di manaHigh
danLow
adalah nilai simulasi, diambil dari masa semasa 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 sebenar (bukan backtest),Info
atribut dalam nilai pulanganexchange.GetTicker()
fungsi menyimpan data asal yang dikembalikan apabila antara muka dipanggil.
exchange.GetDepth()
mendapat data buku pesanan pertukaran pasangan dagangan semasa dan kontrak.Depth
structure.
Depth
struktur mengandungi dua susunan struktur, iaituAsks[]
danBids[]
, Asks
danBids
mengandungi pembolehubah struktur berikut:
Jenis data | Nama pembolehubah | Penerangan |
---|---|---|
nombor | Harga | harga |
nombor | Jumlah | jumlah |
Sebagai contoh, jika saya mahu mendapatkan harga jualan kedua semasa, saya boleh menulis kod 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()
mendapat sejarah perdagangan platform (bukan anda sendiri).Trade
Data tertentu yang dikembalikan bergantung kepada rekod perdagangan dalam julat, mengikut keadaan tertentu.
Data yang dikembalikan adalah array, di mana urutan masa setiap elemen adalah sama dengan urutan data balikexchange.GetRecords
fungsi, iaitu, elemen terakhir array adalah data yang paling dekat dengan masa semasa.
// 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-garis. tempoh K-garis ditentukan apabila membuat bot; jika anda menentukan parameter apabilaexchange.GetRecords()
Apabila fungsi dipanggil, data yang diperoleh akan menjadi data K-line yang sepadan dengan tempoh parameter. Jika tidak ada parameter yang ditentukan, data K-line dikembalikan mengikut tempoh K-line yang ditetapkan pada parameter bot atau tempoh K-line yang ditetapkan pada halaman backtest.
ParameterPeriod
:
Period
hanya boleh lulus tempoh standard yang ditakrifkan di atas, tetapi juga boleh lulus nombor, dalam unit saat.Nilai pulanganexchange.GetRecords(Period)
fungsi:
Nilai pulangan adalah pelbagaiRecord
struktur, data K-garis yang dikembalikan akan terkumpul dari masa ke masa, had atas bar K-garis terkumpul dipengaruhi olehexchange.SetMaxBarLentetapan fungsi. had atas lalai adalah 5000 bar K-line apabila tidak ditetapkan. Apabila data K-Line mencapai had pengumpulan bar K-Line, ia akan dikemas kini dengan menambah bar K-Line dan memadam bar K-Line terdahulu (contohnya antrian masuk/keluar). Sesetengah pertukaran tidak menyediakan antara muka K-line, maka docker mengumpul data rekod transaksi pasaran dalam masa nyata untuk menjana K-line.
Bilangan bar K-garis yang diambil apabilaGetRecords
fungsi dipanggil pada mulanya.
Untukexchange.GetRecords(Period)
fungsi, bot dan backtestmata wang kriptokedua-dua menyokong tempoh tersuai, dan parameterPeriod
adalah bilangan saat. Sebagai contoh:
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 tempoh 5 saat.
JikaPeriod
parameter tidak sama rata dibahagikan dengan 60 (iaitu tempoh yang diwakili adalah tempoh minit tidak tersedia), lapisan bawah sistem menggunakan antara muka yang berkaitan denganGetTrades
untuk mendapatkan data rekod dagangan dan meringkas data K-line yang diperlukan.
JikaPeriod
parameter dibahagikan secara merata dengan 60, maka data K-line yang diperlukan disintesis dengan menggunakan data K-line sekurang-kurangnya 1 minit (menggunakan tempoh yang lebih besar untuk mensintesis data K-line yang diperlukan jika mungkin).
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 mempunyai dua syarat untuk mendapatkan data garis K:
Pertukaran menyediakan antara muka data K-line. Dalam kes ini, data yang diperoleh adalah data yang dikembalikan secara langsung oleh pertukaran.
Bursa tidak menyediakan antara muka data K-line. Program FMZ docker memperoleh rekod perdagangan terkini bursa setiap kali program strategi memanggilexchange.GetRecords()
, iaitu, ia memanggilexchange.GetTrades()
Fungsi untuk mendapatkan data dan menyintesis data K-line.
Pengujian semula tahap simulasi dalam sistem perlu menetapkantempoh garis K asas(apabila sistem backtesting mensimulasikan tahap backtesting, data K-line yang sepadan digunakan untuk menjana data tik mengikut settempoh garis K asas); perlu diperhatikan bahawa tempoh data K-line yang diperoleh dalam strategi tidak boleh kurang daripadatempoh garis K asasKerana dalam backtest tahap simulasi, data K-garis setiap tempoh disintesis oleh data K-garis yang sepadan dengan tempoh K-garis asas dalam sistem backtest.
Dalamcpp
bahasa, jika anda perlu membina data K-garis anda sendiri, terdapat contoh kod 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 tempoh K-garis yang ditetapkan pada halaman laman web platform FMZ apabila menjalankan strategi dalamUjian belakangdanbot. Nilai pulangan adalah bilangan bulat dalam unit saat. Nilai pulangan: jenis nombor.
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 semasa menjalankan 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 kandungan mentah (string) yang dikembalikan oleh yang terakhirRESTpermintaan, yang boleh digunakan untuk menganalisis data sendiri. Nilai pulangan: jenis rentetan, hanya sah dalam persekitaran perdagangan langsung cryptocurrency. Backtest tidak menyokong fungsi.
Strategi dalamcpp
Bahasa tidak menyokong 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 kadar pertukaran mata wang yang kini digunakan dalam pertukaran dan mata wang harga yang kini dipaparkan, dan nilai yang dikembalikan 1 menunjukkan bahawa penukaran kadar pertukaran dimatikan.
Nota:
exchange.SetRate()
tidak dipanggil untuk menetapkan kadar pertukaran, nilai kadar pertukaran dikembalikan olehexchange.GetRate()
adalah 1 secara lalai, iaitu, penukaran kadar pertukaran yang dipaparkan pada masa ini tidak ditukar.exchange.SetRate()
telah digunakan untuk menetapkan nilai kadar pertukaran, seperti,exchange.SetRate(7)
, maka semua maklumat harga objek pertukaran semasa yang mewakili mata wang yang beredar di platform dagangan, seperti sebut harga, kedalaman, harga pesanan, dll, akan dikalikan dengan kadar pertukaran 7 yang ditetapkan sebelumnya untuk penukaran.exchange
sama dengan pertukaran dengan USD sebagai mata wang penetapan harga, selepas memanggilexchange.SetRate(7)
, semua harga bot akan ditukar kepada harga yang dekat dengan CNY dengan mengalikan dengan 7.exchange.GetRate()
ialah 7.exchange.GetUSDCNY()
Mengembalikan kadar pertukaran terkini dolar AS (sumber data yang disediakan olehyahoo
Nilai pulangan: jenis nombor.
Peraturanexchange.SetData(Key, Value)
Fungsi ini digunakan untuk menetapkan data yang dimuatkan pada masa strategi berjalan, yang boleh menjadi mana-mana penunjuk ekonomi, data industri, indeks yang berkaitan, dan lain-lain. Ia boleh digunakan untuk mengukur semua maklumat yang boleh diukur untuk strategi perdagangan dan juga menyokong penggunaan dalam sistem backtest.
Kaedah panggilanexchange.SetData(Key, Value)
fungsi:
Menulis data terus ke dalam strategi
Format data diperlukan sebagaidata
pembolehubah 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);
}
}
Apabila kod ujian di atas dijalankan, data yang sepadan akan diperoleh pada masa yang sepadan, seperti yang ditunjukkan dalam gambar:
Seperti yang kita boleh lihat, masa setem masa yang sepadan1579622400000
adalah2020-01-22 00: 00: 00
; apabila program strategi berjalan selepas masa ini, sebelum stempel masa data seterusnya1579708800000
, iaitu, sebelum masa2020-01-23 00: 00: 00
Panggilexchange.GetData(Source)
Semua yang diperolehi adalah kandungan[1579622400000, 123]
Apabila program terus berjalan dan masa berubah, mendapatkan data sekeping data seperti ini.
Minta data melalui pautan luaran
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 setiap rekod dalam badan utama data yang dimuatkan, format ditetapkan sebagai["time", "data"]
, bersamaan dengandata
format sifat data satu demi satu.data
atribut menyimpan badan utama data, dan setiap bahagian data terdiri daripada timestamp tahap milidetik dan kandungan data (kandungan data boleh menjadi mana-mana data yang dikodkan JSON).
Program perkhidmatan untuk ujian 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)
}
Selepas menerima permintaan, program ini bertindak balas terhadap data:
{
"schema":["time","data"],
"data":[
[1579536000000, "abc"],
[1579622400000, 123],
[1579708800000, {"price": 123}],
[1579795200000, ["abc", 123, {"price": 123}]]
]
}
Kod strategi ujian:
/*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 dimuatkan olehexchange.SetData(Key, Value)
data yang disediakan oleh pautan luaran, ia boleh digunakan dalam sistem backtest. data ini diperoleh pada satu masa semasa backtest, dan data ini disimpan dalam cache selama satu minit semasa perdagangan sebenar.
Mendapatkan kaedah 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);
}
}
Kaedah memanggil data dari pautan luaran
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"));
}
Gunakan data asas platform pusat data
Gunakanexchange.GetData(Source)
fungsi untuk mendapatkanData asas.
Apabila memanggilexchange.GetData(Source)
fungsi, anda boleh lulus dalam parameter kedua untuk menetapkan masa tamat cache dalam mili saat. lalai adalah satu minit masa tamat cache dalam bot sebenar. Dalam sistem backtest, apabila menggunakan antara muka akses untuk meminta data, sistem backtest akan menambah parameter
Fungsi berikut boleh dipanggil melaluiexchange
atauexchanges[0]
objek. Contohnya:exchange.Sell(100, 1);
menunjukkan pesanan seterusnya adalah pesanan jual dengan harga 100 dan kuantiti 1 di bursa.
exchange.Buy(Price, Amount)
digunakan untuk meletakkan pesanan beli dan mengembalikan ID pesanan. Nilai parameter:Price
adalah harga pesanan dalam jenis nombor, danAmount
adalah jumlah pesanan dalam jenis nombor. Nilai balik: jenis rentetan atau jenis nombor (jenis tertentu bergantung kepada jenis balik setiap platform pertukaran).
Nombor pesanan yang dikembalikan boleh digunakan untuk menyoal maklumat 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);
}
Tarikh hadapan
Apabila meletakkan pesanan untuk niaga hadapan, kita mesti memberi perhatian kepada sama ada arah dagangan ditetapkan dengan betul. Jika arah dagangan dan fungsi dagangan tidak sepadan, kesilapan akan dilaporkan. Bilangan pesanan yang diletakkan di bursa niaga hadapan cryptocurrency adalah bilangan kontrak kecuali dinyatakan sebaliknya. Contohnya:
// 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);
}
Mesej ralat:
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
Perintah pasaran
Nota: Antara muka pesanan pertukaran diperlukan untuk menyokong pesanan pasaran (apabila jenis pesanan adalah pesanan beli, parameter jumlah pesanan adalah jumlah dalam mata wang sebut harga), dan kaedah pesanan pasaran niaga hadapan cryptocurrency digunakan untuk meletakkan pesanan, dan unit parameter kuantiti adalahbilangan kontrak. Beberapa pertukaran perdagangan langsung untuk mata wang digital tidak menyokong antara muka pesanan pasaran.
// 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)
meletakkan pesanan jual dan mengembalikan ID pesanan. Nilai parameter:Price
adalah harga pesanan, jenis nombor.Amount
adalah jumlah pesanan, jenis berangka. Nilai balik: jenis rentetan atau jenis berangka (jenis tertentu bergantung kepada jenis balik setiap pertukaran).
Nombor pesanan yang dikembalikan, yang boleh digunakan untuk menyoal maklumat 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);
}
Tarikh hadapan
Apabila meletakkan pesanan untuk niaga hadapan, anda mesti memberi perhatian kepada sama ada arah dagangan ditetapkan dengan betul. Jika arah dagangan dan fungsi dagangan tidak sepadan, kesilapan akan dilaporkan. Jumlah pesanan platform niaga hadapan cryptocurrency adalah jumlah kontrak kecuali dinyatakan sebaliknya.
Perintah pasaran
Nota: antarmuka penempatan pesanan platform diperlukan untuk menyokong pesanan pasaran. (Apabila jenis pesanan adalah pesanan jual, parameter jumlah pesanan adalah bilangan syiling operasi yang dijual), dan masa hadapan cryptocurrency meletakkan pesanan mengikut bentuk pesanan pasaran, dan unit parameter jumlah pesanan adalahbilangan kontrak. Beberapa pertukaran mata wang digital dalam perdagangan sebenar tidak menyokong antara muka pesanan pasaran.
// 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 fungsi ini adalah untuk membatalkan pesanan dengan Id. Nilai parameter:Id
adalah nombor pesanan, dalam jenis rentetan atau jenis nombor (jenis tertentu bergantung kepada jenis pulangan apabila meletakkan pesanan pada setiap platform); nilai pulangan: jenis bool.
Mengembalikan hasil operasi;true
bermakna permintaan pembatalan pesanan telah dihantar dengan berjaya;false
bermakna permintaan pesanan membatalkan gagal untuk menghantar (nilai pulangan hanya menunjukkan sama ada permintaan menghantar berjaya atau tidak, jadi ia adalah yang terbaik untuk memanggilexchange.GetOrders()
untuk memeriksa sama ada 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 boleh menghasilkan fungsi output log, sepertiLog(...)
, exchange.Buy(Price, Amount)
danexchange.CancelOrder(Id)
. Anda boleh mengikuti parameter yang diperlukan dengan beberapa parameter output tambahan, sepertiexchange.CancelOrder(orders[j].Id, orders[j])
Dengan cara ini, ia membatalkanorders[j]
pesanan yang disertai dengan output maklumat pesanan ini, iaituOrder
strukturorders[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)
mendapat butiran pesanan mengikut nombor pesanan. Nilai parameter:Id
ialah nombor siri yang akan diperoleh, danId
adalah jenis rentetan atau nombor (jenis tertentu bergantung kepada jenis pulangan setiap pertukaran).Order
struktur.
(Tidak disokong oleh beberapa pertukaran)
Order
strukturAvgPrice
menunjukkan harga purata yang dilaksanakan (sebahagian bursa tidak menyokong medan ini; tetapkannya kepada 0 jika mereka tidak menyokong).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()
Dapatkan semua pesanan yang belum selesai.Order
susunan struktur.
UntukOrder
struktur, sila rujukexchange.GetOrder()
Apabila akaun yang diwakili oleh objek pertukaranexchange
Tidak ada pesanan yang menunggu, hubungiexchange.GetOrders()
untuk mengembalikan barisan kosong, iaitu:[]
.
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 maklumat pesanan belum selesai daripada set semasaPasangan daganganPerlu diperhatikan bahawa niaga hadapan cryptocurrency mempunyai perbezaan antara bukan sahaja pasangan perdagangan tetapi juga kod 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());
}
Maklumat pesanan belum selesai yang diperoleh:
[{"Id":17116430886,"Amount":1,"Price":808.4,"DealAmount":0,"AvgPrice":0,"Status":0,"Type":1,"ContractType":"quarter"}]
Ia dapat dilihat bahawa dalam perdagangan cryptocurrency, pesanan yang diperoleh olehexchange.GetOrders()
hanya pesanan yang belum selesai dalam kontrak yang ditetapkan pada masa ini.
exchange.SetPrecision(PricePrecision, AmountPrecision)
menetapkan ketepatan perpuluhan harga dan jumlah pesanan simbol; ia akan dipotong secara automatik selepas ditetapkan. Nilai parameter:PricePrecision
adalah jenis nombor, digunakan untuk mengawal bilangan tempat perpuluhan dalam data harga;AmountPrecision
adalah jenis nombor, digunakan untuk mengawal titik perpuluhan selepas jumlah pesanan.PricePrecision
danAmountPrecision
backtest tidak menyokong fungsi, dan ketepatan nombor backtest akan diproses secara automatik.
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 kadar pertukaran mata wang yang beredar di bursa.Rate
adalah daripadanumber
Nilai pulangan: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);
}
Nota:
Jika anda telah menetapkan nilai kadar pertukaran dengan menggunakanexchange.SetRate(Rate)
, seperti 7, maka semua maklumat harga, termasuk harga pasaran semasa, kedalaman, dan harga pesanan, mata wang peredaran yang diwakili oleh mata wang semasaexchange
objek, akan didarabkan dengan kadar pertukaran ditetapkan 7 untuk penukaran.
Sebagai contoh,exchange
adalah kadar pertukaran dalam dolar AS.exchange.SetRate(7)
Apabila harga perdagangan sebenar dipanggil, semua harga perdagangan sebenar akan dikalikan dengan 7 dan ditukar kepada harga yang dekat dengan CNY.
exchange.IO("api", httpMethod, resource, params, raw)
, memanggil antara muka fungsi lain pertukaran. Nilai parameter:httpMehod
adalah jenis rentetan; ia mengisi jenis permintaan, sepertiPOST
atauGET
. resource
adalah jenis rentetan, ia mengisi laluan permintaan.params
adalah jenis rentetan, ia mengisi parameter permintaan.raw
adalah parameter rentetan JSON asal dan ia boleh dihilangkan.exchange.IO("api", httpMethod, resource, params, raw)
panggilan fungsi akan mengakses antara muka pertukaran. Apabila ralat berlaku dan panggilan gagal, ia mengembalikan nilai sifar (fungsi dengan permintaan rangkaian, sepertiGetTicker()
danGetAccount()
, dan lain-lain, mengembalikan nilai null apabila panggilan gagal). Hanya perdagangan langsung menyokong memanggilexchange.IO("api", ...)
function.
Untuk contoh pesanan batch OKX, gunakan parameterraw
untuk lulus parameter perintah:
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
antara muka pertukaran untuk memperluaskan fungsi yang FMZ tidak telah ditambah (anda tidak perlu risau tentang proses parameter penyulitan, tandatangan dan pengesahan apabila anda menghantarPOST
FMZ telah diproses sepenuhnya di lapisan bawah, jadi anda hanya perlu mengisi parameter yang sepadan).
Nota:
Jika nilai kunci dalamparams
parameter (iaitu, parameter permintaan Http) adalah rentetan, ia perlu dibungkus dengan tanda petikan tunggal (simbol'
) di kedua-dua sisi nilai parameter.
Contohnya: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
antara muka:
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 semasa ujian:
{"code":"0","data":[],"msg":""}
Tetapan lainexchange.IO
fungsi:
Tukar pasangan dagangan bursa semasa
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 dagangandisusunapabila bot ditambahkanatauUjian belakang dijalankanakan ditukar melalui kod.
Nota:
ETH_BTC
, yang hanya boleh ditukar kepadaLTC_BTC
, tidakLTC_USDT
.websocket
mod protokol dihidupkan pada Huobi spot pertukaran objek, anda tidak boleh menggunakanexchange.IO("currency", "XXX_YYY")
untuk menukar mata wang.exchange.SetCurrency(Symbol)
fungsi untuk menukar pasangan dagangan, dan menggunakanexchange.IO("currency","XXX_YYY")
kaedah untuk mengekalkan keserasian.exchange.IO
fungsi menukar alamat asas API pertukaran (kontrak RESET; beberapa pertukaran tidak menyokong itu).
Sekarang penggunaanexchange.SetBase(Base)
fungsi telah disokong untuk menukar alamat pangkalan API pertukaran, dan menggunakanexchange.IO("base","https://xxx.xxx.xxx")
kaedah untuk mengekalkan keserasian.
Sebagai contoh: Apabila objek pertukaran dikapsulkan, alamat asas lalai adalahhttps://api.huobipro.com
, untuk beralih kepada:https://api.huobi.pro
, gunakan kod 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 pangkalan 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")