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

griz

Активный участник
Здравствуйте. В терминале открыто много вкладок с разными символами. Есть ли функция, которая может определенную вкладку символа сделать активной(т.е. переключиться на эту вкладку)?
 

MrGreen86

Гуру форума
Здравствуйте. В терминале открыто много вкладок с разными символами. Есть ли функция, которая может определенную вкладку символа сделать активной(т.е. переключиться на эту вкладку)?
Да, ChartSetInteger(0,CHART_BRING_TO_TOP,true);
 
  • Like
Реакции: griz

medved76

Активный участник
Здравствуйте!
Подскажите почему пользовательский индикатор в тестере рисует много окон?
 

MrGreen86

Гуру форума
Здравствуйте!
Подскажите почему пользовательский индикатор в тестере рисует много окон?
Скорее всего ошиблись в функции iCustom, указали неверный набор входных параметров.
Или пропустили какой то параметр, или перепутали порядок
 

kudinoff

Почетный гражданин
тут все же ясно, панель переключения графиков должна не дублировать обьекты) это так сложно понять???? ну вы жарите)))
Если нужна панель, которая не будет открывать новый график, если по этому символу уже открыт, то держи.
 

Вложения

kudinoff

Почетный гражданин
Спасибо, обьекты не дублирует на других графиках?
Открывает чистый график, если он не открыт.
Можно сделать с применением шаблона ( дописать в 179 строку ChartApplyTemplate(newchartid,Template); на 17 строке extern string Template = ""; ) в настройках прописать нужный темплейт.
 

MERFY

Местный знаток
Добрый вечер!

Подскажите, плиз, когда такая конструкция счетчика:
Код:
Expand Collapse Copy
   int i,counted_bars=IndicatorCounted(),half = MathFloor(FilterPeriod/2.0);
      if (counted_bars<0) return(-1);
      if (counted_bars>0) counted_bars--;
      
         int limit = MathMin(MathMax(Bars-counted_bars,half),Bars-1);

Как прописать переменную BarsToCount, чтобы индикатор отображался на интервале к примеру 200 баров на истории? Ограничитель истории в общем, либо MaxBars, не имеет значения.

Конструкция if (limit > MaxBars) limit = MaxBars; - не работает в данном случае.

Спасибо за ответ!
 

MERFY

Местный знаток
Первые 3 строки оставляем, Попробуй заменить так:
if(MaxBars>Bars) MaxBars=Bars;
int limit = MathMin(MathMax(Bars-counted_bars,half),MaxBars);

Только MaxBars пропиши во входных. Но лучше бы код увидеть.

Неа, не получается, отписался в личку и скинул исходник.
 

AlexeyVik

Программист mql4 mql5
Первые 3 строки оставляем, Попробуй заменить так:
if(MaxBars>Bars) MaxBars=Bars;
int limit = MathMin(MathMax(Bars-counted_bars,half),MaxBars);

Только MaxBars пропиши во входных. Но лучше бы код увидеть.
Неа, не получается, отписался в личку и скинул исходник.
Когда-же вы забудете это старьё как страшный сон? Ведь всё это писалось ещё в mql3 в котором было тараканов больше чем в студенческом общежитии.
Пора уже переходить на обновлённый язык и новые обработчики событий.
Вот реально работающая конструкция

Код:
Expand Collapse Copy
input int     shift = 50;

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[])
 {
  int limit = prev_calculated == 0 ? fmin(rates_total-1, shift) : rates_total-prev_calculated;
}
Если так сложно разобраться в тернарном операторе ?: то можно обойтись простым условием if()
Код:
Expand Collapse Copy
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[])
 {
int limit = rates_total-prev_calculated;
  if(prev_calculated == 0)
    limit = fmin(rates_total-1, shift);
}
 

vladradon

Программист
Когда-же вы забудете это старьё как страшный сон?
Моя конструкция работает. Переделывать весь индюк, написанный на старье с кучей глюков, мне лень! А твоя конструкция под тот индюк не подойдет.;) Судя по коду, это похоже на Младеновский хлам. Кстати, сам старый оператор используешь - fmin!:)
Всех с наступающим!
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Моя конструкция работает. Переделывать весь индюк, написанный на старье с кучей глюков, мне лень! А твоя конструкция под тот индюк не подойдет.;) Судя по коду, это похоже на Младеновский хлам. Кстати, сам старый оператор используешь - fmin!:)
Всех с наступающим!
Влад, ты с ума сошёл? Ты считаешь что я способен пользоваться чужим кодом?
«Ты Зин на грубость нарываешься…
Всё Зин обидеть норовишь…»
А fmin это не старьё, а взятая MQ из С++
00.png
 

vladradon

Программист
Влад, ты с ума сошёл? Ты считаешь что я способен пользоваться чужим кодом?
Привет! При чем тут чужой код - просто нужно было индюка доработать. Там в графиках индюка (такой он глючный) первые 144 бара ничего не рисует кроме пары вертикальных линий. Индюк полностью старый - даже стрикт не стал ему включать. Нужно было на самом деле рисовку этих первых слева баров убрать обычной SetIndexDrawBegin. Просто MERFY не все объяснил и в личке потом я код подправил. Я знаю про fmin. Здесь свои функции в mql и для меня fmin и fmax как-то выпадают из общего списка.
 

Leva20

Новичок форума
Добрый день

Есть у меня несколько закрытых индикаторов и на основе них хотел написать советник. Раньше когда я писал другие советники, на основе других индикаторов, я обращался к объектам которые они рисовали на графике по имени, и на основе этих сигналов открывались сделки. Но в этих индикаторах режим перемещения объектов мышью отключен и имя графического объекта в списке объектов не отображается.
Как в такой ситуации можно еще обратится к данным индикаторам, для отображения сигнала для входа в сове?
 

mobidik

-----
Добрый день

Есть у меня несколько закрытых индикаторов и на основе них хотел написать советник. Раньше когда я писал другие советники, на основе других индикаторов, я обращался к объектам которые они рисовали на графике по имени, и на основе этих сигналов открывались сделки. Но в этих индикаторах режим перемещения объектов мышью отключен и имя графического объекта в списке объектов не отображается.
Как в такой ситуации можно еще обратится к данным индикаторам, для отображения сигнала для входа в сове?
Если индикаторы создают графический объект - он всегда доступен: "Список объектов" ->клац по кнопке"Все".
Иначе, если индикатор содержит сигналы в буферах - доступ к ним через ф-цию iCustom().
 

Leva20

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

Leva20

Новичок форума
У меня есть еще один вопрос.
Мне нужно, что бы индикатор смещал расчет на N количество баров в историю. Сейчас я захожу в его свойства и ввожу номер бара для которого нужен расчет.
Не подскажете как сделать на графике кнопку один клик по ней одно смещение, или ввод в окне на графике номер бара без захода в свойства индикатора.
 

mobidik

-----
Не подскажете как сделать на графике кнопку один клик по ней одно смещение, или ввод в окне на графике номер бара без захода в свойства индикатора.
Вам следует использовать ф-цию создания графических объектов ObjectCreate() и создать объект типа OBJ_BUTTON (кнопка), а для ввода значений: OBJ_EDIT (поле ввода). После создания, следует считывать данные с созданных объектов. Считывать можно как по тикам, по таймеру или с помощью ф-ции OnChartEvent(). Замечу, что в тестере будет работать только по тикам, при этом, для работы на реальном графике, удобнее использовать ф-цию OnChartEvent().
Ниже прилагаю файл торговой панельки, в которой есть как кнопки, так и поле ввода. Вам предстоит разобраться что и как там сделано и повторить код под себя. Автор панельки: cmillion, он есть на этом форуме.
 

Вложения

Верх