Pemula, periksa Membawa Anda ke Cryptocurrency Quantitative Trading (2)

Penulis:Ninabadass, Dibuat: 2022-04-19 16:46:53, Diperbarui: 2022-04-20 16:56:43

Pemula, periksa Membawa Anda ke Cryptocurrency Quantitative Trading (2)

Dalam artikel sebelumnya, kami berbicara tentang skrip perdagangan terprogram. Sebenarnya, 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 itu (mencantumkan tiga bahasa pemrograman yang digunakan di FMZ Quant Trading Platform; tentu saja, Anda dapat menggunakan bahasa pemrograman apa pun untuk menerapkan strategi dalam perdagangan terprogram).

Skrip Perdagangan yang Diprogram

  • Jenis strategi perdagangan Pemula yang baru mengenal perdagangan terprogram dan perdagangan kuantitatif mungkin bingung dengan berbagai istilah seperti strategi tren, strategi arbitrage, strategi frekuensi tinggi, strategi grid, dll. Sebenarnya, jenis strategi umum dalam perdagangan terprogram dan perdagangan kuantitatif hanya dalam beberapa arah.

    • Strategi arbitrase Secara sederhana, strategi yang pada dasarnya memegang posisi panjang sementara memegang posisi pendek dapat diklasifikasikan sebagai strategi arbitrase. Ada banyak jenis spesifiknya, seperti pasar lintas spot, periode silang berjangka, futures dan arbitrage spot, dan arbitrage simbol silang, dll.

    • Strategi tren Sederhananya, ini adalah strategi untuk melacak tren dan menempatkan satu posisi, seperti rata-rata bergerak ganda, MACD dan strategi lainnya.

    • Strategi pengembalian Misalnya, strategi grid, mendapatkan keuntungan dari fluktuasi harga di pasar yang tidak stabil.

    • Strategi frekuensi tinggi Secara sederhana, ini adalah strategi untuk melakukan perdagangan frekuensi tinggi melalui beberapa algoritma untuk menemukan mikrostruktur pasar, aturan, peluang, dll.

    Jenis di atas diklasifikasikan dari sudut pandang strategi perdagangan; dari sudut pandang desain strategi di FMZ Quant, strategi juga dapat dibagi menjadi:

    • strategi simbol tunggal Artinya strategi hanya dapat mengoperasikan satu simbol, seperti melakukan perdagangan BTC atau perdagangan ETH.

    • strategi multi-simbol Sederhananya, itu adalah untuk mengoperasikan beberapa simbol dengan satu logika strategi.

    • strategi multi-akun Secara sederhana, ini adalah untuk mengkonfigurasi beberapa objek pertukaran pada bot (konsep platform telah diperkenalkan dalam artikel sebelumnya, dan objek pertukaran yang dikonfigurasi dengan API KEY mewakili akun platform).

    • strategi multi-logika Misalnya, strategi MACD, strategi rata-rata bergerak, strategi grid, dll dirancang pada saat yang sama pada bot (tentu saja, untuk mengoperasikan objek pertukaran yang berbeda, dan objek pertukaran dengan operasi yang sama tergantung pada apakah strategi tertentu secara logis bertentangan)

  • Antarmuka API Platform Bagaimana skrip perdagangan yang diprogram mengoperasikan akun platform? Jawaban adalah melalui antarmuka API yang dibuka oleh platform. Jadi jenis antarmuka apa yang terbuka untuk platform? Dalam artikel sebelumnya, kami berbicara tentang bahwa platform umumnya memiliki antarmuka REST dan Websocket di bagian Platform. Di sini kami menambahkan beberapa konsep dari aspek prosedur strategi.

    • Antarmuka yang tidak memerlukan verifikasi Secara umum, mereka disebut interface publik; jenis antarmuka ini tidak memerlukan verifikasiAPI KEY(jika Anda tidak ingat apa itu API KEY, Anda dapat beralih ke artikel sebelumnya). Jenis antarmuka ini umumnya antarmuka pasar, seperti menanyakan kutipan pasar mendalam, data K-line, tingkat pendanaan, informasi tentang simbol perdagangan, timestamp server platform, dll. Sederhananya, antarmuka yang pada dasarnya tidak terkait dengan akun Anda dapat secara kasar ditentukan sebagai antarmuka publik (tidak diperlukan verifikasi). Pada FMZ Quant Trading Platform, ketika memanggil fungsi API yang tidak diverifikasi (mencakup antarmuka platform yang tidak diverifikasi; antarmuka publik), bahkan jika konfigurasi API KEY tidak benar, data yang dikembalikan oleh antarmuka dapat diperoleh secara normal. (tidak diperlukan verifikasi)

    • Antarmuka yang perlu diverifikasi Secara sederhana, mereka adalah antarmuka yang perlu diverifikasi (dengan API KEY). Jenis antarmuka ini disebut antarmuka pribadi. Jenis antarmuka ini biasanya terkait dengan beberapa operasi atau informasi akun Anda, seperti menanyakan aset akun, posisi akun, pesanan tertunda, transfer, konversi mata uang, penyesuaian leverage, dan pengaturan mode posisi, dll. Operasi ini harus diverifikasi.

      Pada FMZ Quant, ketika memanggil fungsi API yang membutuhkan verifikasi (interface pribadi, yang dikapsulkan dan membutuhkan verifikasi platform). Jika konfigurasi API KEY salah, memanggil jenis fungsi ini akan melaporkan kesalahan, dan mengembalikan null.

    Jadi, bagaimana menggunakan antarmuka ini di FMZ Quant Trading Platform?

    FMZ Quant Trading Platform mengkapsulkan antarmuka platform dengan tindakan dan definisi yang terpadu (seperti antarmuka K-line, antarmuka pasar mendalam, antarmuka kueri aset saat ini, antarmuka order, antarmuka pembatalan order, dll.).https://www.fmz.com/api).

    Jadi, bagaimana menggunakan beberapa antarmuka platform tanpa tindakan dan definisi yang bersatu di FMZ Quant?

    Antarmuka platform ini meliputi: transfer aset, pesanan bersyarat, pesanan batch, pembatalan pesanan batch, modifikasi pesanan, dll. Beberapa platform memiliki antarmuka ini, beberapa platform tidak, dan fungsi dan rincian penggunaan mungkin sangat berbeda, sehingga antarmuka ini dapat diakses melaluiexchange.IOfungsi pada FMZ Quant (untuk rincian, lihat dokumentasi API platform perdagangan FMZ Quant:https://www.fmz.com/api#exchange.io..Ada juga beberapa strategi contoh IO praktis dalam Square dari FMZ Quant.

Dapatkah semua fungsi API dalam dokumentasi FMZ API membuat permintaan jaringan?

Kita perlu mengatakan bahwa API platform memiliki batas untuk frekuensi akses (misalnya, 5 kali dalam 1 detik). Akses tidak bisa terlalu sering, atau kesalahan http 429 akan dilaporkan, dan akses akan ditolak (sebagian besar platform melaporkan 429). Oleh karena itu, memanggil antarmuka platform yang dikapsulkan di FMZ Quant juga memiliki batas, tetapi memanggil fungsi API yang tidak membuat permintaan jaringan tidak memiliki batas seperti itu.
Tidak semua fungsi API di FMZ Quant dapat melakukan permintaan jaringan; beberapa fungsi API di FMZ hanya memodifikasi beberapa pengaturan lokal, seperti pengaturan pasangan perdagangan saat ini, kode kontrak dan fungsi perhitungan indikator, serta memperoleh nama objek pertukaran, dll. Pada dasarnya, dari penggunaan fungsi a, Anda dapat menentukan apakah permintaan jaringan akan dibuat; selama itu untuk memperoleh data platform, atau mengoperasikan akun platform, permintaan jaringan akan dibuat; semua antarmuka ini perlu memperhatikan frekuensi panggilan.

  • Mari kita bicara tentang beberapa masalah umum dan pengalaman menggunakan fungsi API di FMZ Quant.

    • Toleransi kesalahan Ini adalah kesalahan yang paling umum, yang telah mengganggu pemula yang tak terhitung jumlahnya. Seringkali, backtest strategi baik dan semuanya normal. Mengapa bot bekerja secara abnormal setelah bot berjalan untuk sementara waktu (yang dapat dipicu kapan saja)?

      img

      Ketika menulis strategi, untuk data yang dikembalikan oleh antarmuka perlu diverifikasi. Misalnya, kode untuk mendapatkan ticker pada FMZ Quant (yang sama dengan menulis program Anda sendiri untuk langsung mengakses antarmuka platform):var ticker = exchange.GetTicker(); jika kita perlu menggunakan data dariLast(harga terbaru) dalam variabelticker(Anda dapat merujuk pada struktur pengembalian fungsi GetTicker), kita perlu mendapatkan data (apa yang baruHarga? baru: terbaru; Harga: harga; itu benar, gabungkan mereka!)

      Sekarang, itu baik-baik saja jika fungsiGetTicker()mengembalikan data normal; jika ada permintaan timeout, kesalahan jaringan, platform menarik kabel, kabel rusak dengan menggali, atau anak-anak mematikan saklar listrik, fungsiGetTicker()akan kembalinullSaat ini, nilaitickeradalahnull; ketika saya mengaksesLastdari itu, program strategi akan dihentikan oleh program pengecualian. Dari itu tampaknya bahwa kegagalan panggilan antarmuka (pengambilan GetTicker gagal dan mengembalikan null) bukan penyebab langsung dari berhenti dari bot strategi (penyebab langsung adalah bahwa atribut darinullvariabel diakses). Situasi bahwa kegagalan panggilan antarmuka melaporkan kesalahan tidak akan menyebabkan bot untuk berhenti (penekanan ditambahkan di sini).

      Jadi, apa yang harus kita lakukan untuk menghindari berhentinya bot yang abnormal?
      Jawabannya adalah untuk melakukan proses toleransi kesalahan untuk data yang dikembalikan oleh antarmuka; sangat sederhana, dan Anda hanya perlu menilai apakah data yang dikembalikan adalahnull(di sini mengambil JavaScript sebagai contoh, untuk bahasa lain yang sama). Menulis segmen kode kecil (yang hanya untuk instruksi, dan tidak dapat 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 
      }
      

      Tidak hanyaGetTickerantarmuka perlu melakukan pemrosesan toleransi kesalahan, tetapi antarmuka dengan permintaan jaringan perlu melakukan pemrosesan toleransi kesalahan untuk nilai pengembalian (jika Anda menggunakan nilai pengembalian fungsi) Ada banyak metode toleransi kesalahan._C()fungsi (lihat dokumentasi FMZ API) untuk menulis fungsi fault-tolerant Anda sendiri dan merancang mekanisme dan logika fault-tolerant Anda sendiri.

      Mengenai penggunaan_C()Fungsi, banyak siswa baru juga sangat mungkin untuk menggunakan salah._C()fungsi adalah referensi fungsi, bukan panggilan fungsi._C(funcName, param1, param2); panggilan adalah benar; funcName tidak memiliki tanda kurung, dan param1 dan param2 adalah parameter yang akan diimpor ke fungsi funcName._C(funcName(param1, param2)); panggilan salah; biasanya jika seorang pemula tidak membaca dokumentasi FMZ API dengan hati-hati, itu akan ditulis seperti ini.

    • Jumlah pesanan pembelian pasar spot

      Pemula juga mudah membuat kesalahan dalam jumlah pesanan pesanan beli pasar spot. Seperti yang disebutkan dalam artikel sebelumnya, jumlah pesanan pesanan beli pasar spot biasanya jumlah uang (hanya beberapa platform yang mungkin memiliki pengaturan lain, dan umumnya pengaturan platform khusus ini akan dijelaskan dalam dokumentasi FMZ API).

      Tetapkan pasangan perdagangan 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
      }
      

      Karena platform umumnya memiliki batas pada jumlah pesanan, pesanan dengan jumlah yang lebih kecil dari batas tidak akan ditempatkan (misalnya, Binance Spot hanya membutuhkan pesanan dengan jumlah yang lebih besar dari 5USDT dapat ditempatkan dengan sukses). Oleh karena itu, menempatkan pesanan seperti ini akan melaporkan kesalahan:

      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 berjangka

      Ketika melakukan strategi berjangka, pemula sering membuat kesalahan dalam arah urutan.https://www.fmz.com/api#exchange.setdirection...

      img

      Karena fungsi pemesanan hanya memilikiBuydanSellNamun, berjangka (tentu saja, tidak ada masalah untuk spot, untuk spot hanya memiliki beli dan jual) memiliki arah membuka panjang, menutup panjang, membuka pendek, dan menutup pendek, jadi jelas Buy dan Sell tidak dapat mengekspresikan operasi di begitu banyak arah, maka perlu untuk memperkenalkan fungsiexchange.SetDirection()untuk menetapkan arah perdagangan berjangka. Di FMZ,exchange.SetDirection("buy")(yang pertama menetapkan arah pertama) digunakan bersama denganexchange.Buy, yang berarti bahwa order yang ditempatkan adalah order untuk membuka posisi panjang. Dan seterusnya:

      Penggunaanexchange.SetDirection("sell")danexchange.Sellbersama-sama, yang mewakili pesanan yang ditempatkan adalah pesanan untuk membuka posisi pendek. Penggunaanexchange.SetDirection("closebuy")danexchange.Sellbersama-sama, yang mewakili pesanan yang ditempatkan adalah pesanan untuk menutup posisi panjang. Penggunaanexchange.SetDirection("closesell")danexchange.Buybersama-sama, yang mewakili pesanan yang ditempatkan adalah pesanan untuk menutup posisi pendek. Pemula, biasanya akan menggunakanexchange.SetDirection("sell")danexchange.BuyKemudian, kesalahan akan dilaporkan (kesalahan tidak dapat dilaporkan dalam backtest, tapi itu jelas kesalahan logika, yang tidak dapat diabaikan oleh orang obsesif-kompulsif seperti saya.) Berikut adalah kesalahan lain yang biasanya dilakukan oleh para 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)
      }
      

      img
      Ketika datang ke sini, Anda mungkin bertanya:" Saya memiliki posisi, dan menggunakan closebuy dan Sell bersama-sama, jadi mengapa kesalahan dilaporkan dan saya tidak dapat menutup posisi?" Saya akan mengatakan:kearah yang salah untuk menutup posisi! Anda menutup posisi panjang. Selain itu, kesalahan dapat terjadi dalam situasi lain: pengaturan arah posisi dekat adalah benar, penggunaan fungsi penempatan pesanan juga benar, dan Anda juga memegang posisi dalam arah, tetapi kesalahan masih dilaporkan. Alasannya mungkin: program Anda telah menempatkan banyak pesanan, pesanan pada awalnya tidak dieksekusi, dan pesanan posisi dekat sekarang di pasar dan menunggu eksekusi.

    • Log ekspor & tampilan informasi perdagangan Merancang dan menulis strategi perdagangan terprogram dan kuantitatif tidak dapat dipisahkan dari desain interaksi manusia-komputer, seperti data display dan operation log export. Biasanya menggunakan bahasa pemrograman lokal untuk menulis skrip bot dan program strategi. Misalnya: penggunaan pythonprintAku tidak tahu. penggunaan javascriptconsole.logAku tidak tahu. Penggunaan Golangfmt.Println()Aku tidak tahu. Penggunaan C++cout.

      Mari kita bicara tentang tampilan informasi di FMZ. Di FMZ Quant, ada terutama dua tempat untuk menampilkan informasi.

      • Bar Status Setelah bot dimulai, halaman bot ditampilkan sebagai berikut:

        img

        Bagian tampilan adalah informasi status bar. Status bar terutama digunakan untuk menampilkan beberapa perubahan data real-time (karena perubahan real-time perlu diamati secara real-time, dan tidak dapat dicetak sebagai log setiap kali, sehingga jenis data ini dapat ditampilkan di status bar. Jika mencetak log masing-masing, akan ada banyak data berulang yang tidak berarti, mempengaruhi kueri). Data yang ditampilkan pada bilah status menggunakanLogStatusUntuk rincian, silakan lihat dokumentasi FMZ API.

      • Bar log Ini juga ada di halaman bot, seperti yang ditunjukkan pada gambar berikut:

        img

        Bagian tampilan adalah bilah log. Bilah log terutama digunakan untuk mencatat data tertentu secara permanen pada waktu tertentu, atau mencatat operasi strategi tertentu pada waktu tertentu. Log terbagi menjadi berbagai jenis:

        1. common log; strategi FMZ menggunakan fungsi Log untuk output dan mencetak di log strategi.

        img

        1. Pesan log; menggunakanexchange.Sell/exchange.Buydalam strategi FMZ akan secara otomatis output catatan dalam log.

        img

        1. Log pembatalan;exchange.CancelOrderdigunakan dalam strategi FMZ, dan log pembatalan akan keluar secara otomatis di log.

        img

        1. Log kesalahan; ketika strategi FMZ sedang berjalan, dan antarmuka untuk permintaan jaringan memiliki kesalahan panggilan, dan pengecualian dilemparkan (seperti pernyataan throw), log kesalahan akan secara otomatis keluar di log.

        img

      Di antara fungsi FMZ API, fungsi yang dapat menghasilkan output log, seperti Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), dll, dapat diikuti oleh beberapa parameter output tambahan setelah parameter yang diperlukan, seperti: exchange. CancelOrder ((order[j].Id, orders[j]); itu untuk secara tambahan output informasi pesanan ketika 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 indikator Sebelum membahas fungsi indikator, mari kita pertama-tama memahami apa itu indikator. Sederhananya, itu adalah garis seperti moving average, MACD, atau ATR.

      T:bagaimana indikator-indikator tersebut dihasilkan? A: Mereka pasti dihasilkan oleh perhitungan.

      T: Dihitung dari apa? A: Data K-line.

      T: Bisakah Anda memberikan contoh? A: Mengambil indikator rata-rata bergerak paling sederhana sebagai contoh. Jika kita menggunakan data K-line harian (yaitu, garis yang atau garis yin mewakili hari) sebagai sumber data untuk perhitungan indikator. Parameter indikator rata-rata bergerak adalah 10, maka indikator rata-rata bergerak yang dihitung adalah rata-rata bergerak 10 hari.

      T: jika jumlah K-line BAR kurang dari 10, dapatkah indikator rata-rata bergerak dihitung? A: Tidak hanya indikator rata-rata bergerak tidak dapat dihitung, tetapi indikator tidak dapat menghitung nilai indikator 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, sepertinullditampilkan ketikaJavaScriptstrategi mencetak data indikator yang dihitung.

      Ada contoh pengajaran di Lapangan:https://www.fmz.com/strategy/125770Backtest contoh pengajaran ini strategi, dan Anda dapat melihat grafik yang dihasilkan oleh sistem backtest dan 10 periode rata-rata bergerak:

      img

      Dengan strategi gambar khusus, K-line ditarik dan grafik rata-rata bergerak:

      img

      T: Bagaimana jika saya ingin menggunakan rata-rata bergerak 10 jam? A: gunakan data K-line dari periode satu jam.

      Secara sederhana, K-line yang kita lihat adalah array setelah kita mendigitalkannya (jika Anda tidak memahami konsep array, Anda dapat mencarinya di Baidu), dan setiap elemen array adalah bar K-line, yang diatur dalam urutan. Biasanya bar terakhir dari data K-line adalah bar periode saat ini, yang berubah secara real time dan tidak selesai (Anda dapat mengamati perubahan dengan masuk ke halaman platform dan mengamati K-line). Indikator yang dihitung juga dalam korespondensi satu-ke-satu dengan bar K-line. Dalam contoh di atas, Anda 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 FMZ Quant Trading Platform, Anda dapat menggunakan perpustakaan TA (perpustakaan yang diimplementasikan oleh FMZ, terintegrasi dalam docker, dan dapat digunakan langsung dalam berbagai bahasa) atau talib (perpustakaan indikator terkenal lama talib, terintegrasi dalam JS, C ++; Python perlu diinstal secara tambahan). Misalnya, perhitungan rata-rata dalam contoh di atas: Gunakan perpustakaan FMZ TA:

      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 dihitung ma adalah array, dan setiap elemen sesuai dengan array K-line (rekaman) satu per satu, yaitu,ma[ma.length -1]sesuai denganrecords[records.length - 1], dan sebagainya.

      Hal yang sama berlaku untuk indikator lain yang lebih rumit, dan Anda perlu memperhatikan indikator 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 saat ini, variabel macd adalah array dua dimensi (Anda bisa Baidu, jika Anda tidak memahami konsep). array dua dimensi hanyalah array, dan setiap elemen dari itu juga array.

      T: Mengapa data indikator macd adalah array dua dimensi? A: Karena indikator macd terdiri dari dua garis (garis dif dan garis dea) dan seperangkat batang volume (data batang volume macd, pada kenyataannya juga dapat dianggap sebagai garis).

      var dif = macd[0]
      var dea = macd[1]
      var macdbar = macd[2]
      

      Berikut juga contoh pengajaran siap pakai; jika Anda tertarik, Anda dapat mempelajarinya:https://www.fmz.com/strategy/151972

      img


Lebih banyak