[TOC]

기본 지침

시작 하는 일

FMZ 양자 거래 플랫폼은 무엇을 할 수 있습니까?

FMZ 퀀트 트레이딩 플랫폼은 양적 거래 분야에서 가장 전문적인 양적 커뮤니티입니다. 여기에서 양적 전략을 배우고, 쓰고, 공유하고, 구매하고 판매 할 수 있습니다. 온라인 백테스팅을 수행하고 시뮬레이션 봇을 사용하여 시뮬레이션 거래를 수행 할 수 있습니다. 또한 라이브 거래를 실행, 공개 및 시청할 수 있습니다. 우리는 거의 모든 주류 디지털 통화 거래소를 지원합니다.

완전 한 튜토리얼 시리즈

그래픽 튜토리얼:

어떤 문제가 발생하면 언제든지 게시물을 작성하고 토론 할 수 있습니다. 또는 티켓을 제출하거나 Telegram 그룹에서 관리자에게 연락하십시오. (텔레그램), 일반적으로는 질문에 빠르게 대답 할 것입니다.

개발 지원에 대한 ChatGPT 지원

FMZ 양적 거래 플랫폼은 ChatGPT를 개발 지원 도구로 채택했습니다.ChatGPT 보조 도구 페이지.

어떤 프로그래밍 언어가 내 전략을 구현할 수 있을까요?

FMZ 퀀트 트레이딩 플랫폼을 사용 지원JavaScript, TypeScript, Python, C++, Pine Mylanguage그리고Blockly Visualization전략을 작성하고 설계하는 것입니다.

지원합니다.TypeScript언어, 여전히 설정JavaScript전략을 만들 때, 우리는 전략을 작성합니다.// @ts-check전략 코드의 시작 또는 버튼을 클릭TypeScript전략 편집 영역의 오른쪽 위쪽 구석에서TypeScript플랫폼이 코드를 인식하면TypeScript자동으로 작성하고 다음과 같은 적절한 컴파일 및 타입 검사 지원을 제공합니다.

  • 타입 안전성:TypeScript'의 정적 타입 검사 기능은 코드를 작성할 때 잠재적 오류를 발견하고 코드 품질을 향상시킬 수 있습니다.
  • 자동 코드 완료:TypeScript이 타입 시스템은 코드를 작성할 때 필요한 속성과 메소드를 더 빨리 찾아 개발 효율성을 향상시킵니다.
  • 더 명확한 코드 구조:TypeScript, 당신은 더 잘 조직하고 코드를 유지, 읽기 쉽고 이해하기 쉽게 만들 수 있습니다.
  • 강력한 객체 지향 프로그래밍 기능:TypeScript인터페이스, 클래스, 제네릭스 등과 같은 강력한 객체 지향 프로그래밍 기능을 제공합니다. 더 견고하고 재사용 가능한 전략 코드를 작성하는 데 도움이 됩니다.

이 언어 중 하나를 마스터 할 필요가 있습니다. 코드를 작성하여 전략을 설계하는 방법을 지원하는 것 외에도 시각 모듈 (Blockly) 을 사용하여 전략을 만들 수 있습니다. 시각화 모듈 스플라이싱 및 전략 구축은 코딩없이 전략을 설계하는 더 직관적인 방법을 채택하고 있으며, 이는 프로그래밍 및 양적 거래에 신속하게 시작할 수 있도록 전략 디자인에 대한 관심을 키우기에 매우 적합합니다.

Blockly시각화 자습서:

설정Python통역사Python전략 프로그램

전략은Python, 백테스팅 또는 라이브 트레이딩을 할 때, 도커 시스템 환경이파이썬2그리고파이썬3설치, 당신은 설정할 수 있습니다Python전략의 첫 번째 라인에서 실행 시에 출시 될 버전, 예를 들어#!python3그리고#!python2, 그래서 시스템이 자동으로 통역자를 찾을 수 있습니다. 그리고 당신은 또한 절대 경로를 지정할 수 있습니다, 예를 들어:#!/usr/bin/python3.

도커란 무엇인가요?

도커는 복잡한 데이터 요청, 데이터 수신, 네트워크 링크, 로그 포스트백 등을 담당하는 귀하의 거래 전략의 실행자로 이해할 수 있습니다. 도커는 서버에서 실행됩니다. FMZ 퀀트 트레이딩 플랫폼 웹 사이트가 네트워크 장애가 발생하더라도 도커의 운영에 영향을 미치지 않습니다. 도커는 실행 할 수 있습니다.리눅스, 윈도우, 맥 OS, 안드로이드, 라즈베리 파이 ARM 리눅스그리고 다른 시스템들.도커 페이지, 리눅스 도커 설치 및 업데이트 단계. 도커에 의해 관리되는 봇과 로그는 디렉토리에 저장됩니다./logs/storage이 파일은Sqlite데이터베이스 파일db3, 직접 편집 할 수 있습니다Sqlite관리 소프트웨어. 확장자를 가진 파일db3실제 봇 데이터베이스의 파일 이름은 봇 ID입니다.

지원된 프로토콜

  • 블록체인 자산: 50개 이상의 주류 블록체인 자산 (암호화폐) 거래소가 현재 우리 플랫폼에서 지원되고 있습니다.
  • 일반 프로토콜 접근:일반 프로토콜

전략 안전

FMZ 양적 거래 플랫폼에서 거래 전략이 개발되면 전략 내용은 FMZ 계정 소유자만 볼 수 있습니다. 그리고 FMZ 양적 거래 플랫폼에서 전략 코드의 완전한 현지화를 달성 할 수 있습니다. 예를 들어 전략 논리는Python전략 코드에 로드되는 패키지, 그래서 전략 콘텐츠 현지화가 실현될 수 있습니다.

안전성Python코드: 왜냐하면Python오픈 소스 언어로 컴파일하기가 매우 쉽습니다. 전략이 개인용이 아니라 임대용이라면, 전략을 직접 배포한 도커에서 실행하고 하위 계정 또는 전체 도커 관리 형태로 임대할 수 있습니다.

암호화는Python전략 코드: 기본적으로,Python전략 코드는 작가가 사용할 때 암호화되지 않고 타인에게 임대할 때 암호화됩니다. 다음 코드를 편집하여Python전략, 당신은 개인 사용 또는 임대에 대한 전략 코드를 암호화 여부를 지정할 수 있습니다.Python전략 코드 암호화를 지원하는 버전은 다음과 같습니다.Python 2.7, Python 3.5그리고Python 3.6.

  • 전략 작가는 직접 실행하고 다른 사람들이 등록 코드를 통해 사용할 수 있도록 전략 코드를 암호화합니다. 구체화#!python파이썬 인터프리터의 버전으로, 그리고,분리하기 위해; 암호 명령어를 입력encrypt만약 당신이 그 버전을Python, 추가#!,encrypt directly.
 #!python,encrypt

아니면

  #!encrypt
  • 전략 작성자가 자신의 사용을 위해 실행하고 등록 코드를 통해 다른 사람들과 공유 할 때 전략 코드를 암호화하지 않습니다:
  #!python, not encrypted

아니면

  #!not encrypted

코드 사용os.getenv('__FMZ_ENV__')암호화 코드가 유효한지 확인하기 위해; 문자열의 반환"encrypt"효력이 발생했음을 나타냅니다. 그것은 실제 봇에서만 유효하며, 백테스트는Python전략 코드

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

핵심 안전

FMZ 퀀트 트레이딩 플랫폼에서 구성된 계정 정보 및 전략 매개 변수에서 암호화 된 문자열과 같은 민감한 데이터는 웹 브라우저에서 암호화됩니다. FMZ 퀀트 트레이딩 플랫폼에 저장된 모든 정보는 암호화됩니다 (플라인텍스트 데이터가 아닙니다), 사용자만 개인 장치에서 정보를 해독하고 사용할 수 있습니다. 이는 민감한 데이터의 보안을 크게 향상시킵니다. 전략 코드, 매개 변수 설정 및 전략 설명 등에 다른 민감한 정보가 포함되어있는 경우 전략을 공개하거나 판매하지 마십시오.

  • 우리의 플랫폼은 교환 계좌 정보와 비밀 키와 같은 민감한 정보의 현지 구성 지원 플랫폼이 교환 정보를 구성하는 페이지에서, 마스크를 가진 모든 암호화된 텍스트 상자 컨트롤은 도커의 로컬 파일을 로드하는 파일 경로를 구성하는 방법을 지원합니다.RSA KEY교환의 인증 방법은 도커 프로그램이 위치하는 장치에서 민감한 정보를 로컬로 구성하는 방법을 자세히 설명하는 예입니다.
  1. RSA 공개 키와 개인 키를 생성합니다. 예를 들어,PKCS#8, 창조를 위해 사용할 수 있는 많은 도구가 있습니다.openssl.
  2. RSA KEY교환에, 그리고 공개 키를 업로드1단계창조 중에
  3. 이 문서에서 만든 개인 키를 저장합니다1단계같은 디렉토리에서 포맷의 도커txt파일, 또는 도커 프로그램의 디렉토리의 다른 경로에서.
  4. FMZ 플랫폼에서 교환을 구성 할 때RSA KEY구성 편집 상자에서 교환에 의해 생성Access Key.
  5. FMZ 플랫폼에서 교환을 구성 할 때txt도커의 동일한 수준 디렉토리에 배치 파일단계 3구성 편집 상자에서Secret Key예를 들어, 파일 이름이:rsaKey.txt, 그리고 파일과 도커는 같은 레벨 디렉토리에 채워집니다:file:///rsaKey.txt. 파일이 도커 프로그램의 디렉토리 옆에 있는 디렉토리에 있는 경우rsa_key, 다음을 채우십시오:file:///rsa_key//rsaKey.txt만약 당신이rsaKey. txt컴퓨터 또는 서버의 다른 곳에 이러한 지침을 따라, 이 파일은 단지 같은 수준의 디렉토리 또는 도커에 대한 하위 디렉토리에 배치 될 수 있다는 점에 유의해야합니다.

이것은 개인 키를 찾아서 저장하는 것이 더 안전합니다.비디오 설명세부적인 절차를 위해.

백테스트 시스템

백테스트 시스템은 무엇이며, 어떤 용도로 사용되나요?

양적 거래 전략의 디자인을 완료한 후, 전략의 논리와 전략의 수익 방향과 같은 전략의 기본 상황을 어떻게 알 수 있습니까? 물론, 우리는 실제 거래 시장에서 전략을 실행하기 위해 실제 돈을 직접 사용할 수 없지만, 우리는 전략을 테스트하고 역사적 데이터에서 전략의 이익을 알 수있는 역사적 데이터를 사용할 수 있습니다.

백테스트 시스템 데이터가 정확하고 백테스트 결과의 정확성은 어떨까요?

FMZ 퀀트 트레이딩 플랫폼은 백테스트 시스템을실제 시장 수준그리고시뮬레이션 레벨실제 시장 수준은 전체 역사 데이터에 따라 완전히 백테스트를 수행하는 반면 시뮬레이션 수준 백테스트는tick그들은 모두 실제 역사 데이터에 기반하지만 실제 시장 수준 데이터는 더 정확하고 결과는 더 신뢰할 수 있습니다.FMZ 백테스트 메커니즘 설명그러나 백테스팅은 역사적인 데이터에 따라 전략의 수행에 불과합니다. 역사적인 데이터는 미래의 시장을 완전히 표현할 수 없습니다. 역사적인 시장은 반복 될 수 있습니다. 또는 블랙 스완으로 이어질 수도 있습니다. 따라서 백테스트 결과는 합리적이고 객관적으로 취급되어야합니다.

다른 프로그래밍 언어 전략을 백테스팅할 때 주의해야 할 사항:

그 후의 테스트자바스크립트그리고C++트레이딩 전략은 브라우저에서 수행되고 실제 시장 보트 또는WexApp에뮬레이션 교환 실제 시장 (즉WexAppFMZ 양 거래 플랫폼의 에뮬레이션 교환) 다른 소프트웨어, 라이브러리 또는 모듈을 설치하지 않고 실행됩니다. 그 후의 테스트파이썬도커에서 수행됩니다. FMZ 퀀트 트레이딩 플랫폼에 의해 추가 된 공개 서버에서 수행 될 수 있으며 사용자 자신의 도커에서도 수행 될 수 있습니다. 실제 시장 운영과 백테스트 모두파이썬도커가 위치한 시스템에 설치됩니다. 일부 라이브러리가 필요한 경우 수동으로 설치해야합니다 (공용 서버에서 일반 라이브러리만 지원됩니다).

시스템 내 백테스트 데이터

FMZ 양자 거래 플랫폼 백테스트는 두 가지 유형이 있습니다: 시뮬레이션 레벨 백테스트 및 실제 시장 수준의 백테스트. 시뮬레이션 레벨 백테스트는 시뮬레이션 된 백테스트를 생성합니다.tick각 K-라인 기간은 12개의 백테스팅 시간 포인트를 생성합니다.ticks실제로, 몇 초마다 한 번 발생하여 많은 양의 데이터와 느린 백테스트 속도를 초래합니다. 따라서 매우 긴 시간 동안 백테스트 할 수 없습니다. FMZ의 백테스트 메커니즘은 거래 전략이 단일 K 라인에 여러 번 거래 할 수 있도록 허용하여 거래가 닫힌 가격에서만 실행 될 수있는 상황을 피합니다. 백테스트 속도를 고려하면서 더 정확합니다. 자세한 설명은 참조하십시오.링크.

역 테스트 시스템에서 전략 DEBUG 방법

크롬 DevTools에서 자바스크립트 전략 백테스팅 디버깅

백테스팅 시스템에서 지원되는 교환

  • 암호화 통화 (암호화폐)

    이름 종류 지침
    비트피넥스 스팟 교환 대상 제한된 거래 쌍을 지원하는 것, 예를 들어BTC_USD, ETH_USD그리고LTC_USD, 등 (거래 쌍의 코팅 화폐는USD달러)
    바이낸스 스팟 교환 대상 제한된 거래 쌍을 지원하는 것, 예를 들어BTC_USDT, ETH_USDT, ETH_BTC그리고LTC_BTC, 등등
    OKX 스팟 교환 대상 제한된 거래 쌍을 지원하는 것, 예를 들어BTC_USDT, ETH_USDT, ETH_BTC그리고LTC_BTC, 등등
    후오비 스팟 교환 대상 제한된 거래 쌍을 지원하는 것, 예를 들어BTC_USDT, ETH_USDT, ETH_BTC그리고LTC_BTC, 등등
    OKX 선물 선물 거래소 대상 제한된 거래 쌍을 지원하는 것, 예를 들어BTC_USD그리고ETH_USD거래 쌍의 코팅 화폐는USD: 특정 계약 코드 설정 후 (기능을 참조하십시오.exchange.SetContractType), 계약은 암호화 마진 계약입니다. 지원 계약 코드에는 다음이 포함됩니다:this_week, next_week, quarter그리고swap
    HuobiDM 선물 거래소 대상 HuobiDM는 Huobi 퓨처스 (Huobi Contract) 이며, 다음과 같은 제한된 거래 쌍을 지원합니다.BTC_USD그리고ETH_USD거래 쌍의 코팅 화폐는USD: 특정 계약 코드 설정 후 (기능을 참조하십시오.exchange.SetContractType), 계약은 암호화 마진 계약입니다. 지원 계약 코드에는 다음이 포함됩니다:this_week, next_week, quarter그리고swap.
    BitMEX 선물 거래소 대상 거래 쌍은XBT_USD: 특정 계약 코드 설정 후 (기능을 참조하십시오.exchange.SetContractType), 계약은 암호화 마진 계약입니다. 지원 계약 코드는:XBTUSD
    바이낸스 선물 선물 거래소 대상 제한된 거래 쌍을 지원하는 것, 예를 들어BTC_USDT그리고ETH_USDT거래 쌍의 코팅 화폐는USD: 특정 계약 코드 설정 후 (기능을 참조하십시오.exchange.SetContractType), 계약은USDT- 마진 계약; 지원 계약 코드는swap
    파생 옵션 선물 거래소 대상 거래 쌍은 다음과 같습니다.BTC_USD그리고ETH_USD: 특정 계약 코드 설정 후 (기능을 참조하십시오.exchange.SetContractType), 계약은 암호화 마진 계약입니다; 특정 옵션 계약 코드를 설정해야합니다.

    백테스트 시스템에서의 선물 거래 대상에서 거래 쌍을 변경하는 것은 전략 코드에서 일시적으로 지원되지 않습니다.

시뮬레이션 레벨

시뮬레이션 레벨 백테스트는 백테스트 시스템의 기본 K-라인 데이터에 기반하여 특정 알고리즘에 따라 주어진 기본 K-라인 바의 최고 가격, 최저 가격, 오픈 가격 및 종료 가격 값의 틀 내에서 틱 데이터를 시뮬레이션합니다. 데이터는 실시간으로 반환됩니다.tick인터페이스가 요청될 때 데이터를 입력합니다. 자세한 내용은 다음을 참조하십시오.FMZ 양자 시뮬레이션 레벨 백테스트 메커니즘 설명.

실제 시장 수준

실제 시장 수준 백테스트는 실제tick바 시간 계열의 수준 데이터tick실제 시장 수준 백테스트를 사용하여 실제 시장 수준 백테스트에 더 가깝습니다.tick데이터 (data) 는 실제 기록된 데이터이며 시뮬레이션된 데이터가 아닙니다. 깊이 데이터, 시장 거래의 기록 데이터 재생, 사용자 정의 깊이 및 각 개별 거래 데이터를 지원합니다. 실제 시장 수준의 데이터 백테스트의 최대 크기는 최대 50MB까지이며, 데이터 세트의 상단 범위 내에서 백테스트 시간 범위에 제한이 없습니다. 백테스트 시간 범위를 최대한 확대해야하는 경우 깊이 호출 설정 기어의 값을 줄이고 백테스트 시간 범위를 증가시키기 위해 각 개별 거래 데이터를 사용하지 않습니다.GetDepth,GetTrades시장 데이터를 재생하는 기능을 얻습니다. 시간 라인에서 시장 데이터의 순간에, 전화GetTicker,GetTrades, GetDepth그리고GetRecords시간이 백테스트 타임라인에서 여러 번 움직일 때 시간을 밀어붙이지 않을 것입니다. 위의 함수 중 하나에 대한 반복적인 호출은 백테스트 타임라인에서 이동하기 위해 백테스트 시간을 밀어붙일 것입니다. 실제 시장 수준이 백테스트에 사용되면 이전 시간을 선택하는 것이 권장되지 않습니다. 조기 시간대에 실제 시장 수준 데이터가 없을 수 있습니다.

실제 시장 수준 백테스트는 현재 지원:

  • 바이낸스
  • OKX (OKX 스팟)
  • 후오비DM (후오비 퓨처스)

백테스팅 시스템 매개 변수 최적화

FMZ 퀀트 트레이딩 플랫폼의 백테스트 시스템의 매개 변수 최적화 기능은 백테스트 중에 모든 매개 변수 최적화 옵션에 따라 최적화를 설정하는 것이며 옵션은 다음과 같습니다.

  • 최소 값: 매개 변수의 시작 값을 제한합니다.
  • 최대 값: 점진적 변경 후 매개 변수의 최대 값을 제한합니다.
  • 단계 크기: 매개 변수의 추가 변수 크기.

매개 변수 조합을 생성하고, 모든 그 조합을 거슬러 백테스트 (즉, 각 매개 변수 조합을 한 번 백테스트)번호backtesting 시스템에서 최적화 될 수 있습니다.

예를 들어, 설정 매개 변수 최적화 옵션을 백테스트 페이지에서:

img

매개 변수 최적화 모드의 백테스트:

img

백테스트 설정을 저장

전략 편집 페이지에서, Backtest (즉, 백테스트 시스템) 의 페이지링에서, 당신은 전략을 백테스트하기 위해 백테스트 구성 및 전략 매개 변수와 같은 옵션을 설정할 수 있다. 백테스트 설정은 백테스트 시간 범위, 교환 플랫폼, 슬립포인트 및 서비스 수수료 등을 참조한다. 전략 매개 변수는 전략을 위한 매개 변수 옵션을 설정하는 데 사용됩니다. 모든 전략 구성이 설정되면, 당신은 설정에 따라 전략을 백테스트할 수 있다. 그렇다면 다음 백테스트 페이지에서 사용하도록 이러한 구성된 설정을 어떻게 저장할 것인가 (백테스트 페이지 갱신 중에 설정된 옵션이 다시 설정될 것인가)? 당신은 전략 페이지의 Save Settings 버튼을 클릭할 수 있으며, 모든 백테스트 설정 (백테스트 전략 구성 및 파라미터 설정 포함) 은 전략 테스트의 소스 코드 형태로 기록될 것이다. 전략 페이지를 열고 백테스트 페이지로 다시 전환할 때, 테스트 시스템에서 기록된 설정 정보는 자동으로 테스트 전략 코드로 다시 설정될 것이다.

img

가져와JavaScript예를 들어, Backtest 설정을 소스 파일로 저장하라를 클릭합니다:

img

소스 파일에 백테스트 설정을 저장하는 데 약간의 차이가 있습니다JavaScript, Python, cpp그리고Mylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

미일링글:

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

사용자 지정 데이터 소스

이 시스템은GET사용자 지정 URL (공중 접근 가능한 URL) 를 요청하는 방법. 백테스트를 위한 외부 데이터 소스를 얻기 위해 추가 요청 매개 변수는 다음과 같습니다.

매개 변수 의미 설명
기호 기호 이름 예를 들어 BTC_USD_OKCoin_EN
이드 교환 예를 들어 OKCoin_EN
둥글다 가격 정확성 예를 들어 3, 반환 된 데이터의 가격은 1000에 곱하고 둥근해야합니다
주위 양적 정확성 예를 들어 2, 반환된 데이터의 양은 100으로 곱하고 둥근
기간 바 기간 (밀리초) 예를 들어 6만, 바를 표시하고 1분 요청합니다.
깊이 깊이 레벨 1-20
무역 데이터 분할 필요 여부 사실/거짓
이쪽에서 시작 시간 유닉스 시간표
그쪽 종말 시대 유닉스 시간표

참고:

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

꿰매진 데이터의 예:

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

반환된 형식은 다음 두 가지 형식 중 하나여야 합니다 (시스템이 자동으로 인식합니다):

일반 바 레벨 백테스트

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

틱 레벨 백테스트 데이터 (시장 깊이 정보를 포함하여, [가격, 부피]의 깊이 형식을 가진 배열; 여러 수준의 깊이가있을 수 있습니다; Ask는 가격 상승 순서, Bids는 가격 역 순서를 의미합니다.)

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

설명

필드 설명
스케마 데이터 배열의 열의 속성을 지정합니다. 대문자 민감성으로 Time, open, high, low, close, vol, asksbids로 제한됩니다.
데이터 스키마에 따라 데이터를 저장하는 배열

데이터 형식

필드 설명
요청/입찰 [가격,용량...]
무역 [시간, 방향 (0: 구매, 1: 판매), 가격, 양]

자금 조달율 자료 제공:

예를 들어, 바이낸스 퓨처스 백테스트를 할 때, 사용자 지정 데이터 소스를 통해 제공되어야하는 추가 자금 조달 비율 데이터를 확보해야합니다. 예를 들어, 바이낸스 퓨처스 백테스트 중에 요청 된 자금 조달 비율의 데이터 구조는 다음과 같습니다.

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

백테스트 시스템에서 데이터 요청의 예제:

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

사용자 지정 데이터 소스의 예제:

데이터 소스, URL을 지정합니다.http://xxx.xx.x.xx:9090/data데이터 서버를 사용자 정의합니다.

package main 
import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

테스트 전략JavaScript예를 들어:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(ticker)
    Log(records)
}

백테스트 시스템에서 사용자 정의 데이터로 그려진 차트:

전략 인쇄 정보:

로컬 백테스트 엔진

FMZ 퀀트 트레이딩 플랫폼은JavaScript버전과Python로컬 백테스트 엔진 버전, 지원 설정하위 K 라인 기간백테스팅 중에

백테스트 페이지 단축키

  • 전략 편집 페이지와 백테스팅 페이지 사이를 전환하는 단축키

    열쇠를 사용하세요Ctrl +,다시 Backtest 페이지와 Edit Strategy 페이지로 전환합니다.Ctrl키를 누르세요,.

  • 저장 전략을 위한 단축키

    열쇠를 사용하세요Ctrl + s전략을 구하기 위해서요.

  • 전략 백테스트를 시작하는 단축키

    열쇠를 사용하세요Ctrl + bStart Backtest을 활성화하기 위해

코드 설명

입력 기능

함수 이름 설명
main() 그것은 입력 함수입니다.
onexit() 정상적으로 종료될 때 정화 함수입니다. 최대 실행 시간은 5분입니다.끊어오류가 보고됩니다.
onerror() 그것은 비정상적인 출력 함수입니다, 그것의 최대 실행 시간은 5 분입니다.Python그리고cpp이 기능을 지원하지 않습니다.
init() 초기화 함수입니다. 실행을 시작할 때 자동으로 호출됩니다.
  • 설명:
    1. 백테스트 시스템은 기능을 지원하지 않습니다onerror().
    1. 만약 함수가onerror()bot에서 트리거 됩니다.onexit()작동되지 않습니다.

1번 출력 (()

onexit(), 처리 청소 작업, 최대 실행 시간 5 분, 사용자가 실현.

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

init()

사용자가 초기화 함수를 구현init(), 자동으로 기능을 실행합니다init()초기화 작업을 완료하기 위한 전략의 시작.

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

실수입니다.

직무 수행onerror()이 함수는 이식된 전략들을 지원하지 않습니다.Python그리고cpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

고전적 전략 틀

그 전략에JavaScript, Python그리고cpp, 그Sleep()이 함수는 이러한 전략의 메인 루프에서 호출되어야 합니다. 이 함수는 백트래킹 속도를 제어하는 데 사용됩니다. 봇에서는 전략 투표 간격을 제어하는 데 사용되며, 또한 교환의 API 인터페이스에 액세스하는 요청 주파수를 제어합니다.

  • 암호화폐 전략의 기본 프레임워크 예제:

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    가장 간단한 예를 들어보죠. 만약 제가 매초에 100의 가격과 1의 양으로 거래소에 구매 주문을 하고 싶다면,

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

템플릿 라이브러리

템플릿 라이브러리FMZ 퀀트 트레이딩 플랫폼에서 재사용 가능한 코드 모듈로, 거래 전략 코드 카테고리로 작동합니다.템플릿 라이브러리, 현재 FMZ 퀀트 트레이딩 플랫폼에 로그인 한 계정의 전략 페이지에 템플릿이 추가됩니다. 생성 후에는 범주를 정상적인 전략으로 수정 할 수 없습니다.

템플릿 라이브러리JavaScript:

img

템플릿 라이브러리Python:

img

템플릿 라이브러리cpp:

img

  • 템플릿 라이브러리 의 수출 기능 수출 함수는 템플릿 라이브러리의 인터페이스 함수이며, 템플릿 라이브러리를 참조하는 전략으로 호출될 수 있다. 템플릿 라이브러리에서 수출 함수를 선언하고 구현하는 예제 코드는 다음과 같다:

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • 템플릿 라이브러리 매개 변수 템플릿 라이브러리 또한 템플릿 라이브러리의 코드에서 글로벌 변수 형태로 사용되는 자체 인터페이스 매개 변수를 설정할 수 있습니다.

    템플릿 라이브러리 파라미터 설정:

    img

    템플릿 라이브러리 코드:

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    전략 코드 참조템플릿 라이브러리앞서 언급한 예제:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • 인용 템플릿 라이브러리

    전략 편집 페이지의 템플릿 열의 참조를 확인한 후 전략을 저장합니다.

    img

내장 구조

글로벌 변수

교환

Exchange교환 객체로 간주 될 수 있습니다. 기본적으로 전략 매개 변수에 추가 된 첫 번째 교환 객체로 간주됩니다. 교환과 모든 데이터 상호 작용은이 객체의 함수를 통해 실현됩니다.

  • Backtest에서 교환 객체를 추가합니다

  • 보트 페이지에 교환 객체를 추가합니다

추가된 교환 대상은exchange코드의 객체:

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
교환

모든 교환 객체를 저장하는 배열로 이해할 수 있습니다.exchange교환 대상, 여러 개의 교환 대상을 포함할 수 있다.exchanges[0]exchange.

추가된 교환 대상은exchanges[0], exchanges[1], exchanges[2]...전략 코드에서 계속됩니다.

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
주문 상태

속성StatusOrder structure.

일정한 이름 정의 가치
ORDER_STATE_PENDING 완성되지 않은 것 0
ORDER_STATE_CLOSED 끝났다 1
ORDER_STATE_CANCELED 취소 2
ORDER_STATE_UNKNOWN 알 수 없는 상태 (다른 상태) 3

ORDER_STATE_UNKNOWN상태는 호출할 수 있습니다exchange.GetRawJSON()원본 주문 상태 정보를 얻고 교환 파일을 검색하고 구체적인 설명을 볼 수 있습니다. 양식의 상수 이름은 전략 코드에서 직접 사용할 수 있습니다StatusOrder정렬된 순서 상태를 확인하기 위해, 정렬된 순서가 동일하는지 판단합니다상수 이름그리고 그에 해당하는, 그리고 아래의 다른 상수 명칭들은 같은 방식으로 작동합니다. 그래서 더 자세한 설명은 없을 것입니다.

오더 트랜잭션 유형

속성TypeOrder structure.

일정한 이름 정의 가치
ORDER_TYPE_BUY 구매 주문 0
ORDER_TYPE_SELL 판매 명령 1
포지션 타입

속성TypePosition structure.

일정한 이름 정의 설명 적용 가능 가치
PD_LONG 롱 포지션 암호화폐 선물 사용exchange.SetDirection("closebuy")닫기 위치 방향을 설정하고 이러한 유형의 위치를 닫기 암호화폐 선물 0
PD_SHORT 단기 포지션 암호화폐 선물 사용exchange.SetDirection("closesell")닫기 위치 방향을 설정하고 이러한 유형의 위치를 닫기 암호화폐 선물 1
선물 개시 및 폐쇄 지점 방향

속성OffsetOrder structure.

일정한 이름 정의 가치
ORDER_OFFSET_OPEN 오픈 포지션 오더 0
ORDER_OFFSET_CLOSE 클로즈 포지션 오더 1
전략 매개 변수

거래 전략 코드에서 전략 인터페이스에 설정된 전략 매개 변수는 총 변수 형태로 반영됩니다.JavaScript언어는 전략 인터페이스에서 설정되거나 수정된 매개 변수 값에 직접 액세스 할 수 있습니다.Python전략, 키워드global전략의 전체 변수를 수정하는 것이 필요합니다.

매개 변수 유형:

img

변수 설명 언급 종류 기본 값 설명
번호 숫자 타입 언급 번호 (번호) 1 C++ 전략은 부동 소수점 타입입니다
문자열 문자열 언급 문자열 (string) 안녕하세요 FMZ 기본 값은 인용 할 필요가 없습니다. 입력 문자열로 취급됩니다
콤박스 콤보박스 언급 콤보박스 (선택) 1|2|3 컴박스 변수 자체는 숫자 값으로, 컴박스 컨트롤에 의해 선택된 열의 인덱스를 나타냅니다. 첫 번째 컴박스 값은 1, 다른 값은 0등입니다.
체크 옵션 언급 부올어 (진짜/거짓) 사실 확인하면 bool 변수가 true이고, 확인하지 않으면 bool 변수가 false입니다.
비밀 문자열 암호화된 문자열 언급 암호화된 문자열 (string) 비밀번호 문자열과 같은 용도로 암호화된 문자열은 암호화로 전송되며 일반 텍스트로 전송되지 않습니다.
  • 인터페이스 매개 변수는 전략 편집 페이지의 코드 편집 섹션 아래의 전략 매개 변수 섹션에 설정됩니다.
  • 인터페이스 매개 변수는 전략 코드에서 글로벌 변수로 존재합니다. 즉, 인터페이스 매개 변수는 코드에서 수정될 수 있습니다.
  • 전략 코드 내의 인터페이스 매개 변수의 이름 (위 형태의 경우):number, string, combox, bool, secretString.
  • 설명 옵션: 전략 인터페이스의 인터페이스 매개 변수의 이름.
  • 참고 옵션: 인터페이스 매개 변수의 상세한 설명; 마우스가 인터페이스 매개 변수 위에 을 때 설명이 표시됩니다.
  • 타입 옵션: 인터페이스 매개 변수의 유형.
  • 기본 값 옵션: 인터페이스 매개 변수의 기본 값.

파라미터 의존성 설정: 하나의 매개 변수를 설정하면 다른 매개 변수를 표시하고 숨겨 놓을 수 있습니다. 예를 들어, 우리는 매개 변수를 설정합니다.numberA, 이것은 숫자 형식입니다.numberA표시되거나 숨겨지는 경우isShowAtrue 또는 false 입니다. 변수를 설정해야 합니다.numberA인터페이스 매개 변수에 대해numberA@isShowA.

img

이 방법으로, 만약 매개 변수가isShowA확인되지 않은 경우, 매개 변수numberA컴보박스 제어 유형의 매개 변수에 관해서는, 매개 변수 값이지수 값같은 방법으로, 매개 변수를isShowA예를 들어, 매개 변수를 설정할 때numberA@combox==2매개 변수numberA표시하거나 숨길 것입니다.combox세 번째 옵션으로 확인됩니다 (지수 0은 첫 번째 옵션, 지수 1은 두 번째 옵션, 지수 2는 세 번째 옵션에 해당합니다.)

전략 인터페이스 매개 변수, 인터랙티브 컨트롤 및 템플릿에 있는 매개 변수 그룹화 기능: 그냥 더해(?First group)다음 그림과 같이 그룹을 시작하는 매개 변수의 설명의 시작

img

전략을 사용할 때, 매개 변수는 그룹으로 표시됩니다:

img

매개 변수 기본값 저장: 전략 매개 변수는 그림에서 나타납니다. 백테스트 중에, 전략 매개 변수의 기본 값을 저장하고 싶다면,Save settings전략 매개 변수를 변경한 후 버튼.

img

img

당신은 코드 형태로 전략 매개 변수 설정을 저장할 수 있습니다:

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

데이터 구조

일부 기능은 원본과 함께JSON전화 도중 요청 된 데이터입니다.JSON데이터가 속성에 저장됩니다.Info반환된 객체의. 백테스트는 플랫폼 인터페이스에 액세스하지 않기 때문에, 백테스트 중에 반환된 데이터는 속성이 없습니다Info다음은 각 데이터 구조의 주요 속성의 설명입니다.

무역

함수에서 반환된 모든 거래 역사 (자신이 아닌) 를 얻는다exchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}

시장 코팅은 함수로 반환됩니다.exchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
기록

표준OHLC구조는 K-선과 프로세스 지표 계산 및 분석을 그리기 위해 사용됩니다.exchange.GetRecords()구조 배열을 반환합니다.Record구조는 k-라인 바, 즉 한 k-라인BAR.TimeRecordK-라인 바 기간의 시작 시간입니다.

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
순서

순서 구조는 함수들에 의해 반환될 수 있습니다.exchange.GetOrder()그리고exchange.GetOrders(). 그 기능exchange.GetOrders()배열 또는 구조의 빈 배열을 반환 (이것이 없다면)현재 미완성 주문, 반환[]즉, 빈 배열입니다.)

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide