Pada artikel sebelumnya, kami berbicara tentang skrip perdagangan programmatic. Pada kenyataannya, strategi perdagangan adalah program skrip perdagangan. Artikel ini terutama berbicara tentang kebutuhan akan pembawa perangkat keras untuk program skrip perdagangan (di mana program berjalan), dan program perdagangan skrip dapat ditulis dalam bahasa pemrograman komputer seperti apa (tiga bahasa pemrograman yang digunakan di FMZ Quant Trading Platform terdaftar. Tentu saja, Anda dapat menggunakan bahasa pemrograman apa pun untuk menerapkan strategi untuk perdagangan programmatic).
Jenis strategi perdagangan Pemula untuk perdagangan terprogram dan perdagangan kuantitatif mungkin bingung dengan istilah, seperti berbagai strategi tren, strategi arbitrage, strategi frekuensi tinggi, strategi grid, dll.
Di atas dibagi dari perspektif strategi perdagangan. Dari perspektif desain strategi di Platform Perdagangan Kuantum FMZ, strategi juga dapat dibagi menjadi:
Interface API Exchange
Bagaimana skrip perdagangan programmatic mengoperasikan akun pertukaran?
Jadi jenis antarmuka apa yang terbuka untuk pertukaran? Dalam artikel sebelumnya, kita berbicara tentang pertukaran memiliki antarmuka REST dan Websocket umumnya dalam bagian
Antarmuka yang tidak memerlukan verifikasi
Umumnya dikenal sebagai API KEY
(jika Anda lupa apa itu API KEY, Anda dapat beralih ke artikel sebelumnya). Jenis antarmuka ini adalah antarmuka pasar pada umumnya, seperti menanyakan harga pasar yang mendalam, menanyakan data K-line, menanyakan tingkat pendanaan, menanyakan informasi tentang varietas perdagangan, menanyakan timestamp server pertukaran, dll.
Sederhananya, antarmuka yang tidak terkait dengan akun Anda dapat ditentukan secara kasar untuk menjadi antarmuka publik (tidak perlu verifikasi)
Di Platform Perdagangan Kuantum FMZ, ketika memanggil fungsi API yang tidak diverifikasi (menkapsulkan antarmuka yang tidak diverifikasi, antarmuka publik), bahkan jika konfigurasi API KEY tidak benar, data yang dikembalikan oleh antarmuka dapat diperoleh secara normal (karena tidak verifikasi).
Antarmuka yang membutuhkan verifikasi Sederhananya, ini adalah antarmuka yang perlu diverifikasi (melalui API KEY), antarmuka semacam ini disebut antarmuka pribadi. Biasanya terkait dengan beberapa operasi atau informasi akun Anda, seperti menanyakan aset akun, menanyakan posisi akun, menanyakan pesanan tertunda, menanyakan transfer, mentransfer mata uang, menyesuaikan leverage, mengatur mode posisi, dll. Semua operasi ini harus diverifikasi. Di Platform Perdagangan Kuantum FMZ, ketika memanggil fungsi API yang perlu diverifikasi (interface yang perlu diverifikasi untuk pertukaran yang dikapsulkan, antarmuka pribadi), jika KEY API dikonfigurasi dengan salah, kesalahan akan dilaporkan ketika antarmuka dipanggil, dan nilai nol akan dikembalikan.
Jadi bagaimana antarmuka ini digunakan di FMZ Quant Trading Platform?
FMZ Quant Trading Platform merangkum perilaku pertukaran dan antarmuka dengan definisi yang konsisten (seperti antarmuka K-line, antarmuka pasar mendalam, antarmuka kueri aset saat ini, antarmuka pesanan, antarmuka pembatalan pesanan, dll.), antarmuka ini disebut fungsi API FMZ Quant Trading Platform pada FMZ Quant Trading Platform, dan dapat diakses dari dokumentasi API (https://www.fmz.com/api).
Jadi bagaimana beberapa antarmuka pertukaran dengan perilaku dan definisi yang berbeda digunakan pada FMZ Quant Trading Platform?
Antarmuka pertukaran ini meliputi: transfer aset, pesanan bersyarat, penempatan pesanan batch, pembatalan pesanan batch, modifikasi pesanan, dll. Beberapa pertukaran memiliki antarmuka ini, beberapa tidak, dan fungsi dan rincian penggunaannya mungkin sangat berbeda sehingga antarmuka ini dapat diakses melaluiexchange.IO
fungsi pada Platform Perdagangan Kuantum FMZ (untuk rincian, silakan lihat dokumentasi API Platform Perdagangan Kuantum FMZ:https://www.fmz.com/api#exchange.io..Ada juga beberapa contoh strategi IO praktis di kotak strategi Platform Perdagangan Kuantum FMZ.
Apakah semua fungsi API pada dokumen FMZ Quant Trading Platform API menghasilkan permintaan jaringan?
Pertama dan terpenting, antarmuka API dari bursa memiliki pembatasan frekuensi akses (seperti 5 kali per detik), dan akses tidak bisa terlalu sering, jika tidak akan melaporkan kesalahan http 429, dan akses akan ditolak (sebagian besar bursa melaporkan 429). Ada batasan yang sama untuk memanggil antarmuka pertukaran yang dikapsulkan pada Inventor Quantitative Trading Platform, tetapi tidak ada batasan tersebut pada fungsi API yang tidak menghasilkan permintaan jaringan pada FMZ Trading Quant Platform. Tidak semua fungsi API dari FMZ Quant Trading Platform akan menghasilkan permintaan jaringan. Beberapa dari mereka hanya memodifikasi beberapa pengaturan lokal, seperti mengatur pasangan perdagangan saat ini, mengatur kode kontrak, fungsi perhitungan indikator dan mendapatkan nama objek pertukaran, dll. Secara umum, dapat dinilai apakah permintaan jaringan terjadi dari tujuan fungsi. Selama data pertukaran, operasi akun pertukaran dan sebagainya adalah permintaan jaringan yang dihasilkan, antarmuka ini perlu memperhatikan frekuensi panggilan.
Mari kita bicara tentang beberapa masalah umum dan pengalaman saat menggunakan fungsi API di Platform Perdagangan Kuantum FMZ
Toleransi kesalahan Ini adalah kesalahan yang paling umum, yang telah mengganggu pemula yang tak terhitung jumlahnya. semuanya dari strategi backtesting sering normal, mengapa bot nyata berjalan untuk sementara (bisa dipicu kapan saja) dan kemudian gagal?
Saat menulis strategi, kita semua perlu menilai dan memverifikasi data yang dikembalikan oleh antarmuka. misalnya baris kode harga pasar untuk diperoleh di FMZ Quant Trading Platform (sama seperti menulis program untuk mengakses antarmuka pertukaran secara langsung sendiri):var ticker = exchange. GetTicker()
, jika kita perlu menggunakanLast
(harga akhir) data diticker
variabel (lihat struktur yang dikembalikan oleh fungsi GetTicker), kita perlu menggunakanvar newPrice = ticker.Last
Untuk mendapatkan data seperti ini (apa newPrice? baru: terbaru, Harga: harga, ya!GetTicker()
fungsi kembali ke data normal, itu OK, tapi jika ada request timeout, kesalahan jaringan, pertukaran menarik kabel jaringan, kabel terputus, anak menarik saklar listrik, dll... itu akan menyebabkanGetTicker()
fungsi untuk kembali kenull
Pada saat ini, nilaiticker
adalahnull
, dan jika saya pergi untuk mengaksesnyaLast
, program pengecualian akan terjadi dan program strategi akan berhenti.
Tampaknya bahwa kegagalan panggilan antarmuka (GetTicker panggilan gagal dan mengembalikan null) bukan alasan langsung dari berhenti strateginull
variabel diakses). Laporan kesalahan kegagalan panggilan antarmuka tidak akan menyebabkan bot berhenti yang sebenarnya (penekanan).
Jadi apa yang bisa kita lakukan untuk menghindari berhenti yang tidak normal dari bot nyata?
Jawabannya adalah untuk melakukan pemrosesan fault-tolerant pada data yang dikembalikan oleh antarmuka.null
(contoh bahasa JavaScript, bahasa lain biasanya sama)
Tulis segmen kode singkat untuk deskripsi (ini hanya deskripsi, Anda tidak dapat menjalankannya secara langsung!)
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("Print the latest price:", newPrice)
} else {
// The data is null, there will be no problem if no operation is performed
}
Tidak hanyaGetTicker
antarmuka harus toleransi kesalahan, tetapi antarmuka dengan permintaan jaringan harus toleransi kesalahan untuk nilai kembali (jika Anda menggunakan nilai kembali fungsi)
Ada banyak metode fault-tolerant, Anda dapat menggunakan_C()
fungsi (lihat dokumentasi FMZ API) untuk menulis fungsi fault-tolerant dan merancang mekanisme fault-tolerant dan logika sendiri.
Untuk penggunaan_C()
fungsi, banyak pemula biasa menggunakannya dengan salah._C()
fungsi adalah referensi fungsi, bukan panggilan fungsi._C(funcName, param1, param2)
, panggilan adalah benar, funcName adalah tanpa tanda kurung, dan param1 dan param2 adalah parameter yang akan diteruskan ke fungsi funcName._C(funcName(param1, param2))
, panggilan tidak benar, biasanya ditulis oleh pemula yang tidak membaca dokumentasi FMZ API serius.
Jumlah pesanan dari pesanan pembelian pasar spot
Jumlah pesanan pesanan beli pasar spot juga mudah untuk membuat kesalahan oleh pemula, seperti yang disebutkan dalam artikel sebelumnya, jumlah pesanan pesanan beli pasar spot biasanya jumlah (sangat sedikit bursa mungkin pengaturan lain, umumnya, pengaturan pertukaran khusus ini pada FMZ akan dijelaskan dalam dokumen FMZ API), misalnya saya menggunakan OKEX V5 demo untuk menguji:
Pasangan perdagangan ditetapkan sebagai:LTC_USDT
function main() {
exchange.IO("simulate", true) // Switch to the demo of OKEX exchange
exchange.Buy(-1, 1) // The price is -1, indicating that the order placed is a market order, and the quantity is 1, indicating that the order amount is 1USDT
}
Karena bursa umumnya memiliki batas jumlah pesanan, pesanan yang lebih kecil dari batas tidak akan ditempatkan (misalnya, Binance Spot membutuhkan setiap pesanan lebih dari 5USDT sebelum dapat ditempatkan dengan sukses). Oleh karena itu, akan melaporkan kesalahan jika Anda menempatkan pesanan seperti ini:
Error Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
Arah dalam menempatkan pesanan di masa depan Ketika membuat strategi berjangka, arah penempatan order seringkali dibuat kesalahan oleh pemula, yang menyebabkan masalah. Mari kita lihat deskripsi pada dokumentasi API pertama:https://www.fmz.com/api#exchange.setdirection...
Karena fungsi order hanyaBuy
, Sell
Namun, berjangka (tentu saja, tidak ada masalah dengan spot, spot hanya dibeli dan dijual) memiliki arah pembukaan panjang, menutup panjang, membuka pendek dan menutup pendek, jadi jelas bahwa Beli / Jual tidak dapat mengekspresikan operasi di begitu banyak arah.exchange.SetDirection()
, yang menentukan arah perdagangan berjangka.
Di FMZ,exchange.SetDirection("buy")
(set the direction first) digunakan bersama denganexchange.Buy
, itu berarti bahwa pesanan yang ditempatkan adalah pesanan untuk membuka posisi panjang.
Dan seterusnya:exchange.SetDirection("sell")
digunakan bersama denganexchange.Sell
, itu berarti bahwa pesanan yang ditempatkan adalah perintah untuk membuka posisi pendek.exchange.SetDirection("closebuy")
digunakan bersama denganexchange.Sell
, itu berarti bahwa pesanan yang ditempatkan adalah perintah untuk menutup posisi panjang.exchange.SetDirection("closesell")
digunakan bersama denganexchange.Buy
, itu berarti bahwa pesanan yang ditempatkan adalah perintah untuk menutup posisi pendek.
Pemula biasanya menggunakanexchange.SetDirection("sell")
bersama denganexchange.Buy
, atau kombinasi yang salah lainnya. kemudian kesalahan dilaporkan (backtesting mungkin tidak melaporkan kesalahan, tetapi ini jelas kesalahan logis, gangguan obsesif-kompulsif tidak bisa ditoleransi...).
Kesalahan umum lainnya yang dilakukan oleh pemula
function main() {
exchange.SetContractType("quarter") // Set the current contract as a quarterly contract
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("See my market order is placed and the transaction is completed, there is a position", exchange.GetPosition())
exchange.SetDirection("closebuy") // closebuy is used in conjunction with Sell, yes~
exchange.Sell(-1, 1)
}
Di sini Anda mungkin bertanya:
Log output, tampilan informasi transaksi
Desain strategi perdagangan terprogram dan kuantitatif tidak dapat dipisahkan dari desain interaksi manusia-komputer, seperti print
Aku tidak tahu.
penggunaan javascriptconsole.log
Aku tidak tahu.
Penggunaan Golangfmt.Println()
Aku tidak tahu.
Penggunaan C++cout
Mari kita bicara tentang tampilan informasi di platform FMZ, di FMZ Quant Trading Platform, ada dua tempat utama di mana informasi ditampilkan.
Kolom Status Setelah bot yang sebenarnya berjalan, halaman bot yang sebenarnya adalah seperti yang ditunjukkan pada gambar:
Bagian tampilan adalah informasi kolom status. Kolom status terutama digunakan untuk menampilkan beberapa data perubahan real-time (karena perubahan real-time perlu diamati secara real-time, dan tidak dapat dicetak sebagai log setiap kali, jenis data ini dapat ditampilkan di kolom status. Log akan mengulangi banyak data duplikat dan tidak berarti, mempengaruhi kueri jika setiap log dicetak).
Data yang ditampilkan pada kolom status menggunakanLogStatus
Untuk rincian, silakan lihat dokumentasi FMZ API.
Kolom log Juga dihapus pada halaman bot nyata, seperti yang ditunjukkan pada gambar:
Bagian tampilan adalah kolom log. Kolom log terutama digunakan untuk merekam data tertentu pada waktu tertentu secara permanen, atau merekam operasi strategi tertentu pada waktu tertentu. Ada berbagai jenis log:
Log umum, strategi di FMZ mengadopsi fungsi Log untuk output dan mencetak di log strategi.
Pesan log, penggunaanexchange.Sell
/exchange.Buy
dalam strategi FMZ
Log pembatalan,exchange.CancelOrder
digunakan dalam strategi FMZ
Log kesalahan, ketika strategi di FMZ sedang berjalan, kesalahan panggilan terjadi pada antarmuka yang membuat permintaan jaringan, pengecualian dilemparkan (seperti pernyataan lempar), log kesalahan output di log secara otomatis.
Fungsi API pada FMZ, fungsi yang dapat menghasilkan output log seperti Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), dll, semuanya dapat diikuti oleh beberapa parameter output tambahan setelah parameter yang diperlukan, seperti: exchange. CancelOrder ((orders[j].Id, orders[j]), ini adalah untuk output informasi pesanan ketika urutan pesanan[j] dibatalkan.
function main() {
Log("data1", "data2", "data3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "Attached data1", data2, "...")
exchange.CancelOrder(id, "Attached data1", data2, "...")
LogProfit(100, "Attached data1", data2, "...")
}
Penggunaan fungsi indikator
Sebelum membahas fungsi indikator, mari kita mengerti dulu apa itu indikator. Sederhananya, ini adalah garis, seperti moving average, MACD dan ATR.
T: Dari mana indikator ini berasal?
A: Tentu saja itu dihitung.
T: Apa dasar perhitungan ini?
A: Perhitungan berdasarkan data garis K.
P: Ambil contoh?
A: Mengambil indikator rata-rata bergerak yang paling sederhana sebagai contoh, jika kita menggunakan data K-line harian (yaitu, garis positif atau negatif mewakili satu hari) sebagai sumber data untuk perhitungan indikator.
T: Dapatkah indikator rata-rata bergerak dihitung jika jumlah BAR garis K kurang dari 10?
A: Tidak hanya indikator rata-rata bergerak tidak dapat dihitung, tetapi indikator tidak dapat menghitung nilai indeks efektif ketika jumlah data garis K BAR tidak memenuhi parameter periode indikator, dan posisi yang sesuai dari array yang dihitung akan diisi dengan nilai kosong, misalnya,JavaScript
strategi bahasa akan ditampilkannull
saat mencetak data indikator yang dihitung.
Ternyata ada contoh tutorial di kotak strategi:https://www.fmz.com/strategy/125770Backtest strategi contoh tutorial, kita dapat melihat grafik yang dihasilkan oleh sistem backtesting dan rata-rata bergerak 10 periode:
Strategi gambar khusus, K-line ditarik serta grafik rata-rata bergerak.
T: Bagaimana jika saya ingin rata-rata bergerak 10 jam? A: Menggunakan data K-line dengan data K-line periode per jam akan baik-baik saja.
Dalam istilah awam, K-line yang kita lihat adalah array setelah kita mendigitalkannya (Anda dapat bertanya kepada Baidu jika Anda tidak mengerti konsep array), yang setiap elemen adalah kolom K-line, yang diatur dalam urutan, elemen pertama dalam array adalah yang terjauh dari waktu saat ini, dan elemen terakhir array adalah yang paling dekat dengan waktu saat ini. Biasanya, bar terakhir dari data K-line adalah bar periode saat ini, yang berubah secara real time dan tidak lengkap (Anda dapat mengamati perubahan dengan masuk ke halaman pertukaran dan mengamati K-line). Indikator yang dihitung juga sesuai dengan bar K-line. Dalam contoh di atas, kita dapat melihat bahwa nilai indikator sesuai dengan bar K-line. Perhatikan bahwa bar K-line terakhir berubah secara real time, dan indikator yang dihitung juga akan berubah dengan perubahan bar K-line.
Di Platform Perdagangan Kuantum FMZ, kita dapat menggunakan perpustakaan TA (perpustakaan yang diimplementasikan oleh platform FMZ, terintegrasi dalam docker, dan berbagai bahasa dapat digunakan secara langsung) atau perpustakaan talib (perpustakaan indikator talib lama, integrasi JS, C ++, Python perlu diinstal sendiri). Misalnya, untuk menghitung rata-rata bergerak dalam contoh di atas: Gunakan perpustakaan TA:
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // print moving average
}
Gunakan perpustakaan talib:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // print moving average
}
Data indikator yang dihitung ma adalah array, dan setiap elemen sesuai dengan array K-line (rekaman) satu-ke-satu, yaitu,ma[ma.length -1]
sesuai denganrecords[records.length - 1]
, dan sebagainya.
Hal yang sama berlaku untuk indikator kompleks lainnya, dan kita perlu memperhatikan indikator seperti MACD.
var macd = TA.MACD(records) // In this way, only the K-line data is passed in, not the indicator parameters. The indicator parameters use the default values, and the same goes for other indicator functions.
Pada saat ini, variabel macd adalah array dua dimensi (Anda dapat bertanya kepada Baidu jika Anda tidak mengerti konsepnya). T: Mengapa data indikator macd adalah array dua dimensi? A: Karena indikator macd terdiri dari dua garis (garis dif, garis dea) dan seperangkat batang volume (garis volume macd, pada kenyataannya data batang volume ini juga dapat dianggap sebagai garis).
var dif = macd[0]
var dea = macd[1]
var macdColumn = macd[2]
Berikut juga contoh tutorial siap pakai, jika Anda tertarik, Anda dapat belajar di:https://www.fmz.com/strategy/151972