[TOC] 2020년, 저는 HF 전략에 대해 글을 썼습니다.https://www.fmz.com/digest-topic/6228▲ 많은 관심을 받았지만 글은 깊이 있지 않습니다. 시간이 2 년 이상 지나고 시장도 변화했습니다. 그 기사가 발표 된 후, 내 HF 전략은 오랫동안 안정적으로 수익을 올렸지만 천천히 수익이 점차 감소하거나 중단되었습니다. 최근 몇 달 동안 다시 노력하여 개조했으며 현재 약간의 돈을 벌 수 있습니다. 이 기사는 내 HF 전략의 아이디어와 일부 단순화 된 코드를 더 자세히 소개합니다.
환급 계좌, 예를 들어, 현재 메이커 환급은 10만분의 5이고, 하루 거래량이 1억U인 경우 환급은 5000U이다. 물론 타커는 VIP 요금에 따라, 따라서 전략이 요금을 지불할 필요가 없다면, VIP 순위가 고주파 전략에 큰 영향을 미치지 않는다. 일반적인 거래소에는 다른 순위와 다른 환급도 있으며, 높은 거래량을 유지해야 한다.
속도. 하이프레크 정책은 빠른 속도이기 때문에 하이프레크라고 불립니다. 거래소 콜로 서버에 가입하여 최소 지연과 가장 안정적인 연결을 얻는 것도 내장 룰의 조건 중 하나입니다. 정책의 내장 시간은 가능한 한 낮아야합니다.
적절한 시장. 높은 주파수 거래는 정량 거래의 진주라고 불리며, 많은 프로그래머 트레이더들이 시도했지만 대부분의 사람들이 돈을 벌지 못하고 개선 방향을 찾지 못하기 때문에 중단해야한다고 믿는 것이 올바른 거래 시장을 찾는 것이 주된 이유입니다. 전략의 초기 단계는 거래하기 쉬운 상대적으로 쉬운 시장을 찾는 것이 좋습니다. 이렇게 유리한 점과 개선된 피드백이 전략의 발전을 유도합니다. 가장 치열한 경쟁 시장에서 시작하면 많은 잠재적 인 라이벌과 경쟁하고, 어떻게 시도하면 돈을 잃는지 않으면 빨리 지속되지 않습니다.
경쟁에 직면한다. 모든 거래의 시장은 역동적으로 변하고, 거래 전략은 한 번 영원히 사용할 수 없으며, 고 빈도 거래는 더 분명하며, 이 시장에 진입하면 가장 똑똑하고 가장 열심히 일하는 거래자들과 직접 경쟁합니다. 제로 및 게임 시장에서, 당신은 다른 사람들보다 더 많은 돈을 벌습니다. 진입 시간이 늦어질수록 어려움이 높아지고, 시장에 이미 계속 개선되고 있으며 언제든지 제거 될 수 있습니다.
고주파 전략은 여러 가지로 나
내 전략은 트렌드와 시장의 조합입니다. 트렌드를 판단하고 주문을 올리고 거래 후 즉시 주문을 올리고 판매합니다.
아래의 코드는 비트코인 영구계약 기반의 아키텍처이며, 주로 웹소켓의 심층 깊이 주문 흐름 트레이드 시장과 포지션 위치 정보를 구독한다. 시장과 계정 정보가 각각 구독되기 때문에 최신 정보에 대한 접근 여부를 판단하기 위해 지속적으로 read ((-1) 를 사용해야 하기 때문에, 여기서 EventLoop ((1000) 을 사용하여 직접적인 사상순환을 피하고 시스템 부하를 줄인다. EventLoop ((1000) 은 WSS 또는 동시에 임무가 돌아오는 것을 차단하고 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)
}
}
앞서 언급한 바와 같이, 나의 고주파 전략은 트렌드를 판단하고 거래를 실행하는 것을 요구한다. 단기 트렌드를 판단하는 것은 주로 거래 데이터에 기초한 것이다. 즉, 가입된 aggTrade, 거래 방향, 가격, 양, 거래 시간 등을 포함한다. 파는 주요 참조 깊숙이 및 거래량이다. 아래에서 자세히 설명할 때 주목해야 할 지표는 대부분의 지표가 두 그룹으로 나뉘어져 있으며, 특정 시간 창문에서 동적 통계이며, 나의 전략의 시간 창문은 10 초 이내에 있다.
//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;
최근 판매가격이 판매편의 평균 가격, 최근 구매가격이 구매편의 평균 가격, 고정 간격 구매가격이 판매편의 값보다 더 큰 경우 단기 상승 또는 하락을 판단한다.
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]
}
여기서는 여전히 오래된 생각을 가지고, 필요한 금액으로 반복 깊이를 취하고, 여기서는 1s 안에 10달러의 결제금을 거래할 수 있다고 가정하고, 새로운 결제금을 고려하지 않는 경우, 판매单의 가격을 10달러의 결제금이 도달하는 위치에 설정합니다. 얼마나 많은 구체적인 시간 창문이 스스로 설정되어야합니까?
let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time
비율은 고정된 비율을 나타냅니다. 구매량은 최근 판매된 주문량의 고정된 비율을 나타냅니다. 이 전략은 현재 구매 및 판매 활동에 따라 주문 크기를 조정할 수 있습니다.
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)
}
이 중 avg_diff은 평균 거래소의 차이이며, 현재 주문의 구매 판매 차이값이 특정 배수의 이 값보다 커서 유망할 때만 지불할 수 있으며, 빈 주문을 보유하면 이 때도 평형화되어 장기 청구서를 피할 수 있습니다.
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()]})
*/
mztcoin라스 신, 판매의 논리는 무엇입니까?
mztcoin풀의 신
77924998어떤 AWS 서버를 사용합니까?
내 마음은 여전히이 전략은 복제할 수 있는 방법일 수 있을까요?
작가: 트레이드맨초파수를 불러서 더 많은 것을 가르치고, 초파수 거래에 대한 입문 학습을 희망합니다~
♪ 바람에 파는 물결 ♪강인함
fmzero초록색의 신!
오크 정량화강인함
초목이 모든 것은 매우 어렵고, 의미가 없습니다.