При старте - я так понял, скрипт запускается на дополнительном графике.
А надо на одном из рабочих, которые были на момент закрытия.
-----------------------------
При смене ТФ - может попробовать послать в окно горячую клавишу?
Тогда вопрос - кто знает как запостить в окно Ctrl+символ или Alt+символ?
Ilnur, спасибо, так и сделал.
Написал советник RestoreScripts, следящий за работой скриптов в окнах.
Теперь скрипт может оставаться на графике при смене периода или символа.
И добавил в советник возможность удалять выбранные скрипты без подтверждения при смене ТФ/символа.
(программно нажимается кнопка в окне "Вы действительно хотите удалить скрипт такой-то?")
---------------------------
Что нужно, что ваш скрипт оставался на графике при смене периода:
1. Назначить скрипту горячую клавишу.
2. Дописать в функцию deinit() скрипта код:
#define VK_MENU 0x12 // ALT key #define VK_CONTROL 0x11 // CTRL key int KeyCode = VK_CONTROL<<8 | '1'; int me = WindowHandle(Symbol(), Period()); if(UninitializeReason()==REASON_CHARTCHANGE) { GlobalVariableSet("RunScript"+me, KeyCode); } else GlobalVariableDel("RunScript"+me);
не забыв в 3-й строке прописать горячую клавишу (здесь - Ctrl+1)
3. Запустить советник RestoreScripts на одном из графиков, указав в параметрах имя вашего скрипта.
------------------------
У меня все работает, проверяйте.
PS. У кого-нибудь есть пример как в окно с хэндлом h послать сочетание клавиш типа Ctrl+key?
PS. У кого-нибудь есть пример как в окно с хэндлом h послать сочетание клавиш типа Ctrl+key?
опять поди тестер запустить надо?
PS. У кого-нибудь есть пример как в окно с хэндлом h послать сочетание клавиш типа Ctrl+key?
Насколько мне известно, горячие клавиши или так называемые акселераторы работают с активным на текущий момент окном программы.
Поэтому сочетание клавиш типа Ctrl+key нельзя посылать в неактивную область программы.
Ilnur, наверно можно все-таки, если дополнительно обновить "keyboard input-state table" в нужном потоке.
Вот это надо бы попробовать на MQL, может поможете?:
if (h != NULL) { HWND child = ::FindWindowEx(h,NULL,"Edit", NULL); UINT lparam_Ctrl1 = ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ; UINT lparam_A1 = ::MapVirtualKey((int)'A', 0) << 16 | 1 ; UINT lparam_A2 = 1 << 31 | 1 << 30 | ::MapVirtualKey((int)'A', 0) << 16 | 1 ; UINT lparam_Ctrl2 = 1 << 31 | 1 << 30 | ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ; DWORD pid; DWORD tid = GetWindowThreadProcessId(child, &pid); HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, pid); //Ctrl + A AttachThreadInput(GetCurrentThreadId(), tid, TRUE); LRESULT pl1_Ctrl = ::PostMessage(child, WM_KEYDOWN, VK_CONTROL, lparam_Ctrl1 ); WaitForInputIdle(hProc, INFINITE); BYTE state[256]; GetKeyboardState(state); state[VK_CONTROL] = 0x80; SetKeyboardState(state); LRESULT pl1_A = ::PostMessage(child, WM_KEYDOWN, (int)'A', lparam_A1 ); WaitForInputIdle(hProc, INFINITE); LRESULT pl2_A = ::PostMessage(child, WM_KEYUP, (int)'A', lparam_A2); WaitForInputIdle(hProc, INFINITE); LRESULT pl2_Ctrl = ::PostMessage(child, WM_KEYUP, VK_CONTROL, lparam_Ctrl2); WaitForInputIdle(hProc, INFINITE); /* GetKeyboardState(state); state[VK_CONTROL] = 0x0; SetKeyboardState(state); */ AttachThreadInput(GetCurrentThreadId(), tid, FALSE); }
Скрипт, естественно, зацикленный. В индюке работать не будет.
Если сделать зацикленный эксперт, то чтобы, например, торговать на этом графике вручную, надо чтобы в цикле был RefreshRates, и чтобы цикл был быстрый. Тогда тики пропускаться не будут.
Но несколько таких экспертов на чартах серьезно ударят по ресурсам компа.
А в скрипте я могу ставить большой Sleep, причем он не мешает приходу тиков и не грузит проц.
Например, у меня скрипт на нескольких чартах Sleep(2000) и больше, пока его окно неактивно. Советник пропустит тики.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Неудобно при переключении периода запускать скрипт заново.
И при включении терминала прикреплять скрипты к графикам.
Может кто знает как программно это сделать?