Обсуждение статьи "WebSocket для MetaTrader 5"

 

Опубликована статья WebSocket для MetaTrader 5:

До появления сетевых функций в обновленном MQL5 API, приложения MetaTrader были ограничены в возможности подключаться и взаимодействовать с сервисами на основе протокола WebSocket. Сейчас ситуация изменилась. В этой статье мы рассмотрим реализацию библиотеки WebSocket на чистом MQL5. Будут представлены краткое описание протокола WebSocket и пошаговое руководство по использованию полученной библиотеки.

Ниже представлено видео программы, работающей при подключении к серверу.


Автор: Francis Dube

 
MetaQuotes:

Опубликована статья WebSocket для MetaTrader 5:

Автор: Francis Dube

WebSocket даже в нормальных, быстрых и правильных реализациях довольно капризная штука. Её противопоказано делать на MQL

imho: или оно должно появится от разработчиков терминала или обеспечиваться внешними DLL

 
Зачем это нужно? Зачем нужен Websocket и какой функционал он улучшает в сравнении с обычным мт. Можно пример количественного или качественного улучшения. Было так, с Websocket стало так. Во столько раз быстрее.  Спасибо! 
 
Maxim Kuznetsov:

WebSocket даже в нормальных, быстрых и правильных реализациях довольно капризная штука. Её противопоказано делать на MQL

imho: или оно должно появится от разработчиков терминала или обеспечиваться внешними DLL

Чушь какая.

Все отлично работает в MQL5.
 
Renat Fatkhullin:
Чушь какая.

Все отлично работает в MQL5.

Вовсе не чушь относительно MQL. Тут с TLS как были проблемы (я о них писал на форуме, но решения не дождался), так и остались. Пример из статьи не работает. Лог я приложил к оригиналу английской статьи.

Discussion of article "Websockets for MetaTrader 5"
Discussion of article "Websockets for MetaTrader 5"
  • 2020.11.25
  • www.mql5.com
New article Websockets for MetaTrader 5 has been published: Author: Francis Dube...
 
Renat Fatkhullin:
Чушь какая.

Все отлично работает в MQL5.

Там есть старая проблема wss: в штатной функции  SocketIsReadable ()
Обходится элементарно, но уже без этой функции.

uint len = 1024; //SocketIsReadable(socket);

 


 
Roman:

Там есть старая проблема wss: в штатной функции  SocketIsReadable ()
Обходится элементарно, но уже без этой функции.

Есть какое-нибудь обоснование? Что за магическое число и почему оно подойдет для сообщения длиной 256 или 1500, например?

 
Roman:

Там есть старая проблема wss: в штатной функции  SocketIsReadable ()
Обходится элементарно, но уже без этой функции

Вы просто не понимаете и не умеете пользоваться этой функцией.

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

И TLS функции тоже правильные - они ведь даны для подготовленных пользователей, которые знают как и в какой последовательности ими пользоваться. Они не для тех, кто «вызвал и все».


Мало того, сокетные и tls функции в чистом виде те же самые, что использует терминал для raw/tls/https соединений терминал. То есть, все отлично работает. Эти же реализации работают в наших высоконагруженных решениях.

Сырые сетевые функции не для новичков и не для наивного использования. Надо достаточно хорошо понимать принципы и особенности сетевого взаимодействия. А если речь об TLS, то методы и последовательность  обработки handshake процесса.
 
Renat Fatkhullin:

Вы просто не понимаете и не умеете пользоваться этой функцией.

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

И TLS функции тоже правильные - они ведь даны для подготовленных пользователей, которые знают как и в какой последовательности ими пользоваться. Они не для тех, кто «вызвал и все».


Мало того, сокетные и tls функции в чистом виде те же самые, что использует терминал для raw/tls/https соединений терминал. То есть, все отлично работает. Эти же реализации работают в наших высоконагруженных решениях.

Сырые сетевые функции не для новичков и не для наивного использования. Надо достаточно хорошо понимать принципы и особенности сетевого взаимодействия. А если речь об TLS, то методы и последовательность  обработки handshake процесса.

Эта функция не имеет параметра буфера. О каком входном буфере речь?
Не знаю о каком понимании вы говорите и для каких юзеров, эту ошибку нашёл Ильяс и вроде принял за ошибку.
В том то и дело, что все пользователи ориентируются на примеры из документации для сокетов.
А продвинутые пользователи пишут спецификацию протокола, и апргрейды и разбор фрейма всё это понимаем.
Проблема в том, что функция SocketIsReadable(socket) не понятно что возвращает, для wss: фрейма. 

Документация по MQL5: Сетевые функции / SocketIsReadable
Документация по MQL5: Сетевые функции / SocketIsReadable
  • www.mql5.com
SocketIsReadable - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Stanislav Korotky:

Есть какое-нибудь обоснование? Что за магическое число и почему оно подойдет для сообщения длиной 256 или 1500, например?

Обоснование? Да фиг его знает. С числом в переменной, читает без проблем. Длина выставлена на примерный максимальный размер входящего фрейма.
Можно и по максимуму поставить, не на что не влияет.

string CWs::Recv()
{
   uchar   rsp[]; //, res[];
   string  result  = "";
   //uint    timeout_check = GetTickCount() + timeout;

   //do
   //{
      uint len = 65536; //SocketIsReadable(socket);

      //if(len)
      //{
         int rsp_len = SocketTlsReadAvailable(socket, rsp, len);

         //if(rsp_len > 0)
         //{
            //ArrayInsert(res, rsp, ArraySize(res), 0);                       
            //break;
         //}   
      //}
   //}
   //while(GetTickCount() < timeout_check && !IsStopped());

   if(rsp_len > 0) //(ArraySize(res) > 0)
      result = Unpack(rsp, ArraySize(rsp));
   
  
   return(result);
}

А с функцией SocketIsReadable(socket) сам знаешь, что читает с ошибкой. 

То что возвращает SocketIsReadable(socket) в len, не подходит в  SocketTlsRead() и SocketTlsReadAvailable()

Документация по MQL5: Сетевые функции / SocketIsReadable
Документация по MQL5: Сетевые функции / SocketIsReadable
  • www.mql5.com
SocketIsReadable - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

Эта функция не имеет параметра буфера. О каком входном буфере речь?
Не знаю о каком понимании вы говорите и для каких юзеров, эту ошибку нашёл Ильяс и вроде принял за ошибку.
В том то и дело, что все пользователи ориентируются на примеры из документации для сокетов.
А продвинутые пользователи пишут спецификацию протокола, и апргрейды и разбор фрейма всё это понимаем.
Проблема в том, что функция SocketIsReadable(socket) не понятно что возвращает, для wss: фрейма. 

То есть, вы вообще понятия не имеете о сокетах и их буферах, но учите нас ошибкам.

Проверка размера сырых данных во входящем буфере SocketIsReadible конечно не подходит к Tls функциям, которые работают с шифрованными данными, получаемыми в меньшем размере.

'Принял за ошибку' - люди умудряются любой аккуратный ответ принять за признание вины. Покажите четкий ответ.