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

전략 템플릿은 웹소켓 마켓을 원활하게 사용할 수 있습니다

저자:FMZ~리디아, 창작: 2024-10-30 14:23:04, 업데이트: 2024-11-01 10:37:04

img

이것은 FMZ가 공식적으로 개발한 웹소켓 시장 템플릿입니다. 모든 사용자가 복사하여 사용하는 것을 환영합니다:https://www.fmz.com/strategy/470349

왜 웹소켓이 필요하죠?

현재 FMZ 전략은 주로 전통적인 REST API 캡슐화를 기반으로합니다. API 액세스의 각 단계에는 네트워크 연결이 설정되어야하며 시장 데이터는 여론조사를 통해 획득됩니다. 이 방법은 간단하고 사용하기 쉽고 대부분의 필요에 완전히 충분합니다.

그러나 REST 프로토콜에는 고유한 지연 문제가 있습니다. 여러 거래 쌍과 여러 교환 전략이 필요할 때 지연 문제가 확대됩니다. 플랫폼의 Go 함수가 동시에 실행 될 수 있지만, 지연 문제가 여전히 존재하여 상대적으로 높은 주파수 전략 거래의 요구를 충족시키는 것이 어렵습니다. 또한, 너무 많은 거래 쌍이 있고 투표 주파수가 너무 빠르면 거래 플랫폼의 액세스 주파수 제한에 직면 할 것입니다.

현재, 거래소 서버 또한 무거운 부담을 겪고 있다. 그들은 모두 완전한 웹소켓 프로토콜을 제공하고 API 사용자에게 추천한다. REST 프로토콜과 비교하면, 웹소켓은 지속적인 양방향 연결 방법을 제공하여 교환이 데이터를 클라이언트로 실시간으로 푸시하여 빈번한 요청과 응답을 피하여 대기 시간을 크게 줄일 수 있다. 일반적으로, REST API에 액세스하는 지연이 20ms 정도라면, 웹소켓을 통해 데이터를 푸시하는 지연은 약 2ms이다. 또한, 웹소켓 프로토콜과의 링크는 플랫폼 액세스 주파수에 의해 제한되지 않으며, 한 번에 수십 개의 거래 쌍에 가입할 수 있다.

웹소켓 틱러 템플릿 소개

FMZ 퀀트 트레이딩 플랫폼은 오랫동안 웹소켓 프로토콜을 지원하고 있으며, 상대적으로 호출하기가 편리하지만 초보자 사용자에게는 여러 구독을 처리하고 여러 교환 틱에 가입하고 전체 전략 프로세스에 효율적이고 편리하게 삽입하는 것이 여전히 너무 복잡합니다. 이 공개 웹소켓 실시간 틱어 데이터 가속 템플릿은 이 문제를 해결한다. 그것은 매우 사용하기 쉽고 현재 캡슐화된 API 호출과 완전히 호환된다. 대부분의 원래 REST 전략에 대해, 당신은 단순히 그들을 수정하고 전략을 가속시키기 위해 직접 사용할 수 있다.

주요 특징:

  • 다중 거래소 지원: 이 전략은 바이낸스, OKX, Bybit, Bitget 등 여러 거래소의 WebSocket 연결을 지원합니다. 사용자는 이 템플릿의 패키징 방법을 따라 더 많은 거래소를 지원할 수 있습니다.
  • 사용자 정의 가능한 구독: 특정 시장 채널에 가입 할 수 있습니다 (지속, 거래 등) 및 거래 전략에서 즉각적인 사용을 위해 수신 된 데이터를 효율적으로 처리합니다.
  • 고급 오류 처리: 데이터 흐름의 신뢰성 및 연속성을 보장하기 위해 오류 추적 및 WebSocket 재연결 메커니즘이 구축되었습니다.

실행 원칙에 대한 간략한 소개

이 전략은 타입스크립트를 사용한다는 점에 유의하십시오. 만약 당신이 자바스크립트를만 알고 있다면, 약간 이상하게 보일 수 있습니다. 타입스크립트는 자바스크립트를 기반으로 한 타입 시스템과 더 풍부한 언어 기능을 도입합니다. 복잡한 논리를 처리해야 하는 양적 거래와 같은 응용 프로그램에서, 타입스크립트를 사용하면 잠재적 오류를 줄이고 코드의 가독성 및 유지보수를 향상시킬 수 있습니다. 따라서 간단히 배우는 것이 좋습니다.

또한 전략은 FMZ 플랫폼의 비동기 메커니즘을 사용합니다. 자식 스레드는 __threadPostMessage 함수를 통해 메인 스레드에 메시지를 보낼 수 있습니다. 이 방법은 비동기적이며 자식 스레드에서 생성되는 데이터 업데이트의 메인 스레드를 알리는 데 적합합니다. 메인 스레드와 자식 스레드는 __threadGetData 및 __threadSetData 함수를 통해 데이터를 공유 할 수 있습니다. 이 방법은 스레드에 공유 상태를 액세스하고 수정할 수 있습니다. 플랫폼 문서와 결합하여 멀티 스레딩에 대해 배우고 싶다면이 전략은 또한 좋은 학습 예입니다.

이 전략의 주요 원칙은 웹소켓을 통해 주류 디지털 통화 거래소에 연결하고 데이터 지원을 제공하기 위해 실시간 시장 데이터 (깊은 정보 및 거래 정보와 같은) 를 수신하는 것입니다. 구체적인 구현 과정은 다음과 같습니다.

1. 웹소켓 연결 설정기능setupWebsocket웹소켓 연결을 초기화하고 시장 데이터를 수신하는 데 사용됩니다. 그것은 매개 변수를 수신main_exchanges, 연결하는 교환을 표시합니다.

  • MyDial 기능: 웹소켓 연결을 만들고 연결 시간을 기록하고 연결을 닫을 때 종료 시간을 출력합니다.
  • updateSymbols 기능: 새로운 가입 요청이 있는지 정기적으로 확인하고 필요한 경우 현재 거래 쌍 목록을 업데이트하십시오.

2. 데이터 처리물체supports지원되는 교환과 처리 기능을 정의합니다.Binance) 각 교환의 처리 기능은 수신된 메시지를 분석하고 관련 데이터를 추출하는 데 책임이 있습니다.

  • processMsg 기능: 거래소로부터의 메시지를 처리하고, 다양한 유형의 데이터를 식별합니다. (깊은 업데이트, 트랜잭션 등과 같이)

3. 가입자 정보각 연결에서 시스템은 현재 거래 쌍에 기반한 관련 시장 데이터 채널에 가입합니다.

  • getFunction 기능: 교환 이름에 따라 대응 처리 기능을 얻으십시오.
  • this.wssPublic 기능: 웹소켓 연결을 초기화 하 고 데이터를 수신 시작 합니다.

4. 스레드 관리각 교환에 대한 스레드를 시작하여 실시간으로 데이터를 수신하고 콜백 기능을 통해 데이터를 처리합니다.

  • threadMarket 기능: 자식 스레드에서 데이터를 수신, 분석 및 최신 깊이 및 거래 정보를 저장합니다.

5. 데이터 획득 방법을 다시 작성각 거래소에 대한 깊이와 거래 정보를 얻는 방법을 다시 작성하고 실시간으로 업데이트되는 데이터를 반환하는 것을 우선시합니다.

템플릿을 사용하는 방법

  1. 초기화: 사용$.setupWebsocket()목표 교환의 웹소켓 연결을 초기화하기 위해.
  2. 구독: 시스템은 당신이 거래하는 제품에 대한 관련 채널 (지속, 거래 등) 에 자동으로 가입합니다.
  3. 데이터 수집:GetDepth()그리고GetTrades()함수, 시장 깊이 및 거래 기록은 웹소켓 실시간 데이터를 사용하여 자동으로 반환됩니다.
  4. 오류 처리: 이 전략은 연결과 데이터 오류를 기록하는 추적 메커니즘을 포함하고 연결이 손실되면 자동으로 다시 연결하려는 시도를 포함합니다.

전략에 EventLoop() 함수가 추가되면 트리거 메커니즘으로 변경됩니다. wss 데이터 업데이트가있을 때 자동으로 즉시 검색하고 최신 데이터가 없으면 기다립니다. 지능형 잠자리 기능과 동등합니다. 물론, 직접 잠자리를 사용할 수도 있습니다.

function main() {
    $.setupWebsocket()
    while (true) {
        exchanges.map(e=>{
            Log(e.GetName(), e.GetDepth())
            Log(e.GetName(), e.GetTrades())
        })
        EventLoop(100) // trigger by websocket
    }
}

제 이전 다화 거래 전략 가이드를 참조하십시오:https://www.fmz.com/bbs-topic/10508, 웹소켓을 지원하기 위해 쉽게 수정할 수 있습니다:

function MakeOrder() {
    for (let i in Info.trade_symbols) {
        let symbol = Info.trade_symbols[i];
        let buy_price = exchange.GetDepth(symbol + '_USDT').Asks[0].Price;
        let buy_amount = 50 / buy_price;
        if (Info.position[symbol].value < 2000){
            Trade(symbol, "buy", buy_price, buy_amount, symbol);
        }
    }
}

function OnTick() {
    try {
        UpdatePosition();
        MakeOrder();
        UpdateStatus();
    } catch (error) {
        Log("loop error: " + error);
    }
}

function main() {
    $.setupWebsocket()
    InitInfo();
    while (true) {
        let loop_start_time = Date.now();
        if (Date.now() - Info.time.last_loop_time > Info.interval * 1000) {
            OnTick();
            Info.time.last_loop_time = Date.now();
            Info.time.loop_delay = Date.now() - loop_start_time;
        }
        Sleep(5);
    }
}

더 많은