Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1345

 
Vitaly Muzichenko #:

Опять-же, нужно менять префикс при загрузке следующей копии?

а словами то можно озвучить какая цель?

кнопки можно и не на своем окне создавать и контролировать.


что это будет?

 
Igor Makanu #:

а словами то можно озвучить какая цель?

кнопки можно и не на своем окне создавать и контролировать.


что это будет?

Не знаю, но нужно именно так: Создать в своём подокне, и при клике получить номер этого подокна. Рисовать ничего не нужно, только кнопку, которая при клике выводит информацию в Алерт о номере подокна

 
Vitaly Muzichenko #:

Не знаю, но нужно именно так: Создать в своём подокне, и при клике получить номер этого подокна. Рисовать ничего не нужно, только кнопку, которая при клике выводит информацию в Алерт о номере подокна

проверил на своем первом исходнике:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


увы, все как Вы пишите - если запустить несколько копий этого индикатора с параметрами по умолчанию, то кнопка будет только на первом индикаторе  в подокне

а если изменить параметры при запуске, то все ОК


в общем непонятная ситуация

 
Igor Makanu #:

проверил на своем первом исходнике:

увы, все как Вы пишите - если запустить несколько копий этого индикатора с параметрами по умолчанию, то кнопка будет только на первом индикаторе  в подокне

а если изменить параметры при запуске, то все ОК

в общем непонятная ситуация

Вот тут и вопрос: Как сменить параметры автоматически, не влезая в настройки?

Пока ничего не получается ...

---

P.S. В идеале, но увы

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

Пока ничего не получается ...

и не получится:

добавил в:

int OnInit()
{
   Print(__FUNCTION__);

набрасываю индикатор - получаю в логе OnInit, а вот следующий индикатор уже молчит, т.е. действительно запущена всего одна копия индикатора, а остальные индикаторы это просто графическая оболочка

 
Igor Makanu #:

и не получится:

добавил в:

набрасываю индикатор - получаю в логе OnInit, а вот следующий индикатор уже молчит, т.е. действительно запущена всего одна копия индикатора, а остальные индикаторы это просто графическая оболочка

Вот так и есть. Видать архитектура мт5 - кривая. В мт4 всё работает отменно.

Если решили в мт5 так сделать, тогда поставили-бы запрет на запуск копии индикатора с одинаковыми входными параметрами, а то вроде как он есть, а по факту его - нет.

 
Vitaly Muzichenko #:

Вот так и есть. Видать архитектура мт5 - кривая. В мт4 всё работает отменно.

Если решили в мт5 так сделать, тогда поставили-бы запрет на запуск копии индикатора с одинаковыми входными параметрами, а то вроде как он есть, а по факту его - нет.

Расчётная часть индикатора - не одно и то же, что графическая. Поэтому расчётная для них всех одна. Графических несколько.

А нельзя ли в одном индикаторе просто поискать все подокна, и в них засунуть лейблы с номером подокна? При этом отлавливать в таймере количество подокон чарта: увеличилось - добавить на новое подокно лейбл. Но ещё и поискать что за индикатор в нём помещён - если другой, то не добавлять...

Просто непроверенная идейка.

ЗЫ. Не соглашусь про "кривизну". Одна расчётная часть на 20 одинаковых индикаторов лучше, чем 20 расчётных частей на 20 одинаковых индикаторов.

 
Artyom Trishkin #:

Расчётная часть индикатора - не одно и то же, что графическая. Поэтому расчётная для них всех одна. Графических несколько.

А нельзя ли в одном индикаторе просто поискать все подокна, и в них засунуть лейблы с номером подокна? При этом отлавливать в таймере количество подокон чарта: увеличилось - добавить на новое подокно лейбл. Но ещё и поискать что за индикатор в нём помещён - если другой, то не добавлять...

Просто непроверенная идейка.

ЗЫ. Не соглашусь про "кривизну". Одна расчётная часть на 20 одинаковых индикаторов лучше, чем 20 расчётных частей на 20 одинаковых индикаторов.

Делал, на кнопку нет реакции - не срабатывает OnChartEvent копии и не понимает номер подокна.

В общем, вот что не срабатывает и вместе с этим остальной код

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

Igor Makanu, 2021.09.12 21:53

и не получится:

добавил в:

int OnInit()
{
   Print(__FUNCTION__);

набрасываю индикатор - получаю в логе OnInit, а вот следующий индикатор уже молчит, т.е. действительно запущена всего одна копия индикатора, а остальные индикаторы это просто графическая оболочка


 
Vitaly Muzichenko #:

Делал, на кнопку нет реакции - не срабатывает OnChartEvent копии и не понимает номер подокна.

В общем, вот что не срабатывает и вместе с этим остальной код


НО!!! Если сделать шаблон с 2-3 этими индикаторами под именем «Debug.tpl» и запустить отладку индикатора, то OnInit() работает как и положено.

В общем провёл такой эксперимент:

Перенёс #property по максимуму в OnInit(), в расчёте на то, что пока не создан индикатор, будет выполняться OnInit() и короткое имя индикатора сделать в зависимости от количества индикаторов в окне.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

Но это не помогло:

Запускаю первую копию

Имя индикатора 2………

Запускаю вторую копию — имя индикатора по прежнему 2 у обоих индикаторов

Запускаю отладку и что вижу!!! Ещё не загруженный индикатор уже печатает… читайте вторую и третью строку…

как это может быть?


Дальше отладка остановлена на входе в OnInit(), переменная windows_total содержит мусор, short_name пока ещё пустая строка…

Здрасьте……… но ведь всё это уже напечатано… как это так???

И short_name уже поменялись

В итоге после полной загрузки индикатора в режиме отладки вот такие имена индикаторов

Наверное надо обратить внимание разработчиков на такие баги…

 
 Друзья привет может быть я не в тему ,но виже раздел с названием:"Вопросы от начинающих MQL5 MT5 MetaTrader 5".Поэтому вопрос :раньше скачивал Демо советника с Маркета для тестирования сейчас что только не делал МТ 5 не могу скачать Демо.МТ4 без проблем,МТ 5 нет в чем причина?
Причина обращения: