Dalam artikel sebelumnya, kami bercakap mengenai skrip perdagangan berprogram. Sebenarnya, strategi perdagangan adalah program skrip perdagangan. Artikel ini terutamanya membincangkan tentang keperluan pembawa perkakasan untuk program skrip perdagangan (di mana program berjalan), dan program perdagangan skrip boleh ditulis dalam bahasa pengaturcaraan komputer itu (menyenaraikan tiga bahasa pengaturcaraan yang digunakan dalam Platform Dagangan Kuantum FMZ; sudah tentu, anda boleh menggunakan bahasa pengaturcaraan apa pun untuk melaksanakan strategi dalam perdagangan berprogram). Dalam artikel ini, kita terus membincangkan pengukuran lingkaran cryptocurrency dan memahami pengetahuannya.
Jenis strategi dagangan Pemula yang baru dalam perdagangan terprogram dan perdagangan kuantitatif mungkin keliru dengan pelbagai istilah seperti strategi trend, strategi arbitraj, strategi frekuensi tinggi, strategi grid, dll. Sebenarnya, jenis strategi yang biasa dalam perdagangan terprogram dan perdagangan kuantitatif hanya dalam beberapa arah.
Strategi timbang tara Secara ringkasnya, strategi yang pada dasarnya memegang kedudukan panjang sambil memegang kedudukan pendek boleh diklasifikasikan sebagai strategi arbitraj. Terdapat banyak jenis spesifiknya, seperti pasaran silang spot, tempoh silang niaga hadapan, niaga hadapan dan arbitraj spot, dan arbitraj simbol silang, dll.
Strategi trend Secara ringkasnya, ia adalah strategi untuk mengesan trend dan meletakkan satu kedudukan, seperti purata bergerak berganda, MACD dan strategi lain.
Strategi Kembali Sebagai contoh, strategi grid, memperoleh pulangan dari turun naik harga di pasaran yang tidak menentu.
Strategi frekuensi tinggi Secara ringkasnya, ia adalah strategi untuk menjalankan perdagangan frekuensi tinggi melalui beberapa algoritma untuk menemui struktur mikro pasaran, peraturan, peluang, dll.
Jenis di atas diklasifikasikan dari sudut strategi perdagangan; dari sudut reka bentuk strategi di FMZ Quant, strategi juga boleh dibahagikan kepada:
strategi simbol tunggal Maksudnya strategi hanya boleh mengoperasikan satu simbol, seperti membuat perdagangan BTC atau perdagangan ETH.
strategi pelbagai simbol Secara ringkasnya, ia adalah untuk mengendalikan pelbagai simbol dengan satu logik strategi.
strategi pelbagai akaun Secara ringkasnya, ia adalah untuk mengkonfigurasi pelbagai objek pertukaran pada bot (konsep platform telah diperkenalkan dalam artikel sebelumnya, dan objek pertukaran yang dikonfigurasi dengan API KEY mewakili akaun platform).
strategi multi-logik Sebagai contoh, strategi MACD, strategi purata bergerak, strategi grid, dan lain-lain direka pada masa yang sama pada bot (tentu saja, ia adalah untuk mengendalikan objek pertukaran yang berbeza, dan objek pertukaran dengan operasi yang sama bergantung kepada sama ada strategi tertentu adalah bertentangan secara logik)
Antara muka API Platform
Bagaimana skrip dagangan yang diprogramkan mengendalikan akaun platform? Jawapannya adalah melalui antara muka API yang dibuka oleh platform.
Oleh itu, jenis antara muka yang terbuka kepada platform? Dalam artikel sebelumnya, kita bercakap tentang bahawa platform umumnya mempunyai antara muka REST dan Websocket dalam bahagian
Antara muka yang tidak memerlukan pengesahan
Secara amnya, mereka dirujuk sebagai API KEY
(jika anda tidak ingat apa API KEY, anda boleh beralih ke artikel sebelumnya). Antara muka jenis ini biasanya antara muka pasaran, seperti menyoal kutipan pasaran mendalam, data K-line, kadar pembiayaan, maklumat mengenai simbol perdagangan, cap waktu pelayan platform, dll.
Sederhananya, antara muka yang pada dasarnya tidak berkaitan dengan akaun anda boleh ditentukan secara kasar sebagai antara muka awam (tiada pengesahan diperlukan).
Pada Platform Perdagangan Kuantum FMZ, apabila memanggil fungsi API yang tidak disahkan (mencakup antara muka platform yang tidak disahkan; antara muka awam), walaupun konfigurasi KEY API tidak betul, data yang dikembalikan oleh antara muka dapat diperoleh secara normal (tidak diperlukan pengesahan)
Antara muka yang memerlukan pengesahan Secara ringkasnya, mereka adalah antara muka yang perlu disahkan (dengan API KEY). Jenis antara muka ini dipanggil antara muka peribadi. Antara muka jenis ini biasanya berkaitan dengan beberapa operasi atau maklumat akaun anda, seperti menanyakan aset akaun, kedudukan akaun, pesanan yang belum selesai, pemindahan, penukaran mata wang, penyesuaian leverage, dan tetapan mod kedudukan, dll. Operasi ini mesti disahkan.
Pada FMZ Quant, apabila memanggil fungsi API yang memerlukan pengesahan (antara muka peribadi, yang dikapsul dan memerlukan pengesahan platform). Jika konfigurasi API KEY salah, memanggil jenis fungsi ini akan melaporkan ralat, dan mengembalikan null.
Jadi, bagaimana untuk menggunakan antara muka ini di FMZ Quant Trading Platform?
FMZ Quant Trading Platform merangkumi antara muka platform dengan tindakan dan definisi yang dipersempit (seperti antara muka K-line, antara muka pasaran mendalam, antara muka pertanyaan aset semasa, antara muka pesanan, antara muka pembatalan pesanan, dll.).https://www.fmz.com/api).
Jadi, bagaimana untuk menggunakan beberapa platform antara muka tanpa tindakan yang dipersempit dan definisi di FMZ Quant?
Antara muka platform ini termasuk: pemindahan aset, pesanan bersyarat, pesanan batch, pembatalan pesanan batch, pengubahsuaian pesanan, dll. Sesetengah platform mempunyai antara muka ini, beberapa platform tidak, dan fungsi dan butiran penggunaan mungkin sangat berbeza, jadi antara muka ini boleh diakses melaluiexchange.IO
fungsi pada FMZ Quant (untuk butiran, lihat dokumentasi API platform dagangan FMZ Quant:https://www.fmz.com/api#exchange.io..Terdapat juga beberapa strategi contoh IO praktikal dalam
Boleh semua fungsi API dalam dokumentasi FMZ API membuat permintaan rangkaian?
Kami perlu mengatakan bahawa API platform mempunyai had untuk kekerapan akses (contohnya, 5 kali dalam 1 saat). Akses tidak boleh terlalu kerap, atau ralat http 429 akan dilaporkan, dan akses akan ditolak (kebanyakkan platform melaporkan 429). Oleh itu, memanggil antara muka platform yang dikapsulkan di FMZ Quant juga mempunyai had, tetapi memanggil fungsi API yang tidak membuat permintaan rangkaian tidak mempunyai had seperti itu.
Tidak semua fungsi API di FMZ Quant boleh membuat permintaan rangkaian; beberapa fungsi API di FMZ hanya mengubah suai beberapa tetapan tempatan, seperti menetapkan pasangan dagangan semasa, kod kontrak dan fungsi pengiraan penunjuk, serta memperoleh nama objek pertukaran, dll.
Pada asasnya, dari penggunaan fungsi a, anda boleh menentukan sama ada permintaan rangkaian akan dibuat; selagi ia adalah untuk memperoleh data platform, atau mengendalikan akaun platform, permintaan rangkaian akan dibuat; semua antara muka ini perlu memberi perhatian kepada kekerapan panggilan.
Mari kita bincangkan beberapa masalah biasa dan pengalaman menggunakan fungsi API pada FMZ Quant.
Toleransi ralat Ini adalah kesilapan yang paling biasa, yang telah mengganggu banyak pemula. Selalunya, strategi backtest adalah baik dan segala-galanya adalah normal. Mengapa bot berfungsi secara tidak normal selepas bot berjalan untuk sementara waktu (yang boleh dicetuskan pada bila-bila masa)?
Apabila menulis strategi, untuk data yang dikembalikan oleh antara muka perlu disahkan. Sebagai contoh, kod mendapatkan ticker pada FMZ Quant (yang sama dengan menulis program anda sendiri untuk mengakses antara muka platform secara langsung):var ticker = exchange.GetTicker()
Jika kita perlu menggunakan dataLast
(harga terkini) dalam pembolehubahticker
(anda boleh merujuk kepada struktur pulangan fungsi GetTicker), kita perlu mendapatkan data (apa yang baruPrice? baru: yang terbaru; Harga: harga; itu
Sekarang, ia adalah baik-baik saja jika fungsiGetTicker()
mengembalikan data biasa; jika terdapat permintaan waktu, ralat rangkaian, platform menarik kabel, kabel pecah dengan menggali, atau kanak-kanak mematikan suis elektrik, fungsiGetTicker()
akan kembalinull
Pada masa ini, nilaiticker
adalahnull
; apabila saya mengaksesLast
Daripadanya, program strategi akan dihentikan oleh program pengecualian.
Dari itu, nampaknya kegagalan panggilan antara muka (penyebutan GetTicker gagal dan mengembalikan null) bukan penyebab langsung berhenti bot strategi (penyebab langsung adalah bahawa atributnull
keadaan bahawa kegagalan panggilan antara muka melaporkan ralat tidak akan menyebabkan bot untuk berhenti (penekanan ditambah di sini).
Jadi, apa yang perlu kita lakukan untuk mengelakkan berhenti bot yang tidak normal?
Jawapannya adalah untuk melakukan proses toleransi ralat kepada data yang dikembalikan oleh antara muka; ia sangat mudah, dan anda hanya perlu menilai sama ada data yang dikembalikan adalahnull
(di sini mengambil JavaScript sebagai contoh, untuk bahasa lain adalah sama).
Tulis segmen kod kecil (yang hanya untuk arahan, dan tidak boleh dijalankan secara langsung!)
var ticker = exchange.GetTicker()
if (ticker) {
var newPrice = ticker.Last
Log("Print the latest price:", newPrice)
} else {
// data is null, so no operation will make no problem
}
Bukan sahajaGetTicker
antara muka perlu melakukan pemprosesan toleransi ralat, tetapi antara muka dengan permintaan rangkaian perlu melakukan pemprosesan toleransi ralat untuk nilai pulangan (jika anda menggunakan nilai pulangan fungsi)
Terdapat banyak kaedah toleransi ralat._C()
fungsi (lihat dokumentasi FMZ API) untuk menulis fungsi toleransi ralat anda sendiri dan merancang mekanisme dan logik toleransi ralat anda sendiri.
Mengenai penggunaan_C()
Fungsi, banyak pelajar baru juga sangat mungkin menggunakannya dengan tidak betul._C()
fungsi adalah rujukan fungsi, bukan panggilan fungsi._C(funcName, param1, param2)
; panggilan adalah betul; funcName tidak mempunyai kurung, dan param1 dan param2 adalah parameter yang akan diimport ke fungsi funcName._C(funcName(param1, param2))
; panggilan adalah salah; biasanya jika seorang pemula tidak membaca dokumentasi FMZ API dengan teliti, ia akan ditulis seperti ini.
Jumlah pesanan beli pasaran spot
Pemula juga mudah membuat kesilapan dalam jumlah pesanan pesanan beli pasaran spot. Seperti yang disebutkan dalam artikel sebelumnya, jumlah pesanan pesanan beli pasaran spot biasanya jumlah wang (hanya beberapa platform mungkin mempunyai tetapan lain, dan umumnya tetapan platform khas ini akan dijelaskan dalam dokumentasi FMZ API). Sebagai contoh, saya menggunakan OKEX V5 simulasi bot untuk menguji:
Tetapkan pasangan dagangan sebagai:LTC_USDT
function main() {
exchange.IO("simulate", true) // switch to OKEX simulated bot
exchange.Buy(-1, 1) // the price is -1, representing the placed order is market order; the amount of 1 means the order amount of 1 USDT
}
Oleh kerana platform umumnya mempunyai had jumlah pesanan, pesanan dengan jumlah yang lebih kecil daripada had tidak akan diletakkan (contohnya, Binance Spot hanya memerlukan pesanan dengan jumlah yang lebih besar daripada 5USDT dapat diletakkan dengan berjaya). Oleh itu, meletakkan pesanan seperti ini akan melaporkan ralat:
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 pesanan niaga hadapan
Apabila membuat strategi niaga hadapan, pemula sering membuat kesilapan dalam arah pesanan.https://www.fmz.com/api#exchange.setdirection...
Kerana fungsi penempatan pesanan hanya mempunyaiBuy
danSell
Walau bagaimanapun, niaga hadapan (sudah tentu, tidak ada masalah untuk tempat, untuk tempat hanya mempunyai membeli dan menjual) mempunyai arah pembukaan panjang, menutup panjang, membuka pendek, dan menutup pendek, jadi jelas exchange.SetDirection()
untuk menetapkan arah perdagangan niaga hadapan.
Di FMZ,exchange.SetDirection("buy")
(yang pertama menetapkan arah pertama) digunakan bersama denganexchange.Buy
, yang bermaksud bahawa pesanan yang diletakkan adalah pesanan untuk membuka kedudukan panjang.
Dan seterusnya:
Penggunaanexchange.SetDirection("sell")
danexchange.Sell
bersama-sama, yang mewakili pesanan yang diletakkan adalah pesanan untuk membuka kedudukan pendek.
Penggunaanexchange.SetDirection("closebuy")
danexchange.Sell
bersama-sama, yang mewakili pesanan yang diletakkan adalah pesanan untuk menutup kedudukan panjang.
Penggunaanexchange.SetDirection("closesell")
danexchange.Buy
bersama-sama, yang mewakili pesanan yang diletakkan adalah pesanan untuk menutup kedudukan pendek.
Pemula, biasanya akan menggunakanexchange.SetDirection("sell")
danexchange.Buy
Kemudian, kesilapan akan dilaporkan (kesilapan tidak boleh dilaporkan dalam backtest, tetapi itu jelas kesilapan logik, yang tidak boleh diabaikan oleh orang obsesif-kompulsif seperti saya.)
Inilah satu lagi kesilapan yang biasanya dilakukan oleh pemula.
function main() {
exchange.SetContractType("quarter") // set the current contract to a quarterly contract
exchange.SetDirection("sell")
var id = exchange.Sell(-1, 1)
Log("placed market order, executed, get positions", exchange.GetPosition())
exchange.SetDirection("closebuy") // use closebuy and Sell together, yes, no problem
exchange.Sell(-1, 1)
}
Apabila ia datang ke sini, anda mungkin bertanya:" Saya mempunyai kedudukan, dan menggunakan closebuy dan jual bersama-sama, jadi mengapa satu kesilapan dilaporkan dan saya tidak boleh menutup kedudukan? "Saya akan berkata:" arah yang salah untuk menutup kedudukan!
Selain itu, kesilapan boleh berada dalam situasi lain: tetapan arah kedudukan dekat adalah betul, penggunaan fungsi meletakkan pesanan juga betul, dan anda juga memegang kedudukan dalam arah, tetapi kesilapan masih dilaporkan.
Sebabnya mungkin: program anda telah meletakkan banyak pesanan, pesanan pada mulanya tidak dilaksanakan, dan pesanan kedudukan dekat kini berada di pasaran dan menunggu pelaksanaan. pada masa itu, program terus menutup kedudukan, yang akan mencetuskan ralat melebihi kedudukan dekat.
Paparkan maklumat eksport & perdagangan log
Merancang dan menulis strategi perdagangan berprogram dan kuantitatif tidak dapat dipisahkan dari reka bentuk interaksi manusia-komputer, seperti print
.
penggunaan javascriptconsole.log
.
Penggunaan Golangfmt.Println()
.
Penggunaan C++cout
.
Mari kita bercakap tentang paparan maklumat di FMZ. Di FMZ Quant, terdapat dua tempat utama untuk memaparkan maklumat.
Bar Status Selepas bot dimulakan, halaman bot ditunjukkan seperti berikut:
Bahagian paparan adalah maklumat bar status. Bar status terutamanya digunakan untuk memaparkan beberapa data perubahan masa nyata (kerana perubahan masa nyata perlu diperhatikan dalam masa nyata, dan tidak boleh dicetak sebagai log setiap kali, jadi jenis data ini boleh dipaparkan dalam bar status. Jika mencetak log setiap satu, akan ada banyak data berulang yang tidak bermakna, mempengaruhi pertanyaan).
Data yang dipaparkan pada bar status menggunakanLogStatus
Untuk butiran, sila rujuk dokumentasi FMZ API.
Bar log Ia juga di halaman bot, seperti yang ditunjukkan dalam gambar berikut:
Bahagian paparan adalah bar log. Bar log terutamanya digunakan untuk merakam data tertentu secara kekal pada masa tertentu, atau merakam operasi strategi tertentu pada masa tertentu. Log dibahagikan kepada pelbagai jenis:
exchange.Sell
/exchange.Buy
dalam strategi FMZ akan output secara automatik rekod dalam log.exchange.CancelOrder
digunakan dalam strategi FMZ, dan log pembatalan akan output secara automatik dalam log.Antara fungsi FMZ API, fungsi yang boleh menjana output log, seperti Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), dan lain-lain, boleh diikuti oleh beberapa parameter output tambahan selepas parameter yang diperlukan, seperti: pertukaran. CancelOrder ((order[j].Id, order[j]); ia adalah untuk output maklumat pesanan tambahan apabila urutan pesanan[j] dibatalkan.
function main() {
Log("data1", "data2", "data3", "...")
var data2 = 200
var id = exchange.Sell(100000, 0.1, "additional data1", data2, "...")
exchange.CancelOrder(id, "additional data1", data2, "...")
LogProfit(100, "additional data1", data2, "...")
}
Penggunaan fungsi penunjuk Sebelum kita bercakap mengenai fungsi penunjuk, mari kita faham terlebih dahulu apa itu penunjuk.
T:bagaimana penunjuk-penunjuk itu dihasilkan? A: Mereka pasti dihasilkan oleh pengiraan.
T: Mereka dikira berdasarkan apa? A: Data K-line.
P: Bolehkah anda memberikan contoh? J: Mengambil indikator purata bergerak yang paling mudah sebagai contoh. Jika kita menggunakan data K-line harian (iaitu, garis yang atau garis yin mewakili hari) sebagai sumber data untuk pengiraan indikator. Parameter indikator purata bergerak adalah 10, maka indikator purata bergerak yang dikira adalah purata bergerak 10 hari.
T: jika bilangan BAR K-garis kurang daripada 10, bolehkah penunjuk purata bergerak dikira?
A: Bukan sahaja penunjuk purata bergerak tidak boleh dikira, tetapi mana-mana penunjuk tidak boleh mengira nilai penunjuk berkesan apabila bilangan data garis K BAR tidak memenuhi parameter tempoh penunjuk, dan kedudukan yang sepadan dalam array dikira akan diisi dengan nilai kosong, sepertinull
dipaparkan apabilaJavaScript
strategi mencetak data penunjuk yang dikira.
Ada contoh pengajaran di Lapangan:https://www.fmz.com/strategy/125770Backtest ini pengajaran contoh strategi, dan anda boleh melihat carta yang dihasilkan oleh sistem backtest dan 10 tempoh purata bergerak:
Dengan strategi lukisan khusus, garis K yang digambar dan carta purata bergerak:
P: bagaimana jika saya mahu menggunakan purata bergerak 10 jam? A: gunakan data K-line untuk tempoh satu jam.
Secara ringkasnya, K-line yang kita lihat adalah array selepas kita mendigitalisasikannya (jika anda tidak memahami konsep array, anda boleh mencarinya di Baidu), dan setiap elemen array adalah bar K-line, yang disusun mengikut urutan. Biasanya bar terakhir data K-line adalah bar tempoh semasa, yang berubah dalam masa nyata dan tidak selesai (anda boleh memerhatikan perubahan dengan log masuk ke halaman platform dan memerhatikan K-line). Penunjuk yang dikira juga dalam satu-ke-satu korespondensi dengan bar K-line. Dalam contoh di atas, anda dapat melihat bahawa nilai penunjuk sepadan dengan bar K-line. Perhatikan bahawa bar K-line terakhir berubah dalam masa nyata, dan penunjuk yang dikira juga akan berubah dengan perubahan bar K-line.
Di Platform Perdagangan Kuantum FMZ, anda boleh menggunakan perpustakaan TA (perpustakaan yang dilaksanakan oleh FMZ, bersepadu dalam docker, dan boleh digunakan secara langsung dalam pelbagai bahasa) atau talib (perpustakaan penunjuk terkenal lama
function main() {
var records = exchange.GetRecords()
var ma = TA.MA(records, 10)
Log(ma) // print average
}
Gunakan talib:
function main() {
var records = exchange.GetRecords()
var ma = talib.MA(records, 10)
Log(ma) // print average
}
Data indeks yang dikira ma adalah array, dan setiap elemen sepadan dengan array K-garis (rekod) satu demi satu, iaitu,ma[ma.length -1]
sama denganrecords[records.length - 1]
, dan sebagainya.
Ia adalah sama untuk penunjuk lain yang lebih rumit, dan anda perlu memberi perhatian kepada penunjuk seperti MACD.
var macd = TA.MACD(records) // In this way, only the K-line data is passed in, and no indicator parameters are passed in. The indicator parameters use the default values, and that is the same for other indicator functions
Pada masa ini, pembolehubah macd adalah array dua dimensi (anda boleh Baidu, jika anda tidak memahami konsep). array dua dimensi adalah hanya array, dan setiap elemen juga array.
T: Mengapa data penunjuk MACD adalah array dua dimensi? A: Kerana penunjuk macd terdiri daripada dua garis (garis dif dan garis dea) dan satu set bar jumlah (data bar jumlah macd, sebenarnya juga boleh dianggap sebagai garis).
var dif = macd[0]
var dea = macd[1]
var macdbar = macd[2]
Berikut juga contoh pengajaran siap; jika anda berminat, anda boleh mempelajarinya:https://www.fmz.com/strategy/151972