А чем Вас не устраивает перебор окон по WindowsTotal()?
Roger:
А чем Вас не устраивает перебор окон по WindowsTotal()?
Я с "кухней" программирования на уровне терминала совсем не знаком. Для того, чтобы, например, воспользоваться библиотекой ServicesMT4.dll, в функцию нужно передать дескриптор окна, а не номер этого самого окна. В частности:А чем Вас не устраивает перебор окон по WindowsTotal()?
// 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 - не находит нужных линий...
Кто-нибудь подскажет, в чём засада???
...Первую часть оказалось сделать проще:
Первый Print даёт не совсем ожидаемый результат. Предполагалось, что выделяя окно, я, например вызывая Symbol() должен получить символ выделенного окна, а не Родительского (на котором стоит советник):
и исходя из этого положения вещей советник не может "отработать" 2-ой Print - не находит нужных линий...
Кто-нибудь подскажет, в чём засада???
Засада в том, что первичен - символ. Вы его называете окном, откуда весь кавардак.
На график символа наброшен эксперт. Никаких других графиков он видеть не умеет. Видит лишь окна графика текущего символа (0-9), что и делает в Вашем примере.
Ну, первое конечно проще, поставьте
Print ("Нашли открытое окно !!! Handle = ", li_handle, "; Symbol = ", ar_Symbols[li_SMB], "; Period = ", lia_Periods[li_PRD] );
А вот со вторым - засада. ObjectFind ищет только в основном окне и прилегающих к нему окнах индикаторов и никак в других. Кстати и WindowsTotal() показывает количество подокон в основном окне, включая основное.
Как совет, можно попробовать сделать индикатор в виде горизонтальных линий и снимать показания по iCustom().
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Задача: из советника перебрать по очереди все открытые в терминале окна и при наличии на графике горизонтальной линии с определённым именем, а также пересечении ценой этой линии, например, "OpenPrice_BUY" снизу вверх, выставить по паре графика BUY-ордер с заданным лотом. Пожалуйста (для особо догадливых), не нужно мне предлагать использовать отложенные ордера...
Как решить первую часть данной задачи? HELP!!!