Скачать MetaTrader 5

Функции для работы с графиком и реестром windows(DLL)

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зарегистрируйся на MQL5.community и оставляй комментарии!
Evgeniy Takalov
494
Evgeniy Takalov 2013.11.13 20:45 

1. Здрасте.. вот ищу функцию, которая возвращает является ли график(подокно терминала) активным. Функция, естественно вызавается из MQL программы... может в стандартной Win32 есть, или, может кто подскажет..

2. Еще ищу для работы с реестром, запись, чтение и тд... (ну тут, думаю пояснять не стоит... Мог бы конечно и сам порыться, но раз уж на форум пришлось идти - заодно)

Заранее благодарю)

Vadim Zhunko
5226
Vadim Zhunko 2013.11.14 04:14  

1. Библиотека.

 // 4.2.10. Функция возвращает наличие активности окна графика по его системному дескриптору. В случае успеха функция возвращает TRUE, иначе - FALSE.
 bool ServiceIsChartActive(int hwndChart); // Системный дескриптор контроллируемого окна графика.
2. На форуме было что-то такое. Надо поискать.
Vladimir Gomonov
8277
Vladimir Gomonov 2013.11.14 06:34  
Zhunko:

1. Библиотека.

......

Вадим, как впечатление от новых билдов? В библиотеке много править придётся?

Радует то, что скорость нового кода куда выше. Но юникод, конечно, придётся конвертировать (чтоб старые DLL не поправлять).

--

Можно сохранить практически все старые наработки, сделав перекодировочные намордники на DLL-функции. Я пробовал, перекодируется всё за микросекунды, всё летает (учитывая что сам mql-код исполняется быстрей).

принцип прмерно такой:

#import "SoftFX.OneClickTrading.dll"

// Creates instance of FDK information provider;
// Returns provider guid;
// accountServer - string;
// input value - should contain the result of AccountServer() function; 

//  Fix for bild 536
//int FdkCreate(int &isServerAllowed[], string accountServer, string terminalCompany, string accountCompany); //  ЭТО СТАРАЯ ФУНКЦИЯ. С ANSI-СТРОКАМИ
int FdkCreate(int &isServerAllowed[], uchar &accountServer[], uchar &terminalCompany[], uchar &accountCompany[]);  // ЭТО Я ЕЁ ПЕРЕОПРЕДЕЛИЛ

// Deletes instance of FDK information provider;
// handle - int;
// input value - should contain the result of FdkCreate function;
void FdkDelete(int handle);

// Subscribes to FDK level2;
// handle - int;
// input value - should contain the result of FdkCreate function;
// symbol - string;
// input value - should contain Symbol name in "CCY1CCY2" format; 
// depth - int;
// input value - should contain a level2 depth to subscribe;

//  Fix for bild 536
// void FdkSubscribe(int handle, string symbol, int depth);                         И  ТАК  ЖЕ  ПОСТУПАЮ  СО  ВСЕМИ ФУНКЦИЯМИ  ГДЕ  ЕСТЬ ANSI-СТРОКИ  В ПАРАМЕТРАХ
void FdkSubscribe(int handle, uchar &symbol[], int depth);

// Unsubscribes to FDK level2;
// handle - int;
// input value - should contain the result of FdkCreate function;
// symbol - string;
// input value - should contain Symbol name in "CCY1CCY2" format; 

//  Fix for bild 536
// void FdkUnsubscribe(int handle, string symbol);
void FdkUnsubscribe(int handle, uchar &symbol[]);
......................................
.................
..........
#import

а потом ниже по коду их перегружаю :

int FdkCreate(int &isServerAllowed[], string accountServer, string terminalCompany, string accountCompany)  //  Вуаля.  Теперь из вызывающего кода будет вызываться именно эта функция,
{                                                                                                           //  которая сначала перекодирует строки, а потом уже вызовет старую DLL-функцию
  uchar aS[], tC[], aC[];
  StringToCharArray(accountServer,aS);
  StringToCharArray(terminalCompany,tC);                         /////////   здесь перекодировка (однотипная)  из юникода в ansi
  StringToCharArray(accountCompany,aC);                          /////////   она не сложная и везде одинаковая
  return FdkCreate(isServerAllowed, aS, tC, aC);   // а это вызов функции из DLL              
}                                                                /////////   код получается вполне рабочий.  данную DLL с этим самым намордником юзаю без проблем.

void FdkSubscribe(int handle, string symbol, int depth)
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkSubscribe(handle, temp, depth);
}
void FdkUnsubscribe(int handle, string symbol)
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkUnsubscribe(handle, temp);
}

/////////////////////////////////////  И  т.д.   и  т.п.

void FdkGetQuotes(int handle, string symbol, int &SizeBids[], double &Bids[], double &BidVols[], int &SizeAsks[], double &Asks[], double &AskVols[])
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkGetQuotes(handle, temp, SizeBids, Bids, BidVols, SizeAsks, Asks, AskVols);
}
void FdkGetBidQuotes(int handle, string symbol, int &SizeBids[], double &Bids[], double &BidVols[])
{
  uchar temp[];
  StringToCharArray(symbol,temp);
  FdkGetBidQuotes(handle, temp, SizeBids, Bids, BidVols);
}

в результате вызывающий код вообще НЕ НУЖДАЕТСЯ НИ В КАКОЙ МОДИФИКАЦИИ.

ПРОСТО КОМПИЛИРУЕТСЯ И РАБОТАЕТ БЫСТРЕЕ ЧЕМ РАНЬШЕ (поскольку сам выполняемый mql-код ускорился)

gyfto
251
gyfto 2013.11.14 06:38  
Evgeno:

2. для работы с реестром

advapi32.dll
Dmitry Fedoseev
42904
Dmitry Fedoseev 2013.11.14 09:46  

Нашел функцию:

#import "user32.dll"
int      GetParent(int h);
int      GetTopWindow(int h);
int      GetAncestor(int,int);
int      GetDlgItem(int,int);
int      SendMessageA(int,int,int,int);
#import

bool fIsWindowActive(){
   int tWH=WindowHandle(Symbol(),Period());
   int tTWnd=GetAncestor(tWH,2);
   int hMDICWnd=GetDlgItem(tTWnd,0xE900);
   int hMDIAWnd=SendMessageA(hMDICWnd,0x0229,0,0);
   int tWH2=GetDlgItem(hMDIAWnd, 0xE900);
   return(tWH==tWH2);
}
o_o
Модератор
23693
o_o 2013.11.14 12:28  
Integer:

Нашел функцию:


а можешь пояснить по строчно? + константы (у них ведь есть дефайн имена из winapi ?)
Dmitry Fedoseev
42904
Dmitry Fedoseev 2013.11.14 12:39  
sergeev:

а можешь пояснить по строчно? + константы (у них ведь есть дефайн имена из winapi ?)


Бинго!
o_o
Модератор
23693
o_o 2013.11.14 13:05  
Integer:

Бинго!

в смысле ты нашел код но не полностью знаешь его функционал?

----

чего я спрашиваю - думаю что пора бы сделать ветку, посвященную WInApi + Terminal.

и чтоб не копаться в MSDN по этим константам - надеялся на твой быстрый ответ.

Dmitry Fedoseev
42904
Dmitry Fedoseev 2013.11.14 13:12  
sergeev:

1. в смысле ты нашел код но не полностью знаешь его функционал?

----

чего я спрашиваю - думаю что пора бы сделать ветку, посвященную WInApi + Terminal.

и чтоб не копаться в MSDN по этим константам - надеялся на твой быстрый ответ.



1. Да.

Все что на этом форуме сделано по этой теме сделано Ильнуром. Если какие вариации и были, то только после него и на основе его кода.

И еще у меня нет желания становиться мастером WIN API, слишком обширная тема. Если какие задачи возникают, решаются непосредственно по мере их возникновения (и тут же забываютя).

Vadim Zhunko
5226
Vadim Zhunko 2013.11.14 13:16  
MetaDriver:

Вадим, как впечатление от новых билдов? В библиотеке много править придётся?

Радует то, что скорость нового кода куда выше. Но юникод, конечно, придётся конвертировать (чтоб старые DLL не поправлять).

--

Можно сохранить практически все старые наработки, сделав перекодировочные намордники на DLL-функции. Я пробовал, перекодируется всё за микросекунды, всё летает (учитывая что сам mql-код исполняется быстрей).

принцип прмерно такой:

а потом ниже по коду их перегружаю :

в результате вызывающий код вообще НЕ НУЖДАЕТСЯ НИ В КАКОЙ МОДИФИКАЦИИ.

ПРОСТО КОМПИЛИРУЕТСЯ И РАБОТАЕТ БЫСТРЕЕ ЧЕМ РАНЬШЕ (поскольку сам выполняемый mql-код ускорился)

Владимир, меня напрягает высокомерное отношение к пользователем. Остальное - ерунда. Справимся :-)

В библиотеках надо будет исправить передачу строковых массивов. И то, не знаю пока, надо ли. Метаквоты так и не объяснили, как им удалось запретить передачу массивов структур их строк :-)) Теперь, ведь, структуры будут.

Подожду релиза. Тогда буду исправлять. Сейчас свою оболочку (приложение, форма) для тестов советника пишу. Так надёжнее и быстрее. Универсальность не нужна. Только СА. А то, достали уже языками разными, глюками старыми и новыми. Вместо работы постоянные бета-тесты МТ4 :-)

Кстати, форма почему-то с каждым днём всё больше похожа на МТ4 :-))

С переходом на юникод проблем не вижу. Все функции со строками у меня в трёх экземплярах:

1. Текущая кодировка проекта. Для проектов С++.

2. ANSI для МТ4.

3. UNICODE для МТ5. Теперь можно будет в МТ4 использовать.

При этом кодировка самого проекта произвольная. Конечно, для юникода лучше в юникоде компилировать. Чтобы все символы можно было использовать.

Использую преобразование кодировки строковых параметров и возвращаемых значений:

1. Текущая кодировка проекта -> текущая кодировка проекта.

2. ANSI -> текущая кодировка проекта.

3. UNICODE -> текущая кодировка проекта.

Получается всё независимо. Т.е. в перспективе надо будет только инклюд исправить. "A" на "W" поменять.

Рустам
3597
Рустам 2013.11.14 13:50  

1) если это надо для управления (обработка событий мыши), то я использую такую конструкцию :

//+------------------------------------------------------------------+
#import "user32.dll"
   int   WindowFromPoint(int x,int y);
   bool  GetCursorPos(int& Pos[2]);
#import
//+------------------------------------------------------------------+
bool IsActive(){int cursor[2];
   GetCursorPos(cursor);
   return(WindowHandle(Symbol(),Period()) == WindowFromPoint(cursor[0],cursor[1]));
}
//+------------------------------------------------------------------+

если курсор над искомым окном - оно считается активным.

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