MQL4 Добавление индикатора на график из советника - страница 3

 
Georgiy Liashchenko:
sleep заработал, спасибо

Я использую код Алена, и он работает в том смысле, что появляется классическая форма индикатора с просьбой заполнить параметр, а затем нажать Ok для активации индикатора, и это похоже на ручное прикрепление индикатора. Возможно ли полностью автоматизировать всю операцию, даже установку необходимых параметров? Спасибо

 
alessandrovb:

Я использую код Алена, и он работает в том смысле, что появляется классическая форма индикатора с просьбой заполнить параметр, а затем нажать Ok для активации индикатора, и это похоже на ручное прикрепление индикатора. Возможно ли полностью автоматизировать всю операцию, даже установку необходимых параметров? Спасибо

Вам просто нужно добавить код для имитации нажатия клавиш, как вы это делаете вручную.
 
Alain Verleyen:

У меня нет этой проблемы (с кодом, который я разместил).

Проверьте, что значение hWnd отлично от 0.

Вы также можете попробовать увеличить значение sleep до 50 или 100.

Здравствуйте,

Этот комментарий многим помог, мне нужен другой вопрос,

Могу ли я обойти всплывающее окно ввода и использовать индикатор по умолчанию? Как кодировать?

Могу ли я удалить индикатор с графика?

 
Alain Verleyen:

Спасибо, это то, что я искал, я могу добавить свой пользовательский индикатор, только еще один вопрос, как его выгрузить?

 
Alain Verleyen:

Поздравляю, все работает нормально.

 
Alain Verleyen:

У меня нет этой проблемы (с кодом, который я разместил).

Проверьте, что значение hWnd отлично от 0.

Вы также можете попробовать увеличить значение sleep до 50 или 100.


Я использую ваш код, но у меня проблема с его названием.

2018.01.11 12:06:15.864 cannot open file 'C:\............\MQL4\indicators\MACDèõšp.ex4' [123]

2018.01.11 12:04:00.518 не может открыть файл 'C:\.............\MQL4\indicators\MACD. ex4' [123]

Первая строка возникает, когда

   uchar name2[4];

   name2[0]='M'; name2[1]='A'; name2[2]='C'; name2[3]='D';

   // StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));

Вторая строка возникает, когда

   uchar name2[];

   StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));


Я изменил первый код, теперь он работает!

   uchar name2[5];

   name2[0]='M'; name2[1]='A'; name2[2]='C'; name2[3]='D'; name2[4]=0;

   // StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));

Я думаю, что моя проблема связана с определением конца массива!
 

Всем привет!

Я хотел бы поблагодарить Георгия Лященко, и поделиться своей обновленной версией его кода, который добавляет индикатор прямо на график сAutomaticallyAcceptDefaults (когда он установлен на "true").

#import "user32.dll"
   int  RegisterWindowMessageW(string MessageName);
   int  PostMessageW(int hwnd,int msg,int wparam,uchar &Name[]);
   int  FindWindowW(string lpszClass,string lpszWindow);
#import

#define VK_RETURN 13 //ENTER key

void StartCustomIndicator(int hWnd,string IndicatorName,bool AutomaticallyAcceptDefaults=false)
{
   Sleep(100);
   uchar name2[];
   StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));
   int MessageNumber=RegisterWindowMessageW("MetaTrader4_Internal_Message");
   int r=PostMessageW(hWnd,MessageNumber,15,name2);
   Sleep(100);
   if(AutomaticallyAcceptDefaults) {
      int ind_settings = FindWindowW(NULL, "Custom Indicator - "+IndicatorName);
      PostMessageW(ind_settings,0x100,VK_RETURN,name2);
   }
}

int OnInit()
{
   int hWnd = WindowHandle(Symbol(), 0);
   StartCustomIndicator(hWnd, "Indicator_name");
   return(INIT_SUCCEEDED);
}

Надеюсь, это поможет некоторым людям, которым нужно вставлять индикаторы из эксперта.

Примечание: Я работаю для пользовательских индикаторов, в противном случае измените название окна.

Примечание2: Не используйте индикаторы с более чем 15 символами (до ".ex4").

 
Kray:

Всем привет!

Я хотел бы поблагодарить Георгия Лященко, и поделиться своей обновленной версией его кода, который добавляет индикатор прямо на график сAutomaticallyAcceptDefaults (когда он установлен на "true").

Надеюсь, это поможет некоторым людям, которым нужно вставлять индикаторы из эксперта.

Примечание: Я работаю для пользовательских индикаторов, в противном случае измените название окна.

Примечание2: Не используйте индикаторы с более чем 15 символами (до ".ex4").

Очень хорошо.


Я обнаружил, что использование:

int r=PostMessageW(hWnd,MessageNumber,13,name2);

Вместо использования:

int r=PostMessageW(hWnd,MessageNumber,15,name2);

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

 

Я получаю

'name2' - parameter conversion not allowed
сообщение об ошибке, когда я пытаюсь его скомпилировать?!

 

Kray:

Всем привет!

Хочу поблагодарить Георгия Лященко и поделиться своей обновленной версией его кода, который добавляет индикатор прямо на график сAutomaticallyAcceptDefaults (когда он стоит на "true").

......

if(AutomaticallyAcceptDefaults) {
      int ind_settings = FindWindowW(NULL, "Custom Indicator - "+IndicatorName);
      PostMessageW(ind_settings,0x100,VK_RETURN,name2);


Я использую MT4 v4.00 Build 1090 (19 мая 2017).

Функция PostMessageW вызывает крах моего терминала MT4, когда я использую ее из скрипта для размещения индикатора.

Я использовал SendMessageW как альтернативу для размещения индикатора, но, к сожалению, это означает, что нет способа закрыть диалоговое окно конфигурации, имитируя событие клавиатуры и нажатие клавиши Enter. Я думаю, это может быть связано с тем, что функция SendMessageW не возвращается, пока оконная процедура не обработает сообщение, что означает, что событие клавиатуры не может быть обработано, пока диалоговое окно не исчезнет. Это в свою очередь означает, что FindWindowW не будет работать, пока отображается диалоговое окно, поскольку SendMessageW не вернется, пока диалоговое окно не исчезнет.

Вся эта история стала для меня одним большим упражнением в разочаровании. Работает ли PostMessageW на последней сборке MT4? Кто-нибудь знает, как программно закрыть диалоговое окно конфигурации индикатора? Я ознакомился с двумя другими темами, попробовал их рекомендации и не добился успеха:

https://www.mql5.com/en/forum/155334

https://www.mql5.com/en/forum/115967

Может ли кто-нибудь просветить меня? Есть ли способ заставить PostMessageW работать, или закрыть диалоговое окно конфигурации каким-то другим способом?