[TOC] 이 튜토리얼은 API 소개, 회고, 도표 등과 같은 전략 작성에 대한 기초 지식을 포함합니다. 이 기본 튜토리얼을 학습 한 후, 사용자는 기본 API를 능숙하게 사용하여 안정적인 리드 디스크 전략을 작성 할 수 있습니다.FMZ 발명가 양적 플랫폼 사용 입문 。
이전 버전의 설명서:발명가 양적 (FMZ.COM) 전략 작성 완전 사용 설명서 2.0 (도서)이 튜토리얼에는 많은 게시물들이 인덱스 되어 있습니다.
프로그래밍 거래는 API와 거래소를 통해 연결된 프로그램을 사용하여 설계된 의도대로 자동으로 거래하거나 다른 기능을 구현하는 것입니다. API는 응용 프로그램 프로그래밍 인터페이스 (Application Programming Interface, 즉 응용 프로그램 프로그래밍 인터페이스) 이다.
현재 디지털 화폐 거래소는 주로 두 가지 인터페이스 프로토콜이 있습니다: REST 및 Websocket. REST 프로토콜은 데이터를 한 번 가져오면 한 번 방문해야합니다. 예를 들어, 모의 거래소 wex.app의 API를 사용하여 브라우저에서 https://api.wex.app/api/v1/public/ticker?market=BTC_USDT를 직접 열면 다음과 같은 결과가 발생합니다.
{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}
이것은 BTC_USDT 거래 쌍의 최신 트레이드를 볼 수 있습니다.market=그 다음에는 특정 거래 쌍의 매개 변수이며, 다른 거래 쌍 데이터를 얻기 위해 수정할 수 있다. 시장 흐름과 같은 공개 인터페이스는 모든 사람이 액세스 할 수 있으므로 인증이 필요하지 않으며, 주문 및 액세스 계정과 같은 인터페이스는 API-KEY를 사용하여 서명해야하는 사용자 신원을 확인해야합니다. 웹소켓은 구독 모드이며, 구독이 필요한 콘텐츠를 전송 한 후 거래소는 업데이트 된 데이터를 프로그램에 전송하여 매번 다시 방문 할 필요가 없으므로 더 효율적입니다.
FMZ 양적 거래 플랫폼은 각 거래소의 REST 인터페이스를 포괄하고, 통일된 호출 방식과 데이터 형식을 사용하여 전략 기획을 더 간단하고 일반화한다. FMZ 플랫폼에서는 웹소켓을 편리하게 지원할 수 있으며, 다음 튜토리얼에서 자세히 설명한다.
FMZ 플랫폼 API 문서는 대부분 자바스크립트를 예로 들지만, 패키징으로 인해 다른 언어는 거의 다르지 않으며, 문법 문제에만 주의를 기울여야 합니다. C++은 약간 특이하며, 후의 튜토리얼에는 전문적인 소개가 있습니다. Js가 비교적 간단하고 호환성 문제가 없기 때문에 초보자 사용이 권장됩니다. FMZ 양자 플랫폼은 완전한 파이썬을 지원하고, 다양한 패키지를 자유롭게 설치할 수 있으며, 특정 프로그래밍 기반을 사용하는 것이 좋습니다.
파이썬은 다른 버전이 있기 때문에 프로그램 시작 시 지정할 수 있습니다.#!Python2,#!Python3참고: 자바스크립트는 최근에 ES6 문법으로 업그레이드되었으며, 관심있는 사람들은 알아볼 수 있습니다. 아래는 동일한 기능을 하는 파이썬과 자바스크립트 코드를 보여 주며, 문법상의 차이만 보이므로, API 문서는 자바스크립트의 예만을 제시하고, 이 튜토리얼은 또한 파이썬의 특수한 사용 사례를 고려합니다.
#python代码
def main():
while True:
Log(exchange.GetAccount().Balance)
Sleep(2000)
#相应的Js代码
function main(){
while(true){
Log(exchange.GetAccount().Balance)
Sleep(2000)
}
}
FMZ 양적 플랫폼은 API 인터페이스를 디버깅하기 위해 디버깅 도구를 제공합니다. 디버깅 도구는 자바스크립트만 지원하며, 한동안만 실행할 수 있으며, 리스크를 만들지 않고 거래소 인터페이스를 디버깅 할 수 있습니다. 반환된 데이터는 결과로 반환되며, 디버깅 도구의 코드는 저장되지 않습니다. 이 학습 튜토리얼에서 디버깅 도구를 동시에 사용할 수 있습니다.

정책 프로그램은 일반적인 프로그램과 마찬가지로 코드 순서대로 실행되며, 특별한 점은 main 함수가 있어야 한다는 것이다. 정책이 끊이지 않고 실행되어야 하기 때문에, 일반적으로, 루프와 함께 휴면 시간이 필요하다. 거래의 모든 API 접속 빈도가 제한되어 있기 때문에, 그에 따라 휴면 시간을 조정해야 한다. 이 구조는 전형적인 고정 간격 실행이며, websockt을 사용하여 이벤트 주도형 정책을 작성할 수도 있다.
다른 특수 함수는 다음과 같다:
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
while(true){
onTick()
Sleep(6000)
}
}
이전 예제에서 네트워크 접속 오류가 발생하면 정책이 직접 중단될 수 있으며, 자동으로 재시작되지 않는 정책과 유사한 정책을 원한다면, 실장 정책으로 try catch 오류를 용인하는 주 회로를 사용한다. 물론 정책이 안정된 경우에만 이러한 작업을 권장한다. 그렇지 않으면 모든 오류를 보고하지 않고, 정책 문제를 정렬하기 어렵다.
function onTick(){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
//在这里写策略逻辑,将会每6s调用一次
}
function main(){
try{
while(true){
onTick()
Sleep(6000)
}
}catch(err){
Log(err)
}
}
어떤 거래소와 관련된 API를 호출할 때 거래소와 거래쌍을 명확히 해야 합니다.exchange이 객체를 대표하는 것은exchange.GetTicker()이 거래소-거래 쌍의 거래 트릭터입니다.
FMZ 플랫폼은 동시에 여러 거래소-거래 쌍을 추가하는 것을 지원합니다. 같은 거래소 계정에서 동시에 BTC와 ETH를 조작할 수 있습니다. 동일한 거래소에서 다른 계정에서 BTC와 ETH를 동시에 조작할 수도 있습니다.exchanges행렬을 표현하면, 생성된 리드 디스크의 순서대로exchanges[0]、exchanges[1]이 경우, 거래 쌍의 포맷은 다음과 같습니다.BTC_USDTBTC는 거래 통화이며 USDT는 거래 통화입니다.

분명히, 우리가 거래하는 거래가 많다면, 이런 방식은 곤란할 수 있습니다. SetCurrency를 사용하여 거래 쌍을 교환하면,exchange.SetCurrency("BTC_USDT")이 순간exchange이 경우,BTC_USDT다음 통화로 거래 쌍을 변경할 때까지 유효합니다.참고로, 현재 트랜스페이지를 지원하는 최신 테스트는아래는 구체적인 예입니다.
var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
for(var i=0;i<symbols.length;i++){
exchange.SetCurrency(symbols[i])
var ticker = exchange.GetTicker()
var amount = _N(buyValue/ticker.Sell, 3)
exchange.Buy(ticker.Sell, amount)
Sleep(1000)
}
}
앞서 예시한 바와 같이, 상장 인터페이스는 일반적으로 공개된 인터페이스이며, 누구나 이용할 수 있다. 일반적인 상장 인터페이스는 다음과 같다: 상장 티커를 얻을 수 있다, 깊이 깊이를 얻을 수 있다, K라인 레코드를 얻을 수 있다, 거래 기록을 얻을 수 있다. 상장 은 거래 판단을 위한 전략의 기초이다. 아래에서 하나씩 소개할 것이며, 디버팅 도구에서 직접 시도하는 것이 좋습니다. 자세한 설명은 API 문서를 참조할 수 있다.
모든 인터페이스는Info필드, 거래소에서 반환된 원본 데이터 문자열을 나타내는 필드, JavaScript를 사용하여 이전에 분석해야 할 추가 정보를 보완할 수 있습니다.JSON.parse()파이썬은 json 라이브러리를 사용합니다.Time이 필드는 요청의 시간대를 나타내고, 지연을 판단하는데 사용될 수 있다.
리얼 디스크에서 API 인터페이스를 사용하는 경우에도 접속 실패로 돌아오는 경우도 있습니다.null파이썬이 돌아왔습니다.None, 이 자료를 사용할 때 오류가 발생하고 하드 디스크가 멈출 수 있으므로 오류 용기는 매우 중요합니다. 이 튜토리얼에서는 별도로 설명한다.
시장의 현재 행보를 얻는 것은 아마도 가장 일반적으로 사용되는 인터페이스이며, 마지막 거래 가격, 매매 가격, 최근 거래량 등의 정보를 확인할 수 있다. 주문하기 전에 거래 가격을 확인하기 위해 틱러 정보를 사용할 수 있다.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}。
function main() {
var ticker = exchange.GetTicker()
Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。
Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}
挂单深度信息获取. 挂单深度信息获取.GetTicker에는 매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매매
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
......
],
"Time":1530241857399
}
예를 들어, Deep Access의 경우:
function main() {
var depth = exchange.GetDepth()
Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}
가장 많이 사용되는 인터페이스 중 하나인 K 라인을 가져와 여러 지표의 기초를 계산하기 위해 한 번에 더 긴 가격 정보를 반환할 수 있습니다. K 라인 주기는 지정하지 않으면 실 디스크를 추가할 때 사용할 기본 주기를 나타냅니다. K 라인 길이는 지정할 수 없으며, 시간이 축적됨에 따라 계속 증가합니다. 최대 2000 루트, 처음 호출 된 약 200 루트 (다양한 거래소에서 반환됩니다). 마지막 K 라인은 최신의 K 라인입니다.
exchange.SetMaxBarLen(Len)처음 K선 수를 설정할 수 있으며, 최대 K선 수를 설정한다.예를 들어:exchange.SetMaxBarLen(500)
GetRecords는 다음과 같은 기간을 지정할 수 있습니다: PERIOD_M1:1 분, PERIOD_M5:5 분, PERIOD_M15:15 분, PERIOD_M30:30 분, PERIOD_H1:1 시간, PERIOD_D1:1 일.exchange.GetRecords(PERIOD_M1)최신 호스트를 업그레이드한 후, 사용자 정의 주기를 지원하고, 주기 수초를 직접 전송하여, 1분 K선에 따라 1분 이하의 K선에 따라 GetTrades () 을 통해 합성하고, 상품 선물은 tick에 따라 합성됩니다.이 강좌에서 비슷한 것을 발견할 수 있습니다.PERIOD_M1이러한 전체 대문자 변수는 FMZ의 기본 범용 변수이며, 관심있는 사람들은 직접 사용할 수 있는 특정 값을 직접 로그할 수 있다.
데이터 복귀 예시:
[
{"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
{"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
{"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
......
]
K 선의 예시:
function main(){
var close = []
var records = exchange.GetRecords(PERIOD_H1)
Log('total bars: ', records.length)
for(var i=0;i<records.length;i++){
close.push(records[i].Close)
}
return close
}
특정 시간 범위에 대한 거래 데이터를 취득하기 (자기 거래 데이터가 아닌), 일부 거래소는 지원하지 않습니다. 비교적 드물게 사용되며, API 문서에서 자세한 내용을 확인할 수 있습니다.
이러한 인터페이스는 계정과 관련되어 있기 때문에 직접적으로 액세스할 수 없으며 API-KEY 서명이 필요합니다. FMZ 플랫폼은 백그라운드 통합 자동 처리가 되어서 직접 사용할 수 있습니다.
계정 정보를 얻는다. 가장 많이 사용되는 인터페이스 중 하나이며, 예약을 하기 전에 호출해야 합니다. 잔액이 부족하지 않도록 하기 위해.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}。 이 중 Stocks는 거래 부리의 거래 통화 사용 가능한 잔액, FrozenStocks는 미완성 주문의 냉동 잔액, Balance는 계산 통화의 사용 가능한 잔액, FrozenBalance는 냉동 잔액이다.BTC_USDT주식은 BTC를 의미하고, 잔액은 USDT를 의미한다.
참고로, 반환된 결과는 지정된 거래쌍의 결과이며, 거래 계좌의 다른 통화에 대한 정보는 Info 필드에 있으며, 여러 거래쌍을 조작하는 것은 여러 번 호출할 필요가 없습니다.
현재 거래된 쌍의 총 가치를 보여주는 디스크:
function main(){
while(true){
var ticker = exchange.GetTicker()
var account = exchange.GetAccount()
var price = ticker.Buy
var stocks = account.Stocks + account.FrozenStocks
var balance = account.Balance + account.FrozenBalance
var value = stocks*price + balance
Log('Account value is: ', value)
LogProfit(value)
Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
//when run in debug tool, add a break here
}
}
아래의 요금. 호출 방법은 다음과 같습니다.exchange.Buy(Price, Amount)또는exchange.Buy(Price, Amount, Msg),Price는 가격, Amount는 수량,Msg는 추가 문자열로 리드 디스크 로그에 표시될 수 있습니다. 이 방법은 주문을 올리는 방식입니다. 즉시 완전히 거래되지 않으면 미완성 주문이 생성됩니다. 주문은 성공적으로 주문 id로 반환되며, 실패하면 주문 id로 반환됩니다.null, 주문 상태를 확인하기 위해
만약 하향 가격으로 구매할 경우, Price는 -1, Amount는 하향 가격으로 구매할 수 있습니다.exchange.Buy(-1, 0.5)거래가 맞습니다.ETH_BTC일부 거래소에서는 시가 표를 지원하지 않으며, 선물 반추도 지원하지 않습니다.
일부 거래 모든 가격과 수량 정확도 요구 사항, 사용할 수 있습니다_N()정밀 함수를 제어한다. 선물 거래에 대한 추가적인 의미가 있다.
가격에 도달했을 때 구매한 예는:
function main(){
while(true){
var ticker = exchange.GetTicker()
var price = ticker.Sell
if(price >= 7000){
exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
break
}
Sleep(3000)//Sleep 3000ms
}
Log('done')
}
하부매매요소 △ 매수요소 △ 매수요소 △ 매수요소 △ 매수요소 △ 매수요소exchange.Sell(-1, 0.2), 0.2 ETH를 판매하는 것을 의미합니다.
주문 id에 따라 주문 정보를 얻는다. 일반적인 인터페이스, 호출 방법exchange.GetOrder(OrderId),OrderId은 주문 ID이며, 주문할 때 반환됩니다.주문 유형에 주의하십시오Type필드 및 주문 상태Status실제 값은 숫자이며, 다른 의미를 나타내지만 기억에 좋지 않습니다. FMZ는 미완성 주문의 경우와 같이 전 세계 상수를 사용하여 이러한 값을 나타냅니다.Status0과 같습니다.ORDER_STATE_PENDING이 모든 범지구 상수는 문서에서 확인할 수 있습니다.ᄂ) 결과를 반환합니다.
{
"Id":125723661, //订单id
"Amount":0.01, //订单数量
"Price":7000, //订单价格
"DealAmount":0, //已成交数量
"AvgPrice":0, //成交均价
"Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
"Type":1,// 订单类型,0:买单, 1:卖单
"ContractType":"",//合约类型,用于期货交易
"Info":{} //交易所返回原始信息
}
}
특정 양의 동전을 구매하는 전략:
function main(){
while(true){
var amount = exchange.GetAccount().Stocks
var ticker = exchange.GetTicker()
var id = null
if(5-amount>0.01){
id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
}else{
Log('Job completed')
return //return the main function, bot will stop
}
Sleep(3000) //Sleep 3000ms
if(id){
var status = exchange.GetOrder(id).Status
if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
exchange.CancelOrder(id)
}
}
}
}
현재 거래된 모든 미완성 주문에 대한 목록을 가져옵니다. 미완성 주문이 없으면 빈 배열을 반환합니다. GetOrder와 같은 주문 목록에 대한 구체적인 결과
모든 주문에 대한 현재 거래를 취소하는 예시:
function CancelAll(){
var orders = exchange.GetOrders()
for(var i=0;i<orders.length;i++){
exchange.CancelOrder(orders[i].Id) // cancel order by orderID
}
}
function main(){
CancelAll()
while(true){
//do something
Sleep(10000)
}
}
주문에 따라 주문을 취소한다.exchange.CancelOrder(OrderId)○ 취소 성공 반환 true, 그렇지 않으면 반환 false ○ 주의 주문이 완전히 거래 된 경우 취소 실패
디지털 화폐 선물 거래와 현금 거래는 약간 다릅니다. 위의 현금 거래의 기능은 또한 선물, 단기 거래에 고유한 기능이 있습니다. 디지털 화폐 선물 절차 거래를 수행하기 전에 웹 사이트에서 수작업에 익숙해져야하며, 포지션 개시, 경감, 전 포지, 경감, 레버리지, 경감 손실, 부동 수익, 보증금 등의 개념과 그에 따른 계산 공식과 같은 기본 개념을 이해해야합니다. 각 선물 거래소에서 관련 튜토리얼을 찾을 수 있으며, 스스로 학습해야합니다.
영구 계약은 선물 계약과 유사하지만 동시에 다공백을 보유하는 개념이 없습니다.
거래소가 OKEX 및 Huobi 선물과 같은 선물 현금을 동시에 지원하는 경우, 거래소 인터페이스에서 OKEX 선물 칸과 Huobi 선물 칸을 개별적으로 선택하여 FMZ에서 현금과 다른 거래소로 간주해야합니다.
선물 거래의 첫 번째 단계는 거래하고자하는 계약을 설정하는 것입니다. OKEX 선물은 실盘 또는 회수기를 만들 때 BTC 거래 쌍을 선택합니다. 또한 코드에 해당 주, 다음 주 또는 분기 계약이 설정되어야합니다. 설정하지 않으면 요청됩니다.invalid contract type。현금 거래 쌍과 달리, 선물 계약은 거래 거래 통화인 BTC와 같이 보장을 한다. 거래 쌍은 BTC를 추가하는 BTC_USD 거래 쌍을 일반적으로 나타냅니다. USDT로 보장을 하는 미래가 존재한다면, BTC_USDT 거래 쌍을 추가하는 실시판을 만들 필요가 있다.거래 쌍을 설정한 후, 영구, 주, 다음 주 등과 같은 특정 계약 유형을 설정해야합니다. 계약을 설정한 후, 거래, 구매 및 기타 작업을 수행 할 수 있습니다.
비트코인, OKEX, HuobiDM 등은 코인 기반 및 USDT 기반의 계약이 존재하며, 실디 디스크 설정 계약을 추가할 때 구분할 필요가 있다. 구체적인 설정은 다음과 같다.
//OKEX期货
exchange.SetContractType("swap") // 设置为永续合约
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
//HuobiDM
exchange.SetContractType("this_week") // 设置为当周合约
exchange.SetContractType("next_week") // 设置为次周合约
exchange.SetContractType("quarter") // 设置为季度合约
exchange.SetContractType("swap") // 设置为永续合约
//币安期货
exchange.SetContractType("swap") // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter") // 设置为当季合约
exchange.SetContractType("next_quarter") // 设置为次季合约
//BitMEX
exchange.SetContractType("XBTUSD") // 设置为永续合约
exchange.SetContractType("XBTM19") // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码
//GateIO
exchange.SetContractType("swap") // 设置为永续合约,不设置默认为swap永续合约。
//Deribit
exchange.SetContractType("BTC-27APR18") // 具体某个时间结算的合约,详情参看Deribit官网。
현재 포지션 정보 목록을 가져오기 위해, OKEX(OKCOIN) 선물은 얻을 수 있는 계약 유형을 지정하는 파라미터를 전송할 수 있습니다. 포지션이 없으면 빈 목록을 반환합니다.[]│ 보유정보는 다음과 같이 반환됩니다. 구체적인 정보는 많고, 거래에 대한 구체적인 분석과 결합해야 합니다.
| 데이터 타입 | 변수 이름 | 설명하다 |
|---|
“Object HDI Info HDI 거래소에서 반환된 원시 구조” “number”, “MarginLevel”, “bar size”, “OKCoin”은 10 또는 20, “OK Futures”의 “full stocks” 모드는 “fixed 10”로 반환됩니다. “number”은 “Amount”을 뜻하며, “OKCoin”은 “계약의 양”을 뜻합니다. “FrozenAmount” “FrozenAmount” “FrozenAmount” “FrozenAmount” “FrozenAmount” 버 프라이스 더 지주 평균 가격 버 Margin Margin Margin number Profit 상품 선물: 지분시장 손실, 디지털 통화: ((디지털 통화 단위:BTC/LTC, 전통적인 선물 단위:RMB, 참고: OKCoin 선물 전仓 상태에서 흑자를 달성하는 것을 가리키고, 지분손실이 아닌 지분손실을 가리키고) ▲const DATAType DATAPD_LONG는 다수 상위 포지션 (((CTP에서 closebuy_today 평면), PD_SHORT는 공백 포지션 (((CTP에서 closesell_today 평면), (CTP 선물에서) PD_LONG_YD는 어제 다수 상위 포지션 (((closebuy 평면), PD_SHORTYD는 어제 공백 포지션 (((closesell 평면) String arrayContractType 상품은 계약 코드, 주식은 거래소 코드 주식 코드 , 특정 매개 변수 SetContractType의 전송 타입
function main(){
exchange.SetContractType("this_week");
var position = exchange.GetPosition();
if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
}
}
먼저 레버 크기와 호출 방법을 설정해야 합니다.exchange.SetMarginLevel(10)10은 10배의 레버리지를 의미하며, 레버리지를 지원하는 크기는 해당 거래소에서 확인하고, 10은 10배의 레버리지를 의미합니다.참고: 레버리지는 거래소에서 설정되어야 합니다. 코드는 거래소에서 설정된 것과 일치해야 합니다. 그렇지 않으면 오류가 발생합니다.│ 또는 설정하지 않고도, 기본 레버를 사용한다.
다음으로 거래 방향을 설정하고, 호출 방법을 설정합니다.exchange.SetDirection(Direction)“이런 일이 벌어진다면, 우리가 어떻게 해야 할까요?”선물과 달리, 영구 계약이 동시에 다공개 개념을 보유하지 않으면, 즉 단일 포지션을 보유하는 것은 허용되지 않으며, 다공개하면 자동으로 다공개가 이루어지며, 모든 것은 단지 설정해야합니다.buy그리고sell가능. 양방향 포지션을 지원하는 경우 설정이 필요합니다.closebuy,closebuy。특정 관계:
| 작동 | SetDirection의 변수 | 하향 함수 |
|---|---|---|
| 상장 개설 | exchange.SetDirection(“buy”) | exchange.Buy() |
| 평다보상 | exchange.SetDirection(“closebuy”) | exchange.Sell() |
| 공백점 | exchange.SetDirection(“sell”) | exchange.Sell() |
| 공백 | exchange.SetDirection(“closesell”) | exchange.Buy() |
마지막으로 구체적인 개시 및 매각 코드가 있으며, 하차 주문량은 거래소마다 다릅니다. 예를 들어 huobi 선물은 수표에 따라 한 장은 100달러이다. 선물 재검토는 시장 가격을 지지하지 않는다.
function main(){
exchange.SetContractType("this_week") // 举例设置 为OKEX期货 当周合约
price = exchange.GetTicker().Last
exchange.SetMarginLevel(10) //设置杠杆为10倍
exchange.SetDirection("buy") //设置下单类型为做多
exchange.Buy(price+10, 20) // 合约数量为20下单
pos = exchange.GetPosition()
Log(pos)
Log(exchange.GetOrders()) //查看是否有未成交订单
exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
exchange.Sell(price-10, 20)
}
아래는 전체 평점 전략의 구체적인 예입니다.
function main(){
while(true){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){
Log('无法获取ticker')
return
}
if(!pos || pos.length == 0 ){
Log('已无持仓')
return
}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
코드에서 레버리지 계정으로 전환해야 합니다. 다른 것은 현금 거래와 동일합니다.
exchange.IO ((“trade_margin”) 를 사용하여 계정 모드로 전환하면 계정 자산의 주문 및 취득은 거래소의 레버리지 인터페이스를 방문합니다. exchange.IO ((“trade_normal”) 를 사용하여 일반 계정 모드로 다시 전환하십시오.
지원하는 거래소:
상품 선물 거래와 디지털 화폐 선물 거래에는 큰 차이가 있다. 첫째, 상품 선물의 거래 시간은 짧고, 디지털 화폐는 24시간 거래한다. 상품 선물의 협약도 일반적으로 사용되는 REST API가 아니다. 상품 선물의 거래 주파수 및 기금 수 제한은 디지털 화폐는 매우 느슨하다. 따라서 거래 상품 선물에는 특별한 주의가 필요한 많은 부분이 있으며, 풍부한 조작 수동 조작 경험이 권장된다. FMZ는 simnow 상품 선물 시뮬레이션 디스크를 지원한다. 참조: https://www.fmz.com/bbs-topic/325 。 상품 선물 회사는 추가: https://www.fmz.com/bbs-topic/371
상품 선물과 2019년 6월 개설된 개인 개인 사용자에 필요한 개설된 선물 거래자 신청 허가 코드 ((특정 신청 필요한 자료 템플릿은 위키백과 또는 QQ 그룹에서 알릴 수 있습니다), 일반적으로 4-5일 정도 걸리고, 단계가 다소 번거롭습니다. FMZ 양적 플랫폼은 각 선물 서비스 제공자에게 소프트웨어 라이선스를 신청한 프로그램 거래 업체로서, 사용자가 직접 신청할 필요 없이 사용할 수 있으며, 추가된 선물 거래자는 탐색 을 통해 FMZ가 이미 신청한 목록을 볼 수 있습니다. 구체적인 참고 게시물: https://www.fmz.com/bbs-topic/3860 。 귀하의 선물 공급자가 목록에 없거나 자체로 신청하거나 거래 개설자를 다시 지원하는 경우 일반적으로 2일 정도 걸립니다. FMZ와 일부 거래자가 깊은 협력 관계를 맺고있는 경우, 예를 들어, 안토 앙타이 주, FMZ의 상품 구매 기관은 FMZ의 플랫폼을 사용하며, 사용자가 자동으로 개설 할 수 있습니다.
FMZ 플랫폼 아키텍처의 장점으로 인해 사용자는 또한 여러 개의 선물 거래자 계정을 추가 할 수 있으며, 다른 상품 선물 프로그래밍 거래 소프트웨어가 수행 할 수없는 기능을 구현 할 수 있습니다. 예를 들어, 고주파 틱의 합성, 참조: https://www.fmz.com/bbs-topic/1184
우선, 24시간 거래가 아닌 로그인 작업이 필요하기 때문에 거래하기 전에 링크 상태를 판단해야 합니다.exchange.IO("status")~을 위한true연결된 거래소 ᅳ 로그인 성공하지 않은 경우 API를 호출하고 ‘not login’을 요청하지 않습니다. 전략 시작 후 Sleep ((2000), 로그인 일정 시간을 부여할 수 있습니다. 가입을 다시 시도할 수도 있습니다._C(exchange.SetContractType,"MA888")이 사진은 “미국 항공사”의 사진입니다.
상품 선물의 취득 및 거래 코드는 디지털 화폐 선물과 동일하며, 여기서 다른 점과 주의해야 할 사항에 대해 소개한다.
function main(){
_C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
while(true){
if(exchange.IO("status")){
var ticker = exchange.GetTicker()
Log("MA888 ticker:", ticker)
LogStatus(_D(), "已经连接CTP !")//_D获取事件
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(1000)
}
}
}
상품의 미래형 창고 거래를 사용하는 것이 좋습니다 (이후 설명), 이 때 코드는 매우 간단하여 번거로운 세부 사항을 처리 할 필요가 없습니다. 源代码复制地址:https://www.fmz.com/strategy/57029
function main() {
// 使用了商品期货类库的CTA策略框架
$.CTA(Symbols, function(st) {
var r = st.records
var mp = st.position.amount
var symbol = st.symbol
/*
r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
返回值如为n:
n = 0 : 指全部平仓(不管当前持多持空)
n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
无返回值表示什么也不做
*/
if (r.length < SlowPeriod) {
return
}
var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
if (mp <= 0 && cross > ConfirmPeriod) {
Log(symbol, "金叉周期", cross, "当前持仓", mp);
return Lots * (mp < 0 ? 2 : 1)
} else if (mp >= 0 && cross < -ConfirmPeriod) {
Log(symbol, "死叉周期", cross, "当前持仓", mp);
return -Lots * (mp > 0 ? 2 : 1)
}
});
}
상품 선물은 CTP 프로토콜을 사용하며, 모든 거래상황과 주문 거래는 변경된 후에만 통보되며, 주문, 계정, 입장을 조회하는 것은 적극적인 조회입니다. 따라서 이벤트 드라이브의 높은 주파수 전략에 적합합니다. 기본 모드에서 거래상황을 얻는 인터페이스는GetTicker、GetDepth、GetRecords항상 캐시 된 데이터가 최신 데이터를 얻기 위해 있으며, 데이터가 없으면 데이터가있을 때까지 기다립니다. 따라서 전략은 Sleep을 사용하지 않습니다. 상황이 변경되면, ticker, depth, records는 업데이트됩니다. 이 때 임의의 인터페이스를 호출하면 즉시 반환됩니다. 호출 된 인터페이스 상태는 업데이트 모드를 기다리고 있습니다. 다음 번에 동일한 인터페이스를 호출하면 새로운 데이터가 반환 될 때까지 기다립니다.
만약 당신이 모든 데이터를 얻을 수 있다면, 심지어 오래된 데이터라도, 당신은 즉시 업데이트 모드로 전환할 수 있습니다.exchange.IO("mode", 0)이 때 전략은 이벤트 드라이브로 쓰일 수 없으며, SLeep 이벤트를 추가하여 빠른 죽음의 순환을 피해야 한다. 일부 낮은 주파수 전략은 이 모드를 사용할 수 있으며, 전략 설계는 간단하다.exchange.IO("mode", 1)기본 캐시 모드로 되돌릴 수 있습니다.
단일 계약을 작동 할 때, 기본 모드를 사용할 수 있습니다. 그러나 여러 계약이라면, 계약 중 하나가 업데이트되지 않은 상태가 발생할 수 있으며, 이는 거래 인터페이스를 막고 다른 계약의 거래 상태 업데이트도 얻을 수 없습니다. 이 문제를 해결하려면 즉시 업데이트 모드를 사용할 수 있지만, 고주파 전략을 작성하지 않습니다. 이 때 이벤트 푸시 모드를 사용하여 주문과 거래의 추진을 얻을 수 있습니다.exchange.IO("wait")상품 선물에서 드물게 사용되는 여러 거래소 객체를 추가하면 사용할 수 있습니다.exchange.IO("wait_any")이 때 반환된 인덱스는 반환된 거래소 인덱스를 나타냅니다.
트래픽 틱 변경{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}
주문을 전송: {Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}
이 시점에서 전략 구조는 다음과 같이 작성할 수 있습니다.
function on_tick(symbol){
Log("symbol update")
exchange.SetContractType(symbol)
Log(exchange.GetTicker())
}
function on_order(order){
Log("order update", order)
}
function main(){
while(true){
if(exchange.IO("status")){ //判断链接状态
exchange.IO("mode", 0)
_C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
_C(exchange.SetContractType, "rb888")//订阅rb
while(true){
var e = exchange.IO("wait")
if(e){
if(e.event == "tick"){
on_tick(e.Symbol)
}else if(e.event == "order"){
on_order(e.Order)
}
}
}
}else{
Sleep(10*1000)
}
}
}
또한, 상품 선물과 디지털 통화 거래소의 차이에 주목하십시오. 예를 들어, GetDepth는 실제로 1 개의 깊이 (~ 5 개의 깊이 요금이 비싸) 만이 있으며, GetTrades는 거래 역사를 얻을 수 없습니다 (~ 포지션 변경에 따라 시뮬레이션되며 실제 거래 기록이 없습니다). 상품 선물에는 오락 제한이 있으며, 오락 할 때, 깊이 판매 한 판매 가격은 오락 가격이며, 주문량은 0이며, 오락 할 때, 구매 한 구매 가격은 오락 가격이며, 주문량은 0입니다.
exchange.IO ((“instruments”): 거래소의 모든 계약 목록 {계약 이름: 상세}을 사전 형식으로 반환하고, 실디 디스크만 지원한다. exchange.IO ((“products”): Exchange의 모든 제품 목록을 {상품 이름: 상세} 사전 형식으로 반환합니다. exchange.IO ((“subscribed”): 이미 가입한 상태의 계약을 반환하고, 형식상 동일하며, 실 디스크만 지원한다.
전통적인 CTP의 미래ContractType즉, 계약 ID를 가리키고, 대소문자를 구분한다.exchange.SetContractType("au1506")계약 설정 성공 후 반환 계약의 세부 정보, 예를 들어 최소 한 번 구매한 금액, 수료, 배달 시간 등. 여러 계약에 가입할 때, 첫 번째 가입 요청이 진짜로 보내질 때만, 그 다음에는 코드 수준에서 거래 쌍을 전환할 때만, 시간이 걸리지 않습니다. 주력 연속 계약은 MA888과 같은 코드 888이며, MA000과 같은 연속 지수 계약은 000입니다. 가상 계약 거래는 재측정만 지원하며, 실제 디스크는 취득만 지원합니다.그러나 맥 언어는 주력 계약을 조작할 수 있으며, 프로그램은 자동으로 포지션을 변경합니다. 즉, 비주력 포지션의 포지션을 제거하고 주력 포지션에 새로운 포지션을 열습니다.
로그인이 성공하지 않으면 계약을 설정할 수 없지만 즉시 반환되므로 CTP 로그인이 완료되었다는 것을 알고 _C로 다시 시도할 수 있습니다. 로그인이 성공한 후에는 계약을 다시 설정하는 것은 시간이 오래 걸리지 않으며 실제 네트워크 접속도 발생하지 않습니다.
SetDirection방향에 대한buy, closebuy, sell, closesell4개의 변수, 상품의 선물이 더 많이 나갑니다.closebuy_today그리고closesell_today“아, 내가 지금 이 상황을 보고 있다.closebuy/closesell평지전 포지션에 대해서는, 단지 지난 주기의 품종을 구분하여 평지오늘평지전 포지션에 영향을 미칠 수 있으므로 우선 평지전 포지션이 필요하다. CTP 전통적인 선물에 대해서는, 제2변수 ?? 1 ?? 또는 ?? 2 ?? 또는 ?? 3 ?? 를 설정할 수 있으며, 각각 투기 ?? , ?? 수리 ?? , ?? 수리 ?? 을 설정할 수 있으며, 암묵적 투기가 설정되지 않는다.구매, 거래, 포지션 획득, 주문 획득, 인출, 계좌 획득과 같은 구체적인 작업은 디지털 화폐 선물 거래와 동일합니다.
| 작동 | SetDirection의 변수 | 하향 함수 |
|---|---|---|
| 상장 개설 | exchange.SetDirection(“buy”) | exchange.Buy() |
| 평다보상 | exchange.SetDirection(“closebuy”) | exchange.Sell() |
| 공백점 | exchange.SetDirection(“sell”) | exchange.Sell() |
| 공백 | exchange.SetDirection(“closesell”) | exchange.Buy() |
아래의 예제는 구체적인 평소 위치 함수입니다. 이 예제는 너무 단순하기 때문에, 거래 시간에 있는지, 거래가 완전히 이루어지지 않았는지, 주문을 중고 시험하는 방법, 최대 주문 수량이 얼마나 되는지, 주파수가 너무 높지 않은지, 구체적으로 마이너스 또는 마이너스 등과 같은 일련의 문제를 고려해야합니다. 참고용으로만.하드 디스크의 가공 저장소는 플랫폼으로 포장 된 클래스 라이브러리를 사용하는 것이 좋습니다. https://www.fmz.com/strategy/12961ᄒ 클래식 라이브러리 섹션에서 자세한 설명이 있으며, 클래식 라이브러리 소드 코드를 공부하는 것도 좋습니다. ᄒ
function Cover(contractType, amount, slide) {
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType != contractType) {
continue;
}
var depth = _C(e.GetDepth);
if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]);
} else {
exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]);
}
}
}
상품 선물 지원 사용자 지정 주문 유형 (실드 디스크 지원, 역측정 지원하지 않음), 후의 방식 지정, 에 부착_ 뒤에 있는 것은
exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")
특정 후자는 다음과 같습니다.
상품 선물 거래소에서 기본적으로 열리는 것은 CTP 인터페이스이며, 요청이 있을 경우, 이스천 인터페이스로 바꿀 수 있다. FMZ의 패키징을 통해 호출하는 방법은 동일하다. 차이점은 계정, 주문, 보유는 푸시 모드이기 때문에 관리자가 이 데이터를 로컬로 유지하며, 해당 인터페이스를 호출할 때 즉시 반환되며, 실제로 요청을 발송하지 않는다.
이스케인 프로토콜은 다음과 같이 주문 유형을 사용자 정의합니다.
실 디스크 인터페이스의 Log는 문자열 뒤에 @ 문자를 더하면 메시지가 전송 큐에 들어가고, WeChat 또는 telegram을 연결하면 바로 전송된다.Log('推送到微信@')
로그 색상도 사용자 정의할 수 있습니다.Log('这是一个红色字体的日志 #ff0000') 。#ff0000RGB 색상으로 16배를 나타냅니다.
모든 로그 파일은 호스트의 디렉터리에 있는 실 디스크의 sqlit 데이터베이스 내에 존재하며, 다운로드하여 데이터베이스 소프트웨어를 사용하여 열 수 있으며, 복사하여 백업 복구를 할 수도 있다.
수익을 기록하고, 실 디스크 인터페이스에 수익 곡선을 그리는 것, 실 디스크를 재부팅한 후에도 유지할 수 있다.LogProfit(1000)주의하세요.LogProfit이 값은 반드시 수익이 아니라, 어떤 숫자일 수 있고, 스스로 작성해야 한다.
레지드 디스크 상태, 로그 기록이 저장되고 계속 갱신되기 때문에, 저장되지 않은 정보만 표시해야 하는 경우,LogStatus기능.LogStatus의 arguments는 문자열이며, 의 정보를 표현하는 데에도 사용될 수 있다.
구체적인 디스크 상태 위치를 보여주는 표의 예시:
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表
이 변수는 밀리초수입니다.Sleep(1000)휴면 1초. 거래의 모든 접근 빈도 제한으로 인해, 일반적인 전략은 죽은 순환에 휴면 시간을 추가한다.
하드 디스크가 다시 시작되면 프로그램이 다시 시작됩니다._GJSON 서열화된 내용을 저장할 수 있는 매우 편리하고 실용적인 방법입니다._G함수는onexit()이 방법은 전략이 종료될 때마다 필요한 정보를 자동으로 저장합니다.
그리고, 만약 여러분이 더 많은 포맷된 데이터를 저장하고 싶다면,_G 함수는 잘 쓰이지 않는데, 파이썬을 사용하여 데이터베이스에 직접 쓸 수 있다.
function onexit(){
_G('profit', profit)
}
function main(){
_G("num", 1); // 设置一个全局变量num, 值为1 s
_G("num", "ok"); // 更改一个全局变量num, 值为字符串ok
_G("num", null); // 删除全局变量 num
_G("num"); // 返回全局变量num的值,如果不存在返回null
var profit = 0
if(_G('profit')){
profit = _G('profit')
}
}
주문을 할 때 가격과 수량의 정확성을 제어하는 경우가 많으며, FMZ는 소수점의 소수를 저장하는 FMZ_N 함수를 내장하고 있습니다._N(4.253,2)4.25이 됩니다.
모든 API에 접속할 때 성공할 수 있다는 보장은 없습니다._C는 자동으로 다시 시도하는 함수이다. () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()_C(exchange.GetTicker), 기본 재시험 간격은 3초이며, 재시험 간격을 제어하기 위해_CDelay 함수를 호출할 수 있습니다. 예를 들어,_CDelay(1000).GetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderC++에서는 C++를 C++에서 C++에서 C++에서 C++에서 C++에서 C++에서 C++에서
CancelOrder_C 함수를 사용할 수 없습니다, 왜냐하면 철회 실패는 여러 가지 이유가 있기 때문에, 한 단자가 거래 된 경우, 철회 함수는 다시 실패로 돌아옵니다. _C 함수를 사용하면 계속 다시 시도 될 수 있습니다.
_C 함수는 또한 C 함수에도 사용될 수 있다.
”` function main(){ var ticker = _C(exchange.GetTicker)