[TOC]
9 년의 기술적 반복 후, FMZ 양자 거래 플랫폼은 사용자가 그것을 알아차리지 못했지만 여러 번 재구성되었습니다. 지난 2 년 동안 플랫폼은 사용자 경험 측면에서 많은 최적화와 업그레이드를 수행했으며, UI 인터페이스의 포괄적 인 업그레이드, 일반적으로 사용되는 양적 거래 도구의 풍부화 및 더 많은 백테스팅 데이터 지원을 추가했습니다.
전략 설계가 더 편리하고, 거래 논리가 더 명확하고, 초보자가 쉽게 시작할 수 있도록 하기 위해, 플랫폼은 전략에 의해 사용되는 API 인터페이스를 업그레이드했습니다. 최신 버전을 사용하는 도커는 이러한 새로운 기능을 활성화 할 수 있습니다. 플랫폼은 여전히 오래된 인터페이스 호출과 최대 범위에서 호환됩니다. API 인터페이스의 새로운 기능에 대한 정보는 FMZ 퀀트 트레이딩 플랫폼의 API 문서에 업데이트되었습니다:
문법 안내:https://www.fmz.com/syntax-guide사용자 안내:https://www.fmz.com/user-guide
그래서 어떤 인터페이스가 업그레이드 되었는지, 그리고 어떤 변화가 필요한지 빠르게 살펴봅시다.
멀티 제품 전략과 완전한 시장 모니터링 전략을 설계하기 위해서는 집계된 시장 인터페이스가 필수적입니다. 전략을 개발하고 이벤트를 재발견하는 것을 피하기 위해 FMZ 퀀트 트레이딩 플랫폼은 이러한 유형의 교환 API를 포괄합니다.
만약 거래소가 이 인터페이스를 가지고 있지 않다면 (개인 거래소), 호출할 때exchange.GetTickers()
, 오류 메시지가 표시됩니다: 지원되지 않습니다.
이 함수는 어떤 매개 변수도 없으며 거래소의 집계 시장 인터페이스에서 모든 품종의 실시간 시장 데이터를 반환합니다. 간단하게 이해 할 수 있습니다.
exchange.GetTickers()
function는 전체 기능의 요청 버전입니다exchange.GetTicker()
함수 (주의 깊게 보세요, 이 두 함수 이름의 차이점은 단수와 복수입니다.)
우리는 OKX 스팟 시뮬레이션 환경을 테스트를 위해 사용합니다.
function main() {
exchange.IO("simulate", true)
var tickers = exchange.GetTickers()
if (!tickers) {
throw "tickers error"
}
var tbl = {type: "table", title: "test tickers", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var i in tickers) {
var ticker = tickers[i]
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return tickers.length
}
새로 추가된exchange.CreateOrder()
이 업그레이드의 중심입니다.exchange.CreateOrder()
명령의 종류와 방향을 함수 매개 변수에서 직접 지정하는 것입니다. 이렇게하면 현재 거래 쌍, 계약 코드, 거래 방향 및 시스템의 다른 설정에 더 이상 의존하지 않습니다.
다종 거래 주문 배치 시나리오와 동시 시나리오에서 설계 복잡성은 크게 감소합니다.exchange.CreateOrder()
함수들은symbol
, side
, price
, amount
.
OKX 선물 시뮬레이션 환경을 이용한 테스트:
function main() {
exchange.IO("simulate", true)
var id1 = exchange.CreateOrder("ETH_USDT.swap", "buy", 3300, 1)
var id2 = exchange.CreateOrder("BTC_USDC.swap", "closebuy", 70000, 1)
var id3 = exchange.CreateOrder("LTC_USDT.swap", "sell", 110, 1)
Log("id1:", id1, ", id2:", id2, ", id3:", id3)
}
이렇게 하면 3명만exchange.CreateOrder()
함수 호출은 다양한 종류와 방향의 세 개의 선물 주문을 배치하는 데 사용되었습니다.
새로 추가된exchange.GetHistoryOrders()
이 함수는 또한 교환 인터페이스의 지원을 필요로 합니다.
역사적인 주문을 검색하기 위해, 다양한 거래소에서 구현된 인터페이스는 크게 다릅니다.
자세한 함수 설명은 여기에 반복되지 않습니다, 당신은 API 문서의 문법 설명서를 참조할 수 있습니다:
https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders
바이낸스 스팟 거래 환경을 사용하여 테스트:
function main() {
var orders = exchange.GetHistoryOrders("ETH_USDT")
// Write to chart
var tbl = {type: "table", title: "test GetHistoryOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("orders.length:", orders.length, "\n", "`" + JSON.stringify(tbl) + "`")
}
위치 데이터 획득 기능의 오래된 버전은exchange.GetPosition()
이 업그레이드는 함수 명칭 의미와 더 잘 일치하도록 새로운 위치 획득 함수를 추가합니다:exchange.GetPositions()
. 동시에, 그것은 여전히 GetPosition 기능과 호환 / 업그레이드 됩니다.
두 함수 이름이 마지막 s로만 다르다는 점에 유의하십시오. GetPositions가 의미적으로 더 정확하기 때문에 앞으로 GetPositions를 사용하는 것이 좋습니다.
이exchange.GetPositions()
함수는 세 가지 호출 형태를 가지고 있습니다.
교환.GetPositions() 어떤 매개 변수도 전달되지 않을 때, 현재 차원의 모든 품종의 위치 데이터는 현재의 설정에 따라 요청됩니다.거래 쌍 / 계약 코드.
exchange.GetPositions ((BTC_USD.swap
, ETH_USDT.swap
, ETH_USDT.quarter
, 등등
BTC_USD.swap: BTC
교환.GetPositions ((
일부 특별 교환 계약 차원 부문:
USDT.futures_combo: 선물_데리비트 거래소
OKX 선물 시뮬레이션 환경을 이용한 테스트:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
var p1 = exchange.GetPositions()
var p2 = exchange.GetPositions("BTC_USDT.swap")
var tbls = []
for (var positions of [p1, p2]) {
var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
for (var p of positions) {
tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
매개 변수가exchange.GetPositions()
함수는ETH_USDT.swap
, ETH
그 매개 변수가exchange.GetPositions()
기능이 전달되지 않으면 거래소에 나열된 모든 U 기반 영구 계약의 위치 데이터가 얻을 수 있습니다. (현재 거래 쌍은 BTC_USDT이고 계약은 교환이기 때문에 요청은 현재 거래 쌍과 계약 차원 범위에 기반합니다.)exchange.GetPositions("USDT.swap")
그리고 요청 범위를 지정합니다.
시장 기능의 주요 개선exchange.GetTicker()
이 함수는 현재 거래 쌍과 계약 코드 없이 매개 변수에 의해 지정된 제품 정보에 따라 직접 시장 데이터를 요청할 수 있습니다. 이 함수는 코드 작성 프로세스를 단순화합니다. 동시에 매개 변수를 전달하지 않고 통화 방법과 여전히 호환되며, 오래된 플랫폼 전략과 최대 범위에서 호환됩니다.
매개 변수symbol
거래 대상에 대한 포트/퓨처드의 다른 형식이 있습니다.exchange
:
AAA_BBB
, AAA는 baseCurrency, 즉 거래 통화, 그리고 BBB는 quoteCurrency, 즉 가격화폐를 나타냅니다. 통화 이름은 모두 대문자로 되어 있습니다.
예를 들어: BTC_USDT 현금 거래 쌍.AAA_BBB.XXX
, AAA는 baseCurrency, 즉 거래 통화, BBB는 quoteCurrency, 즉 가격화, XXX는 영구 계약 교환과 같은 계약 코드를 나타냅니다. 통화 이름은 모두 대문자로 표시되며 계약 코드는 소문자로 표시됩니다.
예를 들어: BTC_USDT.swap, BTCvar symbols = ["BTC_USDT.swap", "BTC_USDT.quarter", "BTC_USD.swap", "BTC_USD.next_quarter", "ETH_USDT.swap"]
function main() {
exchange.SetCurrency("ETH_USD")
exchange.SetContractType("swap")
var arr = []
var t = exchange.GetTicker()
arr.push(t)
for (var symbol of symbols) {
var ticker = exchange.GetTicker(symbol)
arr.push(ticker)
}
var tbl = {type: "table", title: "test GetTicker", cols: ["Symbol", "High", "Open", "Low", "Last", "Buy", "Sell", "Time", "Volume"], rows: []}
for (var ticker of arr) {
tbl.rows.push([ticker.Symbol, ticker.High, ticker.Open, ticker.Low, ticker.Last, ticker.Buy, ticker.Sell, ticker.Time, ticker.Volume])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return arr
}
특정 기호에 대한 시장 데이터 팩을 요청하는 것은 훨씬 더 간단해졌습니다.
GetTicker 함수와 비슷하게,exchange.GetDepth()
함수 또한 기호 매개 변수를 추가합니다. 이것은 깊이 데이터를 요청할 때 기호를 직접 지정할 수 있습니다.
바이낸스 선물 라이브 환경을 사용하여 테스트:
function main() {
exchange.SetCurrency("LTC_USD")
exchange.SetContractType("swap")
Log(exchange.GetDepth())
Log(exchange.GetDepth("ETH_USDT.quarter"))
Log(exchange.GetDepth("BTC_USD.swap"))
}
GetTicker 함수와 비슷하게,exchange.GetTrades()
이 함수는 또한 기호 매개 변수를 추가합니다. 이것은 시장 거래 데이터를 요청할 때 기호를 직접 지정할 수 있습니다.
바이낸스 선물 라이브 환경을 사용하여 테스트:
function main() {
var arr = []
var arrR = []
var symbols = ["LTC_USDT.swap", "ETH_USDT.quarter", "BTC_USD.swap"]
for (var symbol of symbols) {
var r = exchange.Go("GetTrades", symbol)
arrR.push(r)
}
for (var r of arrR) {
arr.push(r.wait())
}
var tbls = []
for (var i = 0; i < arr.length; i++) {
var trades = arr[i]
var symbol = symbols[i]
var tbl = {type: "table", title: symbol, cols: ["Time", "Amount", "Price", "Type", "Id"], rows: []}
for (var trade of trades) {
tbl.rows.push([trade.Time, trade.Amount, trade.Price, trade.Type, trade.Id])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
이 업그레이드는 또한exchange.Go()
플랫폼 API 인터페이스를 동시에 호출할 때 기능.
이번엔 GetRecords 함수가 크게 조정되었다. 요청된 K-라인 데이터의 타입 정보를 직접 지정하기 위한 기호 매개 변수를 지원하는 것 외에도, K-라인 기간을 지정하기 위한 원래 기간 매개 변수는 유지되고, 요청할 때 예상되는 K-라인 길이를 지정하기 위한 한계 매개 변수는 추가된다. 동시에, 그것은 단지 기간 매개 변수에 통과하는 GetRecords 함수의 오래된 버전과도 호환된다.
호출 방법exchange.GetRecords()
함수는:
바이낸스 선물 라이브 환경을 사용하여 테스트:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
var r1 = exchange.GetRecords()
var r2 = exchange.GetRecords(60 * 60)
var r3 = exchange.GetRecords("BTC_USDT.swap")
var r4 = exchange.GetRecords("BTC_USDT.swap", 60)
var r5 = exchange.GetRecords("LTC_USDT.swap", 60, 3000)
Log("r1 time difference between adjacent bars:", r1[1].Time - r1[0].Time, "Milliseconds, Bar length:", r1.length)
Log("r2 time difference between adjacent bars:", r2[1].Time - r2[0].Time, "Milliseconds, Bar length:", r2.length)
Log("r3 time difference between adjacent bars:", r3[1].Time - r3[0].Time, "Milliseconds, Bar length:", r3.length)
Log("r4 time difference between adjacent bars:", r4[1].Time - r4[0].Time, "Milliseconds, Bar length:", r4.length)
Log("r5 time difference between adjacent bars:", r5[1].Time - r5[0].Time, "Milliseconds, Bar length:", r5.length)
}
또한 GetOrders 함수는symbol
매개 변수, 특정 기호를 지정하고 그 기호의 미완성 주문을 검색하는 데 사용할 수 있습니다. 또한 지정된 차원 범위 내의 모든 기호의 미완성 주문 (미완성 주문) 을 검색하는 것을 지원합니다.
이exchange.GetOrders()
함수는 다음과 같은 방법으로 호출될 수 있습니다.
OKX 선물 시뮬레이션 환경을 이용한 테스트:
function main() {
exchange.IO("simulate", true)
exchange.SetCurrency("BTC_USDT")
exchange.SetContractType("swap")
// Write to chart
var tbls = []
for (var symbol of ["null", "ETH_USDT.swap", "USDT.swap"]) {
var tbl = {type: "table", title: symbol, cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
var orders = null
if (symbol == "null") {
orders = exchange.GetOrders()
} else {
orders = exchange.GetOrders(symbol)
}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
매개 변수가 전달되지 않을 경우 현재 거래 쌍 (BTC_USDT) 및 계약 코드 (스
매개 변수가ETH_USDT.swap
정해진 경우, ETH
그 string이"USDT.swap"
통과되면 모든 USDT 기반 상시 계약의 미완성 주문 (중계 주문) 이 요청됩니다.
그것은 여전히 오래된 위치 획득 함수 명칭과 호환되며, 또한 특정 요청된 위치 데이터의 타입 정보를 지정할 수 있는 기호 매개 변수를 추가합니다.
이 함수의 사용은exchange.GetPositions()
.
에 대해exchange.IO("api", ...)
함수 호출, 모든 교환 객체는 완전한 요청 주소를 직접 전달하는 것을 지원하도록 업그레이드되었습니다.
예를 들어, OKX 인터페이스를 호출하려면:
// GEThttps://www.okx.com/api/v5/account/max-withdrawal ccy: BTC
기본 주소로 직접 쓰기를 지원합니다https://www.okx.com
먼저 기본 주소를 변경하고 IO 함수를 호출하지 않아도 됩니다.
OKX 선물 시뮬레이션 환경을 이용한 테스트:
function main() {
exchange.IO("simulate", true)
return exchange.IO("api", "GET", "https://www.okx.com/api/v5/account/max-withdrawal", "ccy=BTC")
}
이 업그레이드는 주로 매개 변수에 영향을 미칩니다.id
의exchange.GetOrder(id)
기능. id 매개 변수는 원래 교환 주문 id에서 거래 제품을 포함하는 문자열 형식으로 변경됩니다.
FMZ 플랫폼의 모든 캡슐화된 주문 ID는 이 형식으로 되어 있습니다.
예를 들어:
123456
이 업그레이드 전에, 당신이 GetOrder 함수를 호출하려면, 명령 Id가 전달되는123456
.BTC-USDT
- 네
참고로 이것은 FMZ 플랫폼에 의해 정의된 거래 쌍이 아니라 거래소에서 지정된 거래 제품 코드입니다.이 업그레이드 후, 패러미터 id의 형식은exchange.GetOrder(id)
함수는 다음과 같이 조정됩니다.BTC-USDT,123456
.
먼저 이 디자인이 왜 이루어졌는지 설명해 드리겠습니다. Because the CreateOrder function has been upgraded to specify the type of order directly (placed order type may be different from the currently set trading pair and contract code). 반환된 주문 ID가 유형 정보를 포함하지 않으면이 주문 ID는 사용할 수 없을 것입니다. 왜냐하면 주문을 확인 할 때 주문이 어떤 유형 (계약) 에 해당하는지 알 수 없기 때문입니다. 대부분의 거래소는 주문을 확인하고 취소 할 때 타입 코드를 설명하는 매개 변수를 지정해야합니다.
이 충격에 어떻게 대응할 수 있을까요? 이 약물을 사용하는 경우exchange.IO교환 주문 인터페이스를 직접 호출하여 주문을 할 수 있는 기능, 반환 값은 일반적으로 교환의 원래 기호 (제품 코드) 와 원래 주문 id를 포함합니다. 다음 영어 쉼표로 둘을 연결하면 FMZ 플랫폼의 정의에 맞는 주문 ID가됩니다. 마찬가지로, 당신이 FMZ 플랫폼 캡슐화 주문 인터페이스를 사용 하 여 주문을 할 경우, 주문 ID의 시작은 거래 제품 코드이기 때문에, 당신은 원래 주문 ID를 사용 해야 하는 경우, 그냥 제품 코드와 koma를 삭제 합니다.
이 업그레이드의 영향exchange.CancelOrder()
함수와 동일합니다exchange.GetOrder()
function.
이 업그레이드의 영향exchange.Buy()
함수와 동일합니다exchange.GetOrder()
기능.
주문 ID가 반환됩니다exchange.Buy()
함수는 새로운 구조입니다. 예를 들어, OKX 거래소에 선물 주문을 할 때 반환되는 ID는:LTC-USDT-SWAP,1578360858053058560
.
이 업그레이드의 영향exchange.Sell()
함수와 동일합니다exchange.GetOrder()
기능.
주문 ID가 반환됩니다exchange.Sell()
함수는 새로운 구조입니다. 예를 들어, OKX 거래소에 선물 주문을 할 때 반환되는 ID는:ETH-USDT-SWAP,1578360832820125696
.
오직 선물 교환 객체만이 이 함수를 지원한다. 위치 데이터를 얻기 위한 exchange.GetPosition() 함수를 위해, 새로운 exchange.GetPositions() 이름을 추가하고, 두 동작은 정확히 동일하다.
오래된 정의: exchange.GetPosition() 함수는 매개 변수를 지정하지 않고 호출되면 현재 거래 쌍과 계약 코드에 의해 설정된 특정 계약의 위치 데이터를 얻습니다. 조정 및 수정 후, 새로운 정의: exchange.GetPosition( () 함수는 매개 변수를 지정하지 않고 호출되면 현재 설정된 거래 쌍과 계약 코드에 의해 결정된 차원 범위 내의 모든 품종의 위치를 얻습니다.
예를 들어, 현재 거래 쌍은 BTC_USDT이고 계약 코드는 swap입니다.
exchange.GetPosition() // Equivalent to calling exchange.GetPosition("USDT.swap")
이 함수는 모든 통화의 U 기반 상시 계약의 위치 데이터를 요청합니다.
오래된 정의: exchange.GetOrders() 함수는 매개 변수를 지정하지 않고 호출되면 현재 거래 쌍의 모든 완료되지 않은 주문을 얻습니다. 조정 및 수정 후, 새로운 정의는: exchange.GetOrders() 함수, 어떤 매개 변수를 지정하지 않고 호출 할 때, 모든 스팟 거래 쌍의 완료되지 않은 주문을 얻습니다.
오래된 정의: exchange.GetOrders() 함수는 매개 변수를 지정하지 않고 호출되면 현재 거래 쌍과 계약 코드가 설정한 특정 계약의 모든 완료되지 않은 주문을 얻습니다. 조정 및 수정 후, 새로운 정의는: exchange.GetOrders() 함수, 어떤 매개 변수를 지정하지 않고 호출 할 때, 현재 거래 쌍과 계약 코드에 의해 결정 된 차원 범위의 모든 미완성 주문을 얻습니다.
예를 들어, 현재 거래 쌍은 BTC_USD이고 계약 코드는 분자입니다.
exchange.GetOrders() // Equivalent to calling exchange.GetOrders("USD.futures")
이 함수는 모든 코인 기반 선물 계약의 미결 주문 데이터를 요청합니다.
이 업데이트는 현재 트커 구조의 시장 정보를 기록하는 트커 구조에 기호 필드를 추가합니다.
이 필드의 형식은 정확히 같은exchange.GetTicker()
function.
이 업데이트는 Order 구조에 Symbol 필드를 추가합니다. 이 필드의 형식은exchange.GetTicker()
기능.
이 업데이트는 또한 주문 구조의 ID 필드를 수정하여 제품 정보와 원래 주문 정보를 새로운 주문 ID 형식으로 기록합니다.exchange.GetOrder()
그 기능을 여기서 반복하지 않겠습니다.
이 업데이트는 위치 구조에 기호 필드를 추가합니다. 이 필드의 형식은exchange.GetTicker()
function.
플랫폼 전략 API 인터페이스 업그레이드에 따라 플랫폼의 백테스팅 시스템은 동기적으로 업데이트되었습니다. 또한 백테스팅 시스템은 다음을 지원합니다.
농장Account
구조로 반환GetAccount
미래에셋거래 대상의 구성원 기능이 확장되었습니다.
자기자본 현재 마진 자산 화폐의 총 자금. 이 필드를 지원하지 않는 몇 가지 선물 거래소를 제외하고 대부분의 거래소가 이 필드를 지원합니다. 주로 실시간 계정 마진 이익과 손실을 계산하는 데 사용됩니다.
UPnL 현재 마진 자산 통화에 보유된 모든 포지션의 실현되지 않은 이익과 손실. 대부분의 선물 거래소는 이 분야를 지원합니다.
선물 거래소 객체의 멤버 함수 SetMarginLevel가 업그레이드되었으며 매개 변수 기호가 추가되었습니다.
테스트 예제:
function main() {
exchange.SetCurrency("ETH_USDT")
exchange.SetContractType("swap")
// The current trading pair is ETH_USDT, the contract code is swap, and the leverage value is set to 10
exchange.SetMarginLevel(10)
// Directly specify the trading pair BTC_USDT, contract code swap, and set the leverage value to 20
exchange.SetMarginLevel("BTC_USDT.swap", 20)
}
필드CtValCcy
계약의 가치 단위를 기록합니다. 계약의 가치 단위는 BTC, USD, ETH 등이 될 수 있습니다.
필드CtVal
거래소에 거래 상품의 계약의 가치를 기록하고, 단위는 거래소에 기록된 통화입니다.CtValCcy
예를 들어:CtVal
0.01이며,CtValCcy