Ошибки, баги, вопросы - страница 2707

 
Stanislav Korotky:

Я её и не использую. Код для воспроизведения проблемы приложен.

Замените SocketTlsRead на SocketTlsReadAvailable

 
Ilyas:

Замените SocketTlsRead на SocketTlsReadAvailable

А можно поподробнее? В примере документации использована именно SocketTlsRead. Почему там не использовалась SocketTlsReadAvailable?

В каких случаях следует использовать одну функцию, а в каких другую?

Каким образом писать универсальный код для блокирующего чтения из сокета, подходящий и для защищенных и незащищенных соединений - у нас ведь нет аналогичной функции SocketReadAvailable?

PS. Заменил функцию. Ошибка не пропала. Прикладываю обновленный код. GetLastError возвращает 0.

Файлы:
 

В визуальном тестере вызов из индикатора функции CopyTicksRange завершается с ошибкой 4014 (ERR_FUNCTION_NOT_ALLOWED).

Тот же индикатор нормально работает в онлайне на том же инструменте. В чем затык? Запрет на эту функцию в тестере? Не нашел упоминания об этом в справке.

 
Stanislav Korotky:

В визуальном тестере вызов из индикатора функции CopyTicksRange завершается с ошибкой 4014 (ERR_FUNCTION_NOT_ALLOWED).

Тот же индикатор нормально работает в онлайне на том же инструменте. В чем затык? Запрет на эту функцию в тестере? Не нашел упоминания об этом в справке.

Тест по реальным тикам?

 
Stanislav Korotky:
Вот именно, что это не мой код, а из примера разработчиков (у сокетов от MQ - некоторые неинтуитивные особенности, которые выясняются иногда на форуме, поэтому обратился к стандартному примеру). SocketTlsHandshake я пробовал - он у меня всегда во всех условиях возвращает false и не оказывает никакого влияния на решение проблем. Поскольку возвращаются данные сертификата, рукопожатие проходит. Даже заголовок судя по длине приходит, но просто не возвращается в MQL-код. Код ошибки слишком общий, и сам факт ошибки сомнителен. Нужен взгляд изнутри.

Да, я тоже удивился, что без SocketTlsHandshake сертификат возвращается. 
А с функцией SocketTlsHandshake взывает ошибку.
Какая то не явная логика в поведении.

if(SocketConnect(socket, Address, Port, 5000) && SocketTlsHandshake(socket, Address))
Can't connect to echo.websocket.org:443, error 5274

UPD:
Рекомендацию Ильяса увидел.
Да без этой функции, с коннектом проблем нет.
Проблема в чтении.
 
Ilyas:

Замените SocketTlsRead на SocketTlsReadAvailable

Пробовал я так же заменять на SocketTlsReadAvailable

int rsp_len; 

if(ExtTLS)
   rsp_len = SocketTlsReadAvailable(socket, rsp, len); 
   //rsp_len = SocketTlsRead(socket, rsp, len);
else
   rsp_len = SocketRead(socket, rsp, len, timeout);

Поведение тоже самое что и с SocketTlsRead 

UPD:
Эта же проблема есть при использовании SocketTlsHandshake на другой порт.

 

Предлагаю добавить конкретики в автоматическую валидацию продуктов в маркете. Помимо общих ошибок, сообщаемых валидатором, настоятельно требуется контекст выполняемой проверки и логи. В частности, я не могу уже пару лет обновить один индикатор из-за ошибки "tester takes too long time". Первая версия была загружена еще при "человеческом" модерировании и нареканий не вызывала. Критерии автовалидатора для выдачи данной ошибки абсолютно неясны.

Вот такой конкретный вопрос: какое количество тиков за какое количество времени на каком аппаратном обеспечении должен обеспечивать продукт, чтобы не возникало "tester takes too long time"?

Индикатор предназначен для обработки тиков алгоритмом MapReduce, используются целочисленные вычисления, так что ужимать там нечего, если только не выбросить сам алгоритм. Профайлер использовался, был добавлен троттлинг, чтобы пересчитывать массив новых тиков с заданным периодом. Безрезультатно.

На моем компе год тестируется за несколько минут. Что на самом деле происходит в автовалидаторе и почему он тормозит, невозможно в данный момент узнать.

Отсутствие нормальной поддержки продуктов - это проблема как для пользователей, так и для MQ - она сказывается на реализации.

 

Разве так должно быть?

class cA
  {
public:
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
  }

Лог:

2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       +++
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---
2020.04.17 18:39:32.996 test3 (EURUSD,M1)       ---

Двойной вызов конструктора и деструктора, как будто два объекта создаётся и удаляется. При использовании new и delete всё хорошо.

Билд 2380.

 
Aliaksandr Hryshyn:

как будто два объекта создаётся и удаляется.

Так и есть.

 
fxsaber:

Так и есть.

А мой объект создаётся вторым:

class cA
  {
public:
   int               my_i;
   int               Add(int i1,int i2)
     {
      return i1+i2;
     };
                     cA()
     {
      static int i=0;
      my_i=i;
      i++;
      Print("+++");
     };
                    ~cA()
     {
      Print("---");
     };
  };

void OnStart()
  {
   cA a=cA();
   Print(a.my_i);
  }
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       +++
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       1
2020.04.17 18:47:34.771 test3 (EURUSD,M1)       ---