Скачать MetaTrader 5

Нужна помощь с Win32API

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью. Получи вознаграждение!
Sergey Kravchuk
3330
Sergey Kravchuk 2010.02.24 16:08 

Задачка такая: мне в скрипте\индикаторе\советнике нужно узнать

1) номер открытого ордера, который подсвечен\выбран в окне Торговля (колонка Ордер)

2) номер закрытого ордера на закладочке История счета

3) номер ордера на закладочке Результаты в режиме визуального тестирования

В идеале - хотелось бы (на всякий случай) иметь возможность получить значение из любой ячейки этих "таблиц" задавая номер строки и номер или имя колонки ну и конечно номер выбранной строки или 0 если строка не выбрана.

Фактически нужны функции:

int GetSelectedOrderNumber(int Source)

а в общем случае

string GetCell(int Source, int Row, int Column)

int GetSelectedRowNumber(int Source)

int GetRowsCount(int Source)

где Source - задает окно откуда тягать данные, например 0-Открытые, 1-закрытые, 2-визуализатор

нужен код на MQ4 (без внешних dll).

Кто знает как сделать такое и может написать такой набор функций - отзовитесь пожалуйста.

Stanislav Korotky
17923
Stanislav Korotky 2010.02.24 16:35  
Без DLL не обойтись. Что такое внешние и не внешние DLL - не понятно, они все внешние по отношению к MQL.
o_o
Модератор
23693
o_o 2010.02.24 16:41  

почему же не обойтись.

если испльзовать хендлы, то докопаться можно... 

Sergey Kravchuk
3330
Sergey Kravchuk 2010.02.24 16:45  
marketeer >>:
Без DLL не обойтись. Что такое внешние и не внешние DLL - не понятно, они все внешние по отношению к MQL.

очень даже можно обойтись - в MQL достаточно средств для этого ;)

слово внешние - просто подчеркивает что мне нужно "внутреннее" решение только на MQL

вот код который получает к-во строк в истории счета

#include <WinUser32.mqh>

#import "user32.dll"
  int GetParent( int hWnd );
  int GetAncestor(int hWnd, int gaFlags);
  int GetDlgItem(int hDlg, int nIDDlgItem);
#import

#define LVM_GETITEMCOUNT 0x1004

void start()
{
  int hwnd = GetAncestor(WindowHandle(Symbol(),Period()),2); //дескриптор основного окна терминала
  int Count = 0;    

  if (hwnd != 0)  // нашли главное окно
  {
    hwnd = GetDlgItem(hwnd, 0xE81E); // Нашли историю счета
    hwnd = GetDlgItem(hwnd, 0x51);
    hwnd = GetDlgItem(hwnd, 0x81B8);
 
    Count = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0); // получили количество элементов списка
  }

  Print(Count);
}
осталось дописать получение выбранной строки и нужной ячейки в ней, но в этом я уже не силен :((
Sergey Kravchuk
3330
Sergey Kravchuk 2010.02.24 16:49  

вот на просторах тырнета удалось накопиастить такие тексты - возможно они помогут

public struct LV_ITEM
{
public UInt32 mask;
public Int32 iItem;
public Int32 iSubItem;
public UInt32 state;
public UInt32 stateMask;
public String pszText;
public Int32 cchTextMax;
public Int32 iImage;
public IntPtr lParam;
}

const int BUFFER_SIZE = 512;


LV.iItem = 3;
LV.mask = Win32API.LVIF_IMAGE;
LV.cchTextMax = 255;
LV.iSubItem = 0;
LV.pszText = new String('\0', 255);

Win32API.SendMessage(hWnd, Win32API.LVM_GETITEMTEXT, 3, ref LV);
string text = LV.pszText.ToString();


const int LVM_FIRST = 0x1000;
const int LVM_GETITEMCOUNT = LVM_FIRST + 4;
const int LVM_GETITEM = LVM_FIRST + 5;
const int LVIF_TEXT = 0x0001;
LVM_GETITEMTEXT = (LVM_FIRST + 45);

Получить текст из итема ListView можно так:
LVITEM lvi;
memset(&lvi, 0, sizeof(LVITEM));
lvi.iSubItem = 0 /* first column */;
LPTSTR pszRet;
int nLen = 64;
int nRes;
do
{
nLen *= 2;
pszRet = (TCHAR *)realloc(pszRet, sizeof(TCHAR) * nLen);
lvi.cchTextMax = nLen;
lvi.pszText = pszRet;
nRes = (int)SendMessage(hListView, LVM_GETITEMTEXT, (WPARAM)8 /* item index */, (LPARAM)&lvi);
} while (nRes >= nLen-1);
...






SofTAA
408
SofTAA 2010.02.24 20:14  
sergeev >>:

почему же не обойтись.

если испльзовать хендлы, то докопаться можно... 


Так хендлы тоже будешь использовать через DLL, конечно писать свою библиотеку не надо, а вот виндовскими то воспользоваться придется.
Sceptic Philozoff
Модератор
17844
Sceptic Philozoff 2010.02.24 20:53  

ForexTools, а тебе известен аналог функции WindowHandle() в пятере? Я что-то его не нашел. И вообще ничего с окнами нет вроде как.

Ну вот как мне найти хэндл окна текущего чарта в пятере - пусть и с API?

Sergey Kravchuk
3330
Sergey Kravchuk 2010.02.24 22:00  
Mathemat >>:

ForexTools, а тебе известен аналог функции WindowHandle() в пятере? Я что-то его не нашел. И вообще ничего с окнами нет вроде как.

Ну вот как мне найти хэндл окна текущего чарта в пятере - пусть и с API?

ChartID - оно?

Sergey Kravchuk
3330
Sergey Kravchuk 2010.02.24 22:03  
SofTAA >>:


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

годится все что угодно из стандартного набора Win32API - лиш бы не было собственных длл. в примере моего кода используется user32.dll ;)

o_o
Модератор
23693
o_o 2010.02.24 22:14  
Mathemat >>:

ForexTools, а тебе известен аналог функции WindowHandle() в пятере? Я что-то его не нашел. И вообще ничего с окнами нет вроде как.

Ну вот как мне найти хэндл окна текущего чарта в пятере - пусть и с API?


чтоб получить хендл надо обратиться к

ChartGetInteger(ChartID(), CHART_WINDOW_HANDLE)


и все что касается окон лежит в https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property


намного больший ассортимент чем в МТ4

Sceptic Philozoff
Модератор
17844
Sceptic Philozoff 2010.02.24 22:29  

Ух спасибо, народ. А то я уже растерялся...

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