Saya menulis sebuah artikel pada tahun 2020 memperkenalkan strategi perdagangan frekuensi tinggi (https://www.fmz.com/digest-topic/6228Meskipun mendapat perhatian, itu tidak sangat mendalam. Dua setengah tahun telah berlalu sejak itu, dan pasar telah berubah. Setelah saya menerbitkan artikel itu, strategi frekuensi tinggi saya mampu menghasilkan keuntungan yang stabil untuk waktu yang lama, tetapi keuntungan secara bertahap menurun dan bahkan berhenti pada satu titik. Dalam beberapa bulan terakhir, saya telah meluangkan waktu untuk memperbaikinya, dan masih dapat menghasilkan beberapa keuntungan kecil.
Rekening rebate Komisi
menggunakan Binance sebagai contoh, saat ini menawarkan rebate pembuat sebesar 0,05% untuk setiap 100.000 unit yang diperdagangkan. Jika volume perdagangan harian adalah 100 juta U, rebate adalah 5.000 U. Tentu saja, biaya penerima masih tergantung pada tingkat VIP, jadi jika strategi tidak perlu menerima pesanan, tingkat VIP memiliki sedikit efek pada strategi frekuensi tinggi.
Kecepatan
Perdagangan frekuensi tinggi disebut demikian karena kecepatan yang cepat. Bergabung dengan server colocation bursa perdagangan dan mendapatkan latensi terendah dan koneksi paling stabil telah menjadi salah satu kondisi persaingan. Waktu pemrosesan internal strategi juga harus sesingkat mungkin.
Pasar yang cocok
Perdagangan frekuensi tinggi dianggap sebagai permata di mahkota perdagangan kuantitatif, dan saya percaya bahwa banyak pedagang algoritmik telah mencobanya, tetapi kebanyakan orang seharusnya berhenti karena mereka tidak bisa menghasilkan uang dan tidak dapat menemukan cara untuk meningkatkan. Alasan utama mungkin karena mereka memilih pasar perdagangan yang salah. Pada tahap awal strategi, pasar yang relatif mudah harus ditargetkan untuk perdagangan untuk menghasilkan keuntungan dan menerima umpan balik untuk perbaikan, yang kondusif bagi kemajuan strategi. Jika Anda memulai di pasar yang paling kompetitif dan bersaing dengan banyak lawan, Anda akan kehilangan uang tidak peduli seberapa keras Anda mencoba, dan Anda akan segera menyerah. Saya merekomendasikan memulai dengan pasangan perdagangan kontrak abadi yang baru diluncurkan, di mana ada lebih sedikit pesaing, terutama yang memiliki volume perdagangan yang relatif besar, sehingga lebih mudah menghasilkan uang. BTC dan ETH memiliki volume perdagangan tertinggi dan paling aktif, tetapi mereka juga paling sulit untuk bertahan hidup.
Menghadapi persaingan secara langsung
Pasar untuk setiap perdagangan terus berubah, dan tidak ada strategi perdagangan yang bisa menjadi solusi satu kali. Ini bahkan lebih jelas dalam perdagangan frekuensi tinggi, di mana memasuki pasar berarti bersaing langsung dengan pedagang paling cerdas dan paling rajin. Dalam pasar permainan jumlah nol, semakin banyak yang Anda hasilkan, semakin sedikit yang lainnya hasilkan. Semakin lambat Anda masuk, semakin sulit, dan mereka yang sudah berada di pasar harus terus meningkat dan dapat dihilangkan kapan saja. Tiga atau empat tahun yang lalu mungkin adalah kesempatan terbaik, tetapi dengan penurunan keseluruhan aktivitas di pasar mata uang digital baru-baru ini, menjadi sangat sulit bagi pemula untuk mulai melakukan perdagangan frekuensi tinggi.
Ada beberapa strategi perdagangan frekuensi tinggi, seperti arbitrage frekuensi tinggi, yang melibatkan menemukan peluang arbitrage melalui ini atau bursa lain, memanfaatkan kesempatan untuk memakan pesanan di depan yang lain dan menghasilkan keuntungan dengan keuntungan kecepatan; perdagangan tren frekuensi tinggi, yang melibatkan keuntungan dari tren jangka pendek; dan pembuatan pasar, yang melibatkan penempatan pesanan di kedua sisi perdagangan beli dan jual, mengendalikan posisi dengan baik dan menghasilkan keuntungan melalui potongan komisi. Strategi saya menggabungkan tren dan pembuatan pasar, pertama mengidentifikasi tren dan kemudian menempatkan pesanan, menjual segera setelah eksekusi dan tidak memegang posisi persediaan. Di bawah ini adalah pengenalan kode strategi.
Kode berikut didasarkan pada arsitektur dasar kontrak abadi Binance dan terutama berlangganan perdagangan aliran pesanan kedalaman websocket dan informasi posisi. Karena data pasar dan informasi akun berlangganan secara terpisah, membaca (-1) perlu terus digunakan untuk menentukan apakah informasi terbaru telah diperoleh. Di sini, EventLoop (1000) digunakan untuk menghindari loop mati langsung dan mengurangi beban sistem. EventLoop (1000) 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 is the pair of symbol
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 memerlukan pertama mengidentifikasi tren sebelum melakukan perdagangan beli dan jual. Menghakimi tren jangka pendek terutama didasarkan pada data transaksi, yaitu, aggTrade yang terdaftar, yang mencakup arah, harga, kuantitas, dan waktu transaksi. Perdagangan beli dan jual terutama mengacu pada kedalaman dan volume transaksi. Berikut adalah indikator rinci yang perlu dipertimbangkan, yang sebagian besar dibagi menjadi dua kelompok untuk membeli dan menjual dan dihitung secara dinamis dalam jendela waktu tertentu. Jendela waktu strategi saya adalah dalam 10 detik.
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 terakhir lebih besar dari harga jual rata-rata dan harga jual terakhir lebih besar dari harga jual rata-rata dan nilai pesanan beli lebih besar dari nilai pesanan jual pada interval tertentu, maka dianggap sebagai pasar 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, metode lama untuk mengulangi kedalaman ke jumlah yang diperlukan masih digunakan. Dengan asumsi bahwa pesanan beli yang dapat dieksekusi untuk 10 koin dalam waktu 1 detik dan tanpa mempertimbangkan situasi pesanan baru, harga jual ditetapkan pada posisi di mana pesanan beli
dengan volume 10 koin dapat memukul. ukuran jendela waktu tertentu perlu diatur oleh diri sendiri.
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Rasio ini mewakili proporsi tetap dari jumlah pesanan jual terakhir, mewakili jumlah pesanan beli sebagai proporsi tetap dari jumlah pesanan jual terakhir. Ini memungkinkan strategi untuk menyesuaikan ukuran pesanan 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 antara mereka, avg_diff adalah perbedaan rata-rata dalam spread, dan hanya ketika perbedaan beli dan jual dalam menempatkan pesanan lebih besar dari kelipatan tertentu dari nilai ini dan pasar bullish akan pesanan beli ditempatkan. Jika memegang posisi pendek, posisi juga akan ditutup untuk menghindari memegang posisi untuk waktu yang lama. hanya pembuat pesanan dapat ditempatkan untuk memastikan bahwa pesanan dipenuhi, dan ID pesanan khusus dapat digunakan untuk menghindari menunggu pengembalian pesanan.
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)//未返回的任务下次继续等待
}
})
jobs = new_jobs
tasks = []
}
/*
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()]})
*/