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

発明者による量化取引プラットフォームAPIアップグレード:戦略設計体験を向上させる

作者: リン・ハーン発明者 量化 - 微かな夢, 作成: 2024-06-28 09:08:29, 更新: 2024-07-24 12:00:40

[TOC]

img

前言

発明者による量化取引プラットフォームは,9年間の技術革新を経て,ユーザーとしては気づいていないかもしれませんが,何度も再構築された.過去2年間で,プラットフォームはユーザー体験の面では,UIを全面的にアップグレードし,よく使われる量化取引ツールを増やし,より多くの回転データサポートを追加した.

策略の設計を容易にし,取引の論理をより明確にし,初心者向けに使いやすいようにするために,プラットフォームは策略を使用するAPIインターフェースをアップグレードした. 最新バージョンのホストを使用してこれらの新しい機能を有効にすることができる. プラットフォームは古いインターフェースの呼び出しを最大限にサポートしている. APIインターフェースの追加機能などの情報は,発明者の量化取引プラットフォームのAPIドキュメントに同期して更新されています:

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

では,この記事を通して,どのようなインターフェースアップグレードの更新が可能か,また,現在のAPIに対応するために,古いポリシーを使用するときにどのような変更が必要かを見ていきましょう.

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

新增exchange.GetTickers函数

多種多様な戦略,全市場市場監視戦略を設計するために,この集積市場インターフェイスは不可欠であり,戦略を開発しやすくし,重複の輪を避けることを目的としています.発明者は量化取引プラットフォームを取引所のような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

新增exchange.CreateOrder函数

増えているexchange.CreateOrder()このアップグレードの重点は,関数です.exchange.CreateOrder()関数の最大機能は,その関数のパラメータに直接下注の種類,方向を指定することである. これにより,システムの現在の設定による取引対,契約コード,取引方向などの設定に依存しない.

多種取引のシングルシナリオでは,並行シナリオではデザインの複雑性が大幅に低下します.exchange.CreateOrder()この関数の四つの参数は,symbolsidepriceamount

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つの異なる種類,異なる方向のフューチャーオーダーに繋がります.

新增exchange.GetHistoryOrders函数

増えているexchange.GetHistoryOrders()この関数は,ある品種の歴史的な取引注文を取得するために使用され,この関数はまた,取引所のインターフェースのサポートが必要です.

取引所によって実行されるインターフェースは,歴史の注文を検索するために大きく異なります.

  • ページを分割する検索は,一部がサポートされ,一部はサポートされていません.
  • ある取引では,すべての問い合わせ窓間の期間,すなわちN日以上の注文は,問い合わせができない.
  • 取引所の大半は定時問い合わせをサポートしていますが,一部はサポートしていません.

この種のインターフェースを最大限の互換性でパッケージ化するには,実際の使用では,戦略のニーズや期待に合致するかどうかを注意する必要があります.

詳細な関数説明については,APIドキュメントの文法マニュアルを参照してください.

https://www.fmz.com/syntax-guide#fun_exchange.gethistoryorders

リアルタイムの環境でテストする:

function main() {
    var orders = exchange.GetHistoryOrders("ETH_USDT")

    // 写入图表
    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

新增exchange.GetPositions函数

古いバージョンでは,exchange.GetPosition()このアップグレードでは,関数名付けのセミントに合わせて新しい取得保持関数を追加しました.exchange.GetPositions()・同時に,GetPosition関数も対応/アップグレードします.

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

  • exchange.GetPositions (交換.ゲットポジション) パラメータが伝わらなければ,現在の取引対/契約コード設定に基づいて保管データを要求します.
  • exchange.GetPositions ((ETH_USDT.swapタグ) について) 特定の品種情報 (ETH_USDT.swapという形式がFMZプラットフォームによって定義されている) を指定する際に,特定の品種に関する保有データを要求します.
  • exchange.GetPositions (交換.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恒久契約の保有データを入手できます.

img

感染する時exchange.GetPositions()この関数のパラグラムは空の文字列です""U本位のすべての契約の保有データを入手することは便利ではありませんか.

2 APIのアップグレード

升级exchange.GetTicker函数

行政関数exchange.GetTicker()このアップグレードの主な目的は,シンボルパラメータを追加することである. この機能は,現在の取引対から切り離すことができる. 契約コードはパラメータ指定された種類情報を直接パラメータに従って要求する. コード作成プロセスを簡素化. 同時に,非伝達型呼び出し方式を最大限に互換性のあるプラットフォームの古い戦略を保持する.

パラメータsymbol取引所についてexchange商品は現貨/先物で,以下の形式があります.

  • 現金取引対象 形式は:AAA_BBBAAAはベース通貨,BBBはクォート通貨.通貨名はすべて大文字で書かれています. 例えば:BTC_USDT 現金取引ペア.
  • フューチャー取引所対象 形式は:AAA_BBB.XXXAAAはベース通貨,BBBはクォート通貨,XXXは契約コード,例えば永続契約スワップである.通貨名はすべて大文字で,契約コードは小文字で書かれています. 例えば:BTC_USDT.swap,BTCのU位永続契約.

テストは,BTCの現場環境で行われます.

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

特定の品種の市場データ設計を要求することは,よりシンプルになります.

升级exchange.GetDepth函数

この関数は,この関数と同じです.exchange.GetDepth()この関数は,シンボルパラメータも追加した. 深いデータを要求するときに直接品種を指定することが実現された.

テストは,BTCの現場環境で行われます.

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

升级exchange.GetTrades函数

この関数は,この関数と同じです.exchange.GetTrades()この関数には symbol 参数も追加されている.市場取引データを要求するときに直接品種を指定することが可能である.

テストは,BTCの現場環境で行われます.

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

このアップグレードも同等の対応が可能です.exchange.Go()函数同時呼び出しのプラットフォームAPIインターフェースでは,シンボルパラメータ指定品種情報を伝達する.

升级exchange.GetRecords函数

GetRecordsは,Symbol参数で直接要求されるK線データの種類情報をサポートするほか,K線周期を指定する元のperiod参数を維持し,要求期間を指定する望ましいK線長さを指定するlimit参数を追加した.また,旧バージョンのGetRecords関数で Period周期参数のみを伝達する呼び出し方法に対応している.

exchange.GetRecords()函数への呼び出し方法:

  • exchange.GetRecords (英語) について 任意のパラメータを指定せずに,現在の取引対/契約コードに対応した品種を要求するときに,K線周期は,戦略回顧インターフェースまたは実盤時に設定されるデフォルトのK線周期である.
  • exchange.GetRecords ((60*15) といったサイトで K線周期参数のみを指定すると,現在の取引対/契約コードに対応する品種のK線データを要求する.
  • exchange.GetRecords (( BTC_USDT.swap) について) 品種情報のみを指定すると,品種を指定するK線データを求められる.K線周期は,戦略回検インターフェースまたは実盘時に設定されるデフォルトのK線周期である.
  • exchange.GetRecords (( BTC_USDT.swap, 60 * 60) について 種情報指定,特定のK線周期を指定してK線データを要求する.
  • exchange.GetRecords ((BTC_USDT.swap, 60, 1000) について) 種類情報,特定のK線周期を指定し,定期的に取得したいK線長を指すK線データを要求する. 制限パラメータが取引所からのリクエストの最大長を超えると,ページ分割リクエスト (つまり,複数の取引所のK線インターフェースへの呼び出し) が生成される.

テストは,BTCの現場環境で行われます.

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相邻Bar时间差值:", r1[1].Time - r1[0].Time, "毫秒, Bar长度:", r1.length)
    Log("r2相邻Bar时间差值:", r2[1].Time - r2[0].Time, "毫秒, Bar长度:", r2.length)
    Log("r3相邻Bar时间差值:", r3[1].Time - r3[0].Time, "毫秒, Bar长度:", r3.length)
    Log("r4相邻Bar时间差值:", r4[1].Time - r4[0].Time, "毫秒, Bar长度:", r4.length)
    Log("r5相邻Bar时间差值:", r5[1].Time - r5[0].Time, "毫秒, Bar长度:", r5.length)
}

img

升级exchange.GetOrders函数

追加された GetOrders 機能symbolパラメータは,現在未完成の注文 (挂牌) の品種を直接指定する.また,すべての挂牌 (未分類品種) を検索するサポート;元の呼び出し方法に対応する.

exchange.GetOrders()函数への呼び出しには次の方法があります.

  • exchange.GetOrders (交換.Getオーダー)) 現在の取引ペア/契約コードをすべて未完成の注文で検索します.
  • exchange.GetOrders (BTC_USDT.swap) について "BTCのUSDTの永続契約に関するすべての未完了注文について調べる"
  • exchange.GetOrders (交換.GetOrders) は,このサイトで提供されています. エクスチェンジの現在の次元区分 (エクスチェンジAPIの次元区分による) を調べるすべての未完了注文.

OKXのフューチャーシミュレーション盤環境テスト:

function main() {
    exchange.IO("simulate", true)

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

    // 写入图表
    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本拠地でのすべての契約の未完了リストを要求します.

升级exchange.GetPosition函数

また,Symbol Parameters を追加し,特定の要求されたStorage データの種類情報を指定することができます. 機能の使い方と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 インタフェースへの影響

影响exchange.GetOrder函数

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

例えば:

  • 取引所オーダーで定義される取引所の原始オーダーのIdは:123456このアップグレードの前に,GetOrder関数を呼び出すには,入力された注文Idは,123456
  • 取引所オーダーで定義された取引所名前の商品コード:BTC-USDT│ │ ここで言及しているのは,FMZプラットフォームが定義する取引対ではなく,取引所が命名した取引品種コードである.

このアップグレードの後,exchange.GetOrder(id)函数が入力したいパラメータidのフォーマットは:BTC-USDT,123456

デザインの理由を説明します. このアップグレードでは,CreateOrder関数が直接品種を指定する ("品種と現在設定されている取引対,契約コードは異なる可能性があります") 注文IDが返された場合,品種情報を含まない場合は,この注文IDは使用できません. 特定の請求書が到着するときに,その注文がどのような品種 (契約書) かがわからないため,ほとんどの取引所請求書や撤回は,品種コードを記述するパラメータを指定する必要があります.

この影響はどのように調和できるのか? もし下令は,exchange.IO関数が直接取引所の下令インターフェースを呼び出して下令を行う場合,返される値は,通常,取引所の原始シンボル (種コード) と原始注文idを含みます.両方を英語コマで拼接すると,FMZプラットフォームが定義するオーダーIdに適合します. 同様に,FMZプラットフォームで包装された下注インターフェイスを使用した場合,下注は,注文Idの開始部分は取引品種コードであるため,注文の原始Idを使用する必要がある場合は,品種コードとコマを削除するだけでよい.

影响exchange.CancelOrder函数

このアップグレードはexchange.CancelOrder()この関数の影響とexchange.GetOrder()この関数は同じです.

影响exchange.Buy函数

このアップグレードはexchange.Buy()この関数の影響とexchange.GetOrder()この関数は同じです.exchange.Buy()函数が返した注文Idは,OKX取引所の先物注文時に返したIdのような新しい構造です.LTC-USDT-SWAP,1578360858053058560

影响exchange.Sell函数

このアップグレードはexchange.Sell()この関数の影響とexchange.GetOrder()この関数は同じです.exchange.Sell()函数が返した注文Idは,OKX取引所の先物注文時に返したIdのような新しい構造です.ETH-USDT-SWAP,1578360832820125696

4 構造の調整

チッカー構造物

この更新により,Ticker構造に Symbol フィールドが追加され,現在のTicker構造がどの品種であるかを記録する. このフィールドは,exchange.GetTicker()函数のシンボル参数形式は完全に一致している.

Order 構造

この更新では,Order構造体に Symbol フィールドが追加されました.exchange.GetTicker()函数のシンボル参数形式は完全に一致している. この更新では,Order構造体のIdフィールドも変更され,新しいオーダーId形式で品種情報,原始オーダー情報などを記録した.exchange.GetOrder()函数内の注文Idの説明は,ここで説明しません.

位置構造

この更新では,Position構造体に Symbol フィールドが追加されました.exchange.GetTicker()函数のシンボル参数形式は完全に一致している.

5 復習システム

このアップグレードは,ユーザーのニーズを満たすために,最初に実機に互換性を与え,回測システムは1週間以内に適応を完了します. 個々のポリシーコードが影響を受ける場合,この記事の説明に従って変更を調整してください.

追加更新

1, アカウント 構造 新しいフィールド 株式, UPnL

フューチャー取引所のオブジェクトのメンバー関数GetAccount戻ってきたAccount構造はフィールドを拡張した.

  • 株式 現在,特定の先物取引所がサポートしない限り,大部分がこのフィールドをサポートしている. 主にリアルタイムアカウントの先物収益と損失を計算するために使用される.

  • UPnL 現在,担保資産の通貨種に所有するすべてのポジションの未実現利益損失は,非常に特定の先物取引所がサポートしない限り,ほとんどがこの分野を支持している.

2, SetMarginLevel関数アップグレードシンボルパラメータサポート

期貨取引所オブジェクトのメンバー関数SetMarginLevelは,パラメータシンボルを追加してアップグレードされた.

テスト例:

function main() {
    exchange.SetCurrency("ETH_USDT")
    exchange.SetContractType("swap")
    
    // 当前交易对为ETH_USDT,合约代码为swap,设置杠杆值为10
    exchange.SetMarginLevel(10)
    
    // 直接指定交易对BTC_USDT,合约代码swap,设置杠杆值20
    exchange.SetMarginLevel("BTC_USDT.swap", 20)
}

もっと

ワ-エムン返信IDは,取引の名前も付いており,長い研究を経て,注文後,ログの情報が表示されない,そして管理者が更新したためでしょうか.

張小宝郎/upload/asset/2ffc0f961149326b78aed.png この問題は,このインターフェースアップデートによって引き起こされたのでしょうか?

エクネムース 希望exchange.Buy函数能增加开止损单的功能。。

ナンセグ前列の概要

ワ-エムンいいわ

発明者 量化 - 微かな夢このページでは,この問題について詳しく説明します.

ワ-エムンextMsg1は表示されていません.

発明者 量化 - 微かな夢こんにちは,オーダーIDは,直接品種指定の注文をアップグレードしたため,必須の変更です. オーダーIDには品種情報が含まれなければなりません. そうでなければ,このオーダーがどの品種であるか確認することはできません. あなたは,下記の命令の後に表示されないメッセージ,つまり:exchange.Buy ((price, amount, extMsg1, extMsg2) を呼び出すとき,extMsg1, extMsg2 はログに表示されないのですか?

発明者 量化 - 微かな夢こんにちは,現在の取引所設定,取引ペア,契約コード設定を送信してください.

発明者の量化テストコードとコンフィギュレーションの詳細を 工事書に送信してください エンジニアはすぐにご連絡ください

発明者 量化 - 微かな夢取引所の条件化メカニズムなどの違いは大きく,支持度も異なりますが,この間調査してみましょう.

発明者 量化 - 微かな夢サポートありがとうございました. 使用問題がある場合は,お問い合わせやメッセージを送信してください.