Tutorial dasar untuk FMZ Quant platform Strategy Writing

Penulis:Ninabadass, Dibuat: 2022-03-18 09:00:46, Diperbarui: 2022-04-02 11:48:15

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')
    }
}

_N

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.

_C

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, GetOrdersdanGetOrderuntuk mencegah gangguan program yang disebabkan oleh kegagalan akses.

CancelOrdertidak 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
}

_D

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.

Fungsi Indikator TA

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.nullMisalnya, 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)
    }
}

Fungsi yang Sering Digunakan di JavaScript

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());
  • JavaScript memiliki fungsi Matematika sendiri, seperti operasi matematika umum, termasukMath.max(), Math.abs()dan sebagainya; referensi:https://www.w3school.com.cn/jsref/jsref_obj_math.asp ;
  • Perpustakaan matematika pihak ketiga yang digunakan oleh FMZ; referensi:https://mathjs.org/ ;
  • Perpustakaan underscore pihak ketiga JavaScript yang digunakan oleh FMZ, yang dianjurkan untuk memiliki pengetahuan dan yang membuat operasi Js yang membosankan lebih nyaman; referensi:https://underscorejs.org/.

Template

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 Square (https://www.fmz.com/square/20/1) Salin dan simpan perpustakaan template, dan periksa perpustakaan yang akan digunakan saat membuat strategi Anda sendiri.

Semua fungsi template JavaScript dimulai dengan$, sementara Python yang semua dimulai denganext.

Perpustakaan Perdagangan Cryptocurrency

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, "***")

Perpustakaan Perdagangan Komoditas Berjangka

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

  • Bot akan secara otomatis memetakan indeks ke kontrak utama yang berkelanjutan;
  • Ini akan secara otomatis menangani gerakan;
  • Anda dapat menentukan pemetaan untuk backtest, seperti rb000/rb888, yang adalah untuk memetakan k-line dari indeks rb untuk memperdagangkan kontrak kontinu utama;
  • Ini juga dapat dipetakan ke kontrak lain; misalnya, rb000/MA888 adalah untuk melihat garis K dari indeks rb untuk memperdagangkan kontrak MA utama yang berkelanjutan.
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)
    }
}

Perpustakaan Gambar

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.

img

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)
    }
}

Pengaturan Parameter Strategi

Di bawah Edit Strategy, ada pengaturan parameter strategi, yang sama dengan variabel global strategi, dan dapat diakses di lokasi mana pun dalam kode. Parameter strategi dapat dimodifikasi di halaman bot, dan mereka akan berlaku setelah di-restart. Oleh karena itu, beberapa variabel dapat diatur ke parameter, dan parameter dapat dimodifikasi tanpa memodifikasi strategi.
img

  • Nama variabel: yaitu nomor, string dan combox dll pada gambar di atas,yang dapat digunakan secara langsung dalam kelompok strategi.
  • Deskripsi: nama parameter pada antarmuka strategi, lebih nyaman bagi pengguna untuk memahami arti dari parameter.
  • Pernyataan: penjelasan rinci dari parameter, yang akan ditampilkan sesuai ketika mouse berada di atas parameter.
  • Jenis: jenis parameter, yang akan diperkenalkan secara rinci nanti.
  • Standar: default dari parameter a.

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|ETHdalam 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.

Strategi Backtest

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.

Mekanisme Baktest

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, dan secara otomatis akan melompat ke titik waktu berikutnya ketika satu loop berakhir. Namun, Python, karena mekanisme program, membutuhkan kendalaSleep(10), untuk menghindari terjebak.

Pencocokan Backtest

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.

Pengaturan halaman backtest

img

  • 1.memilih halaman Backtest, di sebelah kiri halaman Edit Strategy;
  • 2.waktu awal dan waktu akhir backtest; untuk data mungkin tidak lengkap, backtest dapat dimulai langsung dari saat data ada;
  • 3.periode default pengujian backtestingGetRecords()fungsi; Anda juga dapat menentukan parameter periode dalam kode;
  • 4.memilih mekanisme backtest;
  • 5.menampilkan atau menyembunyikan lebih banyak pengaturan backtest;
  • 6.pos log maksimum,pos log laba danpos log grafik, untuk mencegah browser dari gangguan yang disebabkan oleh jumlah data yang besar;
  • 7. periode yang dihasilkan oleh kutu lapisan bawah sesuai dengan garis K;
  • 8. titik tergelincir
  • 9. toleransi kesalahan, yang akan mensimulasikan situasi ketika permintaan API salah, dan menguji kapasitas toleransi kesalahan strategi;
  • 10.apakah untuk menggambar grafik pasar; jika fungsi indikator TA digunakan dalam backtest, fungsi akan ditampilkan secara otomatis dalam grafik, dan pembelian dan penjualan juga akan ditandai;
  • 11.penetapan biaya layanan;
  • 12.menambahkan platform - trading pair & aset;
  • 13. pengaturan parameter backtest; jika parameter adalah angka dan juga mendukung optimasi satu kunci, parameter akan dilalui secara otomatis dalam rentang tertentu dalam backtest.

Perbedaan Antara Bot & Backtest

  • 1.satu-satunya penawaran pasar yang valid dalam backtest hanya dari GetTicker dan GetRecords; yang lain seperti GetDepth dan GetTrades tidak nyata (volume data sangat besar, dan meskipun backtest tingkat pasar nyata sekarang mendukung data yang sudah ada, itu hanya mendukung data terbaru);
  • 2.platform yang ditambahkan dalam backtest adalah semua akun yang terpisah; hak untuk beralih pasangan perdagangan tidak didukung; oleh karena itu Anda tidak dapat mengoperasikan dua pasangan perdagangan di satu akun;
  • 3.netwrok request tidak dapat digunakan dalam backtest;
  • 4.IOekstensi tidak dapat digunakan dalam backtest, dan hanya API dasar yang dapat dioperasikan;
  • 5.hanya data standar yang dapat diperoleh dalam backtest, dan data, seperti Info yang terkait dengan bot tidak ada;
  • 6.penundaan mungkin tidak dilakukan dalam backtest, dan memperhatikan situasi pesanan yang dibekukan;
  • 7.inbacktest komoditas berjangka, urutan pasar tidak didukung.

Strategi Toleransi Kesalahan & Kesalahan Umum

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.

Cara Umum Menoleransi Kesalahan

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.

FAQ

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")

Lebih banyak