FMZ 정량화 플랫폼 전략 작성 초등 교과서 (보아야 할 것)

저자:초목, 2019-08-13 17:47:27, 업데이트: 2021-08-06 10:29:46

[TOC] 이 튜토리얼은 API 소개, 재검토, 도표 등과 같은 전략 작성에 대한 초보적인 지식을 포함합니다. 이 기본 튜토리얼을 학습한 후 사용자는 기본 API를 능숙하게 사용할 수 있으며 안정적인 실제 디스크 전략 작성할 수 있습니다. 이 튜토리얼을 배우기 전에 먼저 배워야합니다.FMZ 발명가 양적 플랫폼을 이용한 소개 。

이전 버전의 튜토리어:발명자 정량화 (FMZ.COM) 전략 작성 완전히 사용 설명서 2.0 (교습)이 튜토리얼에는 많은 게시물 인덱스가 나열되어 있습니다.

전략 작성에 대한 초기 설명

API 소개

프로그래밍 거래는 응용 프로그램이 API를 통해 거래소와 연결하여 설계된 의도대로 자동으로 거래 또는 다른 기능을 구현하는 것입니다.

현재 디지털 화폐 거래소는 두 가지 인터페이스 프로토콜이 있습니다: 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 정량화 플랫폼은 완전한 파이썬을 지원하며 다양한 설치 패키지를 자유롭게 설치 할 수 있으며, 특정 프로그래밍 기초가있는 사용이 권장됩니다. 프로그래밍 언어를 배우고 싶지 않은 사용자, 단지 전략을 빨리 작성하려는 사용자에게는 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 인터페이스를 디큐밍하는 데 필요한 디큐밍 도구를 제공합니다.https://www.fmz.com/m/debug▲ 디뷰팅 도구는 자바스크립트를 지원하고, 일시적으로만 실행할 수 있으며, 실제 디스크를 만들지 않고 거래소 인터페이스를 디뷰팅할 수 있다. ▲return의 데이터는 결과로 반환되며, 디뷰팅 도구의 코드는 저장되지 않는다.img

전략 프로그램 아키텍처

정책 프로그램은 일반 프로그램과 마찬가지로 코드 순서대로 실행되는 특이점으로 메인 함수가 있어야 한다. 정책은 중단 없이 실행되어야 하기 때문에, 보통은 루프와 휴식시간이 필요하다. 거래의 모든 API 접속 빈도가 제한되어 있기 때문에 휴식시간을 적절히 조정해야 한다. 이 구조는 전형적인 고정 간격 실행이며, websockt을 사용하여 사건형 정책을 작성할 수도 있다.

다른 특별한 기능은 다음과 같습니다.

  • onexit ((() 는 스웨이트랙 함수를 정상적으로 종료하기 위해 최대 실행 시간이 5분이며, 시간이 지나면 인터럽트 오류를 표시할 것이라고 선언할 수 없습니다. 종료 시 결과를 저장할 수 있습니다.
  • onerror ((() 는 예외 출력 함수로서, 최대 실행 시간은 5분이며, 선언할 수 없습니다.
  • init () 는 초기화 함수로서, 정책 프로그램은 실행 시 자동으로 호출되며, 선언할 수 없습니다.
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 소개

거래소 및 거래 쌍 설정

어떤 거래소와 관련된 API를 호출할 때 거래소와 거래 쌍을 명확히 해야 한다.exchange이 문자를 사용해서exchange.GetTicker()이 거래상 거래 쌍의 트렌드 틱러가 얻을 것입니다.

FMZ 플랫폼은 동시에 여러 거래소-거래 쌍을 추가하는 것을 지원합니다. 예를 들어, 같은 거래소 계정을 동시에 운영하는 BTC와 ETH를 동시에 운영할 수 있습니다. 한 거래소에서 BTC와 다른 거래소에서 ETH를 동시에 운영할 수 있습니다.exchanges정렬은 실제 디스크가 생성된 순서대로 추가된 것을 나타냅니다.exchanges[0]exchanges[1]... 이런 식으로. 거래 쌍의 형식은BTC_USDTBTC는 거래 통화이며 USDT는 요금 통화입니다.

img

분명히, 우리가 많은 거래 쌍을 조작하는 경우, 이 방법은 문제가 될 것입니다.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 라인 레코드를 획득, 거래 기록 트레이드를 획득합니다. 시장은 거래 판단을 수행하는 전략의 기초입니다.

모든 인터페이스가Info필드, 거래소가 반환한 원본 데이터 문자열을 나타내는 필드, 추가 정보를 보충하는 데 사용할 수 있습니다.JSON.parse()파이썬은 json 라이브러리를 사용합니다.Time필드는 요청의 시간표를 나타냅니다. 이는 지연을 판단하는 데 사용됩니다.

실제 디스크에서 API 인터페이스를 사용하는 경우에도 액세스 실패가 발생할 수 있습니다.null파이썬이 돌아왔습니다.None이 경우, 이 데이터의 사용은 오류를 발생시키고 디스크가 중지되는 것을 초래할 수 있으므로 오류 용서는 매우 중요합니다. 이 튜토리얼에서는 별도로 설명할 것입니다.

GetTicker

시장의 현재 현황을 얻는 것은 아마도 가장 일반적으로 사용되는 인터페이스이며, 마지막 거래 가격, 구매 판매 가격, 최근 거래량 등의 정보를 확인할 수 있습니다. 다시 주문하기 전에 티커 정보에 따라 거래 가격을 결정할 수 있습니다. 실제 디스크 반환의 예.{"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에는 구매와 판매가 포함되어 있지만, 더 깊은 에 대한 문의가 필요한 경우, 이 인터페이스를 사용하면 일반적으로 상위 200개의 을 찾을 수 있다. 이 인터페이스를 사용하여 충격 가격을 계산할 수 있다. 아래는 실제 반환 결과이다. 여기서 Asks는 파는 을 나타내고, 매개군에서 각각 파는 , 파는 ... 그래서 가격은 순차적으로 상승한다.

{
    "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
}

파워포인트와 파워포인트에 대해 더 자세히 알아보도록 하겠습니다.

function main() {
    var depth = exchange.GetDepth()
    Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}

GetRecords

K 라인을 얻는 것은 가장 많이 사용되는 인터페이스 중 하나이며, 한 번에 더 긴 시간 동안의 가격 정보를 반환하여 다양한 지표의 기초를 계산합니다. K 라인 주기는 정하지 않으면 실제 디스크를 추가할 때 사용 될 기본 주기를 나타냅니다. K 라인의 길이를 지정할 수 없습니다. 시간 축적으로 계속 증가합니다. 최대 2000 베인, 처음 호출하면 약 200 베인 (다양한 거래소가 다르게 반환합니다). 마지막 K 라인은 최신 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 () 를 통해 생성, 상품 선물은 틱에 따라 생성.이 강의에서 비슷한 것을 볼 수 있습니다.PERIOD_M1FMZ의 기본 범용 변수인 이 모든 변수들은 일반적으로 직접 사용할 수 있는 특정 값에 대해 직접 로그를 작성할 수 있다.

데이터의 예를 돌려보냅니다.

[
    {"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
}

GetTrades

특정 시간 범위의 거래 데이터 (자기 거래 데이터가 아닌) 를 얻는 것은 일부 거래소가 지원하지 않습니다. 비교적 자주 사용되지 않습니다. API 문서에서 자세한 내용을 확인할 수 있습니다.

계좌를 열고 거래

이 인터페이스는 계정과 관련이 있기 때문에 직접 액세스 할 수 없으며 API-KEY 서명으로 사용해야합니다. FMZ 플랫폼은 백그라운드 통화를 자동으로 처리하여 직접 사용할 수 있습니다.

GetAccount 계정을 얻으십시오

계정 정보를 얻는다. 가장 많이 사용하는 인터페이스 중 하나이며, 부채를 피하기 위해 주문을 하기 전에 호출해야 한다.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}◎ 여기서 스톡은 거래 쌍의 거래 화폐 사용 가능한 잔액, 프로젠 스톡은 미완성 주문의 동결된 잔액, 발랜스는 가격화 화폐 사용 가능한 잔액, 프로젠 발랜스는 거래가 맞다면 동결된 잔액이다.BTC_USDT이 경우, 주식은 BTC를 의미하고, 균형은 USDT를 의미합니다.

참고로 반환된 결과는 지정된 거래 쌍의 결과이며 거래 계정 내의 다른 통화에 대한 정보는 정보 필드에 있으며, 여러 거래 쌍을 조작하거나 여러 번 호출할 필요가 없습니다.

현재 거래에 대한 전체 가치에 대한 실제 디스크가 계속 인쇄됩니다.

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는 추가 문자열로 실제 디스크 로그에서 표시할 수 있습니다.null, 주문 상태를 검색하기 위해 쓰인다.

만약 시장 가격으로 지불한다면, Price는 -1이고, Amount는 주문 값입니다.exchange.Buy(-1, 0.5)거래는 맞습니다.ETH_BTC이 경우, 시장 가격에 0.5BTC의 ETH를 구매하는 것을 나타냅니다. 일부 거래소는 시장 가격표와 선물 재검토를 지원하지 않습니다.

일부 거래 모든 가격 및 양의 정확성 요구 사항, 사용 가능_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)이 지표는 이 지표에 해당하는 지표입니다.

GetOrder에서 주문을 받으세요

주문 아이디에 따라 주문 정보를 얻는다.exchange.GetOrder(OrderId)OrderId는 주문 id로, 주문을 할 때 반환됩니다.주문 유형에 유의하십시오.Type필드 및 주문 상태Status실제 값은 숫자이며, 다른 의미를 나타냅니다. 그러나 기억에 좋지 않은 FMZ는 전 세계 상수를 사용하여 값을 나타냅니다.Status이 값은 0이므로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)
            }
        }
    }
}

GetOrders 미완성 주문

현재 거래에 해당하는 모든 미완성 주문 목록을 얻는다. 미완성 주문이 없으면 빈 배열을 반환한다.

모든 주문에 대한 현재 거래를 취소하는 예제:

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)
    }
}

CancelOrder 주문 취소

주문 아이디에 따라 주문을 취소합니다.exchange.CancelOrder(OrderId)▲ 취소 성공은 true, 그렇지 않으면 false를 반환합니다. ▲ 주문이 완전히 거래 된 경우 취소 실패를 주의하십시오.

선물과 상속계약

디지털 화폐 선물 거래와 현장 거래는 다르며, 위의 현장 거래의 기능은 선물에도 동일하게 적용되며, 단일 선물 거래에는 고유한 기능이 있습니다. 디지털 화폐 선물 프로그래밍 거래를 수행하기 전에 웹 사이트에서 수동 조작에 익숙해져야하며, 오픈 포지션, 평형 포지션, 전체 포지션, 매매 포지션, 레버링, 평형 손실, 부동 수익, 보증금 등의 개념과 그에 따른 계산 공식과 같은 기본 개념을 이해해야합니다. 각 선물 거래소에서 관련 튜토리얼을 찾을 수 있으며 스스로 배워야합니다.

상속계약과 선물계약은 비슷하지만, 동시에 여러 개의 공간을 보유하는 개념이 없다는 점이 다르다.

만약 거래소가 동시에 OKEX와 후오비와 같은 선물 현장을 지원하는 경우, 거래소 인터페이스에서 개별적으로 OKEX와 후오비를 선택하여 FMZ에서 현장과 다른 거래소로 간주해야 한다.

SetContractType 계약 설정

선물 거래의 첫 번째 단계는 거래가 필요한 계약을 설정하는 것입니다. OKEX 선물의 예를 들어, 실제盘 또는 리모델링을 만들 때 BTC 거래 쌍을 선택하십시오. 또한 코드에 해당 주, 다음 주 또는 분기 계약을 설정해야합니다. 설정하지 않으면 제안됩니다.invalid contract type현장 거래와 달리, 선물 계약은 종종 BTC와 같은 거래 화폐를 담보로 거래하는 경우가 많으며, BTC를 추가하는 거래 쌍은 일반적으로 BTC를 담보로 나타내는 BTC_USD 거래 쌍을 나타냅니다. USDT를 담보로 거래하는 미래가 존재하면 실제 BTC_USDT 거래 쌍을 추가하는 것이 필요합니다.거래 쌍을 설정 한 후, 영구, 같은 주, 다음 주 등과 같은 특정 계약 유형을 설정해야합니다. 계약을 설정 한 후, 구매, 판매 등의 작업을 수행 할 수 있습니다.

비트코인, OKEX, 후오비DM 등 현존하는 비트코인 본위와 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官网。

GetPosition 소장

현재 보유 정보 목록을 얻으려면, OKEX (OKCOIN) 선물은 획득하려는 계약의 유형을 지정하는 매개 변수를 입력할 수 있습니다. 보유가 없으면 빈 목록을 반환합니다.[]⇒ 보유 정보는 아래와 같이 반환됩니다. 구체적인 정보는 많이 있으며 거래에 대한 구체적인 분석과 결합해야합니다.

데이터 타입 변수 이름 설명
물체 정보 거래소의 원래 구조가 돌아왔다
번호 마진 레벨 오케이 코인 10 또는 20의 레버 사이즈, 오케이 선물의 전체 포스트 모드는 기본 API가 지원하지 않기 때문에 고정 10으로 돌아갑니다.
번호 금액 보유량, OKCoin은 계약의 비율을 나타냅니다 (진수 및 1보다 크다)
번호 얼어붙은 금액 포지션 냉동량
번호 가격 주식평가
번호 마진 보증금 동결
번호 수익 상품 선물: 지분 시장 손실, 디지털 통화: ((디지털 통화 단위: BTC/LTC, 전통적인 선물 단위: RMB, 참고: OKCoin 선물은 전체 거래 상태에서 흑자를 달성하는 것을 의미하며 지분 손실이 아닌 지분 손실을 의미합니다.
const 종류 PD_LONG는 멀티 포지션 (CTP에서 closebuy_today로 평준화), PD_SHORT는 빈티 포지션 (CTP에서 closeesell_today로 평준화), (CTP 선물에서) PD_LONG_YD는 어제 멀티 포지션 (CTP에서 closebuy로 평준화), PD_SHORT_YD는 어제 빈티 포지션 (CTP에서 closeesell로 평준화)
문자열 계약 유형 상품 선물은 계약 코드, 주식은 거래소 코드 _ 주식 코드 , 특정 매개 변수 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배의 레버링을 나타냅니다.참고로 레버리지는 거래소에서 설정해야 합니다. 코드는 거래소 설정과 일치해야 합니다. 그렇지 않으면 오류가 발생할 수 있습니다.▲ 또는 설정하지 않고 기본 레버를 사용할 수 있습니다. 다음으로 거래 방향을 설정하고 호출 방식을 설정합니다:exchange.SetDirection(Direction), 오픈 포지션 평형에 대응하는, ** 선물과 달리, 영구 계약이 동시에 다공점 개념을 보유하지 않는 경우, 즉 단일 포지션을 보유하는 것을 허용하지 않는 경우, 더 많은 시간을 오픈하면 자동으로 다공점 평형이됩니다. 모든 것은 설정해야합니다.buy그리고sell하지만, 만약 양방향 보관을 지원한다면 설정해야 합니다.closebuy,closebuyᅳ** 구체적인 관계:

운영 SetDirection의 매개 변수 하위 함수
더 많은 창고 교환.SetDirection (구입) 교환.구입()
평면 다중장 교환.SetDirection (( closebuy) 교환.판매.
빈 창고 교환.SetDirection ((판매) 교환.판매.
평평한 창고 교환.SetDirection (( close-sell) 교환.구입()

마지막으로 구체적인 오픈 거래 중화 거래소 코드가 있으며, 거래소마다 거래량이 다릅니다. 예를 들어, 후오비 선물은 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") 일반 계정으로 전환합니다.

지원하는 거래소:

  • OKEX V3: 레버리드 계정 모형의 거래 쌍은 일반 거래 쌍과 다르며 일부 거래 쌍은 그렇지 않을 수 있습니다.
  • 코인: 레버리드 계정 방식의 거래 쌍은 일반 거래 쌍과 다르며 일부 거래 쌍은 그렇지 않을 수 있습니다.
  • ZB: 자금은 QC로만 전환될 수 있으며, 레버 트레이딩 플라크, 다른 거래 쌍 사이의 자금은 독립적입니다. 즉, BTC_QC에서 볼 수 없는 ETH_QC 거래 쌍의 아래 QC 코인의 수입니다.
  • FCoin
  • 바이낸스 (Binance)

상품 선물 거래

상품 선물 거래와 디지털 통화 선물 거래는 크게 다르다. 첫째, 상품 선물 거래 시간은 짧고, 디지털 통화 거래는 24h입니다. 상품 선물의 프로토콜은 일반적으로 사용되는 REST API도 아닙니다. 상품 선물의 거래 빈도와 기고 목록 수 제한, 디지털 화폐는 느슨합니다.https://www.fmz.com/bbs-topic/325ᅳ 상품 선물 회사 추가:https://www.fmz.com/bbs-topic/371

상품 선물과 2019년 6월부터 가시화 규제, 개인 프로그래밍 개인 사용자가 필요로 하는 개설의 가시화 신청 허가 코드 (특정 신청 필요한 정보 템플릿은 위크소프트 그룹 또는 QQ 그룹에서 메시지를 보낼 수 있습니다), 일반적으로 4-5 일, 단계는 더 번거롭다. FMZ 정량화 플랫폼은 가시화 거래 제공자로 각 미래 서비스 업체에 소프트웨어 허가 코드를 신청, 사용자는 직접 사용 신청을 할 필요가 없습니다.https://www.fmz.com/bbs-topic/3860▲ 만약 당신의 선물상자가 목록에서 사라진다면, 직접 신청하거나 지원하는 거래소에서 다시 계좌를 개설할 수 있습니다. 일반적으로 2일이 소요됩니다. ▲FMZ는 한국타이조안宏源期货과 같은 일부 서비스 업체와 깊은 협력 관계를 가지고 있으며, FMZ 플랫폼의 기관 버전을 구매하여 사용자에게 사용할 수 있으며, 자동으로 VIP로 전환되며 절차 요금이 최소화됩니다. ▲개시자 참조:https://www.fmz.com/bbs-topic/506

FMZ 플랫폼의 구조의 장점으로 인해 사용자는 또한 여러 개의 선물 거래자 계정을 추가 할 수 있으며 다른 상품 선물 프로그래밍 거래 소프트웨어가 수행 할 수없는 기능을 수행 할 수 있습니다.https://www.fmz.com/bbs-topic/1184

전략적 틀

우선 24시간 거래가 아니기 때문에 착륙 작업이 필요하기 때문에 거래 전에 링크 상태를 판단해야 합니다.exchange.IO("status")그 이유는true연결된 거래소를 표시합니다. 만약 로그인 성공하지 않으면 API를 호출하고 login 버튼을 not하지 않습니다. 정책 시작 후 잠자리 (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 데이터 획득 모드

상품 선물은 CTP 프로토콜을 사용하며, 모든 거래 및 거래 거래는 변경된 후에야 알립니다. 주문, 계정, 보유를 검색하는 것은 적극적인 검색입니다. 따라서 이벤트로 구동되는 높은 주파수 정책을 작성하는 데 적합합니다. 기본 모형은 거래의 인터페이스를 취득합니다.GetTickerGetDepthGetRecords모든 데이터들은 최신 데이터를 얻기 위해 캐시되어 있으며, 데이터가 없을 때 데이터가 있을 때까지 계속 기다립니다. 따라서 전략은 잠잠을 사용하지 않습니다. 시장의 변화가 있을 때, 틱어, 깊이, 기록이 모두 업데이트됩니다. 이 때 호출된 임의의 인터페이스는 즉시 반환됩니다. 호출된 인터페이스 상태는 업데이트 모드를 기다리는 상태로 설정됩니다. 다음 번에 같은 인터페이스를 호출하면 새로운 데이터가 돌아올 때까지 기다립니다.

만약 여러분이 매번 시장에 대한 데이터를 얻고 싶다면, 심지어 오래된 데이터라도 시장의 즉각적인 업데이트 모드로 전환할 수 있습니다.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는 실제로 깊이 (5가지 깊이 요금이 비싸다) 를 가지고 있으며, GetTrades는 거래 역사를 얻을 수 없다. 상품 선물에는 유동화 제한이 있으며, 유동화 시, 파는 가격은 유동화 가격이며, 주문량은 0이며, 구매하는 가격은 유동화 가격이며, 주문량은 0이다. 또한 상품 선물 문의 인터페이스의 빈도, 계좌, 주문, 지점 등의 접근 제한이 있습니다.

계약 설정

exchange.IO("instruments"): 거래소의 모든 계약 목록 {계약 이름: 세부 사항} 사전 형식을 반환합니다.exchange.IO("products"): 거래소에 있는 모든 제품 목록을 {제품명: 상세} 사전 형식으로 반환합니다. 실제 디스크만 지원합니다.exchange.IO("subscribed"): 이미 가입한 시장을 반환하는 계약, 동일한 형식, 실제판만 지원한다.

기존의 CTP 선물의ContractType이 문서의 본문에는 계약 ID를 가리키고 있으며, 크기와 작은 글씨를 구분합니다.exchange.SetContractType("au1506")▲ 계약 설정이 성공한 후 계약에 대한 세부 정보가 반환됩니다. 최소 한 번 구매하는 금액, 수수료, 배달 시간 등. 여러 계약을 가입할 때, 첫 번째 경우만 실제 가입 요청을 전송하고 코드 수준에서 거래를 전환하는 것 만으로 시간이 오래 걸리지 않습니다. 주요 연속 계약은 MA888과 같은 코드 888입니다. 연속 지수 계약은 MA000과 같은 000입니다. 888과 000은 가상 계약 거래에 대한 반복만 지원하고 실제 디스크는 거래만 지원합니다.그러나 메이 언어는 주식 계약을 조작할 수 있으며, 프로그램은 자동으로 거래를 교환합니다. 즉, 비주식 지위를 평평화하고 주식 지점에 새로운 지점을 개설합니다.

로그인 실패는 계약을 설정할 수 없지만 즉시 반환되므로 CTP 로그인이 완료되었다는 것을 알고 _C로 다시 시도할 수 있습니다. 로그인 성공 후 재설정을 하는 것은 시간이 오래 걸리지 않고 실제 네트워크 접속을 생성하지 않습니다.

개설 중계

SetDirection이 지표는buy, closebuy, sell, closesell네 가지 요소, 상품 선물의 증가closebuy_today그리고closesell_today그리고 우리는 이 모든 것을 통해,closebuy/closesell평준화 시장을 위해, 단지 전기 품종이 평준화와 평준화에 영향을 미칠 수 있는 평준화 시장을 위해, 우선 순위가 평준화 시장을 필요로 한다. CTP 전통적인 선물에 대한 경우, 두 번째 매개 변수를 1 또는 2 또는 3로 설정할 수 있다.구체적인 거래, 포지션 취득, 주문 취득, 환불, 계좌 취득 등의 작업은 디지털 통화 선물 거래와 동일하며, 이전 장을 참조하십시오.

운영 SetDirection의 매개 변수 하위 함수
더 많은 창고 교환.SetDirection (구입) 교환.구입()
평면 다중장 교환.SetDirection (( closebuy) 교환.판매.
빈 창고 교환.SetDirection ((판매) 교환.판매.
평평한 창고 교환.SetDirection (( close-sell) 교환.구입()

아래의 예제는 특정 평형 함수입니다. 이 예제를 너무 단순하게 고려할 때 거래 시간에 있는지, 거래가 완전히 완료되지 않은 상태에서 주문을 다시 시도하는 방법, 최대 주문 양이 얼마나 많은지, 빈도가 너무 높는지, 특히 슬라이드 가격 또는 매각 여부를 고려해야 합니다. 참고용입니다.실제 거래는 플랫폼이 포장된 클래버를 사용하는 것이 좋습니다.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")

이 글은 다른 글과 비교해 볼 수 있습니다.

  • ioc 즉시 완료, 그렇지 않으면 THOST_FTDC_TC_IOC를 취소
  • gfs 이 문서는 유효합니다 THOST_FTDC_TC_GFS
  • gfd 당일 유효합니다
  • gtd 지정된 날짜 이전에 유효합니다
  • gtc 취소 전에 유효합니다 THOST_FTDC_TC_GTC
  • gfa 집합 입찰 유효 THOST_FTDC_TC_GFA

간편한 인터페이스

기본상품 선물 거래자는 CTP 인터페이스를 열고, 요구가 있는 경우 이시센 인터페이스로 변경할 수 있다. FMZ를 통해 포장, 호출 방식은 동일하다. 차이점은 계정, 주문, 보유가 모두 추진 방식이기 때문에 기탁자는 해당 데이터를 로컬로 유지하며, 해당 인터페이스를 호출할 때 즉시 반환하고 실제로 요청을 하지 않는다.

이시센 협약은 다음과 같은 주문 유형을 정의합니다.

  • gfd 당일 유효 TAPI_ORDER_TIMEINFORCE_GFD
  • gtc 취소 전 유효 TAPI_ORDER_TIMEINFORCE_GTC
  • gtd 지정된 날짜 이전에 유효 TAPI_ORDER_TIMEINFORCE_GTD
  • fak 부분 합병, 나머지 부분을 취소 TAPI_ORDER_TIMEINFORCE_FAK
  • ioc는 즉시 완료, 그렇지 않으면 TAPI_ORDER_TIMEINFORCE_FAK를 취소
  • fok는 완전히 거래가 되지 않아 TAPI_ORDER_TIMEINFORCE_FOK를 모두 취소합니다

일반적으로 사용되는 범용 함수

로그 로그와 웨이비처

실제 인터페이스에서 로그 로그, 문자열 뒤에 @ 문자를 추가하면 메시지는 푸시 큐에 들어가고, 벡션 또는 텔레그램을 묶은 후 직접 푸시됩니다.Log('推送到微信@')

로그 색상도 사용자 정의할 수 있습니다.Log('这是一个红色字体的日志 #ff0000')#ff0000RGB 색상의 16개 계열을 나타냅니다

모든 로그 파일들은 관리자가 있는 디렉토리의 리얼 디스크에 있는 sqlit 데이터베이스에 존재하며, 데이터베이스 소프트웨어로 다운로드하여 열 수 있으며, 백업 복구를 위해 사용할 수도 있습니다. (데이터베이스 이름과 리얼 디스크 id가 동일합니다.)

로그프로프트는 수익을 인쇄합니다

수익을 기록하고, 실제 디스크 인터페이스에서 수익 곡선을 그리며, 실제 디스크 재부팅 후에도 유지할 수 있습니다.LogProfit(1000)◎ 주의LogProfit이 함수는 반드시 이득이 될 필요는 없으며, 어떤 숫자일 수도 있고, 스스로 채워야 합니다.

LogStatus 상태 탭 표시 (표 포함)

실제 디스크 상태, 로그 로그가 저장되고 계속 갱신되기 때문에 저장되지 않은 정보만 표시하는 것이 필요한 경우LogStatus이 함수들은LogStatus이 함수는 문자열로 표시되며, 또한 표 정보를 표시하는 데 사용될 수 있습니다.

특정 디스크 상태 위치를 보여주는 표의 예시:

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)잠자리에 2초. 거래의 모든 접속 빈도가 제한되어 있기 때문에 일반적인 전략은 잠자리에 2초를 추가하는 것입니다.

_G 데이터 저장

디스크가 다시 시작되면 프로그램이 다시 시작됩니다._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')
    }
}

_N 정밀 함수

주문을 할 때 종종 가격과 수량 정밀도를 제어하기 위해 FMZ는 소수점 단위를 저장하는 것을 결정하는 _N 함수를 내장했습니다._N(4.253,2)그리고 그 결과 4.25입니다.

_C 자동 재시험

교환 API를 호출하는 것은, 접근할 때마다 성공할 것을 보장할 수 없으며, _C는 자동으로 다시 시도하는 함수이다._C(exchange.GetTicker), 기본 재시험 간격은 3초이며, 재시험 간격을 제어하기 위해 _CDelay 함수를 호출할 수 있습니다. 예를 들어 _CDelay ((1000), C_C 함수의 재시험 간격을 1초로 변경하는 것을 추천합니다.GetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrder이 모든 오류는 _C로 오류를 허용하여 액세스 실패로 인해 프로그램이 중단되는 것을 방지합니다.

CancelOrder_C 함수를 사용할 수 없습니다. 취소 실패는 여러 가지 이유가 있기 때문에, 만약 하나의 문자가 이미 거래된 경우, 다시 취소하면 실패를 반환하고, _C 함수를 사용하면 계속 반복될 수 있습니다.

_C 함수는 변수를 전달할 수도 있고, 사용자 정의 함수에도 사용됩니다.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}

_D 날짜 함수

직접 호출_D()현재 시간 문자열을 반환합니다.2019-08-15 03:46:14◎ 재검토 중 호출되는 경우 재검토 시간을 반환한다._D().slice(11) > '09:00:00':

_D(timestamp,fmt),ms 시간대를 시간 문자열로 변환합니다._D(1565855310002)◎fmt 파라미터는 시간 형식, 기본 설정yyyy-MM-dd hh:mm:ss

TA 지표 함수

MA\MACD\KDJ\BOLL와 같은 일반적인 지표 기능의 경우 FMZ 플랫폼이 직접 내장되어 있으며 API 문서를 참조하여 특정 지표를 지원할 수 있습니다.

지표 함수를 사용하기 전에 K선의 길이를 결정하는 것이 좋습니다. 앞의 K선의 길이가 계산이 필요한 주기를 충족시키지 못할 때 결과는null▲ 입력된 K선 길이가 100이고, 계산된 MA 주기는 10일 경우, 첫 9값은 0이고, 다음 값은 정상으로 계산된다.

자바스크립트는 또한 타리브를 완전히 지원합니다.talib.CCI(records)참고로http://ta-lib.org/function.html▲ 파이썬의 경우 타리브 라이브러리를 자체적으로 설치할 수 있으며, 컴파일해야 하기 때문에 간단한 pip 설치가 불가능하며, 설치 방법을 자체적으로 검색할 수 있다.

지표 함수는 K선 데이터 이외에도 임의의 배열에 전송할 수 있습니다.

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    if (records && records.length > 9) {
        var ma = TA.MA(records, 14)
        Log(ma)
    }
}

자바스크립트에서 자주 사용하는 함수

여기서는 실제 컴퓨터에서 자주 사용하는 자바스크립트 함수들을 소개합니다.

  • Date.now()현재 시간대에 돌아갑니다
  • parseFloat()문자열을 숫자로 바꾸면parseFloat("123.21")
  • parseInt()문자열을 정수로 변환합니다.
  • num.toString()숫자를 문자열로, 숫자를 숫자로 변환합니다.
  • JSON.parse()Json 문자열을 포맷합니다.JSON.parse(exchange.GetRawJSON())
  • 자바스크립트는 Math 라이브러리 함수를 가지고 있습니다.Math.max(),Math.abs()예를 들어, 일반적인 수학 연산, 참고:https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • FMZ가 참조한 자바스크립트 3자 리눅스, 참조:https://mathjs.org/
  • FMZ는 자바스크립트 타사 언더스코어 라이브러리를 인용하고, 많은 Js의 번거로운 작업을 용이하게 해주는 자바스크립트 서드파티 언더스코어를 추천합니다.https://underscorejs.org/

템플릿 클래스 라이브리

실판 전략 기능을 작성하는 데 고려해야 할 상황이 매우 많습니다. 예를 들어 5 동전을 구입하는 간단한 기능과 같이, 우리는 고려해야합니다: 현재 잔액이 충분합니까? 주문의 가격은 얼마입니까? 정확도는 무엇입니까? 시장을 충격을 피하기 위해 주문을 분할 할 필요가 없습니까? 완료되지 않은 주문을 어떻게 처리합니까? 등 세부 사항.

자바스크립트 디지털 화폐 거래 클래스 라이브러리 및 상품 선물 거래 클래스 라이브러리는 기본으로 내장되어 있으며 복제 할 필요가 없습니다. 다른 템플릿 클래스 라이브러리는 전략 광장에서 찾을 수 있습니다.https://www.fmz.com/square/20/1■ 템플릿 클래스 라이브러리를 복사하고 저장하고, 자신의 정책을 만들 때 사용하려는 클래스 라이브러리를 선택할 수 있습니다.

자바스크립트 템플릿 함수는$Python의 첫 번째 방법은ext시작입니다.

디지털 화폐 거래 목록

이 글의 소스 주소:https://www.fmz.com/strategy/10989, 이미 내장되어 있으며 복제할 필요가 없습니다. 특정 함수의 구현 방법은 직접 소스 코드에 참조할 수 있습니다.

계정 접속:

$.GetAccount(e)

Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));

이명박 대통령의 말:

$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)

$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单

이 글은 다른 글과 비교해 볼 수 있습니다.

$.Cross(periodA, periodB) / $.Cross(arr1, arr2);

var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较

$.withdraw ((e, currency, address, amount, fee, password) 인출 함수:

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

상품 선물 거래 분류

상품 선물 거래 목록 사용 안정적, 사용 추천;; 소스 코드 주소:https://www.fmz.com/strategy/12961▲ 이미 내장되어 있고 복제할 필요가 없습니다.

CTA 자료

  • 실제 디스크는 자동으로 주력 연속으로 지수를 매핑합니다.
  • 이동을 자동으로 처리합니다
  • 재검토는 rb000/rb888과 같은 매핑을 지정할 수 있습니다. 즉 rb 지수 거래를 주 연속으로 매핑하는 것입니다.
  • 다른 계약에도 매핑할 수 있습니다. 예를 들어, rb000/MA888은 rb 지수의 K 라인을 보고 MA 주력 연속으로 거래합니다.
function main() {
    $.CTA("rb000,M000", function(r, mp) {
        if (r.length < 20) {
            return
        }
        var emaSlow = TA.EMA(r, 20)
        var emaFast = TA.EMA(r, 5)
        var cross = $.Cross(emaFast, emaSlow);
        if (mp <= 0 && cross > 2) {
            Log("金叉周期", cross, "当前持仓", mp);
            return 1
        } else if (mp >= 0 && cross < -2) {
            Log("死叉周期", cross, "当前持仓", mp);
            return -1
        }
    });
}

클래스 라이브러리 호출 예제

function main() {
    var p = $.NewPositionManager();
    p.OpenShort("MA609", 1);
    p.OpenShort("MA701", 1);
    Log(p.GetPosition("MA609", PD_SHORT));
    Log(p.GetAccount());
    Log(p.Account());
    Sleep(60000 * 10);
    p.CoverAll("MA609");
    LogProfit(p.Profit());
    Log($.IsTrading("MA609"));
    // 多品种时使用交易队列来完成非阻塞的交易任务
    var q = $.NewTaskQueue();
    q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
        Log(task.desc, ret)
    })
    while (true) {
        // 在空闲时调用poll来完成未完成的任务
        q.poll()
        Sleep(1000)
    }
}

그림 도서관

원본 그림 그래프 함수는 비교적 복잡하기 때문에 다음 튜토리얼에서 소개될 예정이며, 초보자는 직접 그림 그래프 라이브러리를 사용하는 것이 좋습니다. 매우 간단한 그림 회전 라인그램, K 라인그램 등. FMZ는 간단한 클래스 라이브러리를 내장하여 정책 편집 페이지에서 볼 수 있습니다.

img

자바스크립트 프린팅 그림 라이브러리 복사 주소:https://www.fmz.com/strategy/27293파이썬 프린트라인 클래스 라이브러리 복사 주소:https://www.fmz.com/strategy/39066

예를 들어:

function main() {
    while (true) {
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

전략 파라미터 설정

정책 편집 아래에는 정책 변수 설정이 있으며, 정책의 범용 변수에 해당하며, 코드의 임의의 위치에서 액세스 할 수 있습니다. 정책 변수는 실제 디스크 인터페이스에서 수정하여 재시작에 효력을 발휘할 수 있습니다. 따라서 몇 가지 변수를 설정하여 변수로 변경할 수 있습니다.img

  • 변수 이름: 즉, 위의 그림의 number,string,combox 등, 정책 그룹에서 직접 사용할 수 있습니다.
  • 설명: 파라미터의 이름은 정책 인터페이스에서, 파라미터의 의미를 이해하기 쉽다.
  • 참고자료: 파라미터에 대한 자세한 설명, 마우스가 파라미터에 머무르면 해당 설명이 표시됩니다.
  • 유형:이 파라미터의 유형, 아래와 같이 자세히 설명합니다.
  • 기본값: 이 변수의 기본값이다.

문자열 타입과 숫자 타입은 이해하기 쉽고 가장 많이 사용되는 타입이다. 드래그아웃은 파그램 인터페이스에서 선택 가능한 드래그아웃을 표시합니다. 예를 들어, 드래그아웃 SYMBOL 파그램 값을 설정할 수 있습니다.BTC|USDT|ETH, USDT를 선택하면 정책에서 SYMBOL 값은 USDT의 인덱스 1이다.

다른 많은 설정이 있습니다.https://www.fmz.com/bbs-topic/1306

전략 재검토

전략의 정량화 작업이 완료되면, 전략이 역사 데이터에서 어떻게 수익을 창출하는지 historical data를 사용하여 전략을 테스트 할 수 있습니다. 물론, 재검토 결과는 참고로만 사용됩니다. FMZ 정량화 플랫폼은 디지털 화폐 현금, 선물, BitMEX 상속 계약 상품, 선물의 재검토를 지원합니다. 자바스크립트 검색은 브라우저에서 수행되며, 파이썬 검색은 호스트에서 필요합니다. 플랫폼이 공개 호스트를 사용할 수 있습니다.

재검토 메커니즘

온바르 회전 메커니즘은 K 라인을 기반으로 하며, 각 K 라인은 회전 시점을 생성하며, 이 시점에서는 현재 K 라인의 올림, 하림, 거래량 등 정보를 얻을 수 있으며, 이 시점 이전까지의 정보를 얻을 수 있다.


더 많은

가오엔체어아피

과학로컬 구현 정책은 어떻게 작동합니까? 간단한 로그 출력 문장을 작성하고 문장 끝 동작을 따라합니다. 첫 번째 단계는 노트북을 서버로 사용하여 호스트 프로그램을 실행하는 것입니다. 두 번째 단계는 간단한 로그 출력 정보 (FMZ의 API 인터페이스 함수) 를 사용하는 test.py 프로그램을 작성하는 것입니다. 세 번째 단계는, 문장의 끝과 같이 runfile를 작성하여 run.py를 통해 test.py를 호출합니다. /upload/asset/1add39483ef82d45b3ce3.png

지프9제가 구매한 네티즌 클라우드 쿼티 트레이딩 코스는 어떻게 되었을까요?

모누라자크많은

모누라자크안녕하세요

조카님배우기

wqy작은 문장 오류가 있습니다. GetAccount는 계좌를 얻습니다. FrozenStocks는 사용 가능한 균형이 아닌 동결된 균형이어야합니다.

부사장님getorder outtime 오더 오버타임,okex의 거래소, 어떻게

우무 12가 고위 기법을 만들었습니다.보증자산율은 0%에 도달 할 수 없습니다, 강제 평형 보증자산율

쉐이핑2020저는 1분 k 줄기 그래프 동작을 보고 있습니다. 그래서 파이썬의 죽은 루크의 수면시간은 0.1s로 설정할 수 있습니다. 즉 sleep ((100) 입니다.

동풍화문exchange.SetDirection (("closebuy"); // 상속 계약이라면 직접 exchange.SetDirection (("sell") 를 설정합니다. 여기 저는 OKex의 상속 계약을 시도했습니다. 만약 그것을 판매로 설정한다면, 그것은 곧바로 텅 비어 버립니다.

동풍화문exchange.SetDirection (("closebuy"); // 상속 계약이라면 직접 exchange.SetDirection (("sell") 를 설정합니다. 여기 저는 OKex의 상속 계약을 시도했습니다. 만약 그것을 판매로 설정한다면, 그것은 곧바로 텅 비어 버립니다.

동풍화문GetOrders의 코드에는 두 개의 문법 오류가 있다. 하나는 function으로 쓰이고, 다른 하나는 for 루킹의 조건으로 쓰이고,

동풍화문제가 틀렸어요. exchange.Buy ((-1, 0.5), 거래 쌍은 ETH_BTC이며, 시가표는 0.5BTC의 ETH를 구매하는 것을 나타냅니다. exchange.Buy ((price, 0.5)), 만약 이 가격표가 있다면, 0.5ETH를 가격으로 구매하는 것을 의미합니다.

동풍화문exchange.Buy ((-1, 0.5), 거래 쌍은 ETH_BTC이며 시장 가격으로 0.5BTC의 ETH를 구매하는 것을 나타냅니다. 여기 은 0.5ETH의 을 시장 가격으로 구매하는 것이어야 합니다.

지프9감사합니다.

초목유료로 공개되어 있습니다. https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2

초목홈페이지와 微信을 추가하여 그룹에 참여하십시오.

wqy[중고] [중고] [중고] [중고] [중고] [중고]

초목변함

초목다시 가져옵니다.

초목원본에 있는 정보로, GetRawJSON을 사용하거나 정보 필드에 있는 정보를 볼 수 있습니다

동풍화문좋은, 좋은, 관리자 답변도 있습니다.

초목오, 수정됐습니다.

초목일부 영구 계약은 쌍방향 보유를 허용하고 평형 설정이 필요합니다.