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

 
Forester #:

C вашей библиотекой есть подключение и обмен с локальным сервером.Тестировал таким скриптом:

Подключения к ws://echo.websocket.org  выдает 301 редирект на wss://echo.websocket.org.

А подключение к wss://echo.websocket.org не устанавливается с таким сообщением:

Выдана информация о ключе шифрования.

Аналогично ведет себя и байбитовский сервер, тоже выдает информацию о ключе шифрования. Если оба себя так ведут, то видимо проблема общая с шифрованием на стороне клиента. Может какие то заголовки надо добавить? Или какой-то ответ для принятия ключа отправить?

Попробуйте прилагаемый файл. С ним у меня работает эхо wss://echo.websocket.in/, но не работает wss://echo.websocket.org/.

Не понятно, в чем причина. Внутри (в wstransport.mqh) это выглядит на стадии рукопожатия так:

   int read(uchar &buffer[]) override
   {  // can be disconnected already but still having data in internal buffer
      if(!SocketIsConnected(handle) && SocketIsReadable(handle) == 0)
      {
         Print("Can't read from non-connected socket");
         return -1;
      }
      
      ResetLastError();
      ArrayResize(buffer, 0); // ensure buffer is of zero size

      uint available = SocketIsReadable(handle);
      int received = 0;
      
      if(!available) return 0;
      else if(available == !_LastError && TLS) return 0; // available = 1 and TLS is a signal of fake (possible) data

      if(TLS)
      {
         // SocketIsReadable is not compatible with SocketTlsRead!
         // first returns raw data count, second tries to read clean deciphered bytes count
         received = SocketTlsReadAvailable(handle, buffer, available); // waiting for data (block)
      }
      else
      {
         received = SocketRead(handle, buffer, available, timeout);
      }

      if(received == -1)
      {
         // NB: even if we got -1 result and _LastError = 5273,
         // buffer may contain valid data received before connection was lost/closed
         Print("SocketRead failed: ", _LastError, " Available: ", available);
         if(_LastError == 5273 && available == 1 && !TLS) return -1;
      }
      
      return ArraySize(buffer);
   }

SocketIsReadable возвращает какое-то количество данных, например, 541, но вызов SocketTlsReadAvailable их не читает, то есть buffer остается пустым, а received равно 0. Проверял _LastError после всех вызовов - равно 0.

В принципе, поскольку данные шифруют блоками, вполне допустимо, что из сети приходит не весь блок, и его нельзя расшифровать пока не поступит окончание, но проблема в том, что в данном случае этого не происходит никогда - программа остается в ожидании зашифрованного заголовка.

Файлы:
 

Тут https://www.mql5.com/ru/docs/network/sockettlshandshake написано, что

Вызов SocketTlsHandshake() не требуется, если подключение осуществляется к порту 443.

И в примере ниже так и сделано

if(PORT!=443 && TlsHandshake(socket))
Сделал аналогично в вашем коде в wstransport.mqh
  if(port!=443 && !SocketTlsHandshake(handle, host))

но в примере MQL еще 3 команды отправляется в функции TlsHandshake(). Их надо выполнять если SSL порт другой.
Впрочем у меня 443 порт и мне сейчас полная функция TlsHandshake() не нужна.
В общем теперь получаю  TLS enabled и скрипт остается работать, но для wss://echo.websocket.org ничего не происходит. Внутрь условия

if(wss.open(headers)){
не входит, то есть находится в состоянии подключения.

А для байбитовского сервера подключение происходит нормально. И отрабатывает код внутри этого if()


В вашем коде обмен сообщениями пинг-понг происходит? Или это уже мне надо программировать?

 
Forester #:

Тут https://www.mql5.com/ru/docs/network/sockettlshandshake написано, что

И в примере ниже так и сделано

Сделал аналогично в вашем коде в wstransport.mqh

но в примере MQL еще 3 команды отправляется в функции TlsHandshake(). Их надо выполнять если SSL порт другой.
Впрочем у меня 443 порт и мне сейчас полная функция TlsHandshake() не нужна.
В общем теперь получаю  TLS enabled и скрипт остается работать, но для wss://echo.websocket.org ничего не происходит. Внутрь условия

не входит, то есть находится в состоянии подключения.

А для байбитовского сервера подключение происходит нормально. И отрабатывает код внутри этого if()


В вашем коде обмен сообщениями пинг-понг происходит? Или это уже мне надо программировать?

В приложенном выше патче как раз сделано, чтобы не вызывался SocketTlsHandshake для порта 443, который по умолчанию открывается в TLS. Для другого порта будет вызываться.

Про ситуацию "ничего не происходит" написал выше - функция SocketTlsReadAvailable не считывает имеющиеся данные (если заменить на SocketTlsRead - тупо подвисает на этом вызове), то есть программа продолжает ожидать расшифрованного буфера, но почему-то не получает его. Это вопрос к MetaQuotes.

Фреймы пинг-понга обрабатываются.

 
Stanislav Korotky #:

В приложенном выше патче как раз сделано, чтобы не вызывался SocketTlsHandshake для порта 443, который по умолчанию открывается в TLS. Для другого порта будет вызываться.

Про ситуацию "ничего не происходит" написал выше - функция SocketTlsReadAvailable не считывает имеющиеся данные (если заменить на SocketTlsRead - тупо подвисает на этом вызове), то есть программа продолжает ожидать расшифрованного буфера, но почему-то не получает его. Это вопрос к MetaQuotes.

Фреймы пинг-понга обрабатываются.

Зависает наверное потому, что вы одним вызовом SocketRead или SocketTlsReadAvailable читаете все данные, а в примере на странице https://www.mql5.com/ru/docs/network/sockettlshandshake данные читаются мелкими порциями и соединяются:

//--- читаем данные из сокета
   uchar  data[128];
   uint   size=0;
   string resp=NULL;
 
   do
     {
      uchar b[1];
      int   n=SocketRead(socket,b,1,1000);
 
      if(n < 0)
         break;
 
      if(n)
        {
         data[size++]=b[0];
 
         if(size==data.Size())
           {
            resp += CharArrayToString(data,0,data.Size(),CP_UTF8);
            size = 0;
           }
        }
     }
   while(SocketIsReadable(socket));

Если так же сделать, то может и wss://echo.websocket.org/ начнет работать.

 
Forester #:

Зависает наверное потому, что вы одним вызовом SocketRead или SocketTlsReadAvailable читаете все данные, а в примере на странице https://www.mql5.com/ru/docs/network/sockettlshandshake данные читаются мелкими порциями и соединяются:

Если так же сделать, то может и wss://echo.websocket.org/ начнет работать.

Нет. SocketRead для не-TLS режима, и в примере он используется только перед SocketTlsHandshake. И я не использую SocketRead вне TLS-режима. Зачем нужно побайтовое чтение - не понимаю, имхо это плохой пример.

Как я уже писал, мне приходят 541 raw-байт зашифрованного заголовка. Да, я могу их прочитать SocketRead (целиком или побайтово - неважно) и получаю в них "кашу", потому что они зашифрованы и могут быть прочитаны только функциями с Tls-суффиксом. А эти функции "ждут" завершения блока.

ЗЫ. Сейчас для прикола добавил вызов SocketTlsRead(handle, buffer, 1), то есть чтение одного байта - он тоже "висит" несмотря на наличие данных в системном сокете.
 

Короче - echo.websocket.org - глючный сервер (на него есть жалобы на гитхабе) или как минимум в чем-то несовместимый с MQL5 TLS-реализацией.

Используйте echo.websocket.events вместо него. От меня работает.

 
С байбитом работает - это главное сейчас.
Спасибо за рабочую библиотеку)
 

Что-то перестал открываться апи-сайт. У всех так или только у меня? Основной сайт и ЛК работает.

https://api.bybit.com/v5/market/instruments-symbol_info?category=linear&limit=1000

 
Dmitriy Skub #:

Что-то перестал открываться апи-сайт. У всех так или только у меня? Основной сайт и ЛК работает.

https://api.bybit.com/v5/market/instruments-symbol_info?category=linear&limit=1000

У меня работает

2025.05.12 10:13:54.016    WebRequest time: 292 ms
2025.05.12 10:13:54.045    Deserialize time: 28 ms
2025.05.12 10:13:54.046    Create new symbol 1000000BABYDOGEUSDT.bbt.linear
2025.05.12 10:13:54.048    Create new symbol 1000000CHEEMSUSDT.bbt.linear
2025.05.12 10:13:54.049    Create new symbol 1000000MOGUSDT.bbt.linear
2025.05.12 10:13:54.052    Create new symbol 1000000PEIPEIUSDT.bbt.linear

Может лимиты превышены - читал что дают бан за это на 10 минут.
 
Forester #:

У меня работает

2025.05.12 10:13:54.016    WebRequest time: 292 ms
2025.05.12 10:13:54.045    Deserialize time: 28 ms
2025.05.12 10:13:54.046    Create new symbol 1000000BABYDOGEUSDT.bbt.linear
2025.05.12 10:13:54.048    Create new symbol 1000000CHEEMSUSDT.bbt.linear
2025.05.12 10:13:54.049    Create new symbol 1000000MOGUSDT.bbt.linear
2025.05.12 10:13:54.052    Create new symbol 1000000PEIPEIUSDT.bbt.linear

Может лимиты превышены - читал что дают бан за это на 10 минут.

Да не понятно, запросами не бомбил точно, еще 10 мая все работало. Может провайдер чудит - буду разбираться.

Так ссылка открывается у Вас в броузере?