Скачать MetaTrader 5

Кнопка на графике для запуска скрипта.

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

Добрый день!

Требуется решить задачку и получить продукт, который будет возможно полезен многим.

В наличии имеется советник, который выводит на график кнопку BUTTON при нажатии на которую появляется

графический объект в виде прямоугольника : 

 

Также имеется часть кода для вставки в код советника, который "нажимает" сочетание клавиш Ctrl+буква или Alt+буква. С настройками по умолчанию нажимается Ctrl+T.

#import "user32.dll"
// Функция keybd_event синтезирует нажатие клавиши. Система может использовать такое синтезируемое нажатие клавиши, чтобы создать сообщение WM_KEYUP или WM_KEYDOWN.
// Вызывает функцию keybd_event программа обработки прерываний драйвера клавиатуры.
void     keybd_event(int bVk,          // Определяет код виртуальной клавиши. Код должен быть значением в диапазоне от 1 до 254.
                      int bScan,        // Этот параметр не используется (Scan = 0x45).
                      int dwFlags,      // Определяет различные виды операций функции. Этот параметр может состоять из одного или нескольких ниже следующих  значений.
                                        // KEYEVENTF_EXTENDEDKEY    - Если он установлен, скэн-коду предшествует префиксный байт, имеющий значение 0xE0 (224).
                                        // KEYEVENTF_KEYUP          - Если он установлен, клавиша была отпущена. Если не установлен, клавиша была нажата.
                      int dwExtraInfo); // Определяет дополнительное значение, связанное с нажатием клавиши.
                                        // Моделируем нажатие клавиши:                        keybd_event (VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY|0, 0);
                                        // Моделируем возврат клавиши в не нажатое состояние: keybd_event (VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
#import

#define PAUSE 10
#define VK_MENU 0x12 //ALT key
#define VK_CONTROL 0x11 //CTRL key

#property show_inputs
extern   int     CtrlAlt=0;   // Первая клавиша: 0 - Ctrl, 1 - Alt
extern   string  Key="T";     // Вторая клавиша

void start() {
    int FirstKey=VK_CONTROL;
    if(CtrlAlt==1)FirstKey=VK_MENU;
    int SecondKey=StringGetChar(Key,0);
    keybd_event(FirstKey,0,0,0);
    Sleep(PAUSE);
    keybd_event(SecondKey,0,0,0);
    Sleep(PAUSE);
    keybd_event(SecondKey,0,2,0);
    Sleep(PAUSE);
    keybd_event(FirstKey,0,2,0);
}

 Необходимо изменить советник так, чтобы при нажатии на кнопку на графике происходил запуск требуемого скрипта, вместо вывода прямоугольника.

Советник прикрепил.

Буду признателен за конструктив и помощь в решении задачки.

Спасибо.

Файлы:
RILAX
450
RILAX  
Актуально.
Ihor Herasko
14450
Ihor Herasko  

Не нужно виртуально нажимать никаких клавиш. Просто пропишите в обработчик нажатия кнопки вызов соответствующего скрипта через API:

#define MT4_MESSAGE "MetaTrader4_Internal_Message"
#define TA_SCRIPT_NAME "<имя скрипта>"

#import "user32.dll"
  int RegisterWindowMessageA(uchar &lParam[]);
  int SendMessageA(int hWnd, int Msg, int wParam, char &lParam[]);
#import

...
// Тело обработчика нажатой кнопки
    char buf[];
    StringToCharArray(MT4_MESSAGE, buf);
    int MT4InternalMsg = RegisterWindowMessageA(buf);
    StringToCharArray(TA_SCRIPT_NAME, buf);
    
    int hwnd = WindowHandle("<символ>", <таймфрейм>);
    if (hwnd < 0)
    {
      Alert("Заданное окно для запуска скрипта не найдено.");
      return;
    }
    
    SendMessageA(hwnd, MT4InternalMsg, 16, buf);       

 И всего то... 

RILAX
450
RILAX  

 Я не силен в программировании, к сожалению.

Не могли бы подсказать, куда нужно вставить ваш код?

RILAX
450
RILAX  
Актуально.
RILAX
450
RILAX  

Ihor Herasko , куда же вы пропали?

Не бросайте, помогите пожалуйста, ели можете.

Спасибо. 

Ihor Herasko
14450
Ihor Herasko  
Alligator:

 Я не силен в программировании, к сожалению.

Не могли бы подсказать, куда нужно вставить ваш код?

Вот код советника с кнопкой :

 

На этом форуме помогают советами. То есть указывают направление поисков для решения той или иной проблемы. А вот сделать за кого-то полную работу - это неправильно, т. к. не дает никакой пользы для обратившегося за помощью. Сделать за Вас - это во  Фриланс. Там оформят все в лучшем виде.
RILAX
450
RILAX  

Понял. Спасибо.

Когда-то и здесь помогали. Сейчас видимо все стали крутыми прогерами, за менее чем 100 баксов и слушать не станут. ))) 

Alexey Viktorov
16920
Alexey Viktorov  
Alligator:

Понял. Спасибо.

Когда-то и здесь помогали. Сейчас видимо все стали крутыми прогерами, за менее чем 100 баксов и слушать не станут. ))) 

А может быть раньше мерились *** а теперь стало лениво...
Ihor Herasko
14450
Ihor Herasko  
Alligator:

Понял. Спасибо.

Когда-то и здесь помогали. Сейчас видимо все стали крутыми прогерами, за менее чем 100 баксов и слушать не станут. ))) 

Здесь и продолжают помогать. 

Возможно, в Вашем понимании помощь - это попросил, и за тебя сделали. В моем понимании такой подход ведет к развращению человека, т. к. он просто так, без усилий, получает желаемое. В итоге такие люди не могут по достоинству оценить то, что получили. 

Так что тут только два выхода:

1) Поднапрячься, выучив хотя бы азы MQL4. Тогда все для решения Вашего вопроса уже есть. Затраченные Вами усилия на обучение как раз и приведут к пониманию ценности обретенного.

2) Оформить эту задачу как заказ во Фрилансе. На это Вы потратите свои денежные средства, которые уже цените, т. к. получили их, заработав в другой сфере деятельности. Итог - конечный продукт Вы цените как продукт своего труда.

RILAX
450
RILAX  

Я так понимаю что в вашем понимании бабушку через дорогу перевёл и пусть она заплатит, оценит так сказать ваш труд, )) 

не позволив усомниться что  она не оценила ваши титанические усилия.

Ваша философия понятна, дальше можно не дискутировать. ))

Удачи! 

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