Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1194

 
vladmirad:

Спасибо за совет, я об этих функциях знаю.

А вы не знаете почему очень многие и вы в том числе отвечают тем кто в mql сам плавает как топор. А советы знающих игнорируют? В вашем случае вот этот совет:

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

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Artyom Trishkin, 2020.06.29 00:03

Здравствуйте.
Начните с отслеживания состояния графика в OnChartEvent() https://www.mql5.com/ru/docs/event_handlers/onchartevent
Есть несколько событий, которые вам потребуются:
CHARTEVENT_OBJECT_CREATE Создание графического объекта
CHARTEVENT_OBJECT_CHANGE Изменение свойств графического объекта через диалог свойств
CHARTEVENT_OBJECT_DELETE Удаление графического объекта
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Выведите все параметры обработчика OnChartEvent() в журнал и поглядите их значения при добавлении/изменении/удалении графических объектов. Это даст вам направление куда двигаться.

 
vladmirad:

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

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

Как выше отметили, работайте с событиями чарта:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool applyObject(const string _objName) {
  if(MessageBox("Сохранить параметры объекта \"" + _objName + "\" для эксперта?", "ObjChange", MB_YESNO) == IDYES) {
    objName = _objName; // Запись имени изменяемого объекта
    // Запись других параметров изменяемого объекта ...
    return true;
  }
  return false;
}

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam
) {
//---
  if(id == CHARTEVENT_OBJECT_CREATE || id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE) {
    applyObject(sparam);
  }
}
Файлы:
ObjChange.mq5  5 kb
 
Artyom Trishkin:
Здравствуйте.
Начните с отслеживания состояния графика в OnChartEvent() https://www.mql5.com/ru/docs/event_handlers/onchartevent
Есть несколько событий, которые вам потребуются:
CHARTEVENT_OBJECT_CREATE Создание графического объекта
CHARTEVENT_OBJECT_CHANGE Изменение свойств графического объекта через диалог свойств
CHARTEVENT_OBJECT_DELETE Удаление графического объекта
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Выведите все параметры обработчика OnChartEvent() в журнал и поглядите их значения при добавлении/изменении/удалении графических объектов. Это даст вам направление куда двигаться.

Спасибо большое, уже воспользовался вашим советом!

 
Mihail Matkovskij:

Найти и вывести в журнал объекты заданного типа с их координатами можно так:

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

Спасибо и вам, Михаил, за практическую помощь!
 
Mihail Matkovskij:

Как выше отметили, работайте с событиями чарта:

Михаил, Ваша и @Artyom Trishkin помощь оказалась очень кстати!

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

Алгоритм я себе представляю так:
1. По считанным координатам линии тренда вычисляется коэффициент приращения тренда в расчете на 1 бар выбранного ТФ.
2. Вычисляется ценовая координата линии тренда на текущем баре и в течение выбранного ТФ отслеживается факт пересечения графиком этой точки.
3. Если факт имеет место, переходим к обработке этого события, например, открываем ордер. Если нет, процедура повторяется для следующего бара.

Но, может быть, в МТ4(5), в силу специфики этой системы, все решается гораздо проще? 

 
Alexey Viktorov:

А вы не знаете почему очень многие и вы в том числе отвечают тем кто в mql сам плавает как топор. А советы знающих игнорируют? В вашем случае вот этот совет:


Уважаемый Алексей, вы совершенно правы относительно меня в части знания MQL. Но ошибаетесь в том, что я не прислушиваюсь к советам знающих людей, потому что первым делом я обратился в личку к человеку, которого считаю одним из выдающихся профессионалов MQL и которого и вы прекрасно знаете - это @Artyom Trishkin.

Именно его советы позволили мне сразу понять, как решить свою проблему, и открыли глаза, куда двигаться дальше. А @Mihail Matkovskij еще больше упростил мне жизнь!

 
vladmirad:

Михаил, Ваша и @Artyom Trishkin помощь оказалась очень кстати!

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

Алгоритм я себе представляю так:
1. По считанным координатам линии тренда вычисляется коэффициент приращения тренда в расчете на 1 бар выбранного ТФ.
2. Вычисляется ценовая координата линии тренда на текущем баре и в течение выбранного ТФ отслеживается факт пересечения графиком этой точки.
3. Если факт имеет место, переходим к обработке этого события, например, открываем ордер. Если нет, процедура повторяется для следующего бара.

Но, может быть, в МТ4(5), в силу специфики этой системы, все решается гораздо проще? 

Как я уже говорил выше, набросайте исходник, чтобы было от чего отталкиваться. Тем более, кое-какие знания о том как получить данные объекта на графике у Вас уже есть. Делать за Вас всё с нуля никому не охота. А так, то чего не хватает для работы эксперта можно будет дополнить...

 
vladmirad:

Михаил, Ваша и @Artyom Trishkin помощь оказалась очень кстати!

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

Алгоритм я себе представляю так:
1. По считанным координатам линии тренда вычисляется коэффициент приращения тренда в расчете на 1 бар выбранного ТФ.
2. Вычисляется ценовая координата линии тренда на текущем баре и в течение выбранного ТФ отслеживается факт пересечения графиком этой точки.
3. Если факт имеет место, переходим к обработке этого события, например, открываем ордер. Если нет, процедура повторяется для следующего бара.

Но, может быть, в МТ4(5), в силу специфики этой системы, все решается гораздо проще? 

Не очень понятно что хотите найти. Точку пересечения трендовой линии ценой на каком-либо баре? Для этого есть функции получения значения линии на баре. Но я бы использовал уравнение прямой:

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

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

Artyom Trishkin, 2020.05.02 12:27

Используйте уравнение прямой:

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+

Указываете номер и цену бара точки слева, указываете номер и цену бара точки справа (по этим точкам строится виртуальная линия) и указываете искомый бар.
Функция вернёт цену искомого бара.


Не требует наличие реального объекта.
 
Artyom Trishkin:

..... Для этого есть функции получения значения линии на баре. Но я бы использовал уравнение прямой:

.....

Артём, а вот тут поподробнее, пожалуйста.

Я или раньше не очень внимателен был, или документацию подправили... Не знаю.

Но я всегда считал, что ObjectGetDouble возвращал цену линии на конкретном баре (я о цене именно). А тут решил маленький скриптик чиркануть для проверки, и что я увидел?

1. Нет в параметрах номера бара, на котором нужно считать значение.

2. Индентификатор свойства: 

OBJPROP_PRICE

Координата цены

double    модификатор=номер точки привязки


это только точка привязки!

Да, по большому счёту, если я в коде рисую эту линию, то эти точки у меня и так уже есть! Нафига мне их узнавать? Да и вообще, какой в этом смысл?

А как взять значение цены этой линии в другом месте?


Получается, что это

prop_modifier

[in]  Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

тоже вооще никакого смысла не несёт? Это что, ищем точки привязки ЛЮБОЙ линии веера? Бред. Пардон.

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Сергей Таболин:

Артём, а вот тут поподробнее, пожалуйста.

Я или раньше не очень внимателен был, или документацию подправили... Не знаю.

Но я всегда считал, что ObjectGetDouble возвращал цену линии на конкретном баре (я о цене именно). А тут решил маленький скриптик чиркануть для проверки, и что я увидел?

1. Нет в параметрах номера бара, на котором нужно считать значение.

2. Индентификатор свойства: 

OBJPROP_PRICE

Координата цены

double    модификатор=номер точки привязки


это только точка привязки!

Да, по большому счёту, если я в коде рисую эту линию, то эти точки у меня и так уже есть! Нафига мне их узнавать? Да и вообще, какой в этом смысл?

А как взять значение цены этой линии в другом месте?


Получается, что это

prop_modifier

[in]  Модификатор указанного свойства. Для первого варианта по умолчанию значение модификатора равно 0. Большинство свойств не требуют модификатора. Означает номер уровня в инструментах Фибоначчи и в графическом объекте Вилы Эндрюса. Нумерация уровней начинается с нуля.

тоже вооще никакого смысла не несёт? Это что, ищем точки привязки ЛЮБОЙ линии веера? Бред. Пардон.

С такими объектами мало работал. Вот эта функция что вернёт для трендовой по указанному времени бара? Мне нет времени проверять. Пусть и маленьким скриптом...

ObjectGetValueByTime()

Документация по MQL5: Графические объекты / ObjectGetValueByTime
Документация по MQL5: Графические объекты / ObjectGetValueByTime
  • www.mql5.com
Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду...
Причина обращения: