리소스 로딩... 로딩...

디지털 화폐의 하이프레크 전략에 대한 자세한 소개

저자:초목, 창작: 2023-03-10 10:09:13, 업데이트: 2024-11-11 22:39:27

img

[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 초 이내에 있다.

  • 거래당 평균 거래량, 거래당 거래량은 100ms 이내에 같은 방향과 가격에 다른 주문의 집계이며, 구매 주문의 크기를 반영합니다. 이 데이터 무게는 더 높습니다. 구매 주문이 판매 주문보다 거래량이 더 많으면 구매자가 지배하는 시장이라고 가정 할 수 있습니다.
  • 주문 주파수 또는 주문 간격, 또한 매각 데이터에 기초하여, 앞의 평균 거래량은 시간 개념에 상관없이 완전히 정확하지 않습니다. 한 방향의 주문은 평균 거래량이 작지만 빈도가 높으면 또한 방향의 강도에 기여합니다. 평균 거래량 * 주문 빈도는 고정된 간격의 총 거래량을 나타냅니다. 직접 비교를 위해 사용할 수 있습니다. 특정 이벤트에 도달하는 주문은 파파손 분포에 적합하며, 단일 위치에 대한 참조를 제공하는 간단한 추정 시간 간격에 도달하는 전체 주문의 규모가 얼마나 되는지 쉽게 추정 할 수 있습니다.
  • 평균 거래소 차이는, 이 비교가 더 이해하기 쉽다는 것을 알 수 있다. 현재 거래소 대부분은 1 틱의 차이는, 만약 거래소 차이가 커지면, 종종 시장이 나타난다는 것을 의미한다.
  • 평균 매매 가격, 각 거래에 따른 매매가격의 평균을 계산하여 최신 가격과 비교한다. 예를 들어, 최근 매매가격이 평균 매매가격보다 더 높으면 초기 판정을 통해 돌파구를 발생시킬 수 있다.

전략적 논리

단기 동향을 판단합니다.

//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() +"&timestamp="+Date.now()]})
*/

감시된 데이터

  • 지연, 고주파 전략의 속도의 중요성은 강조되어 왔으며, 전략은 시세, 철회, 위치 반환, 깊이, 주문 흐름, 위치, 전체 순환 등 다양한 지연을 모니터링하고 기록해야 한다. 비정상적인 지연이 있는 경우, 적절한 시기에 분류하고 전체 전략 지연을 줄이는 방법을 찾아야 한다.
  • 거래량 비중, 통계에 따르면 거래량이 전체 거래량의 비중이며, 비중이 낮으면 상승할 여지가 있습니다. 정점 시점에는 전략 비중이 전체 거래량의 10% 이상을 차지하는 것도 가능합니다.
  • 평형 수익률, 통계적으로 평균 평형 수익률은 전략의 효과 여부를 판단하는 가장 중요한 기준이다.
  • 수수료의 비율, 통계에 따르면 수수료의 비율은 전체 수익의 비율로, 수수료에 대한 전략의 의존도를 반영한다. 모든 다른 수수료 레벨을 거래하고, 수익이없는 전략은 아마도 수수료가 한 단계 높으면 수익을 올릴 수 있다.
  • 하부 주문 실패 비율, 주문은 하부 주문 거래에만 매달려 있으며, 하부 주문의 지연으로 인해 매달릴 수 없을 수 있습니다. 이 비율이 높으면 전략의 속도가 좋지 않다는 것을 나타냅니다.
  • 거래되는 주문 비율, 플랫폼은 종종 거래율에 대한 요구 사항을 가지고 있으며 너무 낮으면 전략 철수가 너무 자주 발생하여 해결해야한다는 것을 보여줍니다.
  • 평균 매매 주문 거리, 이 데이터는 전략 주문과 매각의 간격을 반영하고 있으며, 대부분 매매를 한 번 구매하는 위치를 차지하고 있음을 볼 수 있습니다.

다른 제안

  • 거래 다화폐, 이 문서의 고주파 전략은 단일 거래소 단일 통화 시장을 참조하는 것 만으로, 제한성이 크며, 대부분의 상황과 대부분의 통화들은 수익성이 높지 않지만, 또한 어떤 통화들이 미래에 수익성이 높을지 예측할 수 없기 때문에 여러 개 또는 모든 통화들을 거래할 수 있기 때문에 기회를 놓치지 마십시오. 거래소 주파수 제한에도 불구하고 하나의 로봇은 여러 거래 쌍을 거래할 수 있으며, 물론 최적의 속도를 위해 하나의 계정으로 하나의 거래를 거래할 수 있고, 하나의 서버로 하나의 로봇을 처리할 수 있습니다.
  • 수익률에 따라 단위량 및 주문 조건이 결정된다. 거래 다화면은 시도의 비용이 너무 높을 수 있으며, 모니터링이 수익성이 없다면 최소 거래량과 거래 주파수를 줄여서 전략적 동적 모니터링이 수익률이 긍정적일 때까지 거래량을 점차 높여 수익을 올릴 수 있다.
  • 더 많은 정보를 얻으려면, 높은 주파수 거래의 또 다른 특징은 처리되는 데이터의 양이 더 많고 사용되는 정보가 더 많습니다. 단일 거래소 내장 거래 쌍의 모든 시장 정보가 참조되어야하며, 영구적으로 현장 데이터를 참조 할 수 있으며, 다른 거래소에서 거래 쌍의 데이터를 참조 할 수 있습니다. 심지어 다른 통화 데이터, 더 많은 데이터가 더 큰 장점도 있습니다. 예를 들어, Binance는 심볼에 따라 가장 선호되는 올린 목록 정보를 구독 할 수 있습니다.
  • 바이안의 서버는 aws 도쿄에 있으며 다른 거래소 서버는 다릅니다.
  • 이 문서의 전략 코드는 단순한 예시 코드이며, 많은 번거로운 세부 사항을 제거하고 사용된 지표는 직접 사용되지 않고 참조를 위해 사용됩니다. 실제로 고주파 전략을 실행하는 것은 많은 세부 사항에 관심을 기울여야하며 인내심을 가지고 수정해야합니다.

관련

더 많은

mztcoin라스 신, 판매의 논리는 무엇입니까? 거래 후 즉시 주문을 판매하고, 재고 보관소를 보유하지 않습니다.

mztcoin풀의 신

초원 신 코보보 1

77924998어떤 AWS 서버를 사용합니까?

키티강제하고 강제합니다.

그라신 (Grasshopper) 은 유료의 HF 코스를 제공합니다.

내 마음은 여전히이 전략은 복제할 수 있는 방법일 수 있을까요?

작가: 트레이드맨초파수를 불러서 더 많은 것을 가르치고, 초파수 거래에 대한 입문 학습을 희망합니다~

♪ 바람에 파는 물결 ♪강인함

fmzero초록색의 신!

오크 정량화강인함

초목이 모든 것은 매우 어렵고, 의미가 없습니다.