Ваши вопросы по языку MQL4

gince

Местный знаток
Что такое дескриптор и идентификатор ? И когда который применяется ?
long h=ChartOpen("EURUSD",gr2x1_P1);Print("ChartOpen ",h); //возвращает идентификатор
int h_ = WindowHandle(Symbol(), Period());Print("WindowHandle ",h_); //возвращает дескриптор


2019.04.22 09:17:46.864 lango ismieru keitimas v1.1 EURUSD,H4: ChartOpen 132003874668418463
2019.04.22 09:17:46.819 lango ismieru keitimas v1.1 EURUSD,H4: WindowHandle 1050518
 

mobidik

-----
Здраствуйте. Кто дружит с winApi, Помогите разобратся.
Надо открыть несколько чартов с заданными размерами. И так и сяк делал, но не осилил.

Не ту редакцию кинул. Скрипт открывает дополнительные окна, но изменения велечины окон нет. Велечину меняет только того окна на который кидаем скрипт, а те , которые открыл размеров не меняет.

//+------------------------------------------------------------------+
//| lango ismieru keitimas.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| windowresize.mq5 |
//+------------------------------------------------------------------+

#import "user32.dll"

int SetWindowPos(int hWnd,int hWndInsertAfter,int X,int Y,int cx,int cy,int uFlags);
int GetParent(int hWnd);
int GetTopWindow(int hWnd);
int GetWindow(int hWnd,int wCmd);
#import

#define GW_HWNDNEXT 0x0002
#define SWP_NOSIZE 0x0001
#define SWP_NOMOVE 0x0002
#define SWP_NOZORDER 0x0004
#define SWP_FRAMECHANGED 0x0020

int gr2x1_P1[]={PERIOD_D1,PERIOD_W1,PERIOD_H4}; // Period of grafic 1 of 2x1
int CXShift2x1[]={0,0,399}; // Horizontal shift of grafic 1 of 2x1
int CYShift2x1[] = {200,555,200}; // Vertical shift of grafic 1 of 2x1
int CXSize2x1[] = {399,399,200}; // Width of grafic 1 of 2x1
int CYSize2x1[] = {355,377,710}; // Height of grafic 1 of 2x1
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnStart()
{
long charthandle=-1;
int parenthandle;

//{
ResetLastError();

int i;
for(i=0; i<3; i++)
{
long h=ChartOpen("EURUSD",gr2x1_P1);Print("ChartOpen ",h);

int hMDIClient=GetParent((int)ChartGetInteger(ChartID(),CHART_WINDOW_HANDLE));

Print("hMDIClient ",hMDIClient);

//Sleep(5000);
int hChildWindow=GetTopWindow(hMDIClient);Print("hChildWindow ",hChildWindow);

while(hChildWindow>0)
{
SetWindowPos(hMDIClient,0,CXShift2x1,CYShift2x1,CXSize2x1,CYSize2x1,0x0004|0x0010);
SetWindowPos(hMDIClient,0,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
hChildWindow=GetWindow(hChildWindow,GW_HWNDNEXT);
}
}
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+


Я не то, что бы дружу с WinAPI, но кое что в твоем варианте изменил бы: ф-цию Sleep() таки нужно использовать, т.к. ф-ция ChartOpen() поступает в очередь на выполнение, а ты сразу же пытаешься изменить размер только что отданного приказа на открытие окна, не узнав открыто ли оно. Повторный вызов ф-ции SetWindowPos() считаю лишним, имхо.
К тому же, у тебя в терминале окажется открытых окон на одно, как минимум, больше, чем тебе нужно - это будет окно в которое будет наброшен скрипт. Размеры окон заданы статично, т.е. любое изменение положения окна терминала или открытие в нем дополнительных панелей управления изменят размер отводимого окна для графиков при этом, открываемые окна будут каждый раз в одном и том же положении, что не есть хорошо. В таком случае, нужно узнать координаты и размер главного окна и затем определить все нужные значения для каждого окна, что будем открывать. Не знаю, с чем связано у тебя предварительная установка размеров окон, но думаю, что ты не собираешься выкладывать пазл из окон...
Как по мне, достаточно сперва изменить окно, в которое набрасываем скрипт, на нужное по ТФ и символу, затем изменить или открыть остальные нужные окна, а лишние, если будут - удалить. Не задаем размеры окон, а чуток подождем и нажимаем волшебную кнопочку и все окна выстраиваются под размер главного окна.
(См. скрины, файл своего варианта прилагаю.)
 

Вложения

  • Chart_do.png
    Chart_do.png
    121,4 КБ · Просмотры: 42
  • Chart_posle.png
    Chart_posle.png
    150,7 КБ · Просмотры: 42
  • Open Chart_Period.mq4
    6,5 КБ · Просмотры: 8

gince

Местный знаток
mobidik;[/QUOTE сказал(а):
Спс. Пока не до конца, но кое что получилось.
теперь можно будет двигатся дальше.
 

Вложения

  • posicion.mq4
    8 КБ · Просмотры: 21
Последнее редактирование:

оn220

Интересующийся
Добрый день!
Есть у кого-нибудь пример-код,чтоб индикатор (машка допустим) рисовалась от пересечения двух других машек с опена бара,и на каждом новом пересечении сбрасывалась и начинала по новой.Мало в этом шарю,за кусочек такого кода для уточнений,буду благодарен.хоть чтонибудь подобное.
 

Sloth

Новичок форума
Добрый день!
Столкнулся с тем что хочется узнать что пишет индикатор в журнал а сам бегаю с телефоном. Отправить на телефон просто но как добраться до Журнала.. Лазил по интернету и нашел что вроде это делается через winApi. Пробовал найти окно так:
i=FindWindow(NULL,"Эксперты"); и так i=FindWindowW(NULL,"Эксперты");
и так fw=GetWindow(fw, GW_HWNDNEXT);
но всегда 0.. Помогите плиз добраться до окна с данными..
 

AlexeyVik

Программист mql4 mql5
Добрый день!
Столкнулся с тем что хочется узнать что пишет индикатор в журнал а сам бегаю с телефоном. Отправить на телефон просто но как добраться до Журнала.. Лазил по интернету и нашел что вроде это делается через winApi. Пробовал найти окно так:
i=FindWindow(NULL,"Эксперты"); и так i=FindWindowW(NULL,"Эксперты");
и так fw=GetWindow(fw, GW_HWNDNEXT);
но всегда 0.. Помогите плиз добраться до окна с данными..
В МТ два лог-файла. Один отображается в закладке "Журнал", а другой в "Эксперты". Так вот в "Журнал" пишется, только от пользовательского индикатора, сам факт его прочтения системой. А в "Эксперты" кроме факта его прочтения пишется ещё то, что в индикаторе предусмотрено программистом и ошибки которые совершил этот самый программист.
Так-вот если есть желание какое-то событие в индикаторе передать на телефон, то лазить по логам нет необходимости. Достаточно в код индикатора вписать отправку пуш-уведомлений при определённых событий. Ну или отправку сообщения на почту.
 

Sloth

Новичок форума
Да так и есть только в лог списывают последние события очень не часто. Ну и совсем не сразу. если бы был код индикатора то и вопрос бы не задавал. поэтому и надо смотреть журнал Эксперты и потом уже пушем отправлять
 

AlexeyVik

Программист mql4 mql5
Да так и есть только в лог списывают последние события очень не часто. Ну и совсем не сразу. если бы был код индикатора то и вопрос бы не задавал. поэтому и надо смотреть журнал Эксперты и потом уже пушем отправлять
Ну на худой конец можно этот индикатор прицепить ресурсом и в этом новом индикаторе вписать пуш-уведомления. На мой взгляд это проще чем писать читалку лог-файла. Плюс ко всему, одна из причин, не везде можно подсунуть .dll
 

Sloth

Новичок форума
Можно индикатор прицепить с iCustom но буфера у его нет а он может меняться с 1 по 7. А просматривать все буфера по всем парам это мне кажется накладно для ноута.. А как отловить что индикатор сделал алерт я не нашел как. Поэтому и написал что как добраться до журнала
 

mobidik

-----
Добрый день!
Столкнулся с тем что хочется узнать что пишет индикатор в журнал а сам бегаю с телефоном. Отправить на телефон просто но как добраться до Журнала.. Лазил по интернету и нашел что вроде это делается через winApi. Пробовал найти окно так:
i=FindWindow(NULL,"Эксперты"); и так i=FindWindowW(NULL,"Эксперты");
и так fw=GetWindow(fw, GW_HWNDNEXT);
но всегда 0.. Помогите плиз добраться до окна с данными..

То, что делается через WinAPI - верно, а вот ход твоих действий малость не то... Читать сами файлы логов не имеет смысла, т.к. оем сбрасываются на диск по закрытию терминала. Открыть в терминале подокно "Терминал" и затем закладку "Эксперты" - можно, но то, что мы можем наблюдать в этой закладке выводится как лист, а вот прочитать его уже проблема...

Можно индикатор прицепить с iCustom но буфера у его нет а он может меняться с 1 по 7. А просматривать все буфера по всем парам это мне кажется накладно для ноута.. А как отловить что индикатор сделал алерт я не нашел как поэтому и написал что как добраться до журнала

Использовать буферы индикатора - это самое разумное решение, как по мне. Но отловить сам алерт вполне реально, но тут так же, есть свои нюансы с чтением инфы алерта. Я бы Вам советовал сперва пробовать сделать через буферы индикатора. Скорее всего, сам алерт формируется по какому-то условию - нужно будет повторить его. А вот если так не получиться - тогда только отлавливать алерт. Если индюк тяжелый и предполагается работать со многими парами - ловля алерта даст намного меньше нагрузки на терминал, имхо.
 

Sloth

Новичок форума
Да инд не легкий и работает со всеми парами. Вот и нужно отложить сигнал когда он делает алерт. Я не нашел в интернете что можно отлавливать алерт. Даже намека нет. поэтому и думал добраться до окна Эксперты т.к. логи сразу отлетели взглянув на их. Пробовал поставить смотреть все буферы но нагрузка большая получается. Дайте хоть намек как можно отловить алерт ПЛИЗ!! Считать даже с журнала будет не просто это правда. Что нашел в User32.dll и вроде не ругается редактором но как кинешь на график то пишет функции такой нет:facepalm:
 
Последнее редактирование:

gince

Местный знаток
Алерт-это выскакивающиы текст в окне. Ты про это или я чего то недочитал
 

mobidik

-----
Да инд не легкий и работает со всеми парами. Вот и нужно отложить сигнал когда он делает алерт. Я не нашел в интернете что можно отлавливать алерт. Даже намека нет. поэтому и думал добраться до окна Эксперты т.к. логи сразу отлетели взглянув на их. Пробовал поставить смотреть все буферы но нагрузка большая получается. Дайте хоть намек как можно отловить алерт ПЛИЗ!! Считать даже с журнала будет не просто это правда. Что нашел в User32.dll и вроде не ругается редактором но как кинешь на график то пишет функции такой нет:facepalm:

Тогда, да, лучше отлавливать алерт. В сети есть кое-что, но из того, что мне попадалось - уже не работает. Без длл-ки "user32.dll" не обойтись. Сам алерт, так же, содержит список лист, который геморойно прочитать, но получить данные, сам тест, последнего сообщения в окне алерта, реально. Нужно периодически искать хендл окна алерта и сравнивать с тем что было и что есть. На "пальцах" как-то так.

Алерт-это выскакивающиы текст в окне. Ты про это или я чего то недочитал
именно о нем.
 

gince

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

gince

Местный знаток
я тыт нафлудил. Цитирования не нашел. Редактирования или удаления своего поста тоже нет.
-Вопрос снимается, зделал сам. - это про https://forexsystemsru.com/threads/vashi-voprosy-po-jazyku-mql4.65289/post-1404901
-Как можно получить признак изменения координат или размеров окна гарафика ? https://forexsystemsru.com/threads/vashi-voprosy-po-jazyku-mql4.65289/post-1405933 Этот вопрос остается.
 

gince

Местный знаток
Столкнулся с тем что хочется узнать что пишет индикатор в журнал а сам бегаю с телефоном. Отправить на телефон просто но как добраться до Журнала.. Лазил по интернету и нашел что вроде это делается через winApi. Пробовал найти окно так:
i=FindWindow(NULL,"Эксперты"); и так i=FindWindowW(NULL,"Эксперты");
и так fw=GetWindow(fw, GW_HWNDNEXT);
но всегда 0.. Помогите плиз добраться до окна с данными..

int handle=FindWindowW(NULL,"Alert");
int hWnd_W_edit =FindWindowExW(handle,NULL,"Edit",NULL);
Print("hWnd_W_edit ", hWnd_W_edit);
 

Buldakov

Местный житель
Нужна помощь. Хочу вывести из индикатора (в тестере стратегий) какое либо значение в журнал. При помощи какого оператора это сделать? Например хочу каждый час выводить в журнал цену открытия.
 

MrGreen86

Гуру форума
Нужна помощь. Хочу вывести из индикатора (в тестере стратегий) какое либо значение в журнал. При помощи какого оператора это сделать? Например хочу каждый час выводить в журнал цену открытия.
C++:
static int last_hour;
if(Hour()!=last_hour) {
    last_hour = Hour();
    Print( DoubleToString( Open[0], _Digits) );
}
 

MrGreen86

Гуру форума
Как можно получить признак изменения координат или размеров окна гарафика ?
Накатал пример по быстрому, там пара строк. Думаю разберетесь. Если нет, спросите.
 

Вложения

  • window_change.mq4
    1,9 КБ · Просмотры: 20
Верх