Anda dapat menggunakan Python untuk menulis langsung ke database.
function onexit(){
_G('profit', profit)
}
function main(){
_G("num", 1); // Set a global variable num, with a value of 1 second
_G("num", "ok"); // Change a global variable num, whose value is the string "ok"
_G("num", null); // Delete the global variable num
_G("num"); // Return the value of the global variable num; if it does not exist, return null
var profit = 0
if(_G('profit')){
profit = _G('profit')
}
}
Ketika menempatkan pesanan, presisi harga dan volume biasanya perlu dikontrol; FMZ telah dibangun dalam fungsi _N untuk menentukan tempat desimal yang akan disimpan; misalnya, hasil dari_N(4.253,2)
adalah 4,25.
Panggilan API platform tidak dapat menjamin akses berhasil setiap kali, dan _C adalah fungsi uji ulang otomatis._C(exchange.GetTicker)
, dengan interval uji ulang default 3 detik, dan Anda dapat memanggil fungsi _CDelay untuk mengontrol interval uji ulang, seperti _CDelay(1000), yang berarti untuk mengubah interval uji ulang fungsi _C menjadi 1 detik.GetTicker()
, exchange.GetDepth
, GetTrade
, GetRecords
, GetAccount
, GetOrders
danGetOrder
untuk mencegah gangguan program yang disebabkan oleh kegagalan akses.
CancelOrder
tidak dapat menggunakan fungsi _C, karena ada berbagai alasan untuk kegagalan untuk membatalkan pesanan. Jika pesanan telah dieksekusi, maka membatalkan pesanan akan mengembalikan kegagalan, dan menggunakan fungsi _C akan menghasilkan mencoba lagi sepanjang waktu.
Fungsi _C juga dapat melewati parameter dan juga digunakan dalam fungsi kustom.
function main(){
var ticker = _C(exchange.GetTicker)
var depth = _C(exchange.GetDepth)
var records = _C(exchange.GetRecords, PERIOD_D1) // Pass in the parameters
}
Menelpon_D()
langsung akan mengembalikan string waktu saat ini, seperti:2019-08-15 03:46:14
. Jika dipanggil selama backtest, waktu backtest akan dikembalikan. Anda dapat menggunakan fungsi _D untuk menilai waktu, seperti:_D().slice(11) > '09:00:00':
.
_D(timestamp, fmt)
, akan mengkonversi stempel waktu ms ke string waktu, seperti_D(1565855310002)
. Parameter fmt adalah format waktu, dan default adalahyyyy-MM-dd hh:mm:ss
.
Untuk beberapa fungsi indikator yang umum digunakan, seperti MA\MACD\KDJ\BOLL dan indikator umum lainnya, yang telah dibangun langsung oleh platform FMZ, dan indikator yang didukung secara spesifik dapat ditemukan dalam dokumen API.
Sebelum menggunakan fungsi indikator, yang terbaik adalah menilai panjang K-line.null
Misalnya, jika panjang garis K input adalah 100 dan periode untuk menghitung MA adalah 10, maka nilai 9 pertama semuanya nol, dan perhitungan setelah nilai 9 akan dilakukan secara normal.
JavaScript juga mendukung talib lengkap, sebagai perpustakaan pihak ketiga, dengan metode panggilan sepertitalib.CCI(records)
Silakan lihathttp://ta-lib.org/function.html. Untuk Python, Anda dapat menginstal perpustakaan talib sendiri. Karena kebutuhan untuk kompilasi, Anda tidak dapat hanya menggunakan pip untuk menginstal. Anda dapat mencari metode instalasi sendiri.
Fungsi indikator tidak hanya dapat melewati data K-line, tetapi juga melewati setiap array
function main(){
var records = exchange.GetRecords(PERIOD_M30)
if (records && records.length > 9) {
var ma = TA.MA(records, 14)
Log(ma)
}
}
Di sini kita memperkenalkan beberapa fungsi JavaScript yang umum digunakan di bot.
Date.now()
Mengembalikan stempel waktu saat ini;parseFloat()
mentransfer string ke dalam angka, sepertiparseFloat("123.21")
;parseInt()
mentransfer string ke dalam bilangan bulat;num.toString()
mentransfer angka ke string, dengan variabel nomor num;JSON.parse()
format string Json, sepertiJSON.parse(exchange.GetRawJSON())
;Math.max()
, Math.abs()
dan sebagainya; referensi:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;Ada banyak situasi yang perlu dipertimbangkan ketika menulis fungsi strategi bot. Misalnya, fungsi sederhana seperti membeli 5 koin, kita perlu mempertimbangkan: Apakah saldo saat ini cukup? Berapa harga pesanan? Apa presisi? Apakah Anda perlu membagi pesanan untuk menghindari mempengaruhi pasar? Bagaimana menangani pesanan yang belum selesai? Dan beberapa detail seperti itu. Dalam strategi yang berbeda, fungsi ini sama, sehingga Anda dapat membuatnya menjadi template. Mengikuti template resmi, pengguna juga dapat menulis strategi template mereka sendiri. Di sini kita akan memperkenalkan beberapa perpustakaan kelas template yang sangat umum digunakan yang dirilis secara resmi oleh FMZ, sehingga pengguna dapat dengan cepat menulis strategi mereka sendiri.
Perpustakaan perdagangan cryptocurrency JavaScript dan perpustakaan perdagangan berjangka komoditas dibangun secara default dan tidak perlu disalin. Perpustakaan template lainnya dapat ditemukan di strategi
Semua fungsi template JavaScript dimulai dengan$
, sementara Python yang semua dimulai denganext
.
Alamat kode sumber:https://www.fmz.com/strategy/10989Implementasi fungsi tertentu dapat secara langsung merujuk ke kode sumber.
Dapatkan Akun:
$.GetAccount(e)
Log($.GetAccount()); // Obtain the account information, with fault tolerance function
Log($.GetAcccount(exchanges[1]));
Pemesanan & Batalkan:
$.Buy/Sell(e, amount)
$.Buy(0.3); // The main platform buys 0.3 coin
$.Sell(0.2); // The main platform sells 0.2 coin
$.Sell(exchanges[1], 0.1); // The secondary platform sells 0.1 coin
$.CancelPendingOrders(e, orderType)
$.CancelPendingOrders(); // Cancel all entrusted orders of the main platform
$.CancelPendingOrders(ORDER_TYPE_BUY); // Cancel all buy orders of the main platform
$.CancelPendingOrders(exchanges[1]); // Cancel all orders of the secondary platform
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // Cancel all sell orders of the secondary platforom
Menghakimi Salib:
$.Cross(periodA, periodB) / $.Cross(arr1, arr2);
var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
If n = 0, it means that the current prices of exactly 15-period EMA and 30-period EMA are equal.
If n > 0, such as 5, it means that the 15-period EMA up-crosses the 30-period EMA by 5 periods (Bar)
If n < 0, such as -12, it means that the 15-period EMA down-crosses the 30-period EMA by 12 periods (Bar)
If it is not an array passed to the Cross, the function automatically obtains the K-line for moving average calculation.
If an array is passed to Cross, compare directly.
$.withdraw ((e, mata uang, alamat, jumlah, biaya, kata sandi) fungsi:
$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")
Untuk penggunaan perpustakaan perdagangan berjangka komoditas sangat stabil, disarankan.https://www.fmz.com/strategy/12961Implementasi fungsi tertentu dapat secara langsung merujuk ke kode sumber.
Perpustakaan CTA
function main() {
$.CTA("rb000,M000", function(r, mp) {
if (r.length < 20) {
return
}
var emaSlow = TA.EMA(r, 20)
var emaFast = TA.EMA(r, 5)
var cross = $.Cross(emaFast, emaSlow);
if (mp <= 0 && cross > 2) {
Log("Golden cross period", cross, "the moment position", mp);
return 1
} else if (mp >= 0 && cross < -2) {
Log("Death cross period", cross, "the moment position", mp);
return -1
}
});
}
Invokasi Contoh perpustakaan
function main() {
var p = $.NewPositionManager();
p.OpenShort("MA609", 1);
p.OpenShort("MA701", 1);
Log(p.GetPosition("MA609", PD_SHORT));
Log(p.GetAccount());
Log(p.Account());
Sleep(60000 * 10);
p.CoverAll("MA609");
LogProfit(p.Profit());
Log($.IsTrading("MA609"));
// Multiple varieties use the trading queue to complete the non-blocking trading task
var q = $.NewTaskQueue();
q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
Log(task.desc, ret)
})
while (true) {
// Call "poll" to execute the unfinished tasks in the spare time
q.poll()
Sleep(1000)
}
}
Untuk fungsi mentah untuk menggambar sangat rumit, yang akan diperkenalkan dalam tutorial berikutnya, kami merekomendasikan pemula untuk menggunakan perpustakaan gambar, untuk menggambar grafik garis yang sangat sederhana dan grafik garis k, dll. Perpustakaan gambar sederhana telah dibangun di FMZ, yang dapat dilihat di halaman pengeditan strategi; jika perpustakaan belum dibangun, pengguna perlu menyalin dan menyimpan, untuk memeriksa dan menggunakan perpustakaan dalam strategi.
Alamat salinan perpustakaan gambar versi Javascript:https://www.fmz.com/strategy/27293Alamat salinan perpustakaan gambar versi Python:https://www.fmz.com/strategy/39066
Contoh spesifik:
function main() {
while (true) {
var ticker = exchange.GetTicker()
if (ticker) {
$.PlotLine('Last', ticker.Last) // You can draw two lines at the samw time, "Last" is the name of the line
$.PlotLine('Buy', ticker.Buy)
}
Sleep(6000)
}
}
Di bawah
Ini sangat mudah untuk memahami dan jenis string dan jenis angka. yang sangat umum digunakan jenis. kotak combo akan menampilkan opsi di kotak pada antarmuka parameter.BTC|USDT|ETH
dalam kotak kombinasi; jika Anda memilih USDT di kotak di halaman, nilai SYMBOL dalam strategi adalah indeks USDT 1.
Ada lebih banyak parameter untuk pengaturan; referene:https://www.fmz.com/api.
Ketika kuantisasi strategi selesai, Anda dapat mengujinya dengan data sejarah, untuk memeriksa situasi keuntungan strategi pada tanggal sejarah. Tentu saja, hasil backtest hanya untuk referensi. Javascript backtest dijalankan di browser; backtest Python berada di docker, dan platform kami menyediakan dockers publik untuk pengguna.
Pada titik waktu, Anda dapat memperoleh informasi termasuk harga terbuka, dekat, tertinggi dan terendah dan volume perdagangan dari garis K saat ini, serta informasi garis K sejarah sebelum titik. Kekurangan dari mekanisme semacam ini sangat jelas: hanya satu pembelian yang dapat dihasilkan pada satu garis K; biasanya harga yang dirujuk adalah harga dekat thr K-line. juga, satu garis K hanya dapat memperoleh empat harga, yaitu harga dekat, terbuka, tertinggi dan terendah; informasi, termasuk bagaimana harga berubah dalam satu garis K dan apakah harga tertinggi atau harga terendah berubah terlebih dahulu, tidak dapat diperoleh. Ambil sebagai contoh tes bot K-line satu jam.
Backtest pada FMZ berisi dua jenis, yaitu backtest tingkat simulasi dan backtest tingkat pasar nyata.Namun, backtest tingkat pasar nyata akan benar-benar mengumpulkan tik, setiap beberapa detik, dan sekarang mendukung kedalaman nyata (termasuk 20 tingkat), dan perdagangan eksekusi nyata oleh tarde.Volume tanggal cukup besar, dan kecepatan backtest sangat lambat, sehingga backtest tidak dapat dijalankan dalam waktu yang lama. mekanisme backtest FMZ dapat mewujudkan beberapa perdagangan dari startegy pada satu K-line, untuk mencegah situasi bahwa perdagangan hanya dapat dilaksanakan oleh harga dekat, dan juga semakin menargetkan dan merawat kecepatan backtest. Untuk instruksi yang lebih rinci:https://www.fmz.com/bbs-topic/9126.
Kerangka kerja backtest dan bot adalah sama, keduanya adalah loop tak terbatas. Karena backtest adalah untuk melompat ke titik backtest yang berbeda, backtest dapat dijalankan tanpa menggunakan Sleep(10)
, untuk menghindari terjebak.
Mesin backtest akan mencocokkan harga order yang ditempatkan oleh pengguna dan harga pasar pada titik waktu backtest. Jika harga beli lebih tinggi dari satu jual, satu jual akan dieksekusi. Jika perdagangan tidak dapat dieksekusi, pesanan yang sedang menunggu akan dihasilkan. Slippage perlu ditambahkan untuk memastikan perdagangan. Jika posisi tidak dapat dibuka atau ditutup selama backtest, periksa apakah posisi dibekukan karena pesanan yang belum selesai.
GetRecords()
fungsi; Anda juga dapat menentukan parameter periode dalam kode;Seperti yang kita sebutkan sebelumnya, Menggunakan antarmuka API di bot mungkin gagal untuk mengakses dan kembalinull
; jika Anda masih menggunakan data itu, kesalahan akan dilaporkan dan bot akan berhenti.
Penyebab Umum:
Kesalahan jaringan akses API; timeout mengakses antarmuka mengembalikan nunll, dan kesalahan akan dilaporkan.
Kesalahan pembatasan dari platform, seperti pembatasan ip, presisi pesanan, frekuensi akses, kesalahan parameter, kekurangan aset, kegagalan perdagangan pasar, pembatalan pesanan yang dieksekusi, dll.; detailnya dapat ditanyakan dalam dokumen API sesuai dengan kode yang salah.
Platform mengembalikan kesalahan data; itu terjadi kadang-kadang, seperti mengembalikan kedalaman nol, informasi akun tertunda dan status pesanan tertunda, dll.
Kesalahan logika program.
Sebelum Anda menggunakan data yang dikembalikan API, Anda harus menilai apakah data adalah nol, dan metode umum diperkenalkan sebagai berikut:
//1.judge the data is null and handle
var ticker = exchange.GetTicker();
while(ticker == null){
Log('ticker obtain error');
ticker = exchange.GetTicker();
}
Log(ticker.Last);
// 2. judge the data is not null, and use
var ticker = exchange.GetTicker();
if(!ticker){
Log(ticker.Last);
}
// 3.retry _C() function
var ticker = _C(exchange.GetTicker);
Log(ticker.Last);
// 4.try cache fault tolerance
try{
var ticker = exchange.GetTicker();
Log(ticker.Last);
}
catch(err){
Log('ticker obtain error');
}
Jika Anda ingin mendapatkan informasi tentang kesalahan, Anda dapat menggunakanGetLastError()
, dan string dari informasi kesalahan terakhir kali akan dikembalikan, dan kesalahan dapat diproses oleh perbedaan.
Ringkasan kesalahan umum di posting atas forum:https://www.fmz.com/bbs-topic/9158Di sini kami memperkenalkan secara singkat; Anda dapat menggunakan ctrl + F untuk mencari, ketika Anda memiliki masalah.
Bagaimana cara menerapkan docker?
Ada pengantar rinci tentang hal itu di bagian menambahkan docker.
Bisakah aku meminta seseorang untuk menulis strategi untukku?
padahttps://www.fmz.com/markets, ada beberapa orang yang menyediakan layanan menulis strategi untuk orang lain, atau Anda dapat bertanya di kelompok obrolan; perhatikan bahwa layanan semacam itu harus dihubungi sendiri, dan Anda harus menyadari bahwa risiko juga harus ditanggung sendiri.
Semua antarmuka meminta timeout ketika diakses
Hal ini mengacu pada timeout antarmuka platform yang diakses; jika timeout terjadi sesekali, itu bukan masalah; jika timeout diminta sepanjang waktu, itu berarti semua jaringan tidak dapat diakses dan server luar negeri diperlukan.
ERR_INVALID_POSISI
Jika backtest melaporkan kesalahan, biasanya itu adalah kesalahan penulisan; ketika Anda mencoba untuk menempatkan pesanan untuk menutup posisi, ketika tidak ada posisi atau volume posisi tidak cukup, kesalahan akan dilaporkan.
Simbol tidak diatur
Tidak ada kontrak yang ditetapkan dalam kode, selama backtesting platform berjangka.
BITMEX 429error,{
error :{ message : Rate limit exceeded re-try in 1 second...... }}
Frekuensi akses antarmuka platform terlalu tinggi.
{
status :6004, msg : timestamp adalah di luar jangkauan }
Tanda waktu server melebihi rentang waktu pembaruan server, dan waktu yang melebihi tidak bisa terlalu lama.
GetOrder ((455284455): Kesalahan: ID pesanan tidak valid atau pesanan dibatalkan.
Jika pesanan platform dibatalkan, platform tidak akan menyimpan informasi pesanan lagi, sehingga informasi tersebut tidak dapat diperoleh.
GetOrders: 400: {
code :-1121, msg : Invalid symbol. }
Pasangan perdagangan tidak valid; periksa apakah pengaturan pasangan perdagangan salah.
Kunci rahasia gagal didekripsi
Parsing APIKEY gagal. Jika kata sandi FMZ telah dimodifikasi setelah APIKEY dikonfigurasi, coba tambahkan halaman platform di FMZ dan konfigurasi ulang APIKEY platform.
Tanda tangan tidak valid: waktu pengiriman yang tidak valid atau format waktu yang salah
sarankan Anda menggunakan server Linux, atau menginstal perangkat lunak sinkronisasi waktu pada sistem Windows ini di mana masalah ini terjadi.
Mengapa docker masih tidak dapat mengakses API platform ketika proxy global diatur?
Proxy global tidak memiliki port jaringan proxy docker. Karena masalah keterlambatan, yang terbaik adalah menyebarkan docker dari server luar negeri.
Bagaimana cara menyimpan strategi secara lokal, tidak untuk mengunggahnya ke FMZ?
Menggunakan Python, dan Anda dapat mengimpor file lokal, menyimpan strategi yang biasanya ditulis oleh FMZ API sebagai file dan meletakkannya di jalur eksekusi pada server Anda sendiri, dan Anda dapat langsung membaca dan mengeksekusi.
#!python2.7
def run(runfile):
with open(runfile,"r") as f:
exec(f.read())
def main():
run('my.py')
Bagaimana untuk testnet platform atau bagaimana untuk mengubah alamat basis API?
Gunakan exchange.SetBase() untuk langsung beralih ke alamat basis API yang sesuai.
exchange.SetBase("https://www.okex.me")