Обсуждение статьи "Многопоточный асинхронный WebRequest на MQL5 своими руками" - страница 3

 
Stanislav Korotky:

WebRequest не работает в индикаторах (и данная библиотека позволяет обойти это ограничение). Отдельный поток в МТ выделяется только экспертам и скриптам, но скрипты не работают с событиями.

Ясно. Спасибо. Не знал.

 
Stanislav Korotky:

В MT4 1146 ресурсы заработали полноценно. Можно смело под четверку идею портировать.

 
fxsaber:

Да, идея именно в этом. Но будет пахать только в MT5.

Реализовал эту идею (с объектами-чартами).

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Обсуждение статьи "Многопоточный асинхронный WebRequest на MQL5 своими руками"

fxsaber, 2018.11.09 22:07

Кстати, можно же обойтись без полноценных чартов - OBJ_CHART. На них скрипты загружаются на ура. А там WebRequest пашет и OrderSend.

Приводил пример, как индикатор сделать торговым без доп. чартов.

Таким образом можно в качестве менеджера использовать iCustom-индикатор, а он будет на каждый WebRequestAsync запускать WebRequest в своем скрипте.

Конструкция должна получиться проще и надежнее, т.к. доп. окон не будет.

Результат такой.

Скрипты не работают, потому что не получается передать в них параметр при запуске - похоже, скрипты вообще не дружат с шаблонами графиков. То, что их вообще удается запустить с помощью библиотеки Expert.mqh (хоть и без параметров), по аналогии с экспертами - похоже на счастливый случай.

Если выполнять веб-запросы не в скриптах, а в экспертах, то схема работает наполовину. То есть входные параметры работают нормально и удается передать в эксперт имя ресурса с данными. Но почему-то в экспертах, запущенных в объектах-чартах, срабатывает только событие OnInit, а например, OnTick или OnTimer - нет. Выполнять веб-запрос в OnInit не очень красиво, но можно. Однако вся эта логика ужасно тормозит, потому что открытие объекта-графика под каждый запрос дает большие накладные расходы.

 
Stanislav Korotky:

Реализовал эту идею (с объектами-чартами).

Результат такой.

Скрипты не работают, потому что не получается передать в них параметр при запуске - похоже, скрипты вообще не дружат с шаблонами графиков. То, что их вообще удается запустить с помощью библиотеки Expert.mqh (хоть и без параметров), по аналогии с экспертами - похоже на счастливый случай.

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

Если выполнять веб-запросы не в скриптах, а в экспертах, то схема работает наполовину. То есть входные параметры работают нормально и удается передать в эксперт имя ресурса с данными. Но почему-то в экспертах, запущенных в объектах-чартах, срабатывает только событие OnInit, а например, OnTick или OnTimer - нет. Выполнять веб-запрос в OnInit не очень красиво, но можно. Однако вся эта логика ужасно тормозит, потому что открытие объекта-графика под каждый запрос дает большие накладные расходы.

У меня ничего не срабатывает.

 
fxsaber:

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

У меня ничего не срабатывает.

Тот комплект, что я отправлял в личку, работает у меня через OnInit в эксперте. Это видно по логам. Пришлите мне свои логи.

 

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

  • multiwebobjectworker.mqh - заголовочный файл с общими классами;
  • multiwebobjectworker.mq5 - рабочий эксперт, выполняющий веб-запросы внутри объектов-графиков;
  • multiwebindicator.mq5 - безбуферный индикатор, демонстрирующий запуск веб-запросов;

Для каждого запроса создается объект, в нем эксперт-помощник, по окончании запроса объект удаляется. Обмен данными запроса и результатами, как в статье, производится через ресурсы.

Судя по логам, полноценной параллельности выполнения запросов данный механизм не предоставляет, поскольку объекты, вероятно, делят общую очередь событий. Пример лога:

2018.11.14 15:11:58.492 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS1 129912254742671349
2018.11.14 15:11:58.694 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS2 129912254742671350
2018.11.14 15:11:58.819 multiwebindicator (EURUSD,H1)   129912254742671348: Starting chart object WRS3 129912254742671351
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnInit
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Reading request \Indicators\multiwebindicator.ex5::WRS_0_129912254742671348
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: Got 64 bytes in request
2018.11.14 15:11:58.960 multiwebobjectworker (EURUSD,H1)        129912254742671349: GET https://google.com/ User-Agent: n/a 5000 
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnInit
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Reading request \Indicators\multiwebindicator.ex5::WRS_1_129912254742671348
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: Got 60 bytes in request
2018.11.14 15:11:58.975 multiwebobjectworker (EURUSD,H1)        129912254742671350: GET https://ya.ru User-Agent: n/a 5000 
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnInit
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Reading request \Indicators\multiwebindicator.ex5::WRS_2_129912254742671348
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: Got 72 bytes in request
2018.11.14 15:11:59.084 multiwebobjectworker (EURUSD,H1)        129912254742671351: GET https://www.startpage.com/ User-Agent: n/a 5000 
2018.11.14 15:11:59.162 multiwebobjectworker (EURUSD,H1)        129912254742671350: Done in 187ms
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671350
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   129912254742671348: Got 16592 bytes in response
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   GET https://ya.ru
2018.11.14 15:11:59.178 multiwebindicator (EURUSD,H1)   Received 3734 bytes in header, 12775 bytes in document
2018.11.14 15:11:59.256 multiwebobjectworker (EURUSD,H1)        129912254742671350: OnDeinit
2018.11.14 15:11:59.272 multiwebobjectworker (EURUSD,H1)        129912254742671349: Done in 297ms
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671349
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   129912254742671348: Got 12688 bytes in response
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   GET https://google.com/
2018.11.14 15:11:59.334 multiwebindicator (EURUSD,H1)   Received 790 bytes in header, 11813 bytes in document
2018.11.14 15:11:59.350 multiwebobjectworker (EURUSD,H1)        129912254742671349: OnDeinit
2018.11.14 15:11:59.833 multiwebobjectworker (EURUSD,H1)        129912254742671351: Done in 749ms
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Result code 200
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Reading result \Experts\multiwebobjectworker.ex5::WRS_0_129912254742671351
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   129912254742671348: Got 45212 bytes in response
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   GET https://www.startpage.com/
2018.11.14 15:11:59.833 multiwebindicator (EURUSD,H1)   Received 822 bytes in header, 44307 bytes in document
2018.11.14 15:11:59.849 multiwebindicator (EURUSD,H1)   > > > Async WebRequest workers finished 3 tasks in 1357ms
2018.11.14 15:11:59.880 multiwebobjectworker (EURUSD,H1)        129912254742671351: OnDeinit
Файлы:
 
Stanislav Korotky:

Попробуйте обновленный Resource_Data.mqh, лаги при передачи веб-страниц должны исчезнуть.

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

#define BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}  

const RESOURCEDATA<uchar> Resource("::" + __FILE__); // Ресурс для передачи данных (байты)
uchar BytesIn[];
const int Init = ArrayResize(BytesIn, 1000000);

void TestResource()
{
  uchar BytesOut[];

  Resource = BytesIn;
  Print(Resource.Get(BytesOut));
}

void OnStart()
{
  BENCH(TestResource());
}


Старая версия

1000000
Time[TestResource()] = 103746


Новая версия

1000000
Time[TestResource()] = 5222
 
fxsaber:

Попробуйте обновленный Resource_Data.mqh, лаги при передачи веб-страниц должны исчезнуть.

Старая версия

Новая версия

Это что ж такое нужно было сделать, чтобы ускориться в 20 раз? Совместимость со старым кодом осталась, клиентские вызовы менять не надо?

 
Stanislav Korotky:

Это что ж такое нужно было сделать, чтобы ускориться в 20 раз? Совместимость со старым кодом осталась, клиентские вызовы менять не надо?

Совместимость осталась.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: TradeTransactions

fxsaber, 2018.12.09 01:23

В исходниках библиотеки присутствует Convert.mqh, который быстро конвертирует массив одного типа в массив другого.

TypeToBytes тормозила (теперь используется только в случае, если ни один из типов массивов не кратен другому) на больших массивах.

Для uchar[] TypeToBytes не используется.

 

Чо то не получается запустить.

Пишет ошибку 4002.

После небольшого анализа нашел что вёкер не получает URL. Вместо него приходит нулевое значение

Причина обращения: