Bybit MT5 - страница 38

 
Rorschach #:
Правильно понимаю, что ваше решение использует node.js?

Было 2 захода (один давно, другой в этом году). В 1-м ядро ccxt было переписано на MQL5 и в него загружались настройки/правила преобразования запросов/ответов для конкретной биржи в формате json. Во 2-м - да, через node.js.

В блогах подробности.

 
Кстати, тем, кто использует Bybit, рекомендую вместо www.bybit.com (который подстраивается под юрисдикцию ЕС) использовать www.bybitglobal.com (не подвержен местным ограничениям и блокировкам пользователей).
 
Edgar Akhmadeev #:
Кстати, тем, кто использует Bybit, рекомендую вместо www.bybit.com (который подстраивается под юрисдикцию ЕС) использовать www.bybitglobal.com (не подвержен местным ограничениям и блокировкам пользователей).

Дельное замечание, мерси.

Даже не знал об этом

А MainNet и TestNet там другие? У меня последнее время в бридже бывает REST API запросы сбой дают(через Curl используя #pragma comment(lib, "libcurl.lib")), раньше такого не было. Надеюсь пройдет.

 
Igor Zakharev #:
А MainNet и TestNet там другие?

Вся инфраструктура и аутентификация единая, разные лишь юрисдикции представительств.

Но я их API пока не трогал.

 
Edgar Akhmadeev #:

Вся инфраструктура и аутентификация единая, разные лишь юрисдикции представительств.

Но я их API пока не трогал.

Вот это и интересно, позже попробую заменить в апи адрес, все нет время зарегистрироваться :)

Там ничего особого, я Rest пользуюсь. Вебсокет даже и не нужен, за скоростью не гоняюсь.

Если вкратце (это рабочий код, прямо из студии копипастом), притом оптимизированный с помощью ИИ. Сам ИИ такое написать без ошибок не в состоянии, но оптимизировать может и красиво оформить.

    bool MakeApiRequest(const std::wstring& endpoint, const std::map<std::wstring, std::wstring>& params, std::string& response) {
        if (stopRequested) {
            return false;
        }

        CURL* curl;
        CURLcode res;
        response.clear();

        curl = curl_easy_init();
        if (curl) {
            std::wstring timestamp = GenerateTimestamp();
            std::wstring recv_window = L"5000";

            std::wstringstream paramsStream;
            bool first = true;
            for (const auto& param : params) {
                if (!first) {
                    paramsStream << L"&";
                }
                paramsStream << param.first << L"=" << param.second;
                first = false;
            }
            std::wstring paramsStr = paramsStream.str();

            std::wstring sign_string = timestamp + apiKey + recv_window + paramsStr;
            std::wstring signature = GenerateSignature(apiSecret, sign_string);

            if (signature.empty()) {
                curl_easy_cleanup(curl);
                return false;
            }

            std::string apiKeyUtf8 = WideToUtf8(apiKey);
            std::string recvWindowUtf8 = WideToUtf8(recv_window);
            std::string timestampUtf8 = WideToUtf8(timestamp);
            std::string signatureUtf8 = WideToUtf8(signature);

            std::string baseUrl = useTestnet ? "https://api-testnet.bybit.com" : "https://api.bybit.com";
            std::string url = baseUrl + WideToUtf8(endpoint);

            if (!paramsStr.empty()) {
                std::string encodedParams;
                bool firstParam = true;
                for (const auto& param : params) {
                    if (!firstParam) {
                        encodedParams += "&";
                    }
                    std::string key = UrlEncode(WideToUtf8(param.first));
                    std::string value = UrlEncode(WideToUtf8(param.second));
                    encodedParams += key + "=" + value;
                    firstParam = false;
                }
                url += "?" + encodedParams;
            }

            struct curl_slist* headers = NULL;
            headers = curl_slist_append(headers, "Content-Type: application/json");
            headers = curl_slist_append(headers, ("X-BAPI-API-KEY: " + apiKeyUtf8).c_str());
            headers = curl_slist_append(headers, ("X-BAPI-TIMESTAMP: " + timestampUtf8).c_str());
            headers = curl_slist_append(headers, ("X-BAPI-SIGN: " + signatureUtf8).c_str());
            headers = curl_slist_append(headers, ("X-BAPI-RECV-WINDOW: " + recvWindowUtf8).c_str());

            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
            curl_easy_setopt(curl, CURLOPT_USERAGENT, "BybitToMT5/1.5");
            curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);

            // Добавляем callback для отмены запросов
            curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
            curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback);
            curl_easy_setopt(curl, CURLOPT_XFERINFODATA, this);

            res = curl_easy_perform(curl);

            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);

            if (res == CURLE_OK) {
                return !response.empty();
            }
            else if (res == CURLE_ABORTED_BY_CALLBACK) {
                LogInfo(L"[MakeApiRequest] Запрос отменен");
                return false;
            }
        }
        return false;
    }
 
Igor Zakharev #:
Там ничего особого, я Rest пользуюсь.

Я работал с API MEXC и Binance. У всех бирж они почти не отличаются. Писал на MQL5 с нуля.

Igor Zakharev #:
Вебсокет даже и не нужен, за скоростью не гоняюсь.

Очень не рекомендую заменять поток информации на REST. Даже несмотря на лимит в несколько раз в секунду, постоянный поток запросов раз в секунду вызывает при реальной торговле срабатывание триггера безопасности. Я нарвался.

Теперь с перерывами терзаю wss.
 
Edgar Akhmadeev #:

Я работал с API MEXC и Binance. У всех бирж они почти не отличаются. Писал на MQL5 с нуля.

Очень не рекомендую заменять поток информации на REST. Даже несмотря на лимит в несколько раз в секунду, постоянный поток запросов раз в секунду вызывает при реальной торговле срабатывание триггера безопасности. Я нарвался.

Теперь с перерывами терзаю wss.
Я попробую собрать на студии новую прогу для ws в свободное время раз рекомендуете, так и не пробовал это сделать. Вопрос как в МТ5 передавать, через мем маппинг или сокет.