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

FMZ API インストラクション

作者: リン・ハーンゼロ, 作成日:2020年4月20日 10:19:00, 更新日:2023年4月12日 14:44:56

pp メインは空です. 取引所[0].IO(ベース, https://api.huobipro.com”); }


The ZB exchange is special. There are two addresses: one is the market data interface address, and the other is the trading interface address. Switch the address:
```js
function main() {
    // The second parameter of exchange.IO is the trading interface address, and the third parameter is the market interface address, which is switched to an address that can be accessed domestically
    exchange.IO("base", "https://trade.zb.plus", "http://api.zb.plus")    
    // Print the account information
    Log(exchange.GetAccount())                                            
}
def main():
    exchange.IO("base", "https://trade.zb.plus", "http://api.zb.plus")
    Log(exchange.GetAccount())
void main() {
    exchange.IO("base", "https://trade.zb.plus", "http://api.zb.plus");
    Log(exchange.GetAccount());
}
  • 市場モードを切り替える 現在サポートされている取引所:

    交換 コメント
    ハウビースポット WebSocket プロトコルをサポートした後,コードexchange.IO(通貨,ETH) は通貨の切り替えに使用できません
    • exchange.IO("websocket")

      市場通信プロトコルをwebsocket(デフォルトは休息) 市場価格の取得方法は,切り替え後に変更されます.exchange.GetTicker()そしてexchange.GetDepth()切り替えるwebsocket市場データの原始のアクティブ取得から市場データの受動的取得まで,現在 Huobi Exchangeのみがサポートされています.

    市場モードがプッシュメカニズムである場合,次の関数を呼び出すことができます.

    • exchange.IO("mode", 0)即返回モード.現在の市場データプッシュが取引所から受信されていない場合は,古い市場データが即返回されます.新しいデータがある場合は,新しいデータが返されます.

    • exchange.IO("mode", 1)キャッシュモード (デフォルトモード). 取引所の最新の市場データが受信されていない場合 (以前のインターフェースから入手したデータと比較して),受信を待って戻します. この機能を呼び出す前に最新の市場データが受信されている場合は,最新のデータが直ちに返されます.

    • exchange.IO("mode", 2)強制更新モード 入力して,交換の次の最新のプッシュデータが受信されるまで待って,それから戻します.

    最新の市場情報を最初に入手したい場合は,websocket呼び出さないSleepデータを直ちにテストする.exchange.GetTicker()そしてexchange.GetDepth()機能はキャッシュモードで動作します.例えば:

    function main () {
        exchange.IO("websocket")
        while (true) {
            Log(exchange.GetTicker())
        }
    }
    
    def main():
        exchange.IO("websocket")
        while True:
            Log(exchange.GetTicker())
    
    void main() {
        exchange.IO("websocket");
        while(true) {
            Log(exchange.GetTicker());
        }
    }
    
  • 取引所レバレッジ口座モード

    使用exchange.IO("trade_margin")取引所のレバレッジインターフェースを利用して,レバレッジアカウントモードに切り替える場合,注文を出し,口座資産にアクセスします. 使用exchange.IO("trade_normal")普通のアカウントモードに戻る

    サポートされている交換:

    交換 特別 意見
    OKX レバレッジアカウントモードの取引ペアは通常のペアとは異なります.exchange.IO("cross", true)ローバー付き口座のフルポジションに切り替え,exchange.IO("cross", false)隔離位置に切り替える
    ハウビー ハーバードアカウントモードの取引ペアは通常のものとは異なり,一部の取引ペアは利用できない場合があります. Huobi ハーバードアカウントはクロスポジションと孤立ポジションに分かれています.trade_margin引き上げ口座から孤立したポジションに切り替えるtrade_super_margin引き上げ口座に切り替えるtrade_normal通常の通貨モードに切り替える
    ZB 資金はQCでのみ転送できます.レバレッジ取引部門では,異なる取引ペアの間の資金は独立しています.つまり,ETH_QC取引ペアの下にあるQCコインの数がBTC_QCでは表示されません.
    バイナンス レバレッジアカウントは,クロスポジションと孤立ポジションに分かれています.trade_margin隔離位置に切り替えるtrade_super_margin交差位置に切り替えるtrade_normal通常の通貨モードに切り替える
    ゲート レバレッジアカウントは,クロスポジションと孤立ポジションに分かれています.trade_margin隔離位置に切り替えるtrade_super_margin交差位置に切り替えるtrade_normal通常の通貨モードに切り替える
    アセンデックス 使用exchange.IO("trade_margin")レバレッジアカウントモードに切り替えてexchange.IO("trade_normal")普通のアカウントモードに戻る

交換日記

exchange.Log(LogType, Price, Amount)呼び出し時に注文を入れないし,取引日記情報を出力するために取引情報を記録するだけです.

注記:

  • この関数はexchangeグローバル関数とは異なります.Log().
  • パラメータ値:LogType取れるLOG_TYPE_BUY, LOG_TYPE_SELL, LOG_TYPE_CANCELそしてPrice価格としてAmount量としてLogTypeLOG_TYPE_CANCEL, PriceパラメータはオーダーIDです

使用exchange.Log(LogType, Price, Amount)ライブ取引のフォローアップテスト,シミュレーションのオーダープレスメントを行い,オーダー記録を支援する.

最も一般的な使用例は:exchange.IO条件付きの注文を配置する交換の条件付きの注文のインターフェースを作成する機能にアクセスします.exchange.IOログの記録に表示されません. したがって,使用できますexchange.Log(LogType, Price, Amount)ログ出力を補完し,注文情報記録する.

var id = 123
function main() {
    // Order type: buy; price: 999; quantity: 0.1
    exchange.Log(LOG_TYPE_BUY, 999, 0.1)      
    // Cancel the order
    exchange.Log(LOG_TYPE_CANCEL, id)         
}
id = 123
def main():
    exchange.Log(LOG_TYPE_BUY, 999, 0.1)
    exchange.Log(LOG_TYPE_CANCEL, id)
void main() {
    auto id = 123;
    exchange.Log(LOG_TYPE_BUY, 999, 0.1);
    exchange.Log(LOG_TYPE_CANCEL, id);
}

交換する.HMAC(...)

exchange.HMAC(Algo, OutputAlgo, Data, Key)支持するHMAC暗号化計算md5/sha256/sha512/sha1リアルタイムの取引のみがサポートされています.

exchange.HMAC("sha256", "hex", "xxxxx", "{{secretkey}}")引用するとaccessKey服用する"{{accesskey}}"- わかった 引用するとsecretKey服用する"{{secretkey}}"; または,普通テキストを使用することができます"abc-123-xxxx". "{{accessKey}}","{{secretkey}}"この関数を使用するときにのみ有効です.OutputAlgo支柱: hex, base64具体的な例

BitMEX 位置変更をプッシュする (wss プロトコル)

function main() {
    var APIKEY = "your Access Key(Bitmex API ID)"
    var expires = parseInt(Date.now() / 1000) + 10
    var signature = exchange.HMAC("sha256", "hex", "GET/realtime" + expires, "{{secretkey}}")
    var client = Dial("wss://www.bitmex.com/realtime", 60)
    var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})
    var pos = 0
    client.write(auth)
    client.write('{"op": "subscribe", "args": "position"}')
    while (true) {
        bitmexData = client.read()
        if(bitmexData.table == 'position' && pos != parseInt(bitmexData.data[0].currentQty)){
            Log('position change', pos, parseInt(bitmexData.data[0].currentQty), '@')
            pos = parseInt(bitmexData.data[0].currentQty)
        }
    }
}
import time
def main():
    APIKEY = "your Access Key(Bitmex API ID)"
    expires = int(time.time() + 10)
    signature = exchange.HMAC("sha256", "hex", "GET/realtime" + str(expires), "{{secretkey}}")
    client = Dial("wss://www.bitmex.com/realtime", 60)
    auth = json.dumps({"args": [APIKEY, expires, signature], "op": "authKeyExpires"})
    pos = 0
    client.write(auth)
    client.write('{"op": "subscribe", "args": "position"}')
    while True:
        bitmexData = json.loads(client.read())
        if "table" in bitmexData and bitmexData["table"] == "position" and len(bitmexData["data"]) != 0 and pos != bitmexData["data"][0]["currentQty"]:   
            Log("position change", pos, bitmexData["data"][0]["currentQty"], "@")
            pos = bitmexData["data"][0]["currentQty"]
void main() {
    auto APIKEY = "your Access Key(Bitmex API ID)";
    auto expires = Unix() + 10;
    auto signature = exchange.HMAC("sha256", "hex", format("GET/realtime%d", expires), "{{secretkey}}");
    
    auto client = Dial("wss://www.bitmex.com/realtime", 60);
    json auth = R"({"args": [], "op": "authKeyExpires"})"_json;

    auth["args"].push_back(APIKEY);
    auth["args"].push_back(expires);
    auth["args"].push_back(signature);
    auto pos = 0;
    client.write(auth.dump());
    client.write("{\"op\": \"subscribe\", \"args\": \"position\"}");
    while(true) {
        auto bitmexData = json::parse(client.read());
        if(bitmexData["table"] == "position" && bitmexData["data"][0].find("currentQty") != bitmexData["data"][0].end() && pos != bitmexData["data"][0]["currentQty"]) {
            Log("Test");
            Log("position change", pos, bitmexData["data"][0]["currentQty"], "@");
            pos = bitmexData["data"][0]["currentQty"];
        }
    }
}

交換する. 行く.

exchange.Go(Method, Args...)は,すべてのサポートされた機能の動作を非同期に変換できる多スレッドアシンクロンサポート機能です (暗号通貨取引所のみをサポートします). パラメータ値:Method文字列の種類,すなわち同時に呼び出された関数の名前です.

注記:

  • この機能は,ライブ取引中に実行される場合にのみ多スレッド実行タスクを作成します.バックテストは,多スレッド同時実行タスクをサポートしません (バックテストは利用可能ですが,それでも順序的に実行されます).
  • その後にexchange.Goこの関数で,wait呼び出しによって自動的に解放されます. 呼び出しによって,データ取得後,スレッドは自動的に解放されます.wait終了します. タイムアウトパラメータを指定する場合はwait,タイムアウトが発生してもスレッドが解放されない.この方法では,スレッドの結果を取得することによってのみスレッドが自動的に解放される (同時アクセスされたインターフェースが成功または失敗で呼び出されても).
  • 糸が成功するか失敗するかに関わらず 糸が成功するか失敗するかはwait機能,およびスレッドリソースが適用されるexchange.Go機能はドッカーによって自動的に解放されます.
  • 返信結果がwait動作が完了しない場合,スレッドリソースは自動的に解放されず,適用スレッドの蓄積を引き起こします.スレッド数が2000を超えると,エラーが報告されます."too many routine wait, max is 2000".

サポートされている機能:GetTicker, GetDepth, GetTrades, GetRecords, GetAccount, GetOrders, GetOrder, CancelOrder, Buy, Sell, GetPositionそしてIO.

function main(){
    // The following four operations are executed concurrently and asynchronously by multiple threads, without time-consuming, but with immediate return.
    var a = exchange.Go("GetTicker")
    var b = exchange.Go("GetDepth") 
    var c = exchange.Go("Buy", 1000, 0.1)
    var d = exchange.Go("GetRecords", PERIOD_H1)
           
    // Call the "wait" method, to wait for the return of the asynchronously obtained "ticker" result 
    var ticker = a.wait()            
    // Return the depth; it is possible to return null, if the acquisition fails 
    var depth = b.wait()             
    // Return the order number; limit the timeout in 1 second; the timeout returns "undefined"; this object can continue to call "wait" to wait if the last "wait" is timeout 
    var orderId = c.wait(1000)
    if(typeof(orderId) == "undefined") {
        // Timeout, reacquire
        orderId = c.wait()
    }
    var records = d.wait()
}
def main():
    a = exchange.Go("GetTicker")
    b = exchange.Go("GetDepth")
    c = exchange.Go("Buy", 1000, 0.1)
    d = exchange.Go("GetRecords", PERIOD_H1)

    ticker, ok = a.wait()
    depth, ok = b.wait()
    orderId, ok = c.wait(1000)
    if ok == False:
        orderId, ok = c.wait()
    records, ok = d.wait()
void main() {
    auto a = exchange.Go("GetTicker");
    auto b = exchange.Go("GetDepth");
    auto c = exchange.Go("Buy", 1000, 0.1);
    auto d = exchange.Go("GetRecords", PERIOD_H1);

    Ticker ticker;
    Depth depth;
    Records records;
    TId orderId;
    a.wait(ticker);
    b.wait(depth);
    if(!c.wait(orderId, 300)) {
        c.wait(orderId);
    }
    d.wait(records);
}

注記:

  • 判断するundefined服用するtypeof(xx)==="undefined"なぜならnull == undefinedJavaScript で提供されています.
function main() {
    var d = exchange.Go("GetRecords", PERIOD_H1)
    // Wait for K-line result
    var records = d.wait()
    // Here we wait for an asynchronous operation that has been waited and ended; it will return null, and record the error
    var ret = d.wait()
}
def main():
    d = exchange.Go("GetRecords", PERIOD_H1)
    records, ok = d.wait()
    ret, ok = d.wait()
void main() {
    auto d = exchange.Go("GetRecords", PERIOD_H1);
    Records records;
    d.wait(records);
    Records ret;
    d.wait(ret);
}

この2つの違いとはPythonそしてJavaScriptそれは?Pythonほらwaitfunction は 2 つのパラメータを返します.最初のパラメータは,非同期 API が返した結果であり,第 2 つのパラメータは,非同期呼び出しが完了したかどうかを示します.

Python例:

def main():
    d = exchange.Go("GetRecords", PERIOD_D1)
    # "ok" must return "True", unless the strategy is stopped
    ret, ok = d.wait()          
    # If the waiting times out, or "wait" for an ended instance, "ok" returns "False"
    ret, ok = d.wait(100)       
    ret, ok = d.wait(100)       

複数の取引所のコートを同時に取得する:

function main() {
    while(true) {
        var beginTS = new Date().getTime()
        var arrRoutine = []
        var arrTicker = []
        var arrName = []
        for(var i = 0; i < exchanges.length; i++) {
            arrRoutine.push(exchanges[i].Go("GetTicker"))
            arrName.push(exchanges[i].GetName())
        }

        for(var i = 0; i < arrRoutine.length; i++) {
            arrTicker.push(arrRoutine[i].wait())
        }
        var endTS = new Date().getTime()

        var tbl = {
            type: "table", 
            title: "Market Quotes", 
            cols: ["Index", "Name", "Latest Executed Price"], 
            rows: []
        }
        
        for(var i = 0; i < arrTicker.length; i++) {
            tbl.rows.push([i, arrName[i], arrTicker[i].Last])
        }

        LogStatus(_D(), "The total time to acquire multiple platforms concurrently is:", endTS - beginTS, "millisecond", "\n", "`" + JSON.stringify(tbl) + "`")
        Sleep(500)
    }
}
import time 
import json
def main():
    while True:
        beginTS = time.time()
        arrRoutine = []
        arrTicker = []
        arrName = []
        for i in range(len(exchanges)):
            arrRoutine.append(exchanges[i].Go("GetTicker"))
            arrName.append(exchanges[i].GetName())

        for i in range(len(exchanges)):
            ticker, ok = arrRoutine[i].wait()
            arrTicker.append(ticker)

        endTS = time.time()
        tbl = {
            "type": "table", 
            "title": "Market Quote", 
            "cols": ["Index", "Name", "Latest Executed Price"], 
            "rows": [] 
        }

        for i in range(len(arrTicker)):
            tbl["rows"].append([i, arrName[i], arrTicker[i]["Last"]])

        LogStatus(_D(), "The total time to acquire multiple platforms concurrently is:", endTS - beginTS, "second", "\n", "`" + json.dumps(tbl) + "`")
        Sleep(500)
void main() {
    while(true) {
        int length = exchanges.size();
        auto beginTS = UnixNano() / 1000000;
        Ticker arrTicker[length] = {};
        string arrName[length] = {};
        
        // Note that to add a few exchange objects, here we need to execute the "exchanges[n].Go" function several times. In this example, we need to add four exchange objects, which can be modified in details
        auto r0 = exchanges[0].Go("GetTicker");
        auto r1 = exchanges[1].Go("GetTicker");
        auto r2 = exchanges[2].Go("GetTicker");
        auto r3 = exchanges[3].Go("GetTicker");
        GoObj *arrRoutine[length] = {&r0, &r1, &r2, &r3};
        
        for(int i = 0; i < length; i++) {
            arrName[i] = exchanges[i].GetName();
        }

        for(int i = 0; i < length; i++) {
            Ticker ticker;
            arrRoutine[i]->wait(ticker);
            arrTicker[i] = ticker;
        }        
        auto endTS = UnixNano() / 1000000;

        json tbl = R"({
            "type": "table", 
            "title": "Market Quote", 
            "cols": ["Index", "Name", "Latest Executed Price"], 
            "rows": [] 
        })"_json;

        for(int i = 0; i < length; i++) {
            json arr = R"(["", "", ""])"_json;
            arr[0] = format("%d", i);
            arr[1] = arrName[i];
            arr[2] = format("%f", arrTicker[i].Last);
            tbl["rows"].push_back(arr);
        }

        LogStatus(_D(), "The total time to acquire multiple platforms concurrently is:", format("%d", endTS - beginTS), "millisecond", "\n", "`" + tbl.dump() + "`");
        Sleep(500);
    }
}

共同の呼びかけexchange.IO("api", ...)機能:

function main() {
    /*  
       Use the OKX placing order interface to test
        POST /api/v5/trade/order        
    */
    
    var beginTS = new Date().getTime()
    var param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
    var ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
    var ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
    var ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", JSON.stringify(param))
    
    var id1 = ret1.wait()
    var id2 = ret2.wait()
    var id3 = ret3.wait()
    var endTS = new Date().getTime()    

    Log("id1:", id1)
    Log("id2:", id2)
    Log("id3:", id3)
    Log("Time for placing orders concurrently:", endTS - beginTS, "millisecond")
}
import time
import json
def main():
    beginTS = time.time()
    param = {"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"}
    ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
    ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))
    ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", json.dumps(param))

    id1, ok1 = ret1.wait()
    id2, ok2 = ret2.wait()
    id3, ok3 = ret3.wait()
    endTS = time.time()

    Log("id1:", id1)
    Log("id2:", id2)
    Log("id3:", id3)
    Log("Time for placing orders concurrently:", endTS - beginTS, "second")
void main() {
    auto beginTS = UnixNano() / 1000000;
    json param = R"({"instId":"BTC-USDT-SWAP","tdMode":"cross","side":"buy","ordType":"limit","px":"16000","sz":"1","posSide":"long"})"_json;
    auto ret1 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
    auto ret2 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());
    auto ret3 = exchange.Go("IO", "api", "POST", "/api/v5/trade/order", "", param.dump());

    json id1 = R"({})"_json;
    json id2 = R"({})"_json;
    json id3 = R"({})"_json;

    ret1.wait(id1);
    ret2.wait(id2);
    ret3.wait(id3);
    auto endTS = UnixNano() / 1000000;

    Log("id1:", id1);
    Log("id2:", id2);
    Log("id3:", id3);
    Log("Time for placing orders concurrently:", endTS - beginTS, "millisecond");
}

口座情報

交換する.GetAccount (取得する)

exchange.GetAccount()交換口座情報を返します.返回値:Account structure.

  • Account構造
function main(){
    var account = exchange.GetAccount()
    Log("Account information, Balance:", account.Balance, "FrozenBalance:", account.FrozenBalance, "Stocks:",
        account.Stocks, "FrozenStocks:", account.FrozenStocks)
}
def main():
    account = exchange.GetAccount()
    Log("Account information, Balance", account["Balance"], "FrozenBalance:", account["FrozenBalance"], "Stocks:", 
        account["Stocks"], "FrozenStocks:", account["FrozenStocks"])
void main() {
    auto account = exchange.GetAccount();
    Log("Account information, Balance", account.Balance, "FrozenBalance:", account.FrozenBalance, "Stocks:", 
        account.Stocks, "FrozenStocks:", account.FrozenStocks);
}

取引対象が暗号通貨先物取引所に設定され,USDT利回りとして (参照exchange.SetContractType資産の交換方法を知るために機能)USDTマージンとして記入されます.BalanceそしてFrozenBalance.

function main(){
    // Switch the trading pair
    exchange.IO("currency", "BTC_USDT")     
    // Take OKX futures as an example; set the contract as the contract of the week, and the current trading pair is BTC_USDT, so the current contract is BTC USDT-margined contract of this week
    exchange.SetContractType("this_week")   
    // Acquire the data of the current account assets
    var account = exchange.GetAccount()
    // The available balance of USDT as margin
    Log(account.Balance)
    // The frozen amount of USDT as margin
    Log(account.FrozenBalance)
}
def main():
    exchange.IO("currency", "BTC_USDT")
    exchange.SetContractType("this_week")    
    account = exchange.GetAccount()
    Log(account["Balance"])
    Log(account["FrozenBalance"])
void main() {
    exchange.IO("currency", "BTC_USDT");
    exchange.SetContractType("this_week");    
    auto account = exchange.GetAccount();
    Log(account.Balance);
    Log(account.FrozenBalance);
}

exchange.GetName (取得する)

exchange.GetName()文字列の種類を返します. 一般的には,文字列の種類を決定するために使用されます.exchangeまたはexchanges[n]戦略コードのオブジェクトです

function main() {
    Log("Determine the exchange object to be OKX:", exchange.GetName() == "OKEX")
}
def main():
    Log("Determine the exchange object to be OKX:", exchange.GetName() == "OKEX")
void main() {
    Log("Determine the exchange object to be OKX:", exchange.GetName() == "OKEX");
}

Docker の線バージョンをコマンドするには,-1交換名のリストを印刷するコマンドです.

交換する.GetLabel ((()

exchange.GetLabel()交換のカスタムラベルを返します. 返した値:文字列タイプ.

img

についてexchangeまたはexchanges[n]戦略コードのオブジェクトは,交換オブジェクトの設定時に設定されたラベルによって通常決定されます.

交換.GetCurrency (通貨を取得する)

exchange.GetCurrency()取引所が運営する通貨ペアの名前と,暗号通貨プラットフォームは文字列を返しますLTC_BTC返される値は:文字列の種類.

交換.セット 通貨...

についてexchange.SetCurrency(Symbol)交換オブジェクトの現在の取引ペアを切り替えるために使用されます.exchange.IO ("currency","BTC_USDT")バックテストシステムで取引ペアを切り替えるのをサポートし,pricing currencyバックテストシステムで取引ペアを切り替えるときには変更できません (例えば,BTC_USDT切り替えられるLTC_USDT切り替えることはできませんLTC_BTC) は,バックテスト以外のページで最初に設定された取引ペアに切り替えた後,trading coins0 (例えば,バックテスト中に,バックテストページの取引ペアの初期値は,BTC_USDTUSDTの数は10,000です. すぐにBTCに切り替えたら,LTC_USDT,数についてtrading coins切り替えた取引ペアの共有USDT金額は依然として10000である.

function main() {
    var ticker = exchange.GetTicker() 
    Log(ticker)
    Log(exchange.GetAccount())    
    // Switch trading pairs, and pay attention to changes in market quote data and account information after switching
    Log("Switch LTC_USDT: ", exchange.SetCurrency("LTC_USDT"))
    ticker = exchange.GetTicker()
    Log(ticker)
    Log(exchange.GetAccount())
}
def main():
    ticker = exchange.GetTicker()
    Log(ticker)
    Log(exchange.GetAccount())
    Log(" Switch LTC_USDT: ", exchange.SetCurrency("LTC_USDT"))
    ticker = exchange.GetTicker()
    Log(ticker)
    Log(exchange.GetAccount())
void main() {
    auto ticker = exchange.GetTicker();
    Log(ticker);
    Log(exchange.GetAccount());
    exchange.SetCurrency("LTC_USDT");
    Log(" Switch LTC_USDT: ");
    ticker = exchange.GetTicker();
    Log(ticker);
    Log(exchange.GetAccount());
}

バックテスト結果:

img

交換.GetQuoteCurrency (GetQuoteCurrency) について

exchange.GetQuoteCurrency()エクスチェンジが運用するベース通貨の名前を返します.BTC_CNYリターンCNYそしてETH_BTCリターンBTC返される値は:文字列の種類.

フューチャー取引

暗号通貨の先物取引所の場合は,その取引先のコードを呼び出す前に,契約コードを指定する必要があります.市場, 順序インターフェース,およびexchange.SetContractType交換オブジェクトの現在の取引ペアを切り替えるとき,あなたは呼び出す必要がありますexchange.SetContractTypeプラットフォームがサポートするデジタル通貨交換契約コードについては,exchange.SetContractType function.

交換する.GetPosition ((()

exchange.GetPosition()現在の位置情報を取得します.返却値:position位置がない場合は,空の配列を返します.[].

  • Position構造

通常,仮想通貨先物契約は2種類に分かれます.

  • 納品契約 契約が配達契約に設定された場合,exchange.GetPosition()現行の取引ペアの下の配送契約のすべてのポジションが返されます.

  • 永久契約 永久契約に設定された場合,呼び出すexchange.GetPosition()継続契約のすべてのポジションが,現在の取引ペアで返されます.

/*
    Note: if there is no position, it will returns an empty array, so you should judge whether the data returned by the interface is a null array, before you use the returned data
    For example:
    When the exchange is set to OKX futures, if the contract is set to be a delivery contract, when the position data of the current week, the next week, and the quarter is obtained, the data type will be an array of position structure.
    When the exchange is set to OKX futures, if the contract is set to a perpetual contract, the array of position structure containing the position data of the perpetual contract will be obtained.
*/

function main(){
    exchange.SetContractType("this_week")
    exchange.SetMarginLevel(10)
    exchange.SetDirection("buy")
    exchange.Buy(10000, 2)
    var position = exchange.GetPosition()
    if(position.length > 0){
        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)
    }
}
def main():
    exchange.SetContractType("this_week")
    exchange.SetMarginLevel(10)
    exchange.SetDirection("buy")
    exchange.Buy(10000, 2)
    position = exchange.GetPosition()
    if len(position) > 0:
        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"])
void main() {
    exchange.SetContractType("this_week");
    exchange.SetMarginLevel(10);
    exchange.SetDirection("buy");
    exchange.Buy(10000, 2);
    auto position = exchange.GetPosition();
    if(position.size() > 0) {
        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(MarginLevel)パラメータ値:数値型

仮想通貨の先物注文のレバレッジの大きさを設定します 例えば:

function main() {
    exchange.SetMarginLevel(10)
}
def main():
    exchange.SetMarginLevel(10)
void main() {
    exchange.SetMarginLevel(10);
}

仮想通貨先物については,仮想通貨先物取引所のレバレッジメカニズムは均一ではない.一部の取引所で,先物取引所のレバレッジ値は,注文の配置インターフェースのパラメータである.この場合,レバレッジメカニズムは,先物取引所のレバレッジメカニズムである.SetMarginLevelこの関数はネットワークリクエストを生成できないが,底層のレバレッジ変数を設定するだけ (プレスオーダーインターフェイスのパラメータを通過するために使用される).一部の取引所の先物レバレッジは,取引所のウェブサイトページまたはAPIインターフェイスを使用して設定する必要がある取引所の設定である.この時点で,レバレッジを呼び出す.SetMarginLevelこの関数はネットワークリクエストを生成し,様々な理由からレバレッジを設定できない可能性があります.例えば:現在のポジションと待機中のオーダーがある場合,この取引ペアと基となるオブジェクトのレバレッジ値は設定されない可能性があります.

戦略設計におけるレバレッジの設定に関する注意事項:

  • 暗号通貨の先物のみがサポートされています
  • バックテストはレバレッジを切り替えるのをサポートします

交換.セットディレクション (((...)

exchange.SetDirection(Direction)セットexchange.Buyまたはexchange.Sellフューチャーオーダーの配列を設定する パラメータ値:文字列タイプ

についてSetDirectionこの関数は,先物取引方向とオーダー配置関数の間の対応を設定します.

オーダー 配置 機能 パラメータ設定方向 SetDirection関数 コメント
exchange.Buy 買って オープン・ロング・ポジションを購入
exchange.Buy 閉店する ショートポジションを閉じる
exchange.Sell 売る オープンショートポジションを売却
exchange.Sell 近売り ロングポジションを閉じる

パラメータDirection4つのパラメータを取ることができます.buy, closebuy, sellそしてclosesell.

function main(){
    // Make an example for setting OKX futures weekly contract
    exchange.SetContractType("this_week")    
    // Set 5 times of leverage
    exchange.SetMarginLevel(5)
    // Set the order placing type into placing long order
    exchange.SetDirection("buy")
    // Place an order with the contract quantity of 2, at the price of 10,000
    exchange.Buy(10000, 2)              
    exchange.SetMarginLevel(5)
    exchange.SetDirection("closebuy")
    exchange.Sell(1000, 2)
}
def main():
    exchange.SetContractType("this_week")
    exchange.SetMarginLevel(5)
    exchange.SetDirection("buy")
    exchange.Buy(10000, 2)
    exchange.SetMarginLevel(5)
    exchange.SetDirection("closebuy")
    exchange.Sell(1000, 2)
void main() {
    exchange.SetContractType("this_week");
    exchange.SetMarginLevel(5);
    exchange.SetDirection("buy");
    exchange.Buy(10000, 2);
    exchange.SetMarginLevel(5);
    exchange.SetDirection("closebuy");
    exchange.Sell(1000, 2);
}

exchange.SetContractType (契約型を設定する)

exchange.SetContractType(ContractType)契約型を設定します. パラメータ値:文字列型. 仮想通貨戦略では,例としてBTC_USDT を参照してください.exchange.SetCurrency("BTC_USDT")またはexchange.IO("currency", "BTC_USDT")薬剤の使い方をexchange.SetContractType新しい取引ペアで操作する必要がある現在の契約を決定するために契約をリセットする機能.currency-based contractまたはU-based contract基準としてトレーディングペア例えば,取引ペアがBTC_ USDT機能を使用するexchange.SetContractType契約コードを設定するswap取引ペアが USDTベースの BTCの永続契約として設定されます.BTC_ USD機能を使用するexchange.SetContractType契約コードを設定するswapBTCの通貨ベースの永続契約として設定されています.

異なった規定がない限り,納品契約暗号通貨の先物契約のコードには,一般的に以下の項目が含まれます.

  • this_week: 週間の契約
  • next_week: 来週の契約
  • quarter:四半期契約
  • next_quarter: 次の四半期契約

異なった規定がない限り,永久契約暗号通貨の先物契約のコードには,一般的に以下の項目が含まれます.

  • swap永久契約

現在の契約を毎週契約に設定します.

function main() {
    // Set to weekly contract
    exchange.SetContractType("this_week") 
}
def main():
    exchange.SetContractType("this_week")
void main() {
    exchange.SetContractType("this_week");
}

サポートされている各暗号通貨取引所の契約命名に関する詳細な説明は以下のとおりです.

  • OKX 永久契約に設定:exchange.SetContractType("swap")この週契約に設定:exchange.SetContractType("this_week")来週に契約するexchange.SetContractType("next_week")決算は四半期契約で:exchange.SetContractType("quarter")次の四半期に設定された契約:exchange.SetContractType("next_quarter")OKX USDT保証契約は,現在の契約に対応するUSDT決済を使用する契約に切り替えることができます.trading pair(または交換オブジェクトを追加するときに直接設定します).

    function main() {
        // The default trading pair is BTC_USD, the contract is set to the weekly contract, and the contract is the crypto-margined contract
        exchange.SetContractType("this_week")
        Log("ticker:", exchange.GetTicker())
        
        // Switch trading pairs, and then set a contract to a USDT-margined contract, which is different from the crypto-margined contract
        exchange.IO("currency", "BTC_USDT")   
        exchange.SetContractType("swap")
        Log("ticker:", exchange.GetTicker())
    }
    
    def main():
        exchange.SetContractType("this_week")
        Log("ticker:", exchange.GetTicker())
        exchange.IO("currency", "BTC_USDT")
        exchange.SetContractType("swap")
        Log("ticker:", exchange.GetTicker())
    
    void main() {
        exchange.SetContractType("this_week");
        Log("ticker:", exchange.GetTicker());
        exchange.IO("currency", "BTC_USDT");
        exchange.SetContractType("swap");
        Log("ticker:", exchange.GetTicker());
    }
    
  • フューチャーズ_HuobiDM この週契約に設定:exchange.SetContractType("this_week")来週に契約するexchange.SetContractType("next_week")決算は四半期契約で:exchange.SetContractType("quarter")次の四半期に設定された契約:exchange.SetContractType("next_quarter")永久契約に設定:exchange.SetContractType("swap")

    プラットフォームは,USDTの保証契約をサポートします. BTCの契約を例に挙げましょう.exchange.SetCurrency("BTC_USDT"),または現在の取引ペアをBTC_USDT取引ペアを切り替えた後,呼び出す必要がありますexchange.SetContractType契約を設定するために再び機能します.

  • フューチャーズ_BitMEX 永久契約に設定:exchange.SetContractType("XBTUSD"), exchange.SetContractType("APTUSDT")- わかった BitMEXの公式ウェブサイトにログインして,詳細については各契約コードを確認します.例えば:exchange.SetContractType("XBTM19").

  • フューチャーズ_GateIO この週契約に設定:exchange.SetContractType("this_week")- わかった 来週に契約するexchange.SetContractType("next_week")- わかった 決算は四半期契約で:exchange.SetContractType("quarter")- わかった 次の四半期に設定された契約:exchange.SetContractType("next_quarter")- わかった 永久契約に設定:exchange.SetContractType("swap")- わかった 取引所は,USDTで保証される契約をサポートします.例として,BTC契約を挙げましょう.exchange.SetCurrency("BTC_USDT"),または現在の取引ペアをBTC_USDT取引ペアを切り替えた後,呼び出す必要がありますexchange.SetContractType契約を設定するために再び機能します.

  • フューチャーズ_デリビット 永久契約に設定:exchange.SetContractType("BTC-PERPETUAL")デリビットのUSDC契約のサポートexchange.SetContractType("ADA_USDC-PERPETUAL")ADA USDCの保証付き永続契約を設定する 契約は特定のタイミングで決済されます.詳細については,Deribitの公式ウェブサイトにログインして各契約コードを確認してください.exchange.SetContractType("BTC-27APR18").

  • フューチャー=KuCoin

    • 暗号化保証金契約 例えば,取引ペアをBTC_USD暗号化されたコンタクトと呼ばれます 永久契約に設定:exchange.SetContractType("swap")決算は四半期契約で:exchange.SetContractType("quarter")次の四半期に設定された契約:exchange.SetContractType("next_quarter")
    • USDT・マージング・コントラクト 例えば,取引ペアをBTC_USDT契約コードを設定します.これはUSDTの保証契約です. 永久契約に設定:exchange.SetContractType("swap").
  • フューチャー=Binance 契約のステータスを設定する必要はありません. 契約を最初に設定する必要があります. 永久契約に設定:exchange.SetContractType("swap")バイナンス・フューチャーズ永続契約は,USDTの担保契約である可能性があります.BTC取引対が設定されている場合,BTC_USDT. Binance 期貨の永久契約には,暗号保証契約も含まれます.例えば,暗号保証契約では,取引ペアをBTC_USD.

    決算は四半期契約で:exchange.SetContractType("quarter")配送契約には,暗号化保証契約 (つまり,使用通貨を保証金として) が含まれます.BTC,取引対はBTC_USD契約コードを設定しますexchange.SetContractType("quarter")BTCの暗号化保証契約を設定しています

    次の四半期に設定された契約:exchange.SetContractType("next_quarter")例えば,Crypto-marginedの四半期契約では,BTC,取引対はBTC_USD契約コードを設定しますexchange.SetContractType("next_quarter).Binanceは,BTC取引ペアをBTC_USDT契約コードを設定します

  • フューチャーズ_ビボックス バイボックス 永久契約コード:swap- わかった 永久契約に設定:exchange.SetContractType("swap").

  • フューチャー=AOFEX AOFEX永続契約コード:swap- わかった 永久契約に設定:exchange.SetContractType("swap").

  • フューチャー=BFX BFX永続契約コード:swap- わかった 永久契約に設定:exchange.SetContractType("swap").

  • フューチャーズ_Bybit Bybitは現在の取引ペアの永久契約にデフォルトします.swap- わかった 四半期契約コード:quarter- わかった 次の四半期契約コード:next_quarter.

  • フューチャーズ_クラケン 契約コードを設定する必要があります. 契約コード:swap永久契約month月間契約quarter契約は四半期ごとにnext_quarter次の四半期契約です

  • フューチャー=Bitfinex Bitfinexは,現在の取引ペアの永久契約に 欠陥があります.契約コード:swap.

  • フューチャー=Bitget Bitget は現在の取引ペアの永久契約にデフォルトします.swap. 取引対は,BTC_USD取引ペアが設定されているのはBTC_USDT模擬された契約は,取引ペアを以下に設定できます.SBTC_USDそしてBTC_SUSDT.

  • フューチャーズ_dYdX dYdX永久契約の契約コード:swap- わかった 永久契約に設定:exchange.SetContractType("swap"). dYdXは,USDTの保証契約のみを持っています.

  • フューチャーズ_MEXC MEXC永続契約の契約コード:swap- わかった 永久契約に設定:exchange.SetContractType("swap"). 取引対は,BTC_USD取引ペアが設定されているのはBTC_USDT, USDT保証契約を表示する.

暗号通貨の戦略を書いているとき,exchange.SetContractType(ContractType)契約パラメータによって設定された機能と詳細な契約情報ContractType返されるでしょう

例えば,交換オブジェクトとして設定されたOKXコントラクトの戦略コードを実行します.

function main(){
    // Set to weekly contract
    var ret = exchange.SetContractType("this_week")     
    // Return the information of the weekly contract
    Log(ret)
}
def main():
    ret = exchange.SetContractType("this_week")
    Log(ret)
void main() {
    auto ret = exchange.SetContractType("this_week");
    Log(ret);
}

戦略を実行しますJavaScript言語と印刷ret詳細な情報this_week契約:

{
    "instrument":"BTC-USD-191101",
    "InstrumentID":"BTC-USD-191101"
}   

exchange.GetContractType (契約型を取得する)

exchange.GetContractType()交換オブジェクトの現在設定されている契約コードを返します (exchange), 返した値:文字列.

function main () {
    Log(exchange.SetContractType("this_week")) 
    Log(exchange.GetContractType())
}
def main():
    Log(exchange.SetContractType("this_week"))
    Log(exchange.GetContractType())
void main() {
    Log(exchange.SetContractType("this_week"));
    Log(exchange.GetContractType());
}

Futures_OP エラー

次の表は,暗号通貨先物契約の交換対象に関連するエラー情報を記述しています.

価値 機能表示のエラー トリガー機能 記述
0 フューチャー_OP 0 exchange.SetMarginLevel レバレッジ関数を呼び出すエラー
1 フューチャー_OP1 exchange.SetDirection フューチャー取引方向関数設定の誤り
2 フューチャーズ_OP2 exchange.SetContractType 契約機能の設定の誤り
3 フューチャー_OP3 exchange.GetPosition 位置関数を取得するエラー
4 フューチャーズ_OP4 exchange.IO IO関数を呼び出すエラー

オプション取引

仮想通貨オプション

使用exchange.SetContractType異なる取引所には異なるオプション契約コードがあります.

FMZ Quant トレーディング プラットフォームがサポートする仮想通貨オプション取引所

  • デリビット Deribitの取引では,exchange.SetContractTypeオプション契約を設定した後,市場インターフェースを呼び出すとき,GetTickerオプション契約の市場データは全て得られます.exchange.Sellそしてexchange.Buy取引方向に注意し,取引方向を設定するexchange.SetDirection..........exchange.Cancel注文をキャンセルする機能exchange.GetPosition位置をクエリする機能です

    参照のための戦略コード:デリビットのオプションのテスト戦略

  • OKX 契約の作成,注文の提出,注文のキャンセル,注文の問い合わせ,市場価格の取得などDeribit契約コードの形式はBTC-USD-200626-4500-Cインターフェースで契約に関連する情報をクエリできますhttps://www.okx.com/api/v5/public/instruments.

    例えば,BTCオプション契約の情報をクエリするには,

    function main() {
        Log(HttpQuery("https://www.okx.com/api/v5/public/instruments?instType=OPTION&uly=BTC-USD"))
    }
    
    import json
    import urllib.request
    def main():
        ret = json.loads(urllib.request.urlopen("https://www.okx.com/api/v5/public/instruments?instType=OPTION&uly=BTC-USD").read().decode('utf-8'))
        Log(ret)
    
    void main() {
        Log(HttpQuery("https://www.okx.com/api/v5/public/instruments?instType=OPTION&uly=BTC-USD"));
    }
    
  • フューチャーズ_HuobiDM 例えば Huobi オプション契約コード:BTC-USDT-201225-P-13000契約はBTC契約; 実施日は2020年12月25日. オプションはPUT (Put Options) です. ストライキ価格は13,000ドルです. コールオプションの場合,購入者が支払うプレミアムはUSDTで,口座資産のUSDTが使用されていることを示します.売り手のマーゲンは通貨で,資産の通貨によって保証されます. 販売オプションの場合,購入者が支払うプレミアムはUSDTで,口座資産のUSDTが使用されていることを示します.売り手の利回りはUSDTで,資産のUSDTによって保証されます.

  • フューチャーズ_Bybit 取引ペアをBybitのUSDCオプションをサポートし,ETH_USDC呼び出し機能exchange.SetContractType契約をオプション契約として設定する.オプション契約コードの例:ETH-25NOV22-1375-P.

ネットワーク設定

交換.セットBase (ベース)

についてexchange.SetBase(Base)交換オブジェクトに記録されたAPIベースアドレスを切り替えるために使用されます.OKXドメイン名https://aws.okx.com, と互換性があるexchange.IO("base","https://aws.okx.com")スイッチングメソッド.バックテストシステムは,交換所のAPIベースアドレスのスイッチングをサポートしていない (バックテストシステムはサンドボックス環境であり,交換にアクセスするための実際のインターフェースではありません).

function main() {
    // Use the default base address
    Log(exchange.GetTicker())
    // Switch to https://aws.okx.com
    exchange.SetBase("https://aws.okx.com")
    Log(exchange.GetTicker())
}
def main():
    Log(exchange.GetTicker())
    exchange.SetBase("https://aws.okx.com")
    Log(exchange.GetTicker())
void main() {
    Log(exchange.GetTicker());
    exchange.SetBase("https://aws.okx.com");
    Log(exchange.GetTicker());
}

交換.SetProxy (セットプロキシ)

exchange.SetProxy(...)この関数は返却値がない (変数によって得られ,得られるものはundefinedインターフェースが呼び出されると null 値が返されます.休む交換オブジェクトはexchanges[n]プロキシを設定した後,交換インターフェースはプロキシを通じてアクセスされます.

最初の追加された交換オブジェクトを取りますexchangeつまり,exchanges[0]例えば:

  • ユーザー名とパスワードなしでプロキシを設定する:exchange.SetProxy("socks5://127.0.0.1:8889")
  • プロキシを設定して,ユーザー名とパスワードを入力します.exchange.SetProxy("socks5://username:password@127.0.0.1:8889") (usernameユーザの名前ですpasswordパスワードです)
  • 普通のモードに切り替える プロキシなしexchange.SetProxy("")

交換オブジェクトが要求する IP アドレスを設定するサポート.

  • グローバル仕様 港湾のwindowsシステムインターフェースのバージョンを直接設定できます. これは次の図で示されています.

img

コマンドプロンプト使用パラメータで操作される他のドーカー-IIP アドレスを指定するには:

img

  • 交換をベースに 詳細に:

    function main(){
        exchange.SetProxy("ip://10.0.3.15")
        exchange.GetTicker()                      // The reque

もっと