Как программно сделать другой график активным? - страница 3

 
AlexSTAL:

Ура!

Вот этого мне и не хватало! Огромное спасибо и низкий поклон! Всё работает!
только скинете все таки реализацию.
потому что у меня так и не получилось открыть график ни одной из APIшных функций...
Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
 
sergeev:
только скинете все таки реализацию.
потому что у меня так и не получилось открыть график ни одной из APIшных функций...

Так я выше код привёл:

#import "user32.dll"
  bool BringWindowToTop(int hWnd);
  int GetParent(int hWnd);
#import

void OnStart()
  {
   // Выбираем второй график (меняем на свой код)
   long Chart = ChartFirst();
   Chart = ChartNext(Chart);
   // Получаем системный дескриптор
   int hwndChart = (int)ChartGetInteger(Chart, CHART_WINDOW_HANDLE);
   // Делаем его активным
   BringWindowToTop(GetParent(hwndChart));
  }
на 64-ах тоже работает
 
AlexSTAL:

Так я выше код привёл:

на 64-ах тоже работает
точно. про GetParent все время забываю...
 
А как сделать переход на чарт программно, если DLL-ки не разрешено использовать? Например, это советник либо индикатор для Маркета... Такой функции в MQL явно не хватает, чтобы по ChartID графика можно было программно перейти на него.
 
Mihail Matkovskij:
А как сделать переход на чарт программно, если DLL-ки не разрешено использовать? Например, это советник либо индикатор для Маркета... Такой функции в MQL явно не хватает, чтобы по ChartID графика можно было программно перейти на него.

Внимательно читайте документацию. Есть такая функция.

  • CHART_BRING_TO_TOP показывает график поверх всех других.
 
Alexey Viktorov:

Внимательно читайте документацию. Есть такая функция.

  • CHART_BRING_TO_TOP показывает график поверх всех других.

Я сначала обрадовался, набросал тестовую программу. Но, увы, к сожалению, не работает.

#property indicator_chart_window

#property indicator_plots 0

#include "Edit.mqh"

Edit edit;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   edit.Create(0, "edit1", 0, 21, 21, 120, 21);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
  if(id == CHARTEVENT_OBJECT_ENDEDIT) {
    if(sparam == edit.Name()) {
      long chartID = (long)edit.getText();
      if(!ChartSetInteger(chartID, CHART_BRING_TO_TOP, 0, true)){
        Alert("CHART_BRING_TO_TOP не сработал!");
      }
    }
  }
}
//+------------------------------------------------------------------+

ChartID получаю с помощью другого индикатора на подопытном чарте и ввожу его в edit на другом чарте, индикатор на котором, собственно и должен показывать подопытного (все исходники прикрепил  ниже). С помощью исходника GetChartID.mq5 получаю ChartID графика, а с помощью GoToChart.mq5 пытаюсь перейти на него. Но ничего не получается и даже аллерт не вылетает, который должен появляться в случае ошибки.

Файлы:
Edit.mqh  3 kb
GoToChart.mq5  5 kb
 
Mihail Matkovskij:

Я сначала обрадовался, набросал тестовую программу. Но, увы, к сожалению, не работает.

ChartID получаю с помощью другого индикатора на подопытном чарте и ввожу его в edit на другом чарте, индикатор на котором, собственно и должен показывать подопытного (все исходники прикрепил  ниже). С помощью исходника GetChartID.mq5 получаю ChartID графика, а с помощью GoToChart.mq5 пытаюсь перейти на него. Но ничего не получается и даже аллерт не вылетает, который должен появляться в случае ошибки.

Мне лениво сейчас искать свой код. Но такая возможность точно есть. Возможно я не совсем внимательно просмотрел свойства. Ищите, экспериментируйте и будет вам счастье.


ps; Всё точно. Я вспомнил в каком индикаторе это использовал. Вот кусок кода из него

 if(bufHigh != EMPTY_VALUE && bufHigh != valueHigh+minPM)
  {
   Alert(_Symbol, " уровень ", s, "S", " ", dts(bufHigh), " изменился на ", dts(valueHigh+minPM));
   if(!IsTesting() && !ChartSetInteger(ChartID(), CHART_BRING_TO_TOP, 0, true))
    Print(__FUNCTION__+", Error Code = ",GetLastError()); 
  }

Разница только в том, что индикаторы установлены на разных графиках и активируют каждый свой график. Но поскольку в функции есть ChartID() то проблем быть не должно, какой укажешь тот и будет активирован.

И это на mql4, а на mql5 вообще проблем быть не должно.
 
Mihail Matkovskij:
Интересно, почему может не работать  CHART_BRING_TO_TOP... Я, вроде, правильно функции прописал...

Я дополнил предыдущее сообщение.

 
Зачем удаляете свои сообщения?
 
Alexey Viktorov:

Мне лениво сейчас искать свой код. Но такая возможность точно есть. Возможно я не совсем внимательно просмотрел свойства. Ищите, экспериментируйте и будет вам счастье.


ps; Всё точно. Я вспомнил в каком индикаторе это использовал. Вот кусок кода из него

Разница только в том, что индикаторы установлены на разных графиках и активируют каждый свой график. Но поскольку в функции есть ChartID() то проблем быть не должно, какой укажешь тот и будет активирован.

Так я же и обращаюсь к графику через его Chart ID, Даже специальную программу написал для его получения: (GetChartID.mq5)

#property indicator_plots 0

#include "Edit.mqh"

Edit chatrID_Edit;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
   chatrID_Edit.Create(0, "chatrID_Edit1", 0, 21, 21, 120, 21);
   chatrID_Edit.setText((string)ChartID()); // Вот так я получаю ChartID() нужного графика на который я бросил этот индикатор, 
                                            // а затем копирую его в буфер обмена Ctr + C и вставляю его в edit индикатора GoToChart.mq5 
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

После вставки Ctr+V вGoToChart.mq5  и нажатия ввода у меня ничего не происходит. В чем же проблема?