WebRequest индикаторы

 

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

Функцию можно вызывать только из экспертов и скриптов, так как они работают в собственном потоке выполнения. При вызове из индикатора GetLastError() вернет ошибку 4014 – "Системная функция не разрешена для вызова".


Рабочая альтернатива есть?

В последнее время wininet не работает в мт5.

2021.12.26 01:06:05.840 metaarbitrage (EURUSD,H1)       +Open Inet...
2021.12.26 01:06:08.537 metaarbitrage (EURUSD,H1)       Access violation at 0x00007FF93AAE2740 read to 0xFFFFFFFFFFFFFFFF in 'wininet.dll'
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)          crash -->  00007FF93AAE2740 66837C410200      cmp        word [rcx+rax*2+0x2], 0x0
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)                     00007FF93AAE2746 488D4001          lea        rax, [rax+0x1]
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)                     00007FF93AAE274A 75F4              jnz        0x7ff93aae2740
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)       
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)                     00007FF93AAE274C 488B0D8D5D3D00    mov        rcx, [rip+0x3d5d8d]
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)                     00007FF93AAE2753 8D044502000000    lea        eax, [rax*2+0x2]
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)                     00007FF93AAE275A 448BC0            mov        r8d, eax
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)                     00007FF93AAE275D 33D2              xor        edx, edx
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)       
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)       00: 0x00007FF93AAE2740
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)       01: 0x000002C546534171
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)       02: 0x0000000000CC0038
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)       03: 0x000002C500000000
2021.12.26 01:06:08.539 metaarbitrage (EURUSD,H1)       

опробовал разные примеры из статей, перестала работать длл в терминале. 

 
Alexandr Gavrilin:

Какая у вас ОС ?

 
Vitaly Muzichenko #:

Какая у вас ОС ?

Windows 10

2021.12.26 13:09:06.000 Terminal Windows 10 build 19044, 12 x AMD Ryzen 5 2600 Six-Core, 9 / 15 Gb memory, 281 / 476 Gb disk, UAC, GMT+5

 
Alexandr Gavrilin:


Рабочая альтернатива есть?

Вынесение WebRequest функций в скрипт/советник и  обмен информацией с индикатором через БД и т.п..

Но очень интересно почему отвалилась dll.

 
Aleksey Mavrin #:

Вынесение WebRequest функций в скрипт/советник и  обмен информацией с индикатором через БД и т.п..

Но очень интересно почему отвалилась dll.

Потому, что с индикатором через БД. 

 
Aleksey Mavrin #:

Вынесение WebRequest функций в скрипт/советник и  обмен информацией с индикатором через БД и т.п..

Но очень интересно почему отвалилась dll.

что-то "починили и улучшили" в планировщике (что-то с таймерами и приоритетами и очередями windows). Некоторые, причём очень не все, вещи с wininet dll в индикаторах стали валится. До того весьма долго работали (собирал чуть не пару лет назад и нареканий ни у кого не было)

 
I have the solution for that but please write me on chat, because it is a private solution.
 
Alexandr Gavrilin:

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

Функцию можно вызывать только из экспертов и скриптов, так как они работают в собственном потоке выполнения. При вызове из индикатора GetLastError() вернет ошибку 4014 – "Системная функция не разрешена для вызова".


Рабочая альтернатива есть?

В последнее время wininet не работает в мт5.

опробовал разные примеры из статей, перестала работать длл в терминале. 

По идее можно из индикатора вызывать скрипт а в нем уже   WebRequest 

 
Yuriy Zaytsev #:

По идее можно из индикатора вызывать скрипт а в нем уже   WebRequest 

Как из индикатора вызвать скрипт?

 
Andrei Khlebnikov #:

Как из индикатора вызвать скрипт?

Вопрос не праздный, если кто знает подскажите, ткните носом в мануал, если туплю и не нашел.

Нужно именно для парсинга,  WebRequest()  запустить, пока решил exeшником который пишет в SQLite BD, но хотелось бы без костылей, чисто на MQL. Вариант с советником тоже на айс, как я понимаю, так как если в основной помещать эту функцию, то "она же синхронная", а отдельного эксперта только под функцию парсинга... ну те еще городульки, уж лучше через exe. В идеале скрипт - более-менее изящное решение.

 
Andrei Khlebnikov #:

Вопрос не праздный, если кто знает подскажите, ткните носом в мануал, если туплю и не нашел.

Нужно именно для парсинга,  WebRequest()  запустить, пока решил exeшником который пишет в SQLite BD, но хотелось бы без костылей, чисто на MQL. Вариант с советником тоже на айс, как я понимаю, так как если в основной помещать эту функцию, то "она же синхронная", а отдельного эксперта только под функцию парсинга... ну те еще городульки, уж лучше через exe. В идеале скрипт - более-менее изящное решение.

вот такой способ - придумал. работает!

1. на скрипт назначил комбинацию клавиш 

Снимок экрана 2022-02-06 160913

2 Создал  .VBS файл  - который вызовет нажатие клавиш Alt+L   (тут Оператор SendKeys (VBA) )

set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Sleep 1000
WshShell.SendKeys "%Д"
WshShell.SendKeys "%L"

3. В индикаторе прописать путь к  .VBS файлу - у меня такой путь("D:\\WebRequest.vbs")

//+------------------------------------------------------------------+
//|                                                ShellExecuteW.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---- импорт функции из внешней DLL
#import "shell32.dll"
int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
#import
//----
#property indicator_chart_window
#property indicator_plots   0
//----
string m_name[]= {"vbs"};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(3);
//--- indicator buffers mapping
//---
   int u=15;
   for(int y=0; y<ArraySize(m_name); y++)
     {
      ButtonCreate(m_name[y],5,u,25,15,8);
      u=u+17;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
//---
   for(int y=0; y<ArraySize(m_name); y++)
     {
      ObjectDelete(0,Symbol()+m_name[y]);
     }
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(ObjectGetInteger(0,Symbol()+"vbs",OBJPROP_STATE)!=0)
     {
      ObjectSetInteger(0,Symbol()+"vbs",OBJPROP_STATE,0);
      ShellExecuteW(NULL,NULL,"D:\\WebRequest.vbs",NULL,NULL,1);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ButtonCreate(string name,int Xdist,int Ydist,int Xsize,int Ysize,int FONTSIZE=12)
  {
   if(ObjectFind(0,Symbol()+name)<0)
      ObjectCreate(0,Symbol()+name,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_COLOR,clrWhite);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_BGCOLOR,clrDimGray);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_XDISTANCE,Xdist);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_YDISTANCE,Ydist);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_XSIZE,Xsize);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_YSIZE,Ysize);
   ObjectSetString(0,Symbol()+name,OBJPROP_FONT,"Sans Serif");
   ObjectSetString(0,Symbol()+name,OBJPROP_TEXT,name);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_FONTSIZE,FONTSIZE);
   ObjectSetInteger(0,Symbol()+name,OBJPROP_SELECTABLE,false);
  }
//+------------------------------------------------------------------+

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

есть у меня проблема с нажатием клавиш с помощью  .VBS файлом 

что бы комбинация клавиш сработала, нужно переключать на русский.