Вызов меню свойств индикатора. - страница 4

 
Zhunko писал (а) >>

Мне эта игрушка нужна была для быстрого вызова свойств индикатора. Частое обращение к свойствам индикатора приводит к повышенной стираемости кнопок мыши.

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

 
Integer писал (а) >>

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

А у меня такая уже есть. Почти такая.

Logitech VX Nano

А ещё у неё можно снять фиксацию колёсика. Колёсико тяжёлое, если его крутануть без фиксации, оно будет очень долго вращаться.

 

Провел небольшое исследование оконных операций терминала при выполнении определенных действий.

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

ForexTools писал (а) >>

Может, но по скольку обычно(?) там один индикатор - меня устроит получить параметры самого первого ;) За другими буду лазить ручками.

Да и после найденного первого, в списке "курсор" будет стоять на первом, и если мне нужно другой, значит я просто закрою окно параметров для первого - ручками перейду на одну строчку вниз и получу параметры для второго (все же меньше движений).


В архиве есть два скрипта, которые возможно Вас устроят:

1. IndicatorPropertyOnDropped - доступ к свойствам конкретного индикатора. Перетаскиваете скрипт на индикатор, свойства которого нужно вызвать. 
2. IndicatorPropertyFromWindow - вызов свойства первого индикатора в окне, куда был брошен скрипт. 

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

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

Во втором случае скрипт достаточно сбросить в окно, содержащий индикатор.


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

granit77 писал (а) >>

Ilnur, в скрипте с выбором строки по имени индикатора описка: break стоит раньше нажатия ОК.


Это не описка. Я специально в целях демонстрации написал код таким образом.

 

Отличная подборочка, особенно IndicatorPropertyOnDropped - это именно то, что мне было нужно. Можно для полноты коллекции добавить еще просто вызов "пункта меню Обновить" - иногда его вполне может хватить и можно будет не прибегать к Reinit.

PostMessageA(WindowHandle(Symbol(),Period()),WM_COMMAND,33324,0);
 
ForexTools писал (а) >>

Отличная подборочка, особенно IndicatorPropertyOnDropped - это именно то, что мне было нужно. Можно для полноты коллекции добавить еще просто вызов "пункта меню Обновить" - иногда его вполне может хватить и можно будет не прибегать к Reinit.


Я знаком с кодом команды для вызова пункта меню "Обновить". Однако решил не включать её в данный набор скриптов. 


Причина была в следующем: все представленные скрипты я проверял при наличии и отсутствии соединения с сервером.  Они работают корректно в обоих случаях.

Когда же я вызвал функцию "Обновить" при отсутствии соединения, то лог программы (вкладка Журнал) начал бесконечно заполняться сообщениями вида

HistoryCenter: synchronize 'EURUSD240'. Остановить этот поток я смог только перезагрузкой терминала.  При наличии соединения обновление происходит корректно.

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

 
Ilnur писал (а) >>

. . .

Имя узла возвращается через указатель в структуре TV_ITEM.

В MQL4 нет возможности обратиться по указателю.

. . .

В контексте данной задачи (вызов меню свойств индикатора) решение все таки есть. Ниже прикрепляю скрипт выполняющий поиск индикатора по имени.

В отличие от ранее выкладываемых решений, здесь нет необходимости вызова окна свойств каждого индикатора. Таким образом, отсутствует

мелькание вызываемых окон при поиске.


P.S. Данный скрипт выложен в качестве демонстрации работы с указателями в MQL4. Поэтому применять его стоит с осторожностью.

Файлы:
 

Ilnur, по мотивам Вашего скрипта для вызова свойств индикатора написал функцию.

Функция работает, но строка с функцией закрывающей окно свойств индикатора работает странно.

// Вызов окна свойств индикатора.
void ShowIndicatorProperties (int&    Handle,        // Системный дескриптор окна, где находится индикатор.
                              string& IndicatorName) // Имя индикатора.
 {
  int hParent, hListDlg, hTree, hDlg;
  int nTreeCount;
  string lpString = "";
  //----
  hParent = GetAncestor (Handle, 2);                       // Получаем дескриптор основного окна терминала.
  if (hParent != 0)
   {
    PostMessageA (hParent, WM_COMMAND, 35419, 0);          // Вызываем окно "Список индикаторов".
    Sleep (100);
    hListDlg = GetLastActivePopup (hParent);               // Определяем дескриптор.
    //----
    hTree = GetDlgItem (hListDlg, 0x48C);                  // Находим список индикаторов.
    nTreeCount = SendMessageA (hTree, TVM_GETCOUNT, 0, 0); // Определяем длину списка.
    PostMessageA (hTree, WM_KEYDOWN, VK_HOME, 0);          // Верхняя строка списка.
    for (int i = 1; i < nTreeCount; i++)                   // Перебираем весь список.
     {
      PostMessageA (hTree, WM_KEYDOWN, VK_DOWN, 0);                             // Смещаемся на следующую позицию списка.
      if (IsWindowEnabled (GetDlgItem (hListDlg, 0x48B)) == 0) continue;
      PostMessageA (hListDlg, WM_COMMAND, 0x48B, GetDlgItem (hListDlg, 0x48B)); // Вызываем окно свойств индикатора.
      Sleep (100);
      hDlg = GetLastActivePopup (hParent);                                      // Определяем дескриптор.
      GetWindowTextA (hDlg, lpString, GetWindowTextLengthA (hDlg) + 1);         // Считываем заголовок окна.
      if (StringFind (lpString, IndicatorName, 0) >= 0) return;                 // Если нашли нужный индикатор, прерываем цикл.
      else
       {
        PostMessageA (hDlg, WM_COMMAND, 0x001, GetDlgItem (hDlg, 0x001));       // Нажимаем кнопку "ОК", закрываем окно, если имя индикатора не подходит.
       }
     }
   }
 }

Если индикатор в списке один, то всё в порядке.

Если индикаторов много, то все открытые окна сразу закрываются. Хотя выход из функции начинается раньше, чем вызов функции для закрытия окна.

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

Может её надо принудительно прекращать? Есть функция "Убить процесс". "Kill()" кажется. Хотя, она убивает процессы, связанные с конкретным файлом.


 

Кое чего понял. Вот, что написано в справочнике:

"Возвpат из функции осуществляется только после обpаботки сообщения."

 

как вариант можно просто менять шаблон с нужными настройками/индикаторами

PostMessageA(hwnd_parent,WM_COMMAND,34801,0);
3480х последняя цифра порядковый номер шаблона из выпадающего списка (отсчет с нуля, т е 1 это второй в списке)

 

Интересный вариант. Спасибо!

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