[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입니다.
지원된 프로토콜
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
교환의 인증 방법은 도커 프로그램이 위치하는 장치에서 민감한 정보를 로컬로 구성하는 방법을 자세히 설명하는 예입니다.PKCS#8
, 창조를 위해 사용할 수 있는 많은 도구가 있습니다.openssl
.RSA KEY
교환에, 그리고 공개 키를 업로드1단계창조 중에txt
파일, 또는 도커 프로그램의 디렉토리의 다른 경로에서.RSA KEY
구성 편집 상자에서 교환에 의해 생성Access Key
.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
시간이 백테스트 타임라인에서 여러 번 움직일 때 시간을 밀어붙이지 않을 것입니다. 위의 함수 중 하나에 대한 반복적인 호출은 백테스트 타임라인에서 이동하기 위해 백테스트 시간을 밀어붙일 것입니다. 실제 시장 수준이 백테스트에 사용되면 이전 시간을 선택하는 것이 권장되지 않습니다. 조기 시간대에 실제 시장 수준 데이터가 없을 수 있습니다.
실제 시장 수준 백테스트는 현재 지원:
FMZ 퀀트 트레이딩 플랫폼의 백테스트 시스템의 매개 변수 최적화 기능은 백테스트 중에 모든 매개 변수 최적화 옵션에 따라 최적화를 설정하는 것이며 옵션은 다음과 같습니다.
매개 변수 조합을 생성하고, 모든 그 조합을 거슬러 백테스트 (즉, 각 매개 변수 조합을 한 번 백테스트)번호backtesting 시스템에서 최적화 될 수 있습니다.
예를 들어, 설정 매개 변수 최적화 옵션을 백테스트 페이지에서:
매개 변수 최적화 모드의 백테스트:
전략 편집 페이지에서,
가져와JavaScript
예를 들어,
소스 파일에 백테스트 설정을 저장하는 데 약간의 차이가 있습니다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]]
}
설명
필드 | 설명 |
---|---|
스케마 | 데이터 배열의 열의 속성을 지정합니다. 대문자 민감성으로 |
데이터 | 스키마에 따라 데이터를 저장하는 배열 |
데이터 형식
필드 | 설명 |
---|---|
요청/입찰 | [가격,용량...] |
무역 | [시간, 방향 (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 +,
다시 Ctrl
키를 누르세요,
.
저장 전략을 위한 단축키
열쇠를 사용하세요Ctrl + s
전략을 구하기 위해서요.
전략 백테스트를 시작하는 단축키
열쇠를 사용하세요Ctrl + b
함수 이름 | 설명 |
---|---|
main() |
그것은 입력 함수입니다. |
onexit() |
정상적으로 종료될 때 정화 함수입니다. 최대 실행 시간은 5분입니다.끊어오류가 보고됩니다. |
onerror() |
그것은 비정상적인 출력 함수입니다, 그것의 최대 실행 시간은 5 분입니다.Python 그리고cpp 이 기능을 지원하지 않습니다. |
init() |
초기화 함수입니다. 실행을 시작할 때 자동으로 호출됩니다. |
onerror()
.onerror()
bot에서 트리거 됩니다.onexit()
작동되지 않습니다.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()
초기화 작업을 완료하기 위한 전략의 시작.
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
:
Python
:
cpp
:
/*
-- 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");
}
템플릿 라이브러리 코드:
$.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());
}
인용
전략 편집 페이지의 템플릿 열의 참조를 확인한 후 전략을 저장합니다.
Exchange
교환 객체로 간주 될 수 있습니다. 기본적으로 전략 매개 변수에 추가 된 첫 번째 교환 객체로 간주됩니다. 교환과 모든 데이터 상호 작용은이 객체의 함수를 통해 실현됩니다.
추가된 교환 대상은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());
}
}
속성Status
에Order
structure.
일정한 이름 | 정의 | 가치 |
---|---|---|
ORDER_STATE_PENDING | 완성되지 않은 것 | 0 |
ORDER_STATE_CLOSED | 끝났다 | 1 |
ORDER_STATE_CANCELED | 취소 | 2 |
ORDER_STATE_UNKNOWN | 알 수 없는 상태 (다른 상태) | 3 |
ORDER_STATE_UNKNOWN상태는 호출할 수 있습니다exchange.GetRawJSON()
원본 주문 상태 정보를 얻고 교환 파일을 검색하고 구체적인 설명을 볼 수 있습니다.
양식의 상수 이름은 전략 코드에서 직접 사용할 수 있습니다Status
에Order
정렬된 순서 상태를 확인하기 위해, 정렬된 순서가 동일하는지 판단합니다상수 이름그리고 그에 해당하는값, 그리고 아래의 다른 상수 명칭들은 같은 방식으로 작동합니다. 그래서 더 자세한 설명은 없을 것입니다.
속성Type
에Order
structure.
일정한 이름 | 정의 | 가치 |
---|---|---|
ORDER_TYPE_BUY | 구매 주문 | 0 |
ORDER_TYPE_SELL | 판매 명령 | 1 |
속성Type
에Position
structure.
일정한 이름 | 정의 | 설명 | 적용 가능 | 가치 |
---|---|---|---|---|
PD_LONG | 롱 포지션 | 암호화폐 선물 사용exchange.SetDirection("closebuy") 닫기 위치 방향을 설정하고 이러한 유형의 위치를 닫기 |
암호화폐 선물 | 0 |
PD_SHORT | 단기 포지션 | 암호화폐 선물 사용exchange.SetDirection("closesell") 닫기 위치 방향을 설정하고 이러한 유형의 위치를 닫기 |
암호화폐 선물 | 1 |
속성Offset
에Order
structure.
일정한 이름 | 정의 | 가치 |
---|---|---|
ORDER_OFFSET_OPEN | 오픈 포지션 오더 | 0 |
ORDER_OFFSET_CLOSE | 클로즈 포지션 오더 | 1 |
거래 전략 코드에서 전략 인터페이스에 설정된 전략 매개 변수는 총 변수 형태로 반영됩니다.JavaScript
언어는 전략 인터페이스에서 설정되거나 수정된 매개 변수 값에 직접 액세스 할 수 있습니다.Python
전략, 키워드global
전략의 전체 변수를 수정하는 것이 필요합니다.
매개 변수 유형:
변수 | 설명 | 언급 | 종류 | 기본 값 | 설명 |
---|---|---|---|---|---|
번호 | 숫자 타입 | 언급 | 번호 (번호) | 1 | C++ 전략은 부동 소수점 타입입니다 |
문자열 | 문자열 | 언급 | 문자열 (string) | 안녕하세요 FMZ | 기본 값은 인용 할 필요가 없습니다. 입력 문자열로 취급됩니다 |
콤박스 | 콤보박스 | 언급 | 콤보박스 (선택) | 1|2|3 | 컴박스 변수 자체는 숫자 값으로, 컴박스 컨트롤에 의해 선택된 열의 인덱스를 나타냅니다. 첫 번째 컴박스 값은 1, 다른 값은 0등입니다. |
불 | 체크 옵션 | 언급 | 부올어 (진짜/거짓) | 사실 | 확인하면 bool 변수가 true이고, 확인하지 않으면 bool 변수가 false입니다. |
비밀 문자열 | 암호화된 문자열 | 언급 | 암호화된 문자열 (string) | 비밀번호 | 문자열과 같은 용도로 암호화된 문자열은 암호화로 전송되며 일반 텍스트로 전송되지 않습니다. |
number
, string
, combox
, bool
, secretString
.파라미터 의존성 설정:
하나의 매개 변수를 설정하면 다른 매개 변수를 표시하고 숨겨 놓을 수 있습니다. 예를 들어, 우리는 매개 변수를 설정합니다.numberA
, 이것은 숫자 형식입니다.numberA
표시되거나 숨겨지는 경우isShowA
true 또는 false 입니다. 변수를 설정해야 합니다.numberA
인터페이스 매개 변수에 대해numberA@isShowA
.
이 방법으로, 만약 매개 변수가isShowA
확인되지 않은 경우, 매개 변수numberA
컴보박스 제어 유형의 매개 변수에 관해서는, 매개 변수 값이지수 값같은 방법으로, 매개 변수를isShowA
예를 들어, 매개 변수를 설정할 때numberA@combox==2
매개 변수numberA
표시하거나 숨길 것입니다.combox
세 번째 옵션으로 확인됩니다 (지수 0은 첫 번째 옵션, 지수 1은 두 번째 옵션, 지수 2는 세 번째 옵션에 해당합니다.)
전략 인터페이스 매개 변수, 인터랙티브 컨트롤 및 (?First group)
다음 그림과 같이 그룹을 시작하는 매개 변수의 설명의 시작
전략을 사용할 때, 매개 변수는 그룹으로 표시됩니다:
매개 변수 기본값 저장:
전략 매개 변수는 그림에서 나타납니다. 백테스트 중에, 전략 매개 변수의 기본 값을 저장하고 싶다면,Save settings
전략 매개 변수를 변경한 후 버튼.
당신은 코드 형태로 전략 매개 변수 설정을 저장할 수 있습니다:
/*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
.Time
에Record
K-라인 바 기간의 시작 시간입니다.
{
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