Win Api - Long & Short

 

Написал как управлять через winapi  чекбоксами

настройки советника - Общие

- разрешить DLL

- Разрешить советнику торговать


Не получается разобраться как контролировать и управлять - Long & Short  - Only Long - Only Short

Подозреваю что надо использовать  DlgDirListComboBox  и DlgDirSelectComboBox

а как?



#include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor(int hWnd, int gaFlags);
   int GetDlgItem(int hDlg, int nIDDlgItem);
   int GetLastActivePopup(int hWnd);
   int IsDlgButtonChecked(int hdlg, int idButton);
   int CheckDlgButton(int hdlg, int idButton, uint check);
#import

void start()
{
   int hMetaTrader, hDlg,  hChart = WindowHandle(Symbol(),Period());
   
   int Nastroy;
   
   hMetaTrader = GetAncestor(hChart,2);          //дескриптор основного окна терминала
   
   PostMessageA(hMetaTrader,WM_COMMAND,33048,0); //вызываем окно свойств советника
   Sleep(100);
   
   hDlg = GetLastActivePopup(hMetaTrader);       //получаем дескриптор всплывающего окна
   Print("hDlg= ", hDlg);
   
    
   
   
   Nastroy = GetDlgItem(hDlg, 0);             //определяем дескриптор Настройки
   
   Print("Nastroy= ", Nastroy);
   
   //------------------------------  Разрешить торговать
   if(IsDlgButtonChecked(Nastroy, 0x3F3) == 0)
   {
      Print("CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F3, 1) ); // Разрешить торговать
   }else
   {
      Print("CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F3, 0) ); // запретить торговать
   }
   
   
   //------------------------------  Разрешить dll
   if(IsDlgButtonChecked(Nastroy, 0x3F1) == 0)
   {
      Print("CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F1, 1) ); // Разрешить dll
   }else
   {
      Print("CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F1, 0) ); // запретить dll
   }
   
   
   
   Print("0x4D7 IsDlgButtonChecked= ", IsDlgButtonChecked(Nastroy, 0x4D7) ); // id Long Short
   
   
}
 
#define CB_GETCURSEL 0x0147

uint hwndCombo = GetDlgItem( Nastroy, 0x4D7 );

uint selectedIndex = SendMessageA( hwndCombo, CB_GETCURSEL, 0, 0 );
 
Koldun Zloy:

Пока непонятно.

- Как выяснить что сейчас включено  из  Long & Short  - Only Long - Only Short ?

- И что включает      конкретно Long & Short  -      конкретно  Only Long -       конкретно  Only Short?

 


 
#define CB_GETLBTEXT     0x0148
#define CB_GETLBTEXTLEN  0x0149

uchar buf[];
uint len = SendMessageA( hwndCombo, CB_GETLBTEXTLEN, selectedIndex, 0 );
   
ArrayResize( buf, len );
SendMessageA( hwndCombo, CB_GETLBTEXT, selectedIndex, buf );
   
string comboText = CharArrayToString( buf );
 
Koldun Zloy:

SendMessageA( hwndCombo, CB_GETLBTEXT, selectedIndex, buf );


ошибка при компиляции

'buf' - parameter conversion not allowed _WinApiAllTrade.mq4 96 80


хочет тип   int

 
#define CB_GETCURSEL 0x0147

uint hwndCombo = GetDlgItem( Nastroy, 0x4D7 );

uint selectedIndex = SendMessageA( hwndCombo, CB_GETCURSEL, 0, 0 );

Этот код возвращает состояние   Long & Short  - Only Long - Only Short

цифрами 0, 1, 2

уже прогресс. Спасибо.

Теперь надо еще переключать ....

 
Dmytro Zelenskyy:

Теперь надо еще переключать ....

CB_SETCURSEL (0x014E)

 

Всем большое спасибо! Работает.


#define CB_GETCURSEL 0x0147
#define CB_SETCURSEL 0x014E




#include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor(int hWnd, int gaFlags);
   int GetDlgItem(int hDlg, int nIDDlgItem);
   int GetLastActivePopup(int hWnd);
   int IsDlgButtonChecked(int hdlg, int idButton);
   int CheckDlgButton(int hdlg, int idButton, uint check);
   //void CheckRadioButton (int hdlg, int idFirstButton, int idLastButton, int idCheckButton);
   
   int DlgDirListComboBox (int hdlg, string lpszPath, int idListBox, int idStatic, uint uFileType);
   //bool DlgDirSelectComboBox(int hdlg, string lpszBuffer, int idListBox);
#import

void start()
{
   int hMetaTrader, hDlg,  hChart = WindowHandle(Symbol(),Period());
   
   int Nastroy;
   
   hMetaTrader = GetAncestor(hChart,2);          //дескриптор основного окна терминала
   
   PostMessageA(hMetaTrader,WM_COMMAND,33048,0); //вызываем окно свойств советника
   Sleep(100);
   
   hDlg = GetLastActivePopup(hMetaTrader);       //получаем дескриптор всплывающего окна
   Print("hDlg= ", hDlg);
   
   //hButtonSave = GetDlgItem(hDlg,1);             //определяем дескриптор кнопки "Сохранить"
   
   
   
   
   
   Nastroy = GetDlgItem(hDlg, 0);             //определяем дескриптор Настройки
   
   Print("Nastroy= ", Nastroy);
   
   //------------------------------  Разрешить торговать
   if(IsDlgButtonChecked(Nastroy, 0x3F3) == 0)
   {
      Print("0x3F3 CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F3, 1) ); // Разрешить торговать
   }else
   {
      Print("0x3F3 CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F3, 0) ); // запретить торговать
   }
   
   
   //------------------------------  Разрешить dll
   if(IsDlgButtonChecked(Nastroy, 0x3F1) == 0)
   {
      Print("0x3F1 CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F1, 1) ); // Разрешить dll
   }else
   {
      Print("0x3F1 CheckDlgButton= ", CheckDlgButton(Nastroy, 0x3F1, 0) ); // запретить dll
   }
   
   
   
   
   
   //-------------------------------- Переключить  0-Long     1-Short    2-Long Short
   uint hwndCombo = GetDlgItem( Nastroy, 0x4D7 );
   
   int SelCh = 2; // 0-Long     1-Short    2-Long Short 
   
   SendMessageA( hwndCombo, CB_SETCURSEL, SelCh, 0 );
   
   
   
   //-------------------------------- Посмотреть  0-Long     1-Short    2-Long Short
   

   uint selectedIndex = SendMessageA( hwndCombo, CB_GETCURSEL, 0, 0 );
   
   Print("selectedIndex= ", selectedIndex);
   
 }
 
Dmytro Zelenskyy:  Всем большое спасибо! Работает.

Спасибо, скрипт переключает. Но надо бы закрыть диалоговое окно - нажать Enter в конце   keybd_event(13,0,0,0);  так?

 
STARIJ:

Спасибо, скрипт переключает. Но надо бы закрыть диалоговое окно - нажать Enter в конце   keybd_event(13,0,0,0);  так?


   Sleep(2000);
   
   uint hButtonOk = GetDlgItem(hDlg, 1);  //дескриптор кнопки "Ok"
        
   PostMessageA(hDlg, WM_COMMAND, 1, hButtonOk); //нажимаем кнопку Ok
Типа так. Добавить к коду в конце. Через 2 сек нажмет Ок, это чтобы на чекбоксы посмотреть.
Причина обращения: