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

vladradon

Программист
а что будет при тестировании советника, когда в нём происходит вызов индюка с большим количеством заданных параметров, чем есть у индюка?
Пробовал уменьшать количество прописанных в iCustom параметров до 3-х как в самом индюке - никакой разницы в скорости ни в индюке, ни в сове: 3 или 20 - не важно. Но работает, конечно, медленнее, чем если напрямую к индюку обращаться.
 

AlexeyVik

Программист mql4 mql5
Пробовал уменьшать количество прописанных в iCustom параметров до 3-х как в самом индюке - никакой разницы в скорости ни в индюке, ни в сове: 3 или 20 - не важно. Но работает, конечно, медленнее, чем если напрямую к индюку обращаться.
Я в подробностях конечно не помню, но вроде-бы при каждом обращении к индикатору с неполными параметрами, создаётся своя копия. Соответственно забивается память. А когда она закончится¿¿¿ одному Богу известно. Так-что лучше не экспериментировать с такими делами…
 

vladradon

Программист
Я в подробностях конечно не помню, но вроде-бы при каждом обращении к индикатору с неполными параметрами, создаётся своя копия. Соответственно забивается память. А когда она закончится¿¿¿ одному Богу известно. Так-что лучше не экспериментировать с такими делами…
Речь идет не о неполных параметрах, а о лишних, которых нет в индюке.
 

mobidik

-----
Речь идет не о неполных параметрах, а о лишних, которых нет в индюке.
Влад, на первый вопрос ты так и не ответил - куда девать остальные 15 параметров, которые будут переданы по вызову в индюк, которых там нет. Ведь после перечня самих параметров, следующих два параметра это индекс и буфер - как индюк будет знать, что какую-то часть параметров нужно пропустить и перепрыгнуть к двум последним..?
По второму: то, что это можно сделать, я не спорю и ты это доказал примером - респект. Но вопрос состоял в ином: зачем прописывать в коде, скажем, для максимального возможного количества переменных в индюке - 10, десять вариантов вызовов индюка, где в первом - один параметр, во тором - два, в третье - три и т.д. Выбор идет через тот же свич, как вариант. Так зачем заморачиваться, сразу прописать все 64 параметра и точка. А может такой вариант не работает? Как думаешь?.
И на последок, что будет, если задать параметров больше, чем есть в самом индюке: не будем далеко ходить, берем твой код индюка, который Handle - убираем в коде строчку #property indicator_chart_window и заменим OnCalculate() на OnTick(). Вот и получили советника - закидываем его в тестер, жмем старт - считаем раз-два-три и жмем на стоп и созерцаем следующую картинку:
 

Вложения

  • EA_On_Handle.png
    EA_On_Handle.png
    119,7 КБ · Просмотры: 51
  • EA_On_Handle.mq4
    8,6 КБ · Просмотры: 16

AlexeNP

Гуру форума
вы спорите, как будто решаете кто бежит за коньяком)
сама по себе изначальная задача (моё имхо) - не имеет смысла - в параметрах индикатора могут быть все параметры которые есть, и еще с десяток, которых нет... определять кто из них кто хотя бы и по типу - тот еще квест...
для зачинщика спора - как я понял, тебе хотелось бы по простому через один советник прогнать 10-20-etc индикаторов по быстрому... но, следует помнить, что универсальные решения в каждом конкретном случае хорошими не будут, поэтому - определяй вызов индикаторов через define и получишь всё о чём мечтал
 

mobidik

-----
вы спорите, как будто решаете кто бежит за коньяком)
Суть в том, что если до конца не знаешь всех нюансов - не стоит советовать.
Вот возьмет kudinoff и именно так и сделает, а потом глюки в работе кода и найди что не так, ведь...
А kudinoffу следует поступить именно так, как он видел.
Примеры реализации видел (не в коде) на 4-ке, но там было ограничение по максимальному количеству настроек.
Можно через StringSplit получить массив настроек. Но дальше?
if(ArraySize(arr) == 1) ind = iCustom(NULL,0, arr[0],0,0);
if(ArraySize(arr) == 2) ind = iCustom(NULL,0, arr[0],arr[1],0,0);
и так далее по количеству настроек. Можно ли как то проще сделать?
Верно говоришь: определить нужные параметры + их количество - присвоить define, все это проделать в OnInit(), а затем уже использовать в iCustom где угодно, по коду.
 

vladradon

Программист
Влад, на первый вопрос ты так и не ответил - куда девать остальные 15 параметров, которые будут переданы по вызову в индюк, которых там нет. Ведь после перечня самих параметров, следующих два параметра это индекс и буфер - как индюк будет знать, что какую-то часть параметров нужно пропустить и перепрыгнуть к двум последним..?
Это делает сама программа - сколько бы ни было параметров, она возьмет 2 последних за номер буфера и номер бара. Все ненужные просто уходят в никуда.
По второму: то, что это можно сделать, я не спорю и ты это доказал примером - респект. Но вопрос состоял в ином: зачем прописывать в коде, скажем, для максимального возможного количества переменных в индюке - 10, десять вариантов вызовов индюка, где в первом - один параметр, во тором - два, в третье - три и т.д. Выбор идет через тот же свич, как вариант. Так зачем заморачиваться, сразу прописать все 64 параметра и точка. А может такой вариант не работает? Как думаешь?.
Я прописывал для себя в своем индюке - мне хватало 20-ти. Работает или нет - можешь сам проверить. Мой вариант работает при всех прописанных параметрах индюка и сколько будет больше задано в iCustom не важно - они не мешают.
А прописывать через свич все варианты можно только для заведомо известного по параметрам индюка - нужно знать где какого типа параметр задается, что у меня определяется из хэндла автоматически для любого индюка и не нужно весь этот набор параметров под каждого индюка переписывать в свиче.
И на последок, что будет, если задать параметров больше, чем есть в самом индюке: не будем далеко ходить, берем твой код индюка, который Handle - убираем в коде строчку #property indicator_chart_window и заменим OnCalculate() на OnTick(). Вот и получили советника - закидываем его в тестер, жмем старт - считаем раз-два-три и жмем на стоп и созерцаем следующую картинку:
Это я и сам видел. Тестер создает максимум 256 окон индикатора и далее память больше не забивается, а данные нормально считываются. От количества параметров ничего не зависит в моем варианте - всегда в тестере будет 256 вариантов забивать и подтормаживать, будет параметров больше или меньше нужного количества.
Зарисовку графика можно убрать HideTestIndicators(true);
Вариант рабочий!
 
Последнее редактирование:

mobidik

-----
Это делает сама программа - сколько бы ни было параметров, она возьмет 2 последних за номер буфера и номер бара. Все ненужные просто уходят в никуда.
Это твое личное утверждение или предоставишь ссылку на документацию?
Это я и сам видел. Тестер создает максимум 256 окон индикатора и далее память больше не забивается, а данные нормально считываются. От количества параметров ничего не зависит в моем варианте - всегда в тестере будет 256 вариантов забивать и подтормаживать, будет параметров больше или меньше нужного количества.
Зарисовку графика можно убрать HideTestIndicators(true);
Вариант рабочий!
А что, если скрыть отображение индюка, то нет к нему обращения? :)
Влад, раз тебя устраивает пользоваться таким костылём - пользуйся.
Все, хватит, проехали, ты молодец.
 

vladradon

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

gravity

Местный знаток
👋
Может кто-нибудь подсказать, как можно с помощью функций TextSetFont, TextGetSize узнать параметры шрифта. При том, что текст изначально выводится через OBJ_LABEL.

Мысль такая, что в TextSetFont вписать размер шрифта из настроек как и для OBJ_LABEL и потом через TextGetSize узнать высоту и ширину шрифта. И использовать эту инфу, чтобы расчитать расстояния между OBJ_LABEL, чтобы при изменении шрифта всё изменялось пропорционально.

Не пойму, как в TextGetSize 2ой и 3ий параметры передавать. Как им вообще пользоваться?)
 

vladradon

Программист
А есть ли способ узнать ширину букв?
Почитай документацию по TextOut - там пример есть часов с использованием битмапа. Вот скрипт из документации, создающий подобие часов. В нем есть вариант использования нужных тебе функций. Но использовать OBJ_LABEL и битмап не рекомендуют. Я вообще делаю проще: задаю координаты смещения X и Y для всей панели, от которых задаю смещение каждого отдельного текста и добавляю умножение этого смещения на -1 при задании противоположных углов по X и Y отдельно.
 

Вложения

  • Clock.mq4
    7,9 КБ · Просмотры: 13

AlexeNP

Гуру форума
👋
Может кто-нибудь подсказать, как можно с помощью функций TextSetFont, TextGetSize узнать параметры шрифта. При том, что текст изначально выводится через OBJ_LABEL.

Мысль такая, что в TextSetFont вписать размер шрифта из настроек как и для OBJ_LABEL и потом через TextGetSize узнать высоту и ширину шрифта. И использовать эту инфу, чтобы расчитать расстояния между OBJ_LABEL, чтобы при изменении шрифта всё изменялось пропорционально.

Не пойму, как в TextGetSize 2ой и 3ий параметры передавать. Как им вообще пользоваться?)
uint width=0,height=0;
TextGetSize("Всякие буквы",width,height);
width= ширина текста "Всякие буквы"
height= высота текста "Всякие буквы"
 

AlexeyVik

Программист mql4 mql5
👋
Может кто-нибудь подсказать, как можно с помощью функций TextSetFont, TextGetSize узнать параметры шрифта. При том, что текст изначально выводится через OBJ_LABEL.

Мысль такая, что в TextSetFont вписать размер шрифта из настроек как и для OBJ_LABEL и потом через TextGetSize узнать высоту и ширину шрифта. И использовать эту инфу, чтобы расчитать расстояния между OBJ_LABEL, чтобы при изменении шрифта всё изменялось пропорционально.

Не пойму, как в TextGetSize 2ой и 3ий параметры передавать. Как им вообще пользоваться?)
Если во входящих параметрах стоит знак & между типом и именем переменной, это значит что переменная передаётся по ссылке. Как это понимать ищи в документации.
Так вот в функцию TextGetSize второй и третий параметр передаётся по ссылке. То-есть сначала надо объявить эти две переменные
Код:
uint width;
uint height;
и их вписать при вызове функции
Код:
TextGetSize("пробный текст", width, height);
и после выполнения этой функции в переменных будут ширина и высота текста в пикселях. Высота, наверное тебе не нужна, но без неё не обойтись. Высоту определит размер шрифта.
 

gravity

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

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

Код:
   TextGetSize("4",width_t,height_t); // ширина и высота текста

4 тут взято произвольно, длина 4ки равна 4м, но у всех символов разная длина. От 2 до 5, которые я просмотрел.

t1...t10. Пока оставил, пробовал каждую строку в отдельности считать через TextOut , но тоже не вышло ничего путного.
 

Вложения

  • Информер1.mq4
    17,5 КБ · Просмотры: 9
  • Screenshot_4.jpg
    Screenshot_4.jpg
    122,5 КБ · Просмотры: 27
Последнее редактирование:

gravity

Местный знаток
Есть вот такой пример индикатора, адаптируется к изменению шрифта.
Я пробовал делать по подобию, но не выходит как в примере.
С dy - смещение по вертикали всё нормально. А с dx при умножении расстояние слишком малое получается и при изменении цифры, на которую умножаешь вообще ничего не меняется.
 

Вложения

  • _TRO_PERIOD_DATA(+).mq4
    23,7 КБ · Просмотры: 11
  • _TRO_PERIOD_DATA(+).jpg
    _TRO_PERIOD_DATA(+).jpg
    86,2 КБ · Просмотры: 27

vladradon

Программист
А с dx при умножении расстояние слишком малое получается
У тебя там, помню, ошибка была: dx=(FSize/15.0); - нужно на 15.0 делить, а не 15! Иначе дробная часть пропадает из-за того, что и FSize и 15 целые числа. С dy так же.
 

gravity

Местный знаток
У тебя там, помню, ошибка была: dx=(FSize/15.0); - нужно на 15.0 делить, а не 15! Иначе дробная часть пропадает из-за того, что и FSize и 15 целые числа. С dy так же.
Cпасибо! 🤓🤝
Даа, где ты раньше был) точно в этом ошибка. dx=(FSize/15.0); выдает 0, без знаков после запятой. Почему интересно так, хотя dx объявлен как double.

Аа, понял, FSize то осталась целым.
 
Верх