En la carga de los recursos... Cargando...

Las instrucciones de la API FMZ

El autor:No hay nada, Creado: 2020-04-20 10:19:00, Actualizado: 2023-04-12 14:44:56

P.p. No hay nada en la caja principal. Las operaciones de intercambio[0].IO(base, 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());
}
  • Cambiar el modo de mercado Intercambios actualmente admitidos:

    Intercambio Las observaciones
    Huobi Spot es un juego de cartas. Después de soportar el protocolo WebSocket, el códigoexchange.IO(moneda, ETH) no pueden utilizarse para cambiar monedas
    • exchange.IO("websocket")

      Cambiar el protocolo de comunicación de mercado awebsocket(default is rest), la forma de obtener las cotizaciones de mercado cambiará después del cambio.exchange.GetTicker()yexchange.GetDepth()se cambiará awebsocketEl protocolo para actualizar, desde la adquisición activa en bruto de datos de mercado hasta la adquisición pasiva de datos de mercado, solo Huobi Exchange es compatible actualmente.

    Cuando el modo de mercado es el mecanismo de empuje, se puede llamar a la siguiente función para establecer:

    • exchange.IO("mode", 0)Modo de retorno inmediato. Si no se ha recibido el impulso de datos de mercado actual del intercambio, los datos de mercado antiguos se devolverán inmediatamente. Si hay nuevos datos, los nuevos datos se devolverán.

    • exchange.IO("mode", 1)Modo caché (modo predeterminado). Si los últimos datos de mercado del intercambio no se han recibido (en comparación con los datos obtenidos de la interfaz anterior), espere a recibirlos y luego regrese. Si los últimos datos de mercado se han recibido antes de llamar a esta función, los últimos datos se devolverán inmediatamente.

    • exchange.IO("mode", 2)Modo de actualización forzada. Introduzca y espere hasta que se reciba el siguiente último dato de empuje del intercambio y luego regrese.

    Si desea obtener la información de mercado más reciente por primera vez, puede cambiar awebsockety no llamenSleepEl estudio de la calidad de los datos de laexchange.GetTicker()yexchange.GetDepth()las funciones funcionan en modo caché, tales como:

    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());
        }
    }
    
  • Modo de la cuenta de apalancamiento de bolsa

    Utilizaciónexchange.IO("trade_margin")para cambiar al modo de cuenta de apalancamiento, la colocación de órdenes y el acceso a los activos de la cuenta utilizarán la interfaz de apalancamiento de la bolsa. Utilizaciónexchange.IO("trade_normal")para volver al modo de cuenta normal.

    Intercambios admitidos:

    Intercambio Observaciones especiales
    No hay problema. Los pares de operaciones del modo de cuenta de apalancamiento son diferentes de los ordinarios, y algunos pares de operaciones pueden no estar disponibles.exchange.IO("cross", true)cambiar a la posición completa de la cuenta apalancada yexchange.IO("cross", false)para cambiar a una posición aislada.
    - ¿ Qué? Los pares de operaciones del modo de cuenta de apalancamiento son diferentes de los ordinarios, y algunos pares de operaciones pueden no estar disponibles.trade_marginpara cambiar a una posición aislada de una cuenta de apalancamiento;trade_super_marginpara cambiar a una posición cruzada en una cuenta de apalancamiento;trade_normalpara cambiar a un modo de moneda normal
    ZB Los fondos solo se pueden transferir en QC. En el sector de negociación de apalancamiento, los fondos entre diferentes pares comerciales son independientes, es decir, el número de monedas QC bajo el par de negociación ETH_QC no es visible en BTC_QC
    Binance Las cuentas de apalancamiento se dividen en posición cruzada y posición aislada.trade_marginpara cambiar a una posición aislada; utilizartrade_super_marginpara cambiar a posición cruzada; utilizartrade_normalpara cambiar a un modo de moneda normal
    Puerta de entrada Las cuentas de apalancamiento se dividen en posición cruzada y posición aislada.trade_marginpara cambiar a una posición aislada; utilizartrade_super_marginpara cambiar a posición cruzada; utilizartrade_normalpara cambiar a un modo de moneda normal
    AscendEx es el nombre de la aplicación. Utilizaciónexchange.IO("trade_margin")para cambiar al modo de cuenta de apalancamiento y utilizarexchange.IO("trade_normal")para volver al modo de cuenta normal.

el intercambio.Log ((...)

exchange.Log(LogType, Price, Amount)no realiza una orden cuando se llama, y sólo registra la información de negociación para emitir la información del registro de intercambio.

Nota:

  • Esta función es una función miembro deexchangeobjetos, que es diferente de la función globalLog().
  • Valor del parámetro:LogTypepuede tomarLOG_TYPE_BUY, LOG_TYPE_SELL, LOG_TYPE_CANCELyPricecomo precio, yAmountEn cuanto a la cantidad.LogTypeesLOG_TYPE_CANCEL, Priceel parámetro es el ID del pedido.

Utilizaciónexchange.Log(LogType, Price, Amount)llevar a cabo las pruebas de seguimiento de operaciones en vivo, la simulación de la colocación de órdenes y ayudar a registrar las órdenes.

El caso de uso más común es:exchange.IOSin embargo, el uso de la interfaz de orden condicional de la bolsa para colocar órdenes condicionales.exchange.IOla función no emitirá la información del registro de intercambio en la grabación del registro del bot.exchange.Log(LogType, Price, Amount)para complementar la salida del registro con el fin de registrar la información relativa a las órdenes de colocación.

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

el intercambio.HMAC(...)

exchange.HMAC(Algo, OutputAlgo, Data, Key)apoya elHMACel cálculo del cifrado deMd5/SHA256/SHA512/el 1, y sólo se admite la operación en vivo.

exchange.HMAC("sha256", "hex", "xxxxx", "{{secretkey}}")Para citaraccessKey, el uso"{{accesskey}}"¿ Qué pasa? Para citarsecretKey, el uso"{{secretkey}}"; o puede utilizar texto plano"abc-123-xxxx". "{{accessKey}}","{{secretkey}}"sólo es válido cuando se utiliza esta función.OutputAlgosoportes: hex, base64.Ejemplo específico

Push cambios de posición BitMEX (protocolo 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"];
        }
    }
}

El intercambio.

exchange.Go(Method, Args...)es la función asíncrona soportada con múltiples hilos, que puede convertir el funcionamiento de todas las funciones soportadas en simultánea asíncrona (que solo soporta intercambios de criptomonedas). Valor del parámetro:Method, de tipo de cadena, es decir, el nombre de la función llamada simultáneamente.

Nota:

  • Esta función solo crea tareas de ejecución multi-threaded cuando se ejecutan en el comercio en vivo.
  • Después de laexchange.Gofunción devuelve un objeto, elwaitLa función se llama para recuperar los datos devueltos por el hilo a través del objeto. El hilo se liberará automáticamente después de la adquisición de datos llamandowaitSi se especifica el parámetro de tiempo de espera dewait, el hilo no se liberará incluso si ocurre el tiempo de espera; de esta manera, el hilo se liberará automáticamente solo al obtener el resultado del hilo (sin importar si la interfaz a la que se accede simultáneamente se llama con éxito o sin éxito).
  • En términos simples, no importa si el hilo aplicado tiene éxito o no, el resultado debe ser obtenido por elwaitFunción, y el recurso de hilo aplicado por elexchange.Gola función es liberada automáticamente por el docker.
  • Si el resultado de retorno delwaitSi la función no se obtiene al final, los recursos de hilo no se liberarán automáticamente, lo que causará la acumulación de hilos aplicados; si el número de hilos supera los 2000, se informará de un error:"too many routine wait, max is 2000".

Funciones soportadas:GetTicker, GetDepth, GetTrades, GetRecords, GetAccount, GetOrders, GetOrder, CancelOrder, Buy, Sell, GetPositionyIO.

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

Nota:

  • Para juzgarundefined, el usotypeof(xx)==="undefined", porquenull == undefinedestá disponible en JavaScript.
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);
}

La diferencia entrePythonyJavaScript¿Es eso?Python¿ Qué?waitLa función devuelve dos parámetros: el primero es el resultado devuelto por la API asíncrona; el segundo indica si la llamada asíncrona se ha completado.

PythonEjemplo:

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)       

Adquirir cotizaciones de varias bolsas simultáneamente:

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

Las llamadas simultáneas a laexchange.IO("api", ...)Función:

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

Información de la cuenta

El cambio.GetAccount ((()

exchange.GetAccount()devuelve la información de la cuenta de cambio.Account structure.

  • Accountestructura
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);
}

Si el objeto de intercambio está configurado para un intercambio de futuros de criptomonedas y cambiado a un contrato conUSDTEn el caso de las empresas, el margen de interés es el margen de interés.exchange.SetContractTypeEn la actualidad, la mayoría de las empresas tienen una función deUSDTcomo margen, que se registra en el atributo deBalanceyFrozenBalance.

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

¿ Qué está pasando?

exchange.GetName()Devuelve el valor: tipo de cadena. Generalmente se utiliza para determinar elexchangeo bienexchanges[n]objetos en el código de estrategia.

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

Para ordenar la versión de línea de Docker, se puede utilizar el-1comando para imprimir una lista de nombres de intercambio.

¿ Qué es esto?

exchange.GetLabel()devuelve la etiqueta personalizada del intercambio.

img

Elexchangeo bienexchanges[n]Los objetos en los códigos de estrategia se determinan normalmente por las etiquetas establecidas al configurar los objetos de intercambio.

En cambio.GetCurrency ((()

exchange.GetCurrency()devuelve el nombre del par de divisas operado por el intercambio, y la plataforma de criptomonedas devuelve una cadena, comoLTC_BTC. Devuelve el valor: tipo de cadena.

cambio.Configuración de la moneda

Elexchange.SetCurrency(Symbol)Compatible con el método de conmutación deexchange.IO ("currency","BTC_USDT")Apoya el cambio de pares de operaciones en el sistema de backtesting, y el nombre de lapricing currencyNo se puede cambiar cuando se cambian los pares de operaciones en el sistema de backtesting (por ejemplo,BTC_USDTpuede ser cambiado aLTC_USDT, pero no se puede cambiar aLTC_BTCEn el caso de las transacciones con pares de valores, el número de pares de valores de las transacciones con pares de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores de valores.trading coinses 0 (por ejemplo, durante el backtest, el valor inicial del par de operaciones en la página de backtest esBTC_USDT, el número de BTC es 3, y el número de USDT es 10.000.LTC_USDT, el número detrading coinsdespués del cambio será 0, lo que significa que el número de LTC en la cuenta es 0, pero el importe compartido de USDT de los pares de negociación cambiados sigue siendo 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());
}

Resultado de la operación de la prueba posterior:

img

En cambio.GetQuoteCurrency()

exchange.GetQuoteCurrency()devuelve el nombre de la moneda base operada por el centro de cambio.BTC_CNYlas devolucionesCNY, yETH_BTClas devolucionesBTC. Devuelve el valor: tipo de cadena.

Negociación de futuros

Para los objetos de intercambio de futuros de criptomonedas, el código del contrato debe especificarse antes de llamar a suel mercado, el ordeny otras interfaces, y elexchange.SetContractTypeCuando se cambia el par de operaciones actual del objeto de intercambio, es necesario llamar a laexchange.SetContractTypePara los códigos de contrato de cambio de moneda digital compatibles con la plataforma, consulte elexchange.SetContractType function.

Cambio. ObtenerPosición ((()

exchange.GetPosition()Obtiene la información de la posición actual. Valor de retorno:positionSi no hay posición, devuelve una matriz vacía, es decir[].

  • Positionestructura

Normalmente, los contratos de futuros de criptomonedas se dividen en dos tipos:

  • Contrato de entrega Cuando un contrato está establecido en un contrato de entrega, llame alexchange.GetPosition()En el caso de las operaciones de negociación de pares de valores, las posiciones en el contrato de entrega en el par de negociación actual serán devueltas.

  • Contrato perpetuo Cuando un contrato está establecido en un contrato perpetuo, llamar a laexchange.GetPosition()En el caso de las operaciones de negociación de pares de valores, las posiciones en el contrato perpetuo en el par de operaciones en curso serán devueltas.

/*
    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);
    } 
}

En el caso de las operaciones de intercambio, el nivel de margen debe ser establecido.

exchange.SetMarginLevel(MarginLevel)El valor del parámetro: tipo numérico.

Establecer el tamaño del apalancamiento para la colocación de órdenes de futuros de criptomonedas, por ejemplo:

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

Para los futuros de criptomonedas, los mecanismos de apalancamiento de los intercambios de futuros de criptomonedas no son uniformes. En algunos intercambios, el valor de apalancamiento de los futuros es un parámetro en la interfaz de orden de colocación.SetMarginLevelLa función no puede generar una solicitud de red, sino que solo establece la variable de apalancamiento en la capa inferior (utilizada para pasar parámetros en la interfaz de la orden de colocación).SetMarginLevelLa función generará una solicitud de red, y puede no establecer el apalancamiento por varias razones. Por ejemplo: si hay posiciones actuales y órdenes pendientes, el valor de apalancamiento puede no ser establecido para este par de operaciones y el objeto subyacente.

Notas para establecer el apalancamiento en el diseño de la estrategia:

  • Solo se admiten futuros de criptomonedas.
  • La prueba de retroceso admite el cambio de apalancamiento.

cambio.Configuración de dirección ((...)

exchange.SetDirection(Direction)conjuntoexchange.Buyo bienexchange.SellPara hacer instrucciones para la colocación de órdenes de futuros.

ElSetDirectionla función establece la correspondencia entre la dirección de negociación de futuros y la función de colocación de órdenes:

Función de colocación de órdenes Dirección de ajuste de parámetros para SetDirection función Las observaciones
exchange.Buy comprar comprar una posición larga abierta
exchange.Buy cierre de venta Comprar posición corta cerrada
exchange.Sell vendiendo Vender una posición corta abierta
exchange.Sell compra cercana Vender la posición larga cerrada

El parámetroDirectionpuede tomar los cuatro parámetros, incluyendobuy, closebuy, sellyclosesell.

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

el tipo de contrato establecido.

exchange.SetContractType(ContractType)Establezca el tipo de contrato. Valor del parámetro: tipo de cadena. En las estrategias de criptomonedas, tome BTC_USDT como ejemplo. Cuando cambie los pares comerciales porexchange.SetCurrency("BTC_USDT")o bienexchange.IO("currency", "BTC_USDT"), usted necesita para utilizar elexchange.SetContractTypeLa función de restablecimiento del contrato para determinar el contrato actual que debe operarse bajo el nuevo par de operaciones.currency-based contracto unaU-based contractBasado en elPares de negociaciónPor ejemplo, cuando el par de operaciones está configurado paraBTC_ USDT, la función de usoexchange.SetContractTypepara establecer el código del contratoswap, que se establece como el contrato perpetuo de BTC basado en USDT.BTC_ USD, la función de usoexchange.SetContractTypepara establecer el código del contratoswap, que se establece como el contrato perpetuo basado en moneda de BTC.

A menos que se especifique lo contrario, elcontrato de entregael código en un contrato de futuros de criptomonedas incluye generalmente:

  • this_week: contrato semanal
  • next_weekContrato de la próxima semana
  • quarter: contrato trimestral
  • next_quarter: contrato del próximo trimestre

A menos que se especifique lo contrario, elcontrato perpetuoel código en un contrato de futuros de criptomonedas incluye generalmente:

  • swap: contrato perpetuo

Establezca el contrato actual en un contrato semanal:

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

La descripción detallada del nombre del contrato de cada intercambio de criptomonedas soportado se muestra de la siguiente manera:

  • No hay problema. Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")En el contrato de esta semana:exchange.SetContractType("this_week")Contrato para la próxima semana:exchange.SetContractType("next_week")Contrato trimestral:exchange.SetContractType("quarter")Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")El contrato con margen en USDT de OKX se puede cambiar al contrato que utiliza la liquidación en USDT correspondiente al contrato actual cambiandotrading pair(o establecerlo directamente al añadir los objetos de intercambio).

    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());
    }
    
  • Futures_HuobiDM En el contrato de esta semana:exchange.SetContractType("this_week")Contrato para la próxima semana:exchange.SetContractType("next_week")Contrato trimestral:exchange.SetContractType("quarter")Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")

    La plataforma admite los contratos con margen USDT. Tome el contrato BTC como ejemplo.exchange.SetCurrency("BTC_USDT"), o estableciendo el par de negociación actual enBTC_USDTdirectamente cuando configure los parámetros del bot y agregue objetos de intercambio.exchange.SetContractTypeLa función de nuevo para establecer el contrato.

  • Las entidades que no cumplen los requisitos de la letra a) del presente artículo no podrán optar por el tipo de garantía de la entidad. Se ha establecido un contrato perpetuo:exchange.SetContractType("XBTUSD"), exchange.SetContractType("APTUSDT")- ¿ Por qué? El contrato se liquida en un momento específico, y inicie sesión en el sitio web oficial de BitMEX para verificar cada código de contrato para obtener más detalles.exchange.SetContractType("XBTM19").

  • Los futuros_GateIO En el contrato de esta semana:exchange.SetContractType("this_week")¿ Qué pasa? Contrato para la próxima semana:exchange.SetContractType("next_week")¿ Qué pasa? Contrato trimestral:exchange.SetContractType("quarter")¿ Qué pasa? Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")¿ Qué pasa? Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")- ¿ Por qué? El intercambio admite los contratos con margen USDT. Tome el contrato BTC como ejemplo.exchange.SetCurrency("BTC_USDT"), o estableciendo el par de negociación actual enBTC_USDTdirectamente cuando configure los parámetros de negociación en vivo y agregue objetos de intercambio.exchange.SetContractTypeLa función de nuevo para establecer el contrato.

  • Los futuros_Deribit Se ha establecido un contrato perpetuo:exchange.SetContractType("BTC-PERPETUAL")Apoyo al contrato Deribit USDC; convocatoriaexchange.SetContractType("ADA_USDC-PERPETUAL")establecer un contrato perpetuo con margen de ADA USDC. El contrato se liquida en un momento específico, y inicie sesión en el sitio web oficial de Deribit para consultar cada código de contrato para obtener más detalles, como:exchange.SetContractType("BTC-27APR18").

  • Los futuros_KuCoin

    • En el caso de los activos financieros, el valor de los activos financieros incluidos en el modelo de referencia será el valor de los activos financieros incluidos en el modelo. Por ejemplo, establecer el par de negociación aBTC_USD, y luego establecer el código del contrato, que se llama contrato cripto-marginado. Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")Contrato trimestral:exchange.SetContractType("quarter")Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")
    • Contrato con margen en USDT: Por ejemplo, establecer el par de negociación aBTC_USDT, y luego establecer el código del contrato, que es el contrato con margen USDT. Se ha establecido un contrato perpetuo:exchange.SetContractType("swap").
  • Los futuros de Binance Binance Futures por defecto no establece el estado del contrato, por lo que necesita establecer el contrato primero. Se ha establecido un contrato perpetuo:exchange.SetContractType("swap")Los contratos perpetuos de Binance Futures pueden ser contratos con margen de USDT.BTCContrato con margen USDT, el par de operaciones está establecido enBTC_USDT. Los contratos perpetuos de Binance Futures también incluyen contratos con cripto margen. Por ejemplo, en el contrato con cripto margen, establece el par de operaciones enBTC_USD.

    Contrato trimestral:exchange.SetContractType("quarter")Los contratos de entrega incluyen contratos de criptomonedas con margen (es decir, tomando la moneda utilizada como margen).BTC, el par de negociación está configurado paraBTC_USD, y luego establecer el código del contratoexchange.SetContractType("quarter"), que está estableciendo el contrato trimestral de criptomonedas BTC.

    Contrato para el próximo trimestre:exchange.SetContractType("next_quarter")Por ejemplo, en el contrato trimestral de criptomonedas con margen deBTC, el par de negociación está configurado paraBTC_USD, y luego establecer el código del contratoexchange.SetContractType("next_quarter)Binance admite parte de los contratos de entrega con margen USDT, como establecer el par de operaciones de BTC aBTC_USDT, y luego establecer el código del contrato.

  • El valor de la inversión se calcula de acuerdo con el método de cálculo. Código del contrato perpetuo de Bibox:swap¿ Qué pasa? Se ha establecido un contrato perpetuo:exchange.SetContractType("swap").

  • Las operaciones de garantía de los bancos centrales Código del contrato perpetuo de AOFEX:swap¿ Qué pasa? Se ha establecido un contrato perpetuo:exchange.SetContractType("swap").

  • Los futuros_BFX Código del contrato perpetuo BFX:swap¿ Qué pasa? Se ha establecido un contrato perpetuo:exchange.SetContractType("swap").

  • El valor de las acciones de la entidad Bybit está por defecto en el contrato perpetuo del par de operaciones actual.swap¿ Qué pasa? Código del contrato trimestral:quarter¿ Qué pasa? Código del contrato del próximo trimestre:next_quarter.

  • Los futuros_Kraken Kraken por defecto no establece el estado del contrato, así que necesitas establecer el código del contrato.swapContrato perpetuo.month: contrato mensual.quarter: contrato trimestral.next_quarterEl próximo trimestre.

  • Las acciones de los bancos centrales de la Unión Bitfinex no cumple con el contrato perpetuo del par de operaciones actual.swap.

  • Los futuros_Bitget Bitget está por defecto en el contrato perpetuo del par de operaciones actual. Código del contrato:swap. El par de operaciones está configurado paraBTC_USD, que indica el contrato de criptomonedas con margen; el par de operaciones está configurado enBTC_USDTLos contratos simulados pueden establecer los pares de negociación en:SBTC_USDyBTC_SUSDT.

  • Los futuros_dYdX El código del contrato del contrato perpetuo dYdX:swap¿ Qué pasa? Se ha establecido un contrato perpetuo:exchange.SetContractType("swap"). dYdX sólo tiene contratos con margen USDT.

  • Los futuros_MEXC El código del contrato del contrato perpetuo MEXC:swap¿ Qué pasa? Se ha establecido un contrato perpetuo:exchange.SetContractType("swap"). El par de operaciones está configurado paraBTC_USD, que indica el contrato de criptomonedas con margen; el par de operaciones está configurado enBTC_USDT, indicando el contrato con margen en USDT.

Al escribir estrategias de criptomonedas, llameexchange.SetContractType(ContractType)función y la información detallada del contrato establecida por el parámetro del contratoContractTypeserá devuelto.

Por ejemplo, ejecutando el código de estrategia del contrato OKX establecido como objeto de intercambio:

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

Ejecute la estrategia enJavaScriptlengua, y la impresiónretdatos, es decir, la información detallada dethis_weekel contrato:

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

el tipo de contrato.GetContractType()

exchange.GetContractType()devuelve el código del contrato establecido actualmente del objeto de intercambio (exchange), devuelve el valor: cadena.

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

Errores de la operación de futuros

La siguiente tabla describe la información de error relacionada con los objetos de intercambio de los contratos de futuros de criptomonedas:

Valor Error de visualización de la función Función de disparo Descripción
0 Futuros_OP 0 exchange.SetMarginLevel error de llamada de la función de apalancamiento
1 Futuros_OP 1 exchange.SetDirection error de configuración de la función de dirección de negociación de futuros
2 Futuros_OP 2 exchange.SetContractType error de configuración de la función del contrato
3 Futuros_OP 3 exchange.GetPosition Error de obtener la función de posición
4 Futuros_OP 4 exchange.IO error de llamada de la función IO

Negociación de opciones

Opciones de criptomonedas

Utilizaciónexchange.SetContractTypeLas diferentes bolsas tienen diferentes códigos de contratos de opciones.

Intercambios de opciones de criptomonedas apoyados por la plataforma de negociación FMZ Quant

  • El deribit Para el intercambio de Deribit, sólo es necesario llamar a laexchange.SetContractTypeLa función de establecer el contrato como un contrato de opciones.GetTicker, se obtienen todos los datos de mercado del contrato de opciones.exchange.Sellyexchange.BuyLas funciones para colocar una orden, y prestar atención a la dirección de negociación al colocar una orden, y establecer la dirección de negociación porexchange.SetDirection. Utilizar elexchange.CancelLa función para cancelar un pedido;exchange.GetPositionFunción para consultar posiciones.

    El código de referencia de la estrategia:La estrategia de prueba de las opciones de Deribit

  • No hay problema. El establecimiento de contratos, la colocación de órdenes, la cancelación de órdenes, la consulta de órdenes y la obtención de cotizaciones de mercado, etc., son de la misma operación queDeribit, y el formato del código del contrato esBTC-USD-200626-4500-CPuede consultar la información relacionada con el contrato a través de la interfazhttps://www.okx.com/api/v5/public/instruments.

    Por ejemplo, para consultar la información de los contratos de opciones de 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"));
    }
    
  • Futures_HuobiDM Por ejemplo, el código del contrato de opciones de Huobi:BTC-USDT-201225-P-13000; el contrato es unBTCcontrato; la fecha de ejercicio es el 25 de diciembre de 2020; las opciones son Put Options (PUT); el precio de ejercicio es de $13,000. Para las opciones de compra, la prima pagada por el comprador es USDT, lo que indica que se utiliza el USDT en los activos de la cuenta; el margen del vendedor es moneda, que está garantizada por la moneda de los activos. Para las opciones de venta, la prima pagada por el comprador es USDT, lo que indica que se utiliza el USDT en los activos de la cuenta; el margen del vendedor es USDT, que está garantizado por el USDT en los activos.

  • El valor de las acciones de la entidad Apoya la opción USDC del intercambio Bybit, y establece el par de operaciones aETH_USDC, función de llamadaexchange.SetContractTypeEjemplo de código del contrato de opción:ETH-25NOV22-1375-P.

Configuración de red

Enlace.Configurar Base ((Base))

Elexchange.SetBase(Base)La función se utiliza para cambiar la dirección de base de API registrada en los objetos de intercambio; por ejemplo, cambiar aOKXnombre de dominiohttps://aws.okx.com, compatible conexchange.IO("base","https://aws.okx.com")El sistema de backtest no admite el cambio de la dirección de base API del intercambio (el sistema de backtest es un entorno de sandbox, no una interfaz real para acceder al intercambio).

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

intercambio.SetProxy ((...)

exchange.SetProxy(...)Esta función no tiene valor de retorno (obtenido por variables, y lo que obtiene esundefinedSi la configuración de proxy falla, un valor nulo será devuelto cuando se llame a la interfaz, sólo para elDescansoCada objeto de intercambioexchanges[n]Después de configurar el proxy, se accederá a la interfaz de intercambio a través del proxy.

Tome el primer objeto de intercambio añadidoexchange, a saber:exchanges[0], por ejemplo:

  • Configurar el proxy, sin nombre de usuario y contraseña:exchange.SetProxy("socks5://127.0.0.1:8889")
  • Configure el proxy y introduzca el nombre de usuario y la contraseña:exchange.SetProxy("socks5://username:password@127.0.0.1:8889") (usernamees el nombre del usuario,passwordes la contraseña.)
  • Cambiar al modo normal, sin proxy:exchange.SetProxy("")

Apoyo para establecer la dirección IP solicitada por el objeto de intercambio.

  • Especificación global El muelle dewindowsla versión de la interfaz del sistema se puede establecer directamente, que se muestra como la siguiente imagen:

img

Otros muelles operados por el parámetro de uso del comando-Ipara especificar las direcciones IP:

img

  • Basado en el intercambio para especificar:

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

Más.