Подскажите, как программно запустить скрипт при смене ТФ или открытии терминала

 

Неудобно при переключении периода запускать скрипт заново.

И при включении терминала прикреплять скрипты к графикам.

Может кто знает как программно это сделать?

 
Программно при старте почитайте в справке к терминалу (раздел Сервис-Конфигурация при старте). Ну а при смене таймфрейма никак, может есть смысл вынести логику скрипта в советник в таком случае?
 

При старте - я так понял, скрипт запускается на дополнительном графике.

А надо на одном из рабочих, которые были на момент закрытия.

-----------------------------

При смене ТФ - может попробовать послать в окно горячую клавишу?

Тогда вопрос - кто знает как запостить в окно Ctrl+символ или Alt+символ?

 
Erics >>:

. . .

Тогда вопрос - кто знает как запостить в окно 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?

опять поди тестер запустить надо?

 
Нет, надо чтобы скрипт не слетал при смене ТФ
 
Erics >>:
Нет, надо чтобы скрипт не слетал при смене ТФ

а код скрипта не будет работать в советнике или индюке?

 
Erics >>:

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);

    }
 
sabluk писал(а) >>

а код скрипта не будет работать в советнике или индюке?

Скрипт, естественно, зацикленный. В индюке работать не будет.

Если сделать зацикленный эксперт, то чтобы, например, торговать на этом графике вручную, надо чтобы в цикле был RefreshRates, и чтобы цикл был быстрый. Тогда тики пропускаться не будут.

Но несколько таких экспертов на чартах серьезно ударят по ресурсам компа.

А в скрипте я могу ставить большой Sleep, причем он не мешает приходу тиков и не грузит проц.

Например, у меня скрипт на нескольких чартах Sleep(2000) и больше, пока его окно неактивно. Советник пропустит тики.