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.
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.
Ada berbagai strategi frekuensi tinggi:
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)
}
}
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.
//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.
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.
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.
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
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() +"×tamp="+Date.now()]})
*/