Как получить список дескрипторов открытых в терминале окон? - страница 2

 
Roger:

Ну, первое конечно проще, поставьте

А вот со вторым - засада. ObjectFind ищет только в основном окне и прилегающих к нему окнах индикаторов и никак в других. Кстати и WindowsTotal() показывает количество подокон в основном окне, включая основное.

Как совет, можно попробовать сделать индикатор в виде горизонтальных линий и снимать показания по iCustom().

Про индикатор не понял идею, если не сложно, поподробнее?!
 
IgRU4ek:
Про индикатор не понял идею, если не сложно, поподробнее?!


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

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

 
Roger:


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

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

Горизонтальная линия задаёт уровень цены - это аналог отложенных ордеров, но виртуальный, причём проводя проверку нахождения цены относительно этого уровня, задавая интервал этой проверки, скажем на начале M1 или M5, я получаю возможность удостовериться, что уровень цены устойчив, а не "случайно" задел мой отложенник тенью свечи.

Мне нужно управлять всем этим процессом слежения и выставления ордеров из одного "центра" и написание лишних советников-индикаторов не приветствуется, а тем более вешание их на другие чарты, по крайней мере пока я не убежусь, что без использования этого дополнительного кода моя идея не дееспособна...
А написать отдельного советника, который бы следил за горизонтальной линией и по необходимости выставлял ордера - нет проблем, у меня скрипт такой написан (он в отличие от советника это делает одноразово), но в этом случае, нужно вешать такого советника в каждое окно, где хочешь выставить ордер, а это не совсем элегантное решение... ;)

 

!!!Я всегда считал, что безвыходных ситуаций НЕ БЫВАЕТ!!!

Проверку наличия горизонтальной линии может делать простенький скрипт, запускаемый в каждом открытом окне функцией:

 // 4.8. Функция загружает на указанный график скрипт по его имени. В случае успеха функция возвращает TRUE, иначе - FALSE.
 bool ServiceLoadScript(int    hChart,        // Системный дескриптор окна графика, куда загружается скрипт.
                        string szNameScript); // Имя загружаемого скрипта.

и передавать, если нашёл заданную линию, значение нужного уровня в глобальную переменную, значение которой и будет считывать советник, а затем принимать необходимые действия!!! :)

 
У меня есть метод собирающий все дескрипторы графиков. Если хотите, могу сделать из него функцию и добавлю в библиотеку SeviceMT4.dll?
 
Zhunko:
У меня есть метод собирающий все дескрипторы графиков. Если хотите, могу сделать из него функцию и добавлю в библиотеку SeviceMT4.dll?
Хорошая (нужная) у Вас библиотека (SeviceMT4.dll). Тем методом (перебором всех возможных комбинаций Symbol-Period), который использовал я, задача решена не лучшим способом, и если, Вы выведете в код более грамотный метод, то ещё раз огромное Вам спасибо!!!

Правда, при попытке заменить предыдущую версию библиотеки на последнюю, с трудом загружается терминал (на одном из чартов расположен советник, который в init() вызывает (точнее пытается вызвать) упомянутую:

ServiceLoadScript()

а затем терминал вылетает с ошибкой. До конца инициализация советника не происходит. Попробовал несколько раз - один и тот же результат...
Пришлось произвести обратную замену... :(

 
IgRU4ek:
Хорошая (нужная) у Вас библиотека (SeviceMT4.dll). Тем методом (перебором всех возможных комбинаций Symbol-Period), который использовал я, задача решена не лучшим способом, и если, Вы выведете в код более грамотный метод, то ещё раз огромное Вам спасибо!!!

Правда, при попытке заменить предыдущую версию библиотеки на последнюю, с трудом загружается терминал (на одном из чартов расположен советник, который в init() вызывает (точнее пытается вызвать) упомянутую:

ServiceLoadScript()

а затем терминал вылетает с ошибкой. До конца инициализация советника не происходит. Попробовал несколько раз - один и тот же результат...
Пришлось произвести обратную замену... :(

Где Ваш неработающий код? У меня работает эта функция в ините.
 
Zhunko:
Где Ваш неработающий код? У меня работает эта функция в ините.
На предыдущей версии библиотеки - всё нормально работает, а новая версия не запустилась... :(
Может XP что-то вытворяет, может ещё что-то, но факт есть факт.
 
Как говорят Метаквоты, нет кода - нет факта :-)) Стало быть, всё работает.
 
Zhunko:
Как говорят Метаквоты, нет кода - нет факта :-)) Стало быть, всё работает.
Ничего принципиально нового из уже представленного мной кода нет (только название функции поменял):
void fGetLevelFromHLine (string ArraySymbols[], double& ArrayLevel[][])
{
    int    li_handle, li_Type, li_TotalGV, li_Range = ArraySize (ArraySymbols),
           lia_Periods[] = {1,5,15,30,60,240,1440,10080,43200};
    double ld_PriceOpen;
    string ls_Name, ls_Symbol, ls_txt;
    bool   lb_break;
//----
    for (int li_SMB = 0; li_SMB < li_Range; li_SMB++)
    {
        li_Type = -1;
        ls_Symbol = ArraySymbols[li_SMB];
        for (int li_PRD = 0; li_PRD < 9; li_PRD++)
        {
            lb_break = false;
            ls_txt = "";
            //---- Поочерёдно перебираем все возможные комбинации Symbol-Period
            li_handle = WindowHandle (ls_Symbol, lia_Periods[li_PRD]);
            if (li_handle > 0)
            {
                //---- Перепроверяем наличие окна по найденному дескриптору
                if (ServiceIsChart (li_handle))
                {
                    //---- Загружаем скрипт для поиска и определения уровней для выставления ордеров
                    if (ServiceLoadScript (li_handle, "CheckLevelFromHLine"))
                }
            }
        }
    }
}
Ну, и собственно, вызов этой функции из init().
Этот код рабочий со старой версией библиотеки (я в который раз повторяюсь).
Причина обращения: