Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Игорь
208
Игорь 2011.04.18 21:25 

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

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

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

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


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

Мне казалось, Вы уже на этом собаку съели, Вы больше всех этой проблемой занимаетесь.
Не обоснованное предположение!.. :(
Просто время от времени появляется необходимость вынужденного самообразования.
Игорь
208
Игорь 2011.04.19 00:30  
...Первую часть оказалось сделать проще:
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 - не находит нужных линий...
Кто-нибудь подскажет, в чём засада???
Алексей Тарабанов
7270
Алексей Тарабанов 2011.04.19 00:55  
IgRU4ek:
...Первую часть оказалось сделать проще:
Первый Print даёт не совсем ожидаемый результат. Предполагалось, что выделяя окно, я, например вызывая Symbol() должен получить символ выделенного окна, а не Родительского (на котором стоит советник):
и исходя из этого положения вещей советник не может "отработать" 2-ой Print - не находит нужных линий...
Кто-нибудь подскажет, в чём засада???

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

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

Alexander
2441
Alexander 2011.04.19 01:08  

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

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

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

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий