
[TOC] Saya menulis artikel pada tahun 2020 yang memperkenalkan strategi frekuensi tinggi, https://www.fmz.com/digest-topic/6228. Walaupun mendapat perhatian ramai, ia tidak ditulis secara mendalam. Lebih daripada dua tahun telah berlalu dan pasaran telah berubah. Selepas artikel itu diterbitkan, strategi frekuensi tinggi saya dapat menghasilkan wang secara berterusan untuk masa yang lama, tetapi keuntungan beransur-ansur berkurangan malah dihentikan pada satu ketika. Dalam beberapa bulan kebelakangan ini, saya telah menghabiskan banyak usaha untuk pengubahsuaian dan pada masa ini saya boleh menjana sedikit wang. Artikel ini akan memperkenalkan idea saya untuk strategi frekuensi tinggi dan beberapa kod yang dipermudahkan dengan lebih terperinci, yang boleh menjadi titik permulaan untuk perbincangan Semua orang dialu-alukan untuk berkomunikasi dan memberi maklum balas.
Untuk akaun yang menerima rebat, mengambil Binance sebagai contoh, rebat pembuat semasa ialah 0.5% daripada 100,000 Jika volum transaksi harian ialah 100 juta U, rebatnya ialah 5,000 U. Sudah tentu, yuran pengambil masih berdasarkan kadar VIP, jadi jika strategi tidak memerlukan pengambilan pesanan, tahap VIP akan memberi sedikit kesan kepada strategi frekuensi tinggi. Secara amnya, tahap pertukaran yang berbeza mempunyai kadar rebat yang berbeza, dan memerlukan mengekalkan volum transaksi yang lebih tinggi. Pada masa dahulu, apabila pasaran beberapa mata wang turun naik dengan ketara, masih terdapat keuntungan walaupun tanpa rebat Dengan involusi peredaran dalaman, rebat menyumbang sebahagian besar keuntungan, malah bergantung sepenuhnya pada rebat yang dikejar oleh pedagang frekuensi tinggi Kadar teratas.
kelajuan. Sebab mengapa strategi frekuensi tinggi dipanggil frekuensi tinggi adalah kerana ia sangat pantas. Menyertai pelayan colo pertukaran untuk mendapatkan kependaman terendah dan sambungan paling stabil juga telah menjadi salah satu syarat untuk peredaran dalaman. Penggunaan masa dalaman strategi juga harus serendah mungkin. Artikel ini akan memperkenalkan rangka kerja websocket yang saya gunakan, yang menggunakan pelaksanaan serentak.
Pasaran yang betul. Perdagangan frekuensi tinggi dikenali sebagai permata perdagangan kuantitatif Saya percaya bahawa ramai pedagang terprogram telah mencubanya, tetapi kebanyakan orang mungkin berhenti kerana mereka tidak menjana wang dan tidak dapat mencari jalan untuk menambah baik bahawa mereka mencari jalan yang salah Pasaran dagangan. Pada peringkat awal strategi, seseorang harus mencari pasaran yang agak mudah untuk membuat perdagangan wang, supaya akan ada keuntungan dan maklum balas mengenai penambahbaikan, yang akan kondusif untuk kemajuan strategi. Jika anda bermula dalam pasaran yang paling kompetitif dan bersaing dengan banyak pesaing yang berpotensi, anda akan kehilangan wang tidak kira seberapa keras anda mencuba dan anda tidak akan dapat bertahan lagi. Saya mengesyorkan pasangan dagangan kontrak perpetual yang baru disenaraikan Pada masa ini, tidak begitu banyak pesaing, terutamanya apabila jumlah dagangan agak besar. Ini adalah masa yang paling mudah untuk membuat wang. BTC dan ETH mempunyai volum dagangan terbesar dan transaksi paling aktif, tetapi ia juga paling sukar untuk bertahan.
Menghadapi pertandingan secara berterusan. Mana-mana pasaran dagangan berubah secara dinamik Tiada strategi perdagangan boleh berfungsi sekali dan untuk semua Ini lebih jelas dalam perdagangan frekuensi tinggi Memasuki pasaran ini bermakna bersaing secara langsung dengan kumpulan pedagang yang paling bijak dan tekun. Dalam pasaran jumlah sifar, lebih banyak yang anda perolehi, semakin kurang pendapatan orang lain. Semakin lama anda masuk, semakin sukar mereka yang sudah berada di pasaran juga mesti terus bertambah baik kerana mereka mungkin akan dihapuskan pada bila-bila masa. Tiga atau empat tahun yang lalu sepatutnya menjadi peluang terbaik Baru-baru ini, keseluruhan aktiviti pasaran mata wang digital telah menurun, dan kini amat sukar bagi orang baru untuk terlibat dalam perdagangan frekuensi tinggi.
Terdapat banyak jenis strategi frekuensi tinggi
Strategi saya adalah gabungan trend dan pembuat pasaran Saya mula-mula menentukan arah aliran, kemudian membuat pesanan, dan segera membuat pesanan jual selepas urus niaga selesai Saya tidak memegang kedudukan inventori.
Kod berikut adalah berdasarkan seni bina asas kontrak kekal Binance, dan terutamanya melanggan kepada aliran pesanan mendalam soket web perdagangan maklumat pasaran dan maklumat kedudukan. Memandangkan maklumat pasaran dan maklumat akaun dilanggan secara berasingan, adalah perlu untuk menggunakan baca(-1) secara berterusan untuk menentukan sama ada maklumat terkini diperolehi EventLoop(1000) digunakan di sini untuk mengelakkan gelung tak terhingga langsung dan mengurangkan beban sistem. EventLoop(1000) akan disekat sehingga wss atau tugasan serentak kembali, dengan tamat masa 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()
}
//需要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 yang dinyatakan sebelum ini, strategi frekuensi tinggi saya memerlukan penentuan arah aliran sebelum melaksanakan pembelian dan penjualan. Aliran jangka pendek dinilai terutamanya berdasarkan data transaksi setiap transaksi, iaitu, aggTrade dalam langganan, yang merangkumi arah transaksi, harga, kuantiti, masa transaksi, dsb. Rujukan utama untuk membeli dan menjual adalah kedalaman dan volum dagangan. Berikut ialah pengenalan terperinci kepada penunjuk yang memerlukan perhatian Kebanyakan penunjuk dibahagikan kepada dua kumpulan: beli dan jual, dan dikira secara dinamik dalam tetingkap masa tertentu.
//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;
Jika harga jualan terkini adalah lebih besar daripada harga jualan purata, harga belian terkini adalah lebih besar daripada harga belian purata, dan nilai pesanan belian selang tetap lebih besar daripada nilai pesanan jualan, maka ia dinilai sebagai kenaikan harga jangka pendek. . Sebaliknya, ia adalah menurun.
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 kami masih mengguna pakai idea lama dan mengulangi kedalaman kepada jumlah yang diperlukan Di sini kami mengandaikan bahawa pesanan belian sebanyak 10 syiling boleh dilaksanakan dalam masa 1 saat Tanpa mengambil kira pesanan belum selesai, harga pesanan jual ditetapkan pada kedudukan di mana pesanan belian 10 syiling akan melanda. Anda perlu menetapkan sendiri saiz tetingkap masa tertentu.
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
Nisbah bermaksud Nisbah Tetap, yang bermaksud kuantiti pesanan beli ialah nisbah tetap bagi kuantiti pesanan jualan terkini. Strategi ini boleh menyesuaikan saiz pesanan berdasarkan aktiviti jual beli semasa.
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)
}
Antaranya, avg_diff ialah perbezaan harga pasaran purata Pesanan belian hanya akan diletakkan apabila spread bid-ask lebih besar daripada berganda tertentu nilai ini dan arah aliran adalah menaik juga akan ditutup pada masa ini untuk mengelakkan pegangan jangka panjang pesanan. Anda boleh membuat pesanan pembuat sahaja untuk memastikan pesanan yang belum selesai dilaksanakan. Dan anda boleh menggunakan ID pesanan tersuai Binance, jadi anda tidak perlu menunggu pesanan dipulangkan.
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()]})
*/