
[TOC] Saya menulis artikel pada tahun 2020 yang memperkenalkan strategi frekuensi tinggi, https://www.fmz.com/digest-topic/6228. Meskipun mendapat banyak perhatian, namun tidak ditulis secara mendalam. Lebih dari dua tahun telah berlalu dan pasar telah berubah. Setelah artikel itu diterbitkan, strategi frekuensi tinggi saya mampu menghasilkan uang secara stabil dalam waktu lama, tetapi keuntungannya lambat laun menurun dan bahkan terhenti di satu titik. Dalam beberapa bulan terakhir, saya telah menghabiskan banyak upaya untuk renovasi dan saat ini saya mampu menghasilkan sejumlah uang. Artikel ini akan memperkenalkan ide-ide saya untuk strategi frekuensi tinggi dan beberapa kode yang disederhanakan secara lebih rinci, yang dapat menjadi titik awal diskusi. Semua orang dipersilakan untuk berkomunikasi dan memberikan masukan.
Untuk akun yang menerima potongan harga, dengan mengambil Binance sebagai contoh, potongan harga maker saat ini adalah 0,5% dari 100.000. Jika volume transaksi harian adalah 100 juta U, potongan harga akan menjadi 5.000 U. Tentu saja, biaya pengambil masih didasarkan pada tarif VIP, jadi jika strategi tidak mengharuskan penerimaan pesanan, level VIP akan berdampak kecil pada strategi frekuensi tinggi. Secara umum, berbagai tingkat pertukaran memiliki nilai rabat yang berbeda, dan mengharuskan mempertahankan volume transaksi yang lebih tinggi. Dahulu kala, ketika pasar beberapa mata uang berfluktuasi sangat besar, masih ada keuntungan bahkan tanpa rabat. Dengan meningkatnya sirkulasi internal, rabat menyumbang sebagian besar keuntungan, dan bahkan sepenuhnya bergantung pada rabat. Pedagang frekuensi tinggi mengejar Nilai tertinggi.
kecepatan. Alasan mengapa strategi frekuensi tinggi disebut frekuensi tinggi adalah karena sangat cepat. Bergabung dengan server colo bursa untuk mendapatkan latensi terendah dan koneksi paling stabil juga menjadi salah satu syarat sirkulasi internal. Konsumsi waktu internal dari strategi tersebut juga harus serendah mungkin. Artikel ini akan memperkenalkan kerangka kerja websocket yang saya gunakan, yang menggunakan eksekusi bersamaan.
Pasar yang tepat. Perdagangan frekuensi tinggi dikenal sebagai permata perdagangan kuantitatif. Saya yakin banyak pedagang terprogram telah mencobanya, tetapi kebanyakan orang mungkin berhenti karena mereka tidak menghasilkan uang dan tidak dapat menemukan cara untuk meningkatkannya. Alasan utamanya mungkin bahwa mereka mencari jalan yang salah. Pasar perdagangan. Pada tahap awal strategi, seseorang harus mencari pasar yang relatif mudah untuk menghasilkan uang dari perdagangan, sehingga akan ada keuntungan dan umpan balik mengenai perbaikan, yang akan kondusif bagi kemajuan strategi. Jika Anda memulai di pasar yang paling kompetitif dan bersaing dengan banyak pesaing potensial, Anda akan kehilangan uang tidak peduli seberapa keras Anda mencoba dan Anda tidak akan mampu bertahan lebih lama lagi. Saya merekomendasikan pasangan perdagangan kontrak berjangka yang baru saja terdaftar. Saat ini, tidak banyak pesaing, terutama ketika volume perdagangan relatif besar. Ini adalah waktu termudah untuk menghasilkan uang. BTC dan ETH memiliki volume perdagangan terbesar dan transaksi paling aktif, tetapi keduanya juga paling sulit untuk bertahan.
Hadapi persaingan secara langsung. Setiap pasar perdagangan berubah secara dinamis. Tidak ada strategi perdagangan yang dapat berhasil sekali dan untuk selamanya. Hal ini bahkan lebih jelas terlihat dalam perdagangan frekuensi tinggi. Memasuki pasar ini berarti bersaing secara langsung dengan sekelompok pedagang yang paling cerdas dan paling tekun. Dalam pasar yang jumlah-nolnya, makin banyak Anda memperoleh penghasilan, makin sedikit penghasilan orang lain. Semakin lambat Anda masuk, akan semakin sulit. Mereka yang sudah ada di pasar juga harus terus meningkatkan kemampuan karena mereka dapat tersingkir kapan saja. Tiga atau empat tahun lalu seharusnya menjadi kesempatan terbaik. Akhir-akhir ini, aktivitas pasar mata uang digital secara keseluruhan telah menurun, dan sekarang sangat sulit bagi pemula untuk terlibat dalam perdagangan frekuensi tinggi.
Ada banyak jenis strategi frekuensi tinggi
Strategi saya adalah gabungan dari tren dan penentu pasar. Pertama-tama saya menentukan tren, kemudian menempatkan pesanan, dan segera menempatkan pesanan jual setelah transaksi selesai. Saya tidak memiliki posisi inventaris. Kode strategi diperkenalkan di bawah ini.
Kode berikut ini didasarkan pada arsitektur dasar kontrak berjangka panjang Binance dan terutama berlangganan informasi pasar perdagangan arus pesanan mendalam websocket dan informasi posisi. Karena informasi pasar dan informasi akun didaftarkan secara terpisah, maka perlu menggunakan read(-1) secara terus-menerus untuk menentukan apakah informasi terkini diperoleh. EventLoop(1000) digunakan di sini untuk menghindari loop tak terbatas secara langsung dan mengurangi beban sistem. EventLoop(1000) akan diblokir hingga wss atau tugas bersamaan kembali, dengan batas waktu 1000 ms.
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()
}
//需要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是设定的交易对
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 disebutkan sebelumnya, strategi frekuensi tinggi saya mengharuskan penentuan tren sebelum melakukan pembelian dan penjualan. Tren jangka pendek terutama dinilai berdasarkan data transaksi setiap transaksi, yaitu aggTrade dalam langganan, yang mencakup arah transaksi, harga, kuantitas, waktu transaksi, dll. Acuan utama untuk membeli dan menjual adalah kedalaman dan volume perdagangan. Berikut ini adalah pengenalan terperinci tentang indikator-indikator yang perlu diperhatikan. Sebagian besar indikator dibagi menjadi dua kelompok: beli dan jual, dan dihitung secara dinamis dalam rentang waktu tertentu. Rentang waktu strategi saya adalah dalam 10 detik.
//bull代表短期看涨,bear短期看跌
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;
Apabila harga jual terakhir lebih besar dari harga jual rata-rata, harga beli terakhir lebih besar dari harga beli rata-rata, dan nilai order beli interval tetap lebih besar dari nilai order jual, maka dinilai bullish jangka pendek. . Sebaliknya, ia bersikap bearish.
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 ide lama dan mengulang kedalaman ke jumlah yang dibutuhkan. Di sini kita berasumsi bahwa order beli 10 koin dapat dieksekusi dalam waktu 1 detik. Tanpa mempertimbangkan order tertunda baru, harga order jual ditetapkan ke posisi di mana pesanan beli 10 koin akan berhasil. Anda perlu mengatur sendiri jangka waktu spesifiknya.
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Rasio adalah singkatan dari Rasio Tetap yang berarti jumlah pesanan beli merupakan rasio tetap dari jumlah pesanan jual terkini. Strategi ini dapat menyesuaikan ukuran pesanan secara adaptif berdasarkan 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 harga pasar rata-rata. Perintah beli hanya akan ditempatkan ketika spread bid-ask lebih besar dari kelipatan tertentu dari nilai ini dan trennya bullish. Jika Anda menahan perintah short, posisi tersebut juga akan ditutup pada saat ini untuk menghindari penahanan pesanan jangka panjang. Anda dapat menempatkan order pembuat saja untuk memastikan order yang tertunda dieksekusi. Dan Anda dapat menggunakan ID pesanan khusus Binance, jadi Anda tidak perlu menunggu pesanan dikembalikan.
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 = []
}
/*
需要的任务参数写在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()]})
*/