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

 

Задача: из советника перебрать по очереди все открытые в терминале окна и при наличии на графике горизонтальной линии с определённым именем, а также пересечении ценой этой линии, например, "OpenPrice_BUY" снизу вверх, выставить по паре графика BUY-ордер с заданным лотом. Пожалуйста (для особо догадливых), не нужно мне предлагать использовать отложенные ордера...

Как решить первую часть данной задачи? HELP!!!

 
А чем Вас не устраивает перебор окон по WindowsTotal()?
 
Roger:
А чем Вас не устраивает перебор окон по WindowsTotal()?
Я с "кухней" программирования на уровне терминала совсем не знаком. Для того, чтобы, например, воспользоваться библиотекой ServicesMT4.dll, в функцию нужно передать дескриптор окна, а не номер этого самого окна. В частности:
 // 2.7. Функция делает окна МТ4 и графика активными.
 void ServiceSetActiveChart(int hChart); // Системный дескриптор активируемого окна.

Может быть я и усложняю себе задачу. Я изложил задачу, которую мне нужно решить. Как использовать для её решения номера окон из WindowsTotal()?
Как я понимаю, нужно поочерёдно каждое открытое в терминале окно сделать активным и в нём произвести поиск необходимого графического объекта?! Или я что-то не так понимаю??? Или есть другой - более простой\элегантный способ???
 
Повесить на каждый график по следилке. Все равно у графика можно узнать только свой дескриптор.
 
TheXpert:
Повесить на каждый график по следилке. Все равно у графика можно узнать только свой дескриптор.
Не элегантное решение... :(
 
Кому как...
 
IgRU4ek:
Не элегантное решение... :(


Мне казалось, Вы уже на этом собаку съели, Вы больше всех этой проблемой занимаетесь.
 
Roger:

Мне казалось, Вы уже на этом собаку съели, Вы больше всех этой проблемой занимаетесь.
Не обоснованное предположение!.. :(
Просто время от времени появляется необходимость вынужденного самообразования.
 
...Первую часть оказалось сделать проще:
void fSendOrdersFromHLine (string ar_Symbols[], double ar_Price[][2], int ar_MyOrders[][3], int iMAX_Orders = 1)
{
    int    li_handle, cmd, li_Type = -1, li_Range = ArraySize (ar_Symbols),
           lia_Periods[] = {1,5,15,30,60,240,1440,10080,43200},
           li_Base_Handle = WindowHandle (Symbol(), Period()); // дескриптор окна советника
    double ld_PriceOpen, ld_Price, ld_SL, ld_TP, ld_Distance = 20;
    bool   lb_Send = false;
//----
    for (int li_SMB = 0; li_SMB < li_Range; li_SMB++)
    {
        for (int li_PRD = 0; li_PRD < 9; li_PRD++)
        {
            //---- Поочерёдно перебираем все возможные комбинации Symbol-Period
            li_handle = WindowHandle (ar_Symbols[li_SMB], lia_Periods[li_PRD]);
            if (li_handle > 0)
            {
                //---- Выделяем окно по найденному дескриптору
                if (ServiceIsChart (li_handle))
                {
                    ServiceSetActiveChart (li_handle);
                    Sleep (300);
                    Print ("Нашли открытое окно !!! Handle = ", li_handle, "; Symbol = ", Symbol(), "; Period = ", Period()); 
                    if (ObjectFind ("OpenPrice_BUY") == 0)
                    {
                        li_Type = OP_BUY;
                        ld_PriceOpen = ObjectGet ("OpenPrice_BUY", OBJPROP_PRICE1);
                        break;
                    }
                    if (ObjectFind ("OpenPrice_SELL") == 0)
                    {
                        li_Type = OP_SELL;
                        ld_PriceOpen = ObjectGet ("OpenPrice_SELL", OBJPROP_PRICE1);
                        break;
                    }
                }
            }
        }
        if (li_Type >= 0)
        {Print ("Готовимся выставить ордер-", GetNameOP (li_Type), " !!!");}
    }
}
Первый Print даёт не совсем ожидаемый результат. Предполагалось, что выделяя окно, я, например вызывая Symbol() должен получить символ выделенного окна, а не Родительского (на котором стоит советник):
2011.04.19 01:22:17     EURUSD,M30: Нашли открытое окно !!! Handle = 68326; Symbol = EURUSD; Period = 30
2011.04.19 01:22:17     EURUSD,M30: Нашли открытое окно !!! Handle = 199406; Symbol = EURUSD; Period = 30
2011.04.19 01:22:16     EURUSD,M30: Нашли открытое окно !!! Handle = 68308; Symbol = EURUSD; Period = 30
2011.04.19 01:22:16     EURUSD,M30: Нашли открытое окно !!! Handle = 199376; Symbol = EURUSD; Period = 30
2011.04.19 01:22:16     EURUSD,M30: Нашли открытое окно !!! Handle = 395992; Symbol = EURUSD; Period = 30
2011.04.19 01:22:15     EURUSD,M30: Нашли открытое окно !!! Handle = 68320; Symbol = EURUSD; Period = 30
и исходя из этого положения вещей советник не может "отработать" 2-ой Print - не находит нужных линий...
Кто-нибудь подскажет, в чём засада???
 
IgRU4ek:
...Первую часть оказалось сделать проще:
Первый Print даёт не совсем ожидаемый результат. Предполагалось, что выделяя окно, я, например вызывая Symbol() должен получить символ выделенного окна, а не Родительского (на котором стоит советник):
и исходя из этого положения вещей советник не может "отработать" 2-ой Print - не находит нужных линий...
Кто-нибудь подскажет, в чём засада???

Засада в том, что первичен - символ. Вы его называете окном, откуда весь кавардак.

На график символа наброшен эксперт. Никаких других графиков он видеть не умеет. Видит лишь окна графика текущего символа (0-9), что и делает в Вашем примере.

 

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

Print ("Нашли открытое окно !!! Handle = ", li_handle, "; Symbol = ", ar_Symbols[li_SMB], "; Period = ", lia_Periods[li_PRD] );

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

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