В процессе загрузки ресурсов... загрузка...

Инструкции по API FMZ

Автор:Нуль, Создано: 2020-04-20 10:19:00, Обновлено: 2023-04-12 14:44:56

pp Главный пустой ((() обмены[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());
}
  • Переключение на рыночный режим В настоящее время поддерживаемые биржи:

    Обмен Примечания
    Huobi Spot После поддержки протокола 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")чтобы вернуться в обычный режим учетной записи.

    Поддерживаемые обмены:

    Обмен Особые замечания
    ОКX Торговые пары в режиме учетного счета с рычагом влияния отличаются от обычных, и некоторые торговые пары могут быть недоступны.exchange.IO("cross", true)перейти на полную позицию счета с кредитным плечом иexchange.IO("cross", false)перейти на изолированное положение.
    Хьюби Торговые пары в режиме счета с рычагами отличаются от обычных, и некоторые торговые пары могут быть недоступны.trade_marginдля перехода на изолированную позицию счета кредитования;trade_super_marginперейти на счет с использованием кредитного плеча;trade_normalперейти на обычный валютный режим
    ZB Средства могут быть переведены только в QC. В секторе торговли с использованием рычага, средства между различными торговыми парами являются независимыми, то есть количество QC монет в торговой паре ETH_QC не видно в BTC_QC
    Binance Учеты с рычагами распределяются на перекрестные позиции и изолированные позиции.trade_marginперейти в изолированное положение; использоватьtrade_super_marginперейти на перекрещенное положение; использоватьtrade_normalперейти на обычный валютный режим
    Ворота Учеты с рычагами распределяются на перекрестные позиции и изолированные позиции.trade_marginперейти в изолированное положение; использоватьtrade_super_marginперейти на перекрещенное положение; использоватьtrade_normalперейти на обычный валютный режим
    AscendEx Использование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как количество.LogTypeэтоLOG_TYPE_CANCEL, PriceПараметр - это идентификатор заказа.

Использование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/ША256/ША512/ША1, и поддерживается только прямая торговля.

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 == undefinedдоступна в 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);
}

Разница междуPythonиJavaScriptЭто так?PythonЭто...waitфункция возвращает два параметра: первый - результат, возвращаемый асинхронным API; второй указывает, завершен ли асинхронный вызов.

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 coinsравен 0 (например, во время обратного теста начальное значение торговой пары на странице обратного тестаBTC_USDT, количество BTC составляет 3, а количество USDT составляет 10 000.LTC_USDT, количествоtrading coinsпосле переключения будет 0, что означает, что количество LTC на счете равняется 0, но общая сумма 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 ((()

exchange.GetQuoteCurrency()возвращает название базовой валюты, используемой обменником.BTC_CNYдоходыCNY, иETH_BTCдоходыBTC. Возвращается значение: тип строки.

Торговля фьючерсами

Для криптовалютных фьючерсных обменных объектов код контракта должен быть указан до вызова егорынок, порядоки других интерфейсов, иexchange.SetContractTypeПри переключении текущей торговой пары обмена объекта, вы должны вызватьexchange.SetContractTypeДля кодов контрактов обмена цифровой валюты, поддерживаемых платформой, обратитесь кexchange.SetContractType function.

Обмен.GetPosition ((()

exchange.GetPosition()получает информацию о текущей позиции.positionЕсли нет позиции, он возвращает пустой массив, а именно[].

  • Positionструктура

Обычно фьючерсные контракты на криптовалюты делятся на два типа:

  • Договор поставки Когда договор установлен на контракт поставки, звоните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 покупать продать закрытую длинную позицию

ПараметрDirectionможет принимать четыре параметра, в том числе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установить код контрактаswap, который устанавливается как валютный вечный контракт BTC.

Если не указано иное,договор поставкикод в фьючерсном контракте на криптовалюту, как правило, включает:

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

Подробное описание названия контракта каждой поддерживаемой криптовалютной биржи приведено следующим образом:

  • ОКX Установлено на постоянный контракт:exchange.SetContractType("swap")Контракт на этой неделе:exchange.SetContractType("this_week")Контракт на следующей неделе:exchange.SetContractType("next_week")Установлено на квартальный контракт:exchange.SetContractType("quarter")Контракт на следующий квартал:exchange.SetContractType("next_quarter")Контракт с маржировкой в 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 в качестве примера. Вы можете перейти на контракт с маржинальной стоимостью в USDT только с помощью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 в качестве примера. Вы можете перейти на контракт с маржинальной стоимостью в USDT только с помощьюexchange.SetCurrency("BTC_USDT"), или установив текущую торговую пару наBTC_USDTПосле переключения торговой пары, вы должны позвонитьexchange.SetContractTypeФункция снова установить контракт.

  • Фьючерсы_Deribit Установлено на постоянный контракт:exchange.SetContractType("BTC-PERPETUAL")Поддержка контракта Deribit 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 Binance Futures по умолчанию не устанавливает статус контракта, поэтому вам нужно сначала установить контракт. Установлено на постоянный контракт:exchange.SetContractType("swap")Бинанс фьючерсные вечные контракты могут быть контрактами с маржинальной стоимостью USDT.BTCКонтракт с маржинальной ставкой в USDT, торговая пара наBTC_USDT. В бессрочные контракты Binance Futures также входят контракты с крипто-маржинальной защитой. Например, в контракте с крипто-маржинальной защитой установить торговую пару наBTC_USD.

    Установлено на квартальный контракт:exchange.SetContractType("quarter")Контракты на поставку включают контракты с криптомаржировкой (например, используемые валюты в качестве маржи).BTC, торговая пара установлена наBTC_USD, а затем установить код контрактаexchange.SetContractType("quarter"), который устанавливает квартальный контракт BTC с крипто-маржировкой.

    Контракт на следующий квартал:exchange.SetContractType("next_quarter")Например, в ежеквартальном контракте с крипто-маржинальнымBTC, торговая пара установлена наBTC_USD, а затем установить код контрактаexchange.SetContractType("next_quarter). Binance поддерживает часть контрактов на доставку с маржинальной ставкой USDT, например, установку торговой пары BTC наBTC_USDT, а затем установить код контракта.

  • Фьючерсы_Бибокс Код бессрочного контракта Bibox:swap- Да. Установлено на постоянный контракт:exchange.SetContractType("swap").

  • Фьючерсы_AOFEX Код вечного контракта AOFEXswap- Да. Установлено на постоянный контракт:exchange.SetContractType("swap").

  • Фьючерсы_BFX Код бессрочного контракта BFX:swap- Да. Установлено на постоянный контракт:exchange.SetContractType("swap").

  • Фьючерсы_Bybit Bybit по умолчанию использует вечный контракт текущей торговой пары.swap- Да. Код квартального контракта:quarter- Да. Код контракта на следующий квартал:next_quarter.

  • Фьючерс_Кракен По умолчанию Kraken не устанавливает статус контракта, поэтому вам нужно установить код контракта.swap- Вечный контракт.month: месячный контракт.quarter: квартальный контракт.next_quarterКонтракт на следующий квартал.

  • Фьючерсы_Bitfinex Bitfinex не выполняет постоянный контракт текущей торговой пары.swap.

  • Фьючерсы_Bitget Bitget по умолчанию в вечном контракте текущей торговой пары.swapТорговая пара установлена наBTC_USD, обозначающий контракт с криптомаржировкой; пара торгового пара наBTC_USDT, указывающий контракт с маржинальной ставкой 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 Фьючерсы_ОП 0 exchange.SetMarginLevel Ошибка вызова функции рычага
1 Фьючерсы_ОП 1 exchange.SetDirection ошибка установки функции направления торговли фьючерсами
2 Фьючерсы_ОП 2 exchange.SetContractType ошибка установки контрактной функции
3 Фьючерсы_ОП 3 exchange.GetPosition Ошибка получения функции позиции
4 Фьючерсы_ОП 4 exchange.IO Ошибка вызова функции IO

Торговля опционами

Опционы на криптовалюты

Использованиеexchange.SetContractTypeРазличные биржи имеют разные коды опционов.

Биржи криптовалютных опционов, поддерживаемые платформой FMZ Quant Trading

  • Дерибит Для биржи Deribit необходимо только позвонитьexchange.SetContractTypeПосле настройки контракта опционов, при вызове рыночного интерфейса, такого какGetTicker, все рыночные данные о контракте опционов получены.exchange.Sellиexchange.Buyфункции для размещения ордера, и обратить внимание на направление торговли при размещении ордера, и установить направление торговлиexchange.SetDirectionИспользуйтеexchange.CancelФункция отмены заказа;exchange.GetPositionФункция для запроса позиций.

    Код стратегии для ссылки:Стратегия тестирования опционов Deribit

  • ОКX Создание контрактов, размещение заказов, отмена заказов, запрос заказов и получение рыночных котировок и т.д. являются одной и той же операцией, что и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контракт; дата осуществления - 25 декабря 2020 года; опционы - опционы Put (PUT); цена страйки $13,000. При покупке опционов покупатель выплачивает премию в USDT, что указывает на то, что используется USDT в активах счета; маржа продавца - это валюта, которая гарантируется валютой в активах. Для опционов продажи премия, выплачиваемая покупателем, составляет USDT, что указывает на то, что используется USDT в активах счета; маржа продавца составляет USDT, которая гарантируется USDT в активах.

  • Фьючерсы_Bybit Он поддерживает вариант USDC биржи Bybit и устанавливает торговую пару наETH_USDC, функция вызоваexchange.SetContractTypeПример кода опциона:ETH-25NOV22-1375-P.

Настройки сети

Обмен.УстановкаБаза ((База)

В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

Другие докеры, работающие по параметру использования командной строки-Iдля указания IP-адресов:

img

  • Основываясь на обмене, уточнить:

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

Больше