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

 

повнимательнее посмотрел код...

дык пока смотрится как ДЫРИЩЩА в безопасности. но прикольно. уважуха

 

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

Вопрос к знатокам по защите советника.

fxsaber, 2018.10.05 07:50

Что можно передать без DLL и без ведома пользователя, если он пропишет адрес для WebRequest

  1. Логины и торговые сервера используемых торговых счетов.
  2. Имя, на которое зарегистрирован.
  3. Торговую историю и текущее состояние счета.
  4. Сигналы.
  5. Некоторые действия на Терминале.
  6. Входные параметры всех советников и индикаторов, что запускаются. Включая логины и пароли, прописанные в них.
  7. Всю песочницу.
  8. Данные о машине: СPU, RAM. По которым можно косвенно сказать, VPS это или нет.
  9. Пинг.
  10. ...

Что можно сделать со счетом пользователя

  1. Удалить любой советник/индикатор/объект и т.д.
  2. Изменить входные параметры запущенных советников/индикаторов.
  3. Отключить/включить автоторговлю для запущенного советника.
  4. Подписаться на Сигнал.
  5. Вести свою торговлю.
  6. Любые действия с чартами.
  7. Закрытие Терминала.
  8. Невозможность запуска советников/индикаторов.
  9. Невозможность выгрузить индикатор, который запустил. Невидимый режим.
  10. ...

Это пункты по WebRequest. Такой же список можно составить и для Маркета. Не воспринимаю, как дыры.

 
fxsaber:

Это пункты по WebRequest. Такой же список можно составить и для Маркета. Не воспринимаю, как дыры.

  const long Res = ObjectCreate(0, __FILE__, OBJ_CHART, 0, 0, 0) && _GlobalVariableSet("ORDERSEND", Order) &&
                   _GlobalVariableSet("Symbol", Symb) && _GlobalVariableSet("Comment", comment) &&
                   EXPERT::Run(ObjectGetInteger(0, __FILE__, OBJPROP_CHART_ID), Params) &&
                   ObjectDelete(0, __FILE__) ? _GlobalVariableGet2<long>(__FUNCTION__) : -1

краем глаза понимаю что тут вызывается скрипт. Из индикатора. С повышением полномочий

немного смущает только EXPERT::Run

вот тут 

https://www.mql5.com/ru/forum/288985#comment_9291731

Обсуждение статьи "Многопоточный асинхронный WebRequest на MQL5 своими руками"
Обсуждение статьи "Многопоточный асинхронный WebRequest на MQL5 своими руками"
  • 2018.11.08
  • www.mql5.com
Опубликована статья Многопоточный асинхронный WebRequest на MQL5 своими руками: Автор: Stanislav Korotky...
 
Maxim Kuznetsov:

краем глаза понимаю что тут вызывается скрипт. Из индикатора. С повышением полномочий

немного смущает только EXPERT::Run

вот тут 

https://www.mql5.com/ru/forum/288985#comment_9291731

Не уловил мысли.

 
Остался один главный вопрос по предлагаемому подходу - в каком потоке выполняются объекты-чарты (и то что в них вложено)?
 
Stanislav Korotky:
Остался один главный вопрос по предлагаемому подходу - в каком потоке выполняются объекты-чарты (и то что в них вложено)?

В своем потоке. Это чарты, но в виде объектов.

 
fxsaber:

В своем потоке. Это чарты, но в виде объектов.

Тогда доп.вопрос: можно ли сделать чарт-объект размером 0x0 или 1x1?

В общем идея, как я понял, такая - без менеджера и пула просто по необходимости создаем объект-чарт, запускаем в нем worker-скрипт, отправляем веб-запрос и получаем результат (везде по прежнему плодим ресурсы для передачи данных), в завершении удаляем объект.

 
Stanislav Korotky:

Тогда доп.вопрос: можно ли сделать чарт-объект размером 0x0 или 1x1?

Чтобы сделать невидимым, его можно переместить в отрицательные координаты. Вот пример

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.10.31 08:11

// Сохранение Bitmap-объекта в bmp/gif/png-файле (прозрачность не учитывается)
bool BitmapObjectToFile( const long chartID, const string ObjName, const string FileName, const bool FullImage = false )
{  
  const ENUM_OBJECT Type = (ENUM_OBJECT)ObjectGetInteger(chartID, ObjName, OBJPROP_TYPE);  
  bool Res = (Type == OBJ_BITMAP_LABEL) || (Type == OBJ_BITMAP);
             
  if (Res)
  {
    const string Name = __FUNCTION__ + (string)MathRand();

    ObjectCreate(chartID, Name, OBJ_CHART, 0, 0, 0);
    ObjectSetInteger(chartID, Name, OBJPROP_XDISTANCE, -1e3);
    
    const long chart = ObjectGetInteger(chartID, Name, OBJPROP_CHART_ID);
        
    Res = ChartSetInteger(chart, CHART_SHOW, false) && ObjectCreate(chart, Name, OBJ_BITMAP_LABEL, 0, 0, 0) &&
          ObjectSetString(chart, Name, OBJPROP_BMPFILE, ObjectGetString(chartID, ObjName, OBJPROP_BMPFILE)) &&
          (FullImage || (ObjectSetInteger(chart, Name, OBJPROP_XSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_XSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YSIZE, ObjectGetInteger(chartID, ObjName, OBJPROP_YSIZE)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_XOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_XOFFSET)) &&
                         ObjectSetInteger(chart, Name, OBJPROP_YOFFSET, ObjectGetInteger(chartID, ObjName, OBJPROP_YOFFSET)))) &&
                         ChartScreenShot(chart, FileName, (int)ObjectGetInteger(chart, Name, OBJPROP_XSIZE),
                                                          (int)ObjectGetInteger(chart, Name, OBJPROP_YSIZE));
    ObjectDelete(chartID, Name);
  }                    

  return(Res);
}


Применение

// Сохраняет в png-файлах все Bitmap-объекты текущего чарта
void OnStart()
{  
  for (int i = ObjectsTotal(0) - 1; i >= 0; i--)
  {
    const string Name = ObjectName(0, i);
    
    BitmapObjectToFile(0, Name, (string)ChartID() + "\\" + Name + ".png");    
  }      
}


ЗЫ Так же реализовывается конвертер файлов BMP->GIF/PNG.


В общем идея, как я понял, такая - без менеджера и пула просто по необходимости создаем объект-чарт, запускаем в нем worker-скрипт, отправляем веб-запрос и получаем результат (везде по прежнему плодим ресурсы для передачи данных), в завершении удаляем объект.

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

 

Статья интересная, но с самого начала возник вопрос: зачем нужны несколько графиков с экспертами и менеждером, если можно поместить функцию WebRequest() в параллельный индикатор  и наладить общение с экспертом через EventChartCustom()?

Советник будет посылать комманду индикатору, а тот будет делать WebRequest(), и возвращать результат в советник. Все асинхронно. 

 
Реter Konow:

Статья интересная, но с самого начала возник вопрос: зачем нужны несколько графиков с экспертами и менеждером, если можно поместить функцию WebRequest() в параллельный индикатор  и наладить общение с экспертом через EventChartCustom()?

Советник будет посылать комманду индикатору, а тот будет делать WebRequest(), и возвращать результат в советник. Все асинхронно. 

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

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