資源の読み込みに... 荷物...

FMZ Quant API アップグレードの詳細な説明: 戦略設計の経験を改善する

作者: リン・ハーンFMZ~リディア作成日: 2024-07-05 09:44:08,更新日: 2024-07-25 15:15:03

[TOC]

img

FMZ Quant API アップグレードの詳細な説明: 戦略設計の経験を改善する

前言

FMZ Quant Trading Platformは9年間の技術的な繰り返しを経て,ユーザーとしては気づいていないかもしれませんが,何度も再構築されています.過去2年間で,プラットフォームはユーザー体験の観点から,UIインターフェースの包括的なアップグレード,一般的に使用される定量取引ツールの強化,より多くのバックテストデータサポートの追加を含む多くの最適化およびアップグレードを行いました.

戦略設計をより便利,取引論理をより明確,初心者より簡単に始めるために,プラットフォームは戦略で使用する API インターフェースをアップグレードしました.最新のバージョンを使用するドーカーは,これらの新しい機能を有効にすることができます.プラットフォームは,古いインターフェースコールと最大限に互換性があります. API インターフェースの新しい機能に関する情報は,FMZ Quant Trading Platform の API ドキュメンテーションに更新されています:

構文ガイド:https://www.fmz.com/syntax-guideユーザーガイド:https://www.fmz.com/user-guide

では,どのインターフェースがアップグレードされ,古い戦略を活用して,現在のAPIと互換化するために,どのような変更が必要かを簡単に見ていきましょう.

1. 新しい API インターフェース

交換を追加.GetTickers機能

多製品戦略と完全な市場モニタリング戦略の設計には,総合的な市場インターフェースが不可欠です.戦略の開発を容易にし,イベントの再発明を避けるために,FMZ Quant Trading Platformは,このタイプの取引APIを収めています.

このインターフェースがない場合 (個々の交換),呼び出すときexchange.GetTickers(),エラーメッセージが表示されます: サポートされていません.

この関数にはパラメータがなく,取引所の総市場インターフェイスですべての品種のリアルタイム市場データを返します.

exchange.GetTickers()機能は,すべての機能のリクエストバージョンですexchange.GetTicker()この2つの関数名との違いは単数と複数です.

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
}

img

交換を追加.CreateOrder関数

新たに追加された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)
}

img

この方法で,たったの3つのexchange.CreateOrder()異なる種類と方向の3つのフューチャーオーダーを配置するために使用されました.

交換.GetHistoryOrders 機能を追加しました

新たに追加されたexchange.GetHistoryOrders()この機能は,特定の種類の過去のトランザクションオーダーを取得するために使用されます.この機能には,交換インターフェースのサポートも必要です.

歴史的な注文をクエリする際には,様々な取引所によって実装されるインターフェースは大きく異なります.

  • ページ化されたクエリをサポートするものもあれば,サポートしないものもあります.
  • いくつかの取引所にはクエリウィンドウ期間があり,N日以上の注文はクエリできません.
  • ほとんどの交換は指定された時間に問い合わせをサポートしますが,一部はサポートしません. このようなインターフェースは,最高レベルの互換性で封じ込められ,実際の使用では,戦略の要件と期待に応えるかどうかを注意する必要があります.

詳細な機能説明はここで繰り返されません. 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) +  "`")
}

img

交換.GetPositions 関数を追加しました

位置データ取得機能の古いバージョンはexchange.GetPosition(). このアップグレードでは,関数名付けセマンティクスをよりよくマッチするために,新しい位置取得関数を追加します:exchange.GetPositions(). 同時に,それはまだGetPosition機能と互換性/アップグレードされています.

についてexchange.GetPositions()函数には3つの呼び出し形式があります.

  • 交換.GetPositions (位置を取得する) パラメータが送信されない場合,現在の取引ペア/契約コード設定に基づいてポジションデータが要求されます.
  • exchange.GetPositions ((ETH_USDT.swap) について 特定の製品情報 (ETH_USDT.swapのフォーマットは FMZ プラットフォームによって定義されます) を指定する際には,特定の製品の位置データを要求します.
  • 交換する.GetPositions ((("") 交換位置インターフェイスから,現在の位置データのすべての次元を取得するように要求する. (交換インターフェイスの製品次元に応じて分割) OKX フューチャーシミュレーション環境を用いたテスト:
function main() {
    exchange.IO("simulate", true)

    exchange.SetCurrency("BTC_USDT")
    exchange.SetContractType("swap")

    var p1 = exchange.GetPositions()
    var p2 = exchange.GetPositions("")

    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) +  "`")
}

img

パラメータがexchange.GetPositions()機能はETH_USDT.swap, ETHのUベースの永続契約の位置データは入手できます.

img

パラメータがexchange.GetPositions()Uベースのすべての契約の位置データを取得できます.それは便利ではありませんか?

2. API インターフェイスのアップグレード

アップデート交換.GetTicker 関数

市場機能の主要なアップグレードexchange.GetTicker()この機能は,現在の取引ペアとコントラクトコードなしでパラメータによって指定された製品情報に従って直接市場データをリクエストすることができます. コード書き込みプロセスを簡素化します. 同時に,パラメータを通過せずにコール方法と互換性があり,古いプラットフォーム戦略と最大限に互換性があります.

パラメータsymbol交換対象のスポット/フューチャーに異なるフォーマットがあります.exchange:

  • スポット交換オブジェクト 形式は次のとおりですAAA_BBB, AAA は baseCurrency,つまり取引通貨,BBB は quoteCurrency,つまり価格設定通貨を表します.通貨名はすべて大文字で書かれています. 例えば,BTC_USDTのスポット取引ペアです.
  • フューチャー取引対象 形式は次のとおりですAAA_BBB.XXX, AAA は baseCurrency,つまり取引通貨,BBB は quoteCurrency,つまり価格設定通貨,XXX は永久契約スワップなどの契約コードを表します.通貨名はすべて大文字で,契約コードは小文字で書かれています. 例えば: BTC_USDT.swap,BTCのUベースの永続契約. バイナンス・フューチャーズのライブ環境でテストしました
var 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
}

img

特定のシンボルの市場データの一連の要求は,はるかに簡単になりました.

アップデート交換.GetDepth関数

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

img

エクスチェンジを更新する.GetTrades 機能

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) +  "`")
}

img

このアップグレードは,また,Symbol Parameterによって指定されたexchange.Go()プラットフォーム API インターフェースを同時に呼び出すときの機能です

アップデート交換.GetRecords 関数

このとき,GetRecords関数は大きく調整された.要求されたK線データのタイプ情報を直接指定するためのシンボルパラメータをサポートすることに加えて,K線期間を指定するために元の周期パラメータが保持され,要求時に期待されるK線長さを指定するために制限パラメータが追加されている.同時に,周期パラメータにのみ通過するGetRecords関数の古いバージョンと互換性がある.

呼び出す方法exchange.GetRecords()機能は

  • 交換.GetRecords (取得記録) パラメータが指定されていない場合,現在の取引ペア/契約コードに対応する製品のKラインデータは要求されます.Kライン期間は,戦略バックテストインターフェースまたはライブ取引で設定されたデフォルトのKライン期間です.
  • 交換する.GetRecords ((60 * 15) この項に該当する商品のK線データ (K線データ) は,現在の取引ペア/契約コードに対応する商品のK線データのみが指定されている場合です.
  • 交換.GetRecords (BTC_USDT.スワップ) 商品情報のみが指定された場合,指定された製品のK線データは要求されます.K線期間は,戦略バックテストインターフェースまたはライブ取引で設定されたデフォルトのK線期間です.
  • exchange.GetRecords ((BTC_USDT.swap,60 * 60) 製品情報と特定のK線期間を指定してK線データを要求します.
  • exchange.GetRecords ((BTC_USDT.swap, 60, 1000) 製品情報を指定し,特定のK線期間を指定し,K線データを要求するための予想されるK線長を指定します. 制限パラメータが交換所の単一のリクエストの最大長を超えると,ページングリクエストが生成される (すなわち,交換所のKラインインターフェースへの複数の呼び出し).

バイナンス・フューチャーズのライブ環境でテストしました

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

img

アップデート交換.GetOrders 機能

GetOrders 関数も追加します.symbolパラメータは,直接クエリされる現在の未完了注文 (待機注文) の種類を指定できます.また,すべての待機注文 (種類に関係なく) のクエリをサポートし,元の呼び出し方法と互換性があります.

についてexchange.GetOrders()この関数は次の方法で呼び出せる:

  • 交換する.GetOrders (GetOrders) 現行の取引ペア/契約コードに関する未完了の注文をすべてクエリする.
  • 交換.GetOrders (BTC_USDT.swap) USDTで担保された BTCの永続契約に関するすべての未払い注文をクエリします.
  • 交換する.GetOrders (GetOrders) 交換の現在の次元 (交換 API インターフェースの次元に応じて分割) のすべての未完成の注文をクエリする.

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", ""]) {
        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) +  "`")
}

img

パラメータが送信されない場合,デフォルトのリクエストは,現在のBTC_USDT取引ペアとスワップ永続契約の未完了未完了のすべての注文です.

img

その時にETH_USDT.swapパラメータが指定されている場合, ETH_USDT取引ペアの永久契約の未完了のすべての注文が要求されます.

img

文字列が空いているとき""USDTで保証されるすべての契約の未完了の注文が要求されます.

アップデート交換.GetPosition 関数

旧の位置取得機能の命名と互換性があり,特定の要求位置データのタイプ情報を指定できるシンボルパラメータも追加しています. この関数の使い方は,exchange.GetPositions().

アップデートexchange.IO機能

についてexchange.IO("api", ...)完全なリクエストアドレスの直接転送をサポートするためにアップグレードされています. OKX インターフェースを呼び出したい場合:

GET はhttps://www.okx.com/api/v5/アカウント/最大引き出口: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")
}

img

3. API インターフェースの影響

Exchange.GetOrder 機能に影響を与える

このアップグレードは主にパラメータに影響します.idについてexchange.GetOrder(id)id パラメータは,元の交換注文 id から,取引製品を含む文字列形式に変更されます. FMZプラットフォーム上のすべてのオーダーIDは このフォーマットです

例えば:

  • 交換命令で定義された交換の元のオーダーIDは:123456このアップグレードの前に,GetOrder関数を呼び出したい場合は,その中に渡されたオーダーIDは123456.
  • 交換命令で定義された取引所によって命名された製品コード:BTC-USDT- わかった これは,FMZプラットフォームで定義された取引ペアではなく,取引所によって命名された取引製品コードを指すことに注意してください.

このアップグレード後,パラメータ id のフォーマットがexchange.GetOrder(id)機能は以下のように調整されます.BTC-USDT,123456.

まず このデザインの理由を 説明しましょう CreateOrder関数は,直接注文の種類を指定するためにアップグレードされているため (注文の種類は,現在設定されている取引ペアと契約コードとは異なる場合があります).戻された注文IDがタイプ情報を含まない場合,この注文IDは使用不能になります.注文をチェックするときに,注文の種類 (契約) が何であるかわからないため.ほとんどの取引所は,注文をチェックしキャンセルするときに,タイプコードを記述するパラメータの仕様が必要です.

この衝撃にどう対応するか: 薬剤を使用する場合は,exchange.IO交換オーダーインターフェースを直接呼び出し,注文を行うため,返される値は,通常,交換の元のシンボル (製品コード) と元の注文IDを含みます.その後,両方を英語の逗子で連結すると,FMZプラットフォームの定義に適合する注文IDになります. 同様に,あなたが FMZ プラットフォームをカプセル化された注文インターフェイスを使用して注文をします. 注文 ID の始まりは取引製品コードであるため,元の注文 ID を使用する必要がある場合は,製品コードとコンマを削除するだけです.

交換に影響を与える.キャンセルオーダー機能

このアップグレードが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.

4. 構造 調整

ティッカーの構造

この更新では,現在のティッカー構造の市場情報を記録する,シンボルのフィールドが追加されます. このフィールドのフォーマットは,このフィールドのシンボルパラメータのフォーマットとまったく同じです.exchange.GetTicker() function.

秩序構造

この更新では,Order構造に Symbol フィールドを追加し,このフィールドの形式は,Orderのシンボルパラメータ形式とまったく同じです.exchange.GetTicker()機能 この更新では,注文構造のIdフィールドも変更され,新しい注文ID形式で製品情報と元の注文情報を記録します.exchange.GetOrder()繰り返すつもりはない.

位置構造

この更新では,位置構造にシンボルフィールドを追加します. このフィールドのフォーマットは,exchange.GetTicker() function.

5. バックテストシステム

ユーザーニーズを満たすために,このアップグレードはまずライブ取引と互換性があり,バックテストシステムは1週間以内に適応されます.個々の戦略コードが影響を受けると,変更と適応を行うためにこの記事の指示に従ってください.

追加 の 更新

1. 口座構造における新しいフィールド 株式とUPnL

農地についてAccount構造が返されるGetAccountフューチャー取引のオブジェクトのメンバー機能が拡張されています.

  • 株式 現行のマーージン資産通貨の総株価.このフィールドをサポートしないいくつかの先物取引所を除き,ほとんどの取引所はこのフィールドをサポートしています.主にリアルタイムアカウントのマーージン利益と損失を計算するために使用されます.

  • UPnL 現行のマーージン資産通貨で保持されているすべてのポジションの未実現利益と損失.ほとんどの先物取引所は,このフィールドをサポートしません.

2. SetMarginLevel 関数は,シンボルのパラメータをサポートするためにアップグレードされました

フューチャー取引オブジェクトのメンバー関数 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)
}

もっと