Библиотеки: Expert - страница 8

 
Stanislav Korotky:

Все равно не понял, чем константное название Expert.mqh.tpl более "практическое" (практичное?), чем шаблоны, названные по имени программы, которые их плодят? Допустим есть программа A.mq5 и B.mq5, использующие библу. Если бы они генерировали шаблоны со своими именами было бы более практично, во-первых, иметь последний "отпечаток" действий _каждой_ программы, а не перезаписывать одно другим. Во-вторых, по имени сразу можно было бы видеть, кто есть генератор (особенно удобно, если программы чужие). Сейчас по файлу Expert.mqh.tpl этого не скажешь, пока внутрь не залезешь. Универсальное решение я привел - брать имя MQL-программы+таймстамп+рандом. И в оставлении файла при sync=true не вижу надобности. Вроде, давно все проверено и отлажено. В случае ошибок и необходимости отладки есть опция sync=false. Тогда файл следует оставлять. По-моему всё логично. И правки простые.

Согласен, что на практике коллизия может возникать редко, если только кто-то не будет использовать библу параллельно в нескольких программах. У меня такого нет, но я просто в код мимоходом глянул, да и за Expert.mqh.tpl глаз в папке Files "зацепился". Всё - сугубое имхо.

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

Совсем не хотел видеть в папке Files зоопарк tpl-файлов. Удалять что-то специально - аналогично. Удалял только здесь.

Возможность вызова DLL в Маркет-продуктах.
Возможность вызова DLL в Маркет-продуктах.
  • 2019.07.20
  • www.mql5.com
Возможно написание EX5 с вызовом DLL, который пройдет все проверки Маркета и будет там опубликован.В прицепе такой EX5-скрипт. Он запускает указанные приложения/документы.В прицепе еще один вариант
 
Vitaly Muzichenko:

Каким образом можно запустить советник в формате .ех4 подключив его в советнике с другим именем, при этом нужно чтоб отображались входные параметры, то есть была возможность полноценной работы с ним.

Имеем скомпилированный советник с названием "Trade.ех4"

Создаём новый советник с названием "Hand.ех4"

Как это совместить, чтобы при запуске "Hand.ех4" полноценно работал "Trade.ех4",   при этом "Trade.ех4" был вшит в "Hand.ех4"

То есть имеем на машине только файл Hand.ех4, а используем в работе Trade.ех4

Спасибо!

Вы нашли решение?

 
Vitaly Muzichenko:

Как это совместить, чтобы при запуске "Hand.ех4" полноценно работал "Trade.ех4",   при этом "Trade.ех4" был вшит в "Hand.ех4"

То есть имеем на машине только файл Hand.ех4, а используем в работе Trade.ех4

Должно получиться с индикаторами. Вроде, советники не вшиваются в другие советники.

 
fxsaber:

Должно получиться с индикаторами. Вроде, советники не вшиваются в другие советники.

Да, советник не получилось вшить, решение не найдено

 
Спасибо ребята!
 
Vitaly Muzichenko:

Да, советник не получилось вшить, решение не найдено

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

Возможность вызова DLL в Маркет-продуктах.
Возможность вызова DLL в Маркет-продуктах.
  • 2019.07.20
  • www.mql5.com
Возможно написание EX5 с вызовом DLL, который пройдет все проверки Маркета и будет там опубликован.В прицепе такой EX5-скрипт. Он запускает указанные приложения/документы.В прицепе еще один вариант
 
fxsaber:

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

Вот Я когда пробовал, то не нашёл ни единого способа. Касалось четвёрки, на пятёрке не пробовал.

 

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

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

fxsaber, 2020.05.21 09:13

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

// Выгружает себя, если после смены счета отсутствует символ.
void OnDeinit( const int Reason )
{
  if (Reason == REASON_ACCOUNT)
  {
    MqlTick Tick;
    
    if (!SymbolInfoInteger(_Symbol, SYMBOL_CUSTOM) && !SymbolInfoTick(_Symbol, Tick))
    {
      Alert("Account is changed!");
      
      if (EXPERT::Remove())
        Alert("Expert is removed!");
      
      // ExpertRemove(); // Не поможет.
      // ChartClose();   // Не лучшее решение.
    }
//  else
      // Для кастомных и других случаев дополнить код следущим решением.
      // https://www.mql5.com/ru/forum/170952/page175#comment_16365819    
  }  
}
 
fxsaber:
Классная библиотека!  Я бы не додумался так реализовать открытие эксперта. А Вы еще не подскажете, как определить активный график средствами mql без использования dll. Я тут накодил на winapi, получилось слишком громоздко:
long                          Agent::ChartGetActiveID()
  {
   static long                terminal_wnd = ChartGetInteger(0,CHART_IS_DOCKED) ?
                              GetAncestor(ChartGetInteger(0, CHART_WINDOW_HANDLE), 2) :
                              GetParent(GetAncestor(ChartGetInteger(0, CHART_WINDOW_HANDLE), 2));

   static uint                process_id = 0;
   static uint                thread_id = GetWindowThreadProcessId(terminal_wnd, process_id);
   static long                mdi_wnd = GetDlgItem(terminal_wnd, 0xE900);
   static GUITHREADINFO       thread_info;


   thread_info.cbSize = sizeof(GUITHREADINFO);
   if(!GetGUIThreadInfo(thread_id, thread_info))
      return -1;

   long wnd_on_focus = 0, chart_id = -1;
   if(GetDlgItem(thread_info.hwndActive, 0xE900)== mdi_wnd)
      wnd_on_focus = GetWindow(SendMessageW(mdi_wnd, 0x0229, 0, 0), 5);
   else
      wnd_on_focus = GetWindow(thread_info.hwndActive, 5);

   for(long ch_id = ChartFirst(); ch_id != -1; ch_id = ChartNext(ch_id))
      if(ChartGetInteger(ch_id, CHART_WINDOW_HANDLE)==wnd_on_focus)
        {
         chart_id = ch_id;
         break;
        }
   return chart_id;
  }

Может быть знаете, как это дело реализовать на mql или хотя бы с dll, но попроще?

 
vek_y4icb:
как определить активный график средствами mql без использования dll.

Не помню точно. Вроде, решалась эта задача. Возможно, поиск поможет.