Strategi Frekuensi Tinggi Mata Uang Digital Pengantar Rincian

Penulis:Lydia, Dibuat: 2023-03-27 16:46:14, Diperbarui: 2023-09-18 20:12:59

img

Strategi Frekuensi Tinggi Mata Uang Digital Pengantar Rincian

Aku menulis artikel di tahun 2020 memperkenalkan strategi frekuensi tinggi,https://www.fmz.com/bbs-topic/9750. Meskipun mendapat perhatian yang cukup sedikit, itu tidak sangat mendalam. Lebih dari dua tahun telah berlalu sejak itu, dan pasar telah berubah. Setelah artikel itu diterbitkan, strategi frekuensi tinggi saya bisa menghasilkan keuntungan secara stabil untuk waktu yang lama, tetapi secara bertahap, keuntungan menurun dan bahkan berhenti pada satu titik. Dalam beberapa bulan terakhir saya telah menghabiskan beberapa upaya untuk memperbaikinya, dan sekarang masih dapat menghasilkan beberapa keuntungan.

Kondisi perdagangan frekuensi tinggi

  • Jika jumlah transaksi harian adalah 100 juta U, rebate akan menjadi 5000 U. Tentu saja, biaya penerima masih didasarkan pada tarif VIP, jadi jika strategi tidak memerlukan penerima, tingkat VIP memiliki sedikit dampak pada strategi frekuensi tinggi. Berbagai tingkat bursa umumnya memiliki tingkat rebate yang berbeda dan memerlukan pemeliharaan jumlah transaksi yang tinggi. Pada masa awal ketika beberapa pasar mata uang berfluktuasi sangat tinggi, ada keuntungan bahkan tanpa rebate. Seiring meningkatnya persaingan, rebate menyumbang sebagian besar keuntungan atau bahkan hanya bergantung pada mereka; pedagang frekuensi tinggi mengejar biaya tingkat atas.

  • Kecepatan. Alasan mengapa strategi frekuensi tinggi disebut frekuensi tinggi adalah karena mereka sangat cepat. Bergabung dengan server warna pertukaran, mendapatkan latensi terendah dan koneksi paling stabil juga telah menjadi salah satu kondisi untuk persaingan internal. Waktu konsumsi internal dari strategi harus sesedikit mungkin, dan artikel ini akan memperkenalkan kerangka websocket yang saya gunakan, yang mengadopsi eksekusi simultan.

  • Pasar yang cocok. Perdagangan frekuensi tinggi dikenal sebagai mutiara perdagangan kuantitatif, dan banyak pedagang programatik telah mencobanya, tetapi kebanyakan orang berhenti karena mereka tidak dapat menghasilkan keuntungan dan tidak dapat menemukan arah untuk perbaikan. Alasan utama harus karena mereka memilih pasar perdagangan yang salah. Pada tahap awal pengembangan strategi, pasar yang relatif mudah harus dipilih untuk menghasilkan keuntungan dalam perdagangan sehingga ada keuntungan dan umpan balik untuk perbaikan, yang kondusif untuk kemajuan strategi. Jika Anda mulai bersaing di pasar yang paling kompetitif dengan banyak lawan potensial, tidak peduli seberapa keras Anda mencoba, Anda akan segera kehilangan uang dan menyerah. Saya merekomendasikan pasangan perdagangan kontrak abadi baru yang terdaftar ketika tidak ada begitu banyak pesaing, terutama yang memiliki jumlah transaksi yang relatif besar; ini adalah saat keuntungan paling mudah. BTC dan ETH memiliki jumlah transaksi terbesar dan paling aktif dalam transaksi tetapi juga paling sulit untuk bertahan hidup.

  • Berhadapan dengan persaingan. Pasar untuk setiap transaksi terus berubah, dan tidak ada strategi perdagangan yang dapat bertahan selamanya, terutama dalam perdagangan frekuensi tinggi. Masuk ke pasar ini berarti bersaing dengan pedagang paling cerdas dan paling rajin secara langsung. Di pasar permainan nol, semakin banyak Anda mendapatkan, semakin sedikit yang lain akan mendapatkan. Semakin lambat Anda masuk, semakin tinggi kesulitan; mereka yang sudah berada di pasar juga harus terus meningkat. 3-4 tahun yang lalu mungkin adalah kesempatan terbaik; baru-baru ini, aktivitas keseluruhan di pasar mata uang digital telah menurun, sehingga sangat sulit bagi pendatang baru untuk memulai perdagangan frekuensi tinggi sekarang.

Prinsip frekuensi tinggi

Ada berbagai strategi frekuensi tinggi:

  • Hedging frekuensi tinggi, menemukan peluang lindung nilai melalui bursa ini atau bursa lain, mengandalkan keuntungan kecepatan untuk menangkap pesanan dan menghasilkan keuntungan;
  • Tren frekuensi tinggi, menghasilkan keuntungan dengan menilai tren jangka pendek;
  • Market maker, menempatkan pesanan di kedua sisi membeli dan menjual, mengendalikan posisi dengan baik dan membuat keuntungan melalui diskon;
  • Ada banyak lagi yang tidak akan saya sebutkan satu per satu. strategi saya adalah kombinasi dari trend dan market maker. pertama, kita menilai trend, lalu menempatkan order. setelah transaksi selesai, menempatkan order segera untuk menjual tanpa memegang posisi persediaan. selanjutnya, saya akan memperkenalkannya bersama dengan kode strategi.

Kerangka Strategi

Kode berikut didasarkan pada kerangka kerja dasar kontrak abadi Binance, terutama berlangganan kedalaman websocket, data pasar perdagangan aliran pesanan kedalaman, dan informasi posisi. Karena data pasar dan informasi akun berlangganan secara terpisah, perlu menggunakan read ((-1) secara terus menerus untuk menentukan apakah informasi terbaru telah diperoleh. Di sini EventLoop ((1000) digunakan untuk menghindari loop tak berujung langsung dan mengurangi beban sistem. EventLoop ((1000) akan memblokir sampai ada wss atau pengembalian tugas bersamaan dengan timeout 1000ms.

var datastream = null
var tickerstream = null
var update_listenKey_time = 0

function ConncetWss(){
    if (Date.now() - update_listenKey_time < 50*60*1000) {
        return
    }
    if(datastream || tickerstream){
        datastream.close()
        tickerstream.close()
    }
    //Need APIKEY
    let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY) 
    let listenKey = JSON.parse(req).listenKey
    datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
    //Symbols are the set trading pairs
    let trade_symbols_string = Symbols.toLowerCase().split(',')
    let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
    tickerstream = Dial(wss_url+"|reconnect=true", 60)
    update_listenKey_time = Date.now()
}

function ReadWss(){
    let data = datastream.read(-1)
    let ticker = tickerstream.read(-1)
    while(data){
        data = JSON.parse(data)
        if (data.e == 'ACCOUNT_UPDATE') {
            updateWsPosition(data)
        }
        if (data.e == 'ORDER_TRADE_UPDATE'){
            updateWsOrder(data)
        }        
        data = datastream.read(-1)
    }
    while(ticker){
        ticker = JSON.parse(ticker).data
        if(ticker.e == 'aggTrade'){
            updateWsTrades(ticker)
        }
        if(ticker.e == 'depthUpdate'){
            updateWsDepth(ticker)
        }
        ticker = tickerstream.read(-1)
    }
    makerOrder()
}

function main() {
    while(true){
        ConncetWss()
        ReadWss()
        worker()
        updateStatus()
        EventLoop(1000)
    }
}

Indikator strategi

Seperti yang disebutkan sebelumnya, strategi frekuensi tinggi saya membutuhkan penentuan tren sebelum melakukan pembelian dan penjualan. Tren jangka pendek terutama dinilai berdasarkan data transaksi tik-by-tick, yaitu aggTrade dalam langganan, yang mencakup arah transaksi, harga, kuantitas, waktu transaksi, dll. Membeli dan menjual terutama mengacu pada kedalaman dan jumlah perdagangan. Berikut ini adalah pengenalan rinci dari indikator yang harus diperhatikan; sebagian besar dari mereka dibagi menjadi kelompok pembelian dan penjualan dan dihitung secara dinamis dalam jendela waktu tertentu. Jendela waktu strategi saya adalah dalam 10 detik.

  • Jumlah transaksi rata-rata per perdagangan, per transaksi perdagangan adalah kumpulan pesanan yang berbeda dengan arah dan harga yang sama dalam 100ms, mencerminkan ukuran pesanan beli dan jual. data ini memiliki bobot yang tinggi, dapat diasumsikan bahwa jika volume pesanan beli lebih besar dari pesanan jual, ini adalah pasar yang didominasi pembeli.
  • Order frequency atau order interval, ini juga didasarkan pada data transaksi per transaksi, jumlah transaksi rata-rata yang disebutkan sebelumnya tidak memperhitungkan konsep waktu dan tidak sepenuhnya akurat. Jika order dalam satu arah memiliki jumlah transaksi rata-rata kecil tetapi frekuensi tinggi, itu masih berkontribusi pada kekuatan arah itu. Jumlah transaksi rata-rata * frekuensi pesanan mewakili jumlah transaksi total pada interval yang ditetapkan dan dapat digunakan untuk perbandingan langsung. Kedatangan pesanan mengikuti distribusi Poisson, yang dapat digunakan untuk hanya memperkirakan berapa banyak jumlah total pesanan yang tiba dalam interval waktu tertentu dan memberikan referensi untuk menempatkan posisi pesanan.
  • Spread rata-rata, ini relatif mudah dipahami, yaitu, jual satu dikurangi beli satu. pasar saat ini sebagian besar memiliki spread 1 tick. jika spread menjadi lebih besar, itu sering berarti bahwa ada tren pasar.
  • Harga jual beli rata-rata, hitung harga rata-rata dari setiap transaksi secara terpisah, dan bandingkan dengan harga terakhir.

Logika strategi

Tentukan tren jangka pendek

//bull represents short-term bullish, bear represents short-term bearish
let bull =  last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
            avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear =  last_sell_price < avg_sell_price && last_buy_price < avg_buy_price && 
            avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;

Jika harga jual terbaru lebih tinggi dari harga jual rata-rata, harga beli terbaru lebih tinggi dari harga beli rata-rata, dan nilai pesanan pembelian interval tetap lebih besar dari nilai pesanan jual, maka dianggap bullish jangka pendek.

Harga untuk menempatkan pesanan

function updatePrice(depth, bid_amount, ask_amount) {

    let buy_price = 0
    let sell_price = 0
    let acc_bid_amount = 0
    let acc_ask_amount = 0

    for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
        acc_bid_amount += parseFloat(depth.bids[i][1])
        acc_ask_amount += parseFloat(depth.asks[i][1])
        if (acc_bid_amount > bid_amount  && buy_price == 0) {
            buy_price = parseFloat(depth.bids[i][0]) + tick_size
        }
        if (acc_ask_amount > ask_amount  && sell_price == 0) {
            sell_price = parseFloat(depth.asks[i][0]) - tick_size
        }
        if (buy_price > 0 && sell_price > 0) {
            break
        }
    }
    return [buy_price, sell_price]
}

Di sini, kita masih mengadopsi pendekatan lama, mengulangi ke kedalaman yang diperlukan. Dengan asumsi bahwa 10 koin dapat diperdagangkan dalam 1 detik, tanpa mempertimbangkan pesanan baru yang sedang menunggu, harga jual ditetapkan di posisi di mana 10 koin dibeli. Ukuran spesifik jendela waktu perlu ditetapkan oleh diri Anda sendiri.

Jumlah pesanan

let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time

Rasio mewakili proporsi tetap, yang berarti bahwa jumlah pesanan beli adalah proporsi tetap dari jumlah pesanan jual baru-baru ini. Dengan cara ini, strategi dapat menyesuaikan ukuran pesanan secara adaptif sesuai dengan aktivitas pembelian dan penjualan saat ini.

Kondisi urutan tempat

if(bull && (sell_price-buy_price) > N * avg_diff) {
    trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
    trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) >  N * avg_diff) {
    trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
    trade('sell', sell_price, position.amount)
}

Di mana avg_diff adalah perbedaan harga pasar rata-rata, dan pesanan beli hanya akan ditempatkan ketika spread bid-ask lebih besar dari kelipatan tertentu dari nilai ini dan bullish. Jika memegang posisi pendek, itu juga akan menutup posisi untuk menghindari memegang untuk jangka waktu yang diperpanjang. Pesan dapat ditempatkan sebagai pesanan pembuat tunggal untuk memastikan mereka dieksekusi. Selain itu, ID pesanan kustom Binance dapat digunakan sehingga tidak perlu menunggu respons pesanan.

Struktur bersamaan

var tasks = []
var jobs = []

function worker(){
    let new_jobs = []
    for(let i=0; i<tasks.length; i++){
        let task = tasks[i]
        jobs.push(exchange.Go.apply(this, task.param))
    }
    _.each(jobs, function(t){
        let ret = t.wait(-1)
        if(ret === undefined){
            new_jobs.push(t)//Unreturned tasks will continue to wait next time
        }
    })
    jobs = new_jobs
    tasks = []
}

/*
Write the required task parameters in param
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
        "symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
        amount+"&price="+price+"&newClientOrderId=" + UUID() +"&timestamp="+Date.now()]})
*/

Data yang dipantau

  • Penundaan, pentingnya kecepatan strategi frekuensi tinggi telah ditekankan. Dalam strategi, berbagai penundaan perlu dipantau dan dicatat, seperti penempatan pesanan, pembatalan pesanan, pengembalian posisi, kedalaman, aliran pesanan, posisi, keseluruhan loop dan sebagainya. Setiap penundaan abnormal harus diselidiki tepat waktu dan mencoba untuk memperpendek penundaan strategi secara keseluruhan.
  • Rasio jumlah transaksi, menghitung jumlah transaksi sebagai persentase dari total jumlah transaksi. Jika rasio rendah, masih ada ruang untuk pertumbuhan. Pada saat puncak, mungkin strategi menyumbang lebih dari 10% dari total jumlah perdagangan.
  • Tingkat keuntungan posisi penutupan, menghitung rata-rata tingkat keuntungan posisi penutupan adalah referensi yang paling penting untuk menilai apakah strategi efektif.
  • Rasio rebate, proporsi rebate dalam total pendapatan, mencerminkan tingkat ketergantungan pada rebate oleh strategi.
  • Rasio kegagalan order, order hanya diperdagangkan dengan menempatkan order. Karena keterlambatan dalam menempatkan order, mungkin tidak ditempatkan. Jika rasio ini tinggi, itu berarti bahwa strategi s kecepatan tidak menguntungkan.
  • Perbandingan pesanan yang selesai, platform sering memiliki persyaratan untuk tingkat transaksi. Jika terlalu rendah, itu berarti bahwa strategi membatalkan pesanan terlalu sering dan perlu diselesaikan.
  • Rata-rata jarak pesanan beli dan jual, yang mencerminkan strategi penempatan pesanan dan kesenjangan antara pasar, kita dapat melihat bahwa sebagian besar dari mereka masih menempati posisi membeli satu dan menjual satu.

Saran lain

  • Strategi frekuensi tinggi dalam artikel ini hanya mengacu pada pertukaran tunggal, mata uang tunggal dan pasar tunggal. Ini memiliki keterbatasan besar, dan sebagian besar situasi dan mata uang tidak dapat menghasilkan keuntungan. Namun, tidak mungkin untuk memprediksi mata uang mana yang akan menguntungkan di masa depan, sehingga Anda dapat memperdagangkan beberapa atau bahkan semua mata uang tanpa kehilangan peluang. Bahkan di bawah batas frekuensi pertukaran, robot dapat memperdagangkan beberapa pasangan perdagangan. Tentu saja, untuk kecepatan optimal, satu sub akun dapat memperdagangkan satu pasangan perdagangan dengan satu server yang sesuai dengan satu robot; namun, ini akan menghasilkan biaya yang jauh lebih tinggi.
  • Menentukan jumlah pesanan dan kondisi pesanan berdasarkan hasil. Perdagangan dengan beberapa mata uang akan menghasilkan biaya usaha yang tinggi, jika pemantauan tidak menguntungkan, gunakan jumlah transaksi minimum dan kurangi frekuensi perdagangan sampai strategi secara dinamis memantau tingkat pengembalian positif, kemudian tingkatkan jumlah transaksi untuk meningkatkan pengembalian secara bertahap.
  • Dapatkan lebih banyak informasi, fitur lain dari perdagangan frekuensi tinggi adalah bahwa ia memproses jumlah data yang lebih besar dan menggunakan lebih banyak informasi. Semua informasi pasar untuk satu pasangan perdagangan dalam satu bursa harus direferensikan, dan kontrak abadi juga dapat merujuk pada data pasar spot, serta data dari bursa lain untuk pasangan perdagangan yang sama, atau bahkan data dari mata uang lain. Semakin banyak data yang ada, semakin besar keuntungan yang sesuai.
  • Server Binance berada di Tokyo, server bursa lain bervariasi, Anda dapat berkonsultasi dengan staf teknis bursa untuk rincian.
  • Kode strategi dalam artikel ini hanyalah kode contoh yang disederhanakan, dengan banyak detail yang rumit tetapi diperlukan dihapus. Indikator yang digunakan hanya untuk referensi dan tidak boleh digunakan secara langsung. Ada banyak detail yang perlu diperhatikan saat menjalankan strategi frekuensi tinggi, dan membutuhkan kesabaran untuk memodifikasi dan meningkatkan.

Berkaitan

Lebih banyak