Скачать MetaTrader 5

Как получить дескриптор окна???

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Игорь
208
Игорь  
Из советника, стоящего на одном чарте, я закрываю соседний чарт с индикаторами (в целях перезагрузки индюков), затем восстанавливаю это окно с индикаторами. И как мне узнать дескриптор этого восстановленного окна, чтобы (если есть необходимость) сменить его период???
//+------------------------------------------------------------------+
// Закрывает\открывает окно удаленного графика с дескриптором hwnd   |
//+------------------------------------------------------------------+
bool fRefreshChart (int hwnd, int i_Period = 0, bool bCondition = false)
{
    int err = GetLastError();
    if (ServiceCloseChart (hwnd))
    {
        Print ("Закрыли окно ", hwnd, "!!!");
        Sleep (PAUZE);
        if (OpenDeletedChart (0, i_Period, bCondition))
        {return (true);}
    }
    else
    {Print ("Не закрыли окно ", hwnd, "!!!");}
//----
    return (false);
}

и вторая, используемая функция:

//+------------------------------------------------------------------+
// Открывает окно удаленного графика с номером NumChart (нумерация с нуля)
//+------------------------------------------------------------------+
bool OpenDeletedChart (int NumChart, int iPeriod = 0, bool Condition = false)
{
    int hwnd = fWindowHandle();
    int li_hWnd = ???;
    int err[] = {0};
//----
    hwnd = GetAncestor (hwnd, GA_ROOT);
    NumChart += 35000;  
    if (PostMessageA (hwnd, WM_COMMAND, NumChart, err) > 0)
    {
        if (Condition && iPeriod > 0)
        {
            if (ServiceIsChart (li_hWnd))
            {ServiceSetTimeframeByPeriod (li_hWnd, iPeriod);}
        }
        return (true);
    }
//----
    return (false);
}

Функции :

void ServiceSetTimeframeByPeriod (int hChart, int nPeriod);
bool ServiceIsChart(int hChart);

из Библиотеки "ServicesMT4.dll" - сервисные функции для терминала МТ4.

Vadim Zhunko
5226
Vadim Zhunko  
В библиотеке "ServicesMT4.dll"  функция, открывающая удалённый график, возвращает дескриптор открытого окна.
Игорь
208
Игорь  
Zhunko:
В библиотеке "ServicesMT4.dll" функция, открывающая удалённый график, возвращает дескриптор открытого окна.


Автору легче ориентироваться в своём детище, а я не вижу в упомянутой библиотеке функции, открывающей удалённый график:

 //21. Функция открывает окно графика символа, расположенного в окне "Обзор рынка" по имени инструмента, и устанавливает период графика.
 //    Функция, в случае удачи, возвращает системный дескриптор открытого графика. Иначе - NULL.
 int ServiceOpenChartByName(string sNameTool,   // Имя инструмента в окне "Обзор рынка".
                            string sTimeFrame); // Имя устанавливаемого ТФ:  ""     пустая строка или NULL не меняет ТФ открытого графика.
                                                //                          "M1"    1 минута;
                                                //                          "M5"    5 минут;
                                                //                          "M15"  15 минут;
                                                //                          "M30"  30 минут;
                                                //                          "H1"    1 час;
                                                //                          "H4"    4 часа;
                                                //                          "D1"    1 день;
                                                //                          "W1"    1 неделя;
                                                //                          "MN1"   1 месяц.
 //===================================================================================================================================================
 //22. Функция открывает окно графика символа, расположенного в строке nLine окна "Обзор рынка".
 //    Функция, в случае удачи, возвращает системный дескриптор открытого графика. Иначе - NULL.
 int ServiceOpenChartByNumber(int    nLine,     // Номер строки в окне "Обзор рынка".
                              string szSymbol); // Указатель на буфер со строкой символа инструмента, находящегося в указанной строке списка.
                                                // Строка должна быть инициализирована не менее 12-ю символами.
 //===================================================================================================================================================
 //23. Функция открывает окно автономного графика. Функция, в случае удачи, возвращает системный дескриптор открытого графика. Иначе - NULL.
 int ServiceOpenOfflineChart(string sSymbol,  // Имя инструмента.
                             string sPeriod); // Период. Примеры: M1, M2, M5, H1, H12, Daily, Weekly, Monthly, D90, D360, D1440.

"Обзор рынка" здесь ни при чём и оффлайн (автономный график) тоже не из "той оперы"... :(

Мне нужен дескриптор именно последнего удалённого, а затем восстановленного окна, на котором находятся нужные мне индикаторы.

Vadim Zhunko
5226
Vadim Zhunko  
А ниже посмотреть?
 // 5.6. Функция открывает окно удалённого графика и возвращает его системный дескриптор.
 int ServiceOpenDeletetChart(int nChart); // Номер графика в списке удалённых графиков.
Vadim Zhunko
5226
Vadim Zhunko  
Понял. У Вас версия библиотеки старая.
Игорь
208
Игорь  
Zhunko:
А ниже посмотреть?

СПАСИБО!!! У меня не та версия Вашей библиотеки!... :)
Vadim Zhunko
5226
Vadim Zhunko  
Только, что новую версию выложил (0.12.6.1). Завтра, наверно, появится.
Игорь
208
Игорь  
Zhunko:
Только, что новую версию выложил (0.12.6.1). Завтра, наверно, появится.


Имхо, Вы зря изменили тип функции ServiceCloseChart (int hChart) с bool на void заменили - приходится лишнюю проверку (ServiceIsChart (int hChart)) производить - лишние телодвижения...

Кстати, используя Вашу функцию ServiceOpenDeletetChart (int nChart) - закрытый чарт открывает, но затем фиксирует ошибку при попытке получить дескриптор открытого окна (Ошибка в методе: "MetaTrader4:: Windows::OpenDeletetChart()". Системный дескриптор окна графика не получен.). Несколько раз пытался произвести данную опреацию (в 3-ёх случаях из 10) терминал вообще вылетал с критической ошибкой.

Используемые функции:

//+------------------------------------------------------------------+
// Закрывает\открывает окно удаленного графика с дескриптором hwnd   |
//+------------------------------------------------------------------+
bool fRefreshChart (int hwnd, int i_Period = 0, bool bCondition = false)
{
    int err = GetLastError();
    if (ServiceIsChart (hwnd))
    {
        ServiceCloseChart (hwnd);
        Print ("Закрыли окно ", hwnd, "!!!");
        Sleep (PAUZE);
    }
    else
    {Print ("Окна с дескриптором ", hwnd, " НЕ СУЩЕСТВУЕТ !!!");}
    if (!ServiceIsChart (hwnd))
    {
        Sleep (PAUZE);
        if (OpenDeletedChart (0, i_Period, bCondition))
        {return (true);}
        else
        {Print ("fRefreshChart(): Удалённое окно НЕ ВОССТАНОВИЛИ !!!");}
    }
    //---- Контролируем возможные ошибки
    fGetLastError ("fRefreshChart():");
//----
    return (false);
}

и

//+------------------------------------------------------------------+
// Открывает окно удаленного графика с номером NumChart (нумерация с нуля)
//+------------------------------------------------------------------+
bool OpenDeletedChart (int NumChart, int iPeriod = 0, bool Condition = false)
{
    int hWnd = ServiceOpenDeletetChart (NumChart);
//----
    if (hWnd > 0)
    {
        if (Condition && iPeriod > 0)
        {
            if (ServiceIsChart (hWnd))
            {ServiceSetTimeframeByPeriod (hWnd, iPeriod);}
        }
        return (true);
    }
    else
    {Print ("OpenDeletedChart(): Удалённое окно НЕ ВОССТАНОВИЛИ !!!");}
    //---- Контролируем возможные ошибки
    fGetLastError ("OpenDeletedChart():");
//----
    return (false);
}

В новой версии библиотеки что-то исправлено в методе, дающем такую ошибку???

Vadim Zhunko
5226
Vadim Zhunko  
IgRU4ek:


Имхо, Вы зря изменили тип функции ServiceCloseChart (int hChart) с bool на void заменили - приходится лишнюю проверку (ServiceIsChart (int hChart)) производить - лишние телодвижения...

Кстати, используя Вашу функцию ServiceOpenDeletetChart (int nChart) - закрытый чарт открывает, но затем фиксирует ошибку при попытке получить дескриптор открытого окна (Ошибка в методе: "MetaTrader4:: Windows::OpenDeletetChart()". Системный дескриптор окна графика не получен.). Несколько раз пытался произвести данную опреацию (в 3-ёх случаях из 10) терминал вообще вылетал с критической ошибкой.

Используемые функции:

и

В новой версии библиотеки что-то исправлено в методе, дающем такую ошибку???

Да. Именно это исправил. У меня на Висте всё работает. А на ХР возможны проблемы. По этому вернул обратно всё.
Файлы:
servicesmt4.rar 155 kb
Игорь
208
Игорь  
Zhunko:
Да. Именно это исправил. У меня на Висте всё работает. А на ХР возможны проблемы. По этому вернул обратно всё.

Я на второй раздел винта (для ближайшего знакомства) поставил параллельно XP Windows 7. Если я правильно Вас понял, то для 7-ки нужно оставить "предыдущую" версию "ServicesMT4.dll"? А для XP положить последнюю - "завтрашнюю"? :)
Vadim Zhunko
5226
Vadim Zhunko  
Лучше везде последнюю. Она надёжнее.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий