Свечной индикатор – определяем какой по отношению к выборке является свеча - Страница 2


18.11.2018, в 19:27
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Андрей Вчера, в 13:46:
Всем здравствуйте!
Нужен индикатор для МТ5

Здесь все про МТ4. МТ5 с виду схож, но есть существенные различия.

Андрей Вчера, в 13:46:
показывать размер тела свечи и размер каждой из его теней в виде всплывающего оконца при наведении на свечу.

Я таких не встречал. Возможно, потому, что никогда не искал. =)
Вот посмотрите на мое творчество:
Скачать индикатор МТ5, который при наведении курсора показывает во всплывающей подсказке размеры тела свечи и ее теней.
Скрин ниже показывает, что отображается в окне:
Индикатор МТ5, который при наведении курсора показывает во всплывающей подсказке размеры тела свечи и ее теней Добавлено сообщение 18.11.2018, в 19:31Да, забыл указать, что для удобного отображения пунктов (в зависимости от разрядности котировок и инструмента) введен параметр K_Punkt. Например, для удобного восприятия на четырехзначных котировках удобно, чтобы он был равен 1, а на пятизначных 10. Думаю, смысл понятен.

+ -
Цитировать Ответить

19.11.2018, в 12:44
Андрей
Аватар гостя
Регистрация: нет
Сообщений: 5
Рейтинг: 0

Отлично! Спасибо огромное!
Только не все свечи показывает точно – на 1 пункт разница), то у тела, то у тени.

+ -
Цитировать Ответить

19.11.2018, в 17:42
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Андрей Сегодня, в 12:44:
Только не все свечи показывает точно – на 1 пункт разница), то у тела, то у тени.

Исправленная и дополненная версия 2.0. Выводит в подсказке кроме размера тела и теней еще и стандартную информацию о свече:
Исправленная и дополненная версия 2.0 размер тела и теней свечей с информацией о свече
Скачать view_body_and_shadow_v2.mq5
Для использования в терминале MT4, переименовать расширение файла индикатора на mq4.

+ -
Цитировать Ответить

20.11.2018, в 22:51
Андрей
Аватар гостя
Регистрация: нет
Сообщений: 5
Рейтинг: 0

Ваще круто!! Только вот терминал не видит его ни фига)) Установил туда же, что и предыдущий; перезагрузил и ничего(( Добавлено сообщение 20.11.2018, в 23:00Всё, заработал (удалил файл из папки и снова вставил)
Но вот проблема с разницей в 1 пункт осталась( Добавлено сообщение 20.11.2018, в 23:06Теперь, стабильно (проверил несколько свечей) у тела на 1 пункт больше.
Наверно лучше вернуть как прежде было…., а хотя хня всё это, подумаешь один пункт.
В общем – от души.
Я должен как-то Вас отблагодарить; в цифирках) Добавлено сообщение 20.11.2018, в 23:26Извиняюсь, только ещё одна маленькая просьба: можно, чтоб в окошке отображались цены оупен, клоус, хай и лоу в таком же порядке, как и в терминале (Open High Low Close) а то как-то не привычно.

+ -
Цитировать Ответить

20.11.2018, в 23:32
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Андрей Сегодня, в 22:51:
Теперь, стабильно (проверил несколько свечей) у тела на 1 пункт больше.

Совершенно правильно все считается. Разрешите задать Вам вопрос из курса школьной математики. Сколько натуральных чисел включает диапазон от 1 до 10?
Решение: 10-1+1 = 10 натуральных чисел.
Аналогично и с расчетом тела свечи. См. картинку. Сколько пунктов в диапазоне от 1.29818 до 1.28924?
Тело свечи включает диапазон цен от 1.29818 до 1.28924.
Рассчитаем размер тела:
1.29818-1.28924+0.00001 = 0.00895,
где 0.00001 – минимальное изменение цены (он же стоимость размера пункта текущего инструмента в валюте котировки).
И в целочисленном выражении, разделив результат на стоимость размера пункта текущего инструмента в валюте котировки, получим 0.00895/0.00001 = 895 пунктов.

+3 + -
Цитировать Ответить

21.11.2018, в 13:05
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Андрей Сегодня, в 22:51:
можно, чтоб в окошке отображались цены оупен, клоус, хай и лоу в таком же порядке, как и в терминале (Open High Low Close) а то как-то не привычно.

Индикатор выводит во всплывающем окне  кроме размера тела и теней еще и стандартную информацию о свече
Перезалил.
Скачать view_body_and_shadow_v2.mq5

+5 + -
Цитировать Ответить

24.11.2018, в 20:14
Антон
Аватар гостя
Регистрация: нет
Сообщений: 1
Рейтинг: 0

Здравствуйте.
Уважаемый админ посмотрите пожалуста почту. Я вам предложение о написании индикатора отправил 3 дня назад.

+ -
Цитировать Ответить

11.01.2019, в 18:42
Вадим
Аватар гостя
Регистрация: нет
Сообщений: 2
Рейтинг: 0

Здравствуйте уважаемый Влад. Есть ли у вас возможность индикатор для МТ5 “view_body_and_shadow.mq5″ который вы создали, переделать на МТ4?

+ -
Цитировать Ответить

11.01.2019, в 20:19
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Вадим Сегодня, в 18:42:
Есть ли у вас возможность индикатор для МТ5 “view_body_and_shadow.mq5″ который вы создали, переделать на МТ4?

Здравствуйте.
Просто переименуйте расширение файла индикатора в mq4, т.е. view_body_and_shadow.mq4
И все заработает *FEDORA*

+ -
Цитировать Ответить

12.01.2019, в 09:31
Вадим
Аватар гостя
Регистрация: нет
Сообщений: 2
Рейтинг: 0

Добрый день Влад. Спасибо, не ожидал что так оперативно среагируете. Сможете модифицировать «view_body_and_shadow_v2.mq4» и добавить в индикатор параметр или функцию ”задаваемый диапазон ТЕЛА свечи” в пунктах, нужны определенные свечи для визуализации на графике, например: задаваемый диапазон 20-30п,размер ТЕЛА закрытой свечи-23п, , и так что бы отображения после закрытия этих свеч на графике было видно стрелками или цветом, также сопровождался алертом. С уважением Вадим.

+ -
Цитировать Ответить

27.01.2019, в 14:44
Никита
Аватар гостя
Регистрация: нет
Сообщений: 7
Рейтинг: 1

admin 17.05.2018, в 23:20:
Скачать индикатор, который отмечает свечу с заданным периодом минут и смещением на таймфрейме М1 – select_each_n_candle_v2.mq4

Здравствуйте Admin. Подскажите пожалуйста такой момент. Заново скачал индикатор(уже скаченный давным давно сгорел вместе с жестким диском), который Вы написали, закинул в папку “indicators”, и он почему то к графику не прикрепляется. Даже окно настройки индикатора не появляется когда пытаешься нанести индикатор на сам график. Может знаете в чём причина? Первый раз с таким сталкиваюсь. Буду Вам очень признателен!!!
Жму руку! Добавлено сообщение 27.01.2019, в 14:53Здравствуйте Admin. В посте №36 Вы написали мне индикатор (спасибо еще раз огромное). Скачал его заново, поместил в папку “indicators”, а он к графику не прикрепляется, даже не открывается окно настройки индикатора. Можете подсказать в чем причина? При многом Вам благодарен.
Жму руку!!! Добавлено сообщение 27.01.2019, в 15:02Прошу прощения за будляж сообщений… они не сразу появляются:) думал что с первого раза не отправил :) ))

+ -
Цитировать Ответить

28.01.2019, в 14:04
Алексей
Аватар гостя
Регистрация: нет
Сообщений: 1
Рейтинг: 0

Добрый день!
Классный индикатор.
А можете сделать чтобы при его использовании не слетала настройка терминала “График сверху” (Графики->График сверху)?

+ -
Цитировать Ответить

29.01.2019, в 11:41
Никита
Аватар гостя
Регистрация: нет
Сообщений: 7
Рейтинг: 1

Прошу прощения…какой то косяк в установке терминала. буду искать причину

+ -
Цитировать Ответить

31.01.2019, в 08:11
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Алексей Вчера, в 14:04:
А можете сделать чтобы при его использовании не слетала настройка терминала “График сверху” (Графики->График сверху)?

Здравствуйте.
В коде индикатора заккоментируйте строки:

ChartSetInteger(0, CHART_FOREGROUND, false);
ChartSetInteger(0, CHART_FOREGROUND, true);
+ -
Цитировать Ответить

26.05.2019, в 22:10
Михаил
Аватар гостя
Регистрация: нет
Сообщений: 1
Рейтинг: 0

Уважаемый админ, доброго времени суток! У вас очень полезный сайт! Не знаю, есть в этой ветке кто еще или нет.. но попробую написать.. Осваиваю mql относительно недавно и не могу реализовать нужный код к сожалению. Может поможете? Вот ТЗ:

1.Задать во внешних переменных параметр отвечающий за выборку. Т.е. количество свечей, на истории которое будет использоваться для анализа.
2. Укажем так же во внешних переменных такие показатели как:

extern int MyBar=0; //My Bar (номер бара, с которым сравнивать график с конца)
extern int Body_Plus=70; // Вверх тела (Указываем верхний придел диапазона тела свечи)
extern int Body_Minus=70; // Низ тела (Указываем нижний придел диапазона тела свечи)
extern int UpperShadow_Plus=30; // Верхняя тень + (Указываем верхний придел диапазона верхней тени свечи)
extern int UpperShadow_Minus=30; // Верхняя тень – (Указываем нижний придел диапазона верхней тени свечи)
extern int LowerShadow_Plus=30; // Нижняя тень + (Указываем верхний придел диапазона нижней тени свечи)
extern int LowerShadow_Minus=30; // Нижняя тень – (Указываем нижний придел диапазона нижней тени свечи)
Чтобы можно было выбирать данные значения, задавать их.
3.Метод анализа на основе этих данных следующий- Берется заданное в первом параметре количество свечей, затем они вычисляются на предмет верхнего придела диапазона тела свечи, нижнего придела диапазона тела свечи, верхняя тень плюс, минус, и нижняя тень плюс- минус. Т.е. расстояние верхней тени от тела свечи до конца тени, и точно так же для нижней тени. После этих вычислений происходит проверка с каждой последующей текущей свечой, на том ТФ который включен. Если есть совпадение по истории данных свечек, то на текущей свече загорится точка либо стрелка соответственно для бай свечи бай точка, для селл свечи селл точка.
4.Заключение, т.е. индикатор должен анализировать выборку истории на предмет повторения свечек. Проанализировав историю, он запоминает повторяющиеся свечи и каждую новую свечу на выбранном фрейме сверяет ее с выборкой. Если если совпадение по всем параметрам, индюк дает сигнал.

Ну как-то так, надеюсь написал все понятно :)

+ -
Цитировать Ответить

22.09.2019, в 16:27
Sergey
Аватар гостя
Регистрация: нет
Сообщений: 1
Рейтинг: 0

Помогите!!! Есть индикатор, который рисует вертикальные линии сигнала. В индикаторе нет буферов чтоб можно было подключиться к нему и привязать советник. Каким образом можно определить что свеча появилась на первой свече, а не на 10. Помогите такого я не нашел в нете. Добавлено сообщение 22.09.2019, в 16:29Помогите!!! Есть индикатор, который рисует вертикальные линии сигнала. В индикаторе нет буферов чтоб можно было подключиться к нему и привязать советник. Каким образом можно определить, что вертикальная линия появилась на первой свече, а не на 10. Помогите такого я не нашел в нете.

+ -
Цитировать Ответить

22.09.2019, в 23:18
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Sergey Сегодня, в 16:27:
Каким образом можно определить, что вертикальная линия появилась на первой свече, а не на 10

Скорее всего, никаким, если нет буферов. Либо возможно (теоретически, но, очевидно, сложно на практике) по параметрам графических объектов (линии). В общем, программно отслеживать появление графического объекта на такой-то свече и отсюда плясать. В программировании, в общем-то, возможно практически все. Другой вопрос состоит в том, а “стоит ли овчинка выделки” ? Может, есть иной путь… Добавлено сообщение 22.09.2019, в 23:23

admin Сегодня, в 23:18:
программно отслеживать появление графического объекта на такой-то свече

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

admin Сегодня, в 23:18:
Скорее всего, никаким, если нет буферов.

Если линия рисуется не графическими объектами, а средствами индикаторов (индикаторными линиями, гистограммами и т.п.), то буфера точно есть. Главное, их идентифицировать.

+ -
Цитировать Ответить

05.03.2020, в 14:57
Евгений
Аватар гостя
Регистрация: нет
Сообщений: 1
Рейтинг: 0

Так рад что попал на ваш форум .Тут так все доволны и так быстро делаются “Хотелки” Но вот моя идея у других програмистрв всё никак не получается может у вас получиться.Индикатор Вопросы для составления технического задания.
1) Название для советника (индикатора, скрипта)
2) «Brick»
3) Для какого терминала нужен советник (МТ4 или МТ5)
4) МТ4
5) Параметры стратегии. Каждому параметру должен быть присвоено уникальным имя (на латинском) и краткое описание. При описании алгоритма использовать имена параметров.
6) Это индикатор который, подаёт звуковой и текстовый сигнал, а также указывает стрелками направления движения. Условия для сигнала:
7) Должно появится энное количество одинаковых по размеру свечей, обязательное условие они должны находиться на одной цене И БЕЗ ТЕНЕЙ. Если одинаковые по размеру свечи получаются при восхождении или снижении, то их не учитывать.
8) Какие индикаторы используются в роботе? Какие настройки у индикаторов? Значение индикаторов берет с текущего бара или с закрытого?
9) Индикатор берёт значения с закрытого бара
10) В индикаторе нужны настройки:
11) 1) Возможность установки Размера свечи ( или высоты)в пунктах от 1 до 40
12) 2) количество свечей под подряд (от 1 до 5 )
13) 3) настройка стрелок по цвету
14) Требуется ли оповещение (звуковое, alert, email, push). Да, alert и push

15) Требуются ли для работы графические элементы на графике (кнопки, линии, вспомогательная информация) ДА, нужны стрелки И по возможности, после формирования сигнала должна появится линия которая подчёркивает этот сигнал. Это своего рода уровень.линия должна проходить через весь экран и сохраняться на следуюшие дни. (может коряво объяснил, если что то извените)
16) Дополнительная информация

+ -
Цитировать Ответить

01.04.2020, в 14:12
Галина
Аватар гостя
Регистрация: нет
Сообщений: 1
Рейтинг: 0

Добрый день, ищу индикатор на каждую свечу без перерисовки, может работали с таким? Буду благодарна или возьму на тестовый период. С уважением

+ -
Цитировать Ответить

01.04.2020, в 15:03
admin
Аватар админа
Регистрация: 17.02.2011
Сообщений: 4565
Рейтинг: 3594

Галина Сегодня, в 14:12:
ищу индикатор на каждую свечу

Здравствуйте.
А что должен отображать этот индикатор?

+ -
Цитировать Ответить

10.04.2020, в 00:13
Игорь
Аватар гостя
Регистрация: нет
Сообщений: 1
Рейтинг: 0

Профита вам!)
Нужен индикатор, когда за 30 сек до закрытия (например, на М5) тела, свеча достигла нужной длинны, выдается SendNotification.
Вижу, что первая часть индикатора уже мелькала в предыдущих сообщениях (индикатор алерта после закрытия тела свечи), но я не знаю, как прикрутить алерт с условием 30 сек до закрытия. Спасибо за терпение, всех благ и заранее спасибо)))) Добавлено сообщение 10.04.2020, в 00:29

Игорь 10.04.2020, в 00:13:

Забыл добавить, что для МТ4. Добавлено сообщение 10.04.2020, в 00:36Использую индикатор Bar Value (copyright “AlievTM”). Вот к нему и хотел прикрутить SendNotification с условием в 30 сек до закрытия при достижении длинны.
Сам я не программер. Но пытаюсь разобраться с этим вопросом.

+ -
Цитировать Ответить

14.05.2020, в 15:57
Никита
Аватар гостя
Регистрация: нет
Сообщений: 7
Рейтинг: 1

Здравствуйте ребята! Можно по интересоваться таким моментом: вот есть индикатор Color Levels. У него есть 3 закрашенных квадратика. Можете пожалуйста сделать таких квадратиков 8 штук? Для МТ4 и для МТ5 !!! Буду Вам очень признателен! Спасибо огромное! Жму руку! Добавлено сообщение 14.05.2020, в 15:59Картинку почему то не получается добавить с этим индикатором Добавлено сообщение 14.05.2020, в 16:08

//+------------------------------------------------------------------+
//|                                                 Color Levels.mq4 |
//|                                        Copyright 2015, omutmoren |
//|                                       https://www.investlabfx.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, omutmoren"
#property link      "https://www.investlabfx.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator Parameters                                      |
//+------------------------------------------------------------------+
extern ENUM_BASE_CORNER InpCorner   =  CORNER_LEFT_UPPER;   // Угол графика для привязки
extern color            panl_0_cl   =  clrGainsboro;        // Цвет панели инструментов
extern bool             panl_0_st   =  false;               // Отображать панель?
extern color            rect_1_cl   =  clrCrimson;          // 1. Цвет границы
extern ENUM_LINE_STYLE  rect_1_st   =  STYLE_SOLID;         // 1. Стиль границы
extern int              rect_1_wd   =  2;                   // 1. Толщина границы
extern color            rect_2_cl   =  clrDarkGreen;        // 2. Цвет границы
extern ENUM_LINE_STYLE  rect_2_st   =  STYLE_SOLID;         // 2. Стиль границы
extern int              rect_2_wd   =  2;                   // 2. Толщина границы
extern color            rect_3_cl   =  clrLightPink;        // 3. Цвет прямоугольника
extern color            rect_4_cl   =  clrDarkSeaGreen;     // 4. Цвет прямоугольника
extern color            rect_5_cl   =  clrMediumPurple;     // 5. Цвет прямоугольника
extern color            line_1_cl   =  clrCrimson;          // 6. Цвет линии
extern ENUM_LINE_STYLE  line_1_st   =  STYLE_SOLID;         // 6. Стиль линии
extern int              line_1_wd   =  2;                   // 6. Толщина линии
extern color            line_2_cl   =  clrPurple;           // 7. Цвет линии
extern ENUM_LINE_STYLE  line_2_st   =  STYLE_SOLID;         // 7. Стиль линии
extern int              line_2_wd   =  2;                   // 7. Толщина линии

// Для кнопок
bool              InpSelection      =  false;               // Выделить для перемещений
bool              InpHidden         =  true;                // Скрыт в списке объектов
bool              InpHidden_OBJ     =  false;               // Скрыт в списке объектов
bool              InpBackRect       =  false;               // Объект на заднем плане

// Координаты
extern int x_coor = 7;    // Сдвиг по оси X
extern int y_coor = 10;    // Сдвиг по оси Y
int x_size = 153;
int y_size = 31;
int x_step = 7;
int y_panl = 20;
int x_rect = 17;
int y_rect = 17;
int y_line = 7;

string obj_name[8] = {"name_1","name_2","name_3","name_4","name_5","name_6","name_7","name_8"};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
   RectLabelDelete(0,obj_name[0]);
   RectLabelDelete(0,obj_name[1]);
   RectLabelDelete(0,obj_name[2]);
   RectLabelDelete(0,obj_name[3]);
   RectLabelDelete(0,obj_name[4]);
   RectLabelDelete(0,obj_name[5]);
   RectLabelDelete(0,obj_name[6]);
   RectLabelDelete(0,obj_name[7]);
}
//+------------------------------------------------------------------+
//| 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[])
{
   CreatePanel();
   CreateRect();

   return(rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   datetime dt_1     = 0;
   double   price_1  = 0;
   datetime dt_2     = 0;
   double   price_2  = 0;
   int      window   = 0;
   int      x        = 0;
   int      y        = 0;

   // Нажатие на первый прямоугольник
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      if (clickedChartObject == obj_name[1]) {
         string name = "name_" + IntegerToString(MathRand() + 100,0,' ');

         y = y_coor + y_rect + 3*x_step;
         ChartXYToTimePrice(0, x_coor + x_step, y, window, dt_1, price_1);

         y = y_coor + 3*y_rect + 4*x_step;
         ChartXYToTimePrice(0, x_coor + x_size, y, window, dt_2, price_2);

         RectangleCreate(0,name,0,dt_1,price_1,dt_2,price_2,rect_1_cl,rect_1_st,rect_1_wd,false,false,true,InpHidden_OBJ,0);
      }
   }
   // Нажатие на второй прямоугольник
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      if (clickedChartObject == obj_name[2]) {
         string name = "name_" + IntegerToString(MathRand() + 100,0,' ');

         y = y_coor + 3*y_rect + 4*x_step;
         ChartXYToTimePrice(0, x_coor + x_step, y, window, dt_1, price_1);

         y = y_coor + 4*y_rect + 7.5*x_step;
         ChartXYToTimePrice(0, x_coor + x_size, y, window, dt_2, price_2);         

         RectangleCreate(0,name,0,dt_1,price_1,dt_2,price_2,rect_2_cl,rect_2_st,rect_2_wd,false,false,true,InpHidden_OBJ,0);
      }
   }
   // Нажатие на третий прямоугольник
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      if (clickedChartObject == obj_name[3]) {
         string name = "name_" + IntegerToString(MathRand() + 100,0,' ');

         y = y_coor + 5*y_rect + 5*x_step;
         ChartXYToTimePrice(0, x_coor + x_step, y, window, dt_1, price_1);

         y = y_coor + 5*y_rect + 6*x_step;
         ChartXYToTimePrice(0, x_coor + x_size, y, window, dt_2, price_2);   

         RectangleCreate(0,name,0,dt_1,price_1,dt_2,price_2,rect_3_cl,STYLE_SOLID,2,true,true,true,InpHidden_OBJ,0);
      }
   }
   // Нажатие на четвёртый прямоугольник
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      if (clickedChartObject == obj_name[4]) {
         string name = "name_" + IntegerToString(MathRand() + 100,0,' ');

         y = y_coor + 5*y_rect + 7*x_step;
         ChartXYToTimePrice(0, x_coor + x_step, y, window, dt_1, price_1);

         y = y_coor + 5*y_rect + 6*x_step;
         ChartXYToTimePrice(0, x_coor + x_size, y, window, dt_2, price_2);

         RectangleCreate(0,name,0,dt_1,price_1,dt_2,price_2,rect_4_cl,STYLE_SOLID,2,true,true,true,InpHidden_OBJ,0);
      }
   }
   // Нажатие на пятый прямоугольник
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      if (clickedChartObject == obj_name[5]) {
         string name = "name_" + IntegerToString(MathRand() + 100,0,' ');

         y = y_coor + 5*y_rect + 8*x_step;
         ChartXYToTimePrice(0, x_coor + x_step, y, window, dt_1, price_1);

         y = y_coor + 5.45*y_rect + 6*x_step;
         ChartXYToTimePrice(0, x_coor + x_size, y, window, dt_2, price_2);

         RectangleCreate(0,name,0,dt_1,price_1,dt_2,price_2,rect_5_cl,STYLE_SOLID,2,true,true,true,InpHidden_OBJ,0);
      }
   }
   // Нажатие на первую линию
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      if (clickedChartObject == obj_name[6]) {
         string name = "name_" + IntegerToString(MathRand() + 100,0,' ');

         y = y_coor + 6*y_rect + 6*x_step;
         ChartXYToTimePrice(0, x_coor + x_step, y, window, dt_1, price_1);
         ChartXYToTimePrice(0, x_coor + x_size, y, window, dt_2, price_2);         

         TrendCreate(0,name,0,dt_1,price_1,dt_2,price_2,line_1_cl,line_1_st,line_1_wd,InpBackRect,true,false,false,InpHidden_OBJ,0);
      }
   }
   // Нажатие на вторую линию
   if (id == CHARTEVENT_OBJECT_CLICK) {
      string clickedChartObject = sparam;
      if (clickedChartObject == obj_name[7]) {
         string name = "name_" + IntegerToString(MathRand() + 100,0,' ');

         y = y_coor + 6*y_rect + 7*x_step;
         ChartXYToTimePrice(0, x_coor + x_step, y, window, dt_1, price_1);
         ChartXYToTimePrice(0, x_coor + x_size, y, window, dt_2, price_2);         

         TrendCreate(0,name,0,dt_1,price_1,dt_2,price_2,line_2_cl,line_2_st,line_2_wd,InpBackRect,true,false,false,InpHidden_OBJ,0);
      }
   }
}

//+------------------------------------------------------------------+
void CreatePanel()
{
   // Панель инструментов

   if (panl_0_st) {

      int x_pn = x_coor, y_pn = y_coor;
      if (InpCorner == 1)  x_pn = x_coor + x_size + x_step;
      if (InpCorner == 2)  y_pn = y_coor + y_rect + x_step;
      if (InpCorner == 3) {x_pn = x_coor + x_size + x_step; y_pn = y_coor + y_rect + x_step;}

      if (!RectLabelCreate(0,obj_name[0],0,x_pn,y_pn,x_size,y_size,panl_0_cl,BORDER_SUNKEN,InpCorner,
           clrBlack,STYLE_SOLID,2,true,InpSelection,true,0)) {
         return;
      }
   } else {
      panl_0_cl = ChartBackColorGet(0);
   }
}
//+------------------------------------------------------------------+
void CreateRect()
{
   // Первый прямоугольник
   int x_pn = x_coor + x_step, y_pn = y_coor + x_step;
   if (InpCorner == 1)  x_pn = x_coor + x_size;
   if (InpCorner == 2)  y_pn = y_coor + y_rect;
   if (InpCorner == 3) {x_pn = x_coor + x_size; y_pn = y_coor + y_rect;}

   if (!RectLabelCreate(0,obj_name[1],0,x_pn,y_pn,x_rect,y_rect,panl_0_cl,BORDER_FLAT,InpCorner,
        rect_1_cl,rect_1_st,rect_1_wd,InpBackRect,InpSelection,InpHidden,0)) {
      return;
   }   

   // Второй прямоугольник
   x_pn = x_coor + x_rect + 2*x_step; y_pn = y_coor + x_step;
   if (InpCorner == 1)  x_pn = x_coor + x_size - x_step - x_rect;
   if (InpCorner == 2)  y_pn = y_coor + y_rect;
   if (InpCorner == 3) {x_pn = x_coor + x_size - x_step - x_rect; y_pn = y_coor + y_rect;}

   if (!RectLabelCreate(0,obj_name[2],0,x_pn,y_pn,x_rect,y_rect,panl_0_cl,BORDER_FLAT,InpCorner,
        rect_2_cl,rect_2_st,rect_2_wd,InpBackRect,InpSelection,InpHidden,0)) {
      return;
   }  

   // Третий прямоугольник
   x_pn = x_coor + 2*x_rect + 3*x_step; y_pn = y_coor + x_step;
   if (InpCorner == 1)  x_pn = x_coor + x_size - 2*x_step - 2*x_rect;
   if (InpCorner == 2)  y_pn = y_coor + y_rect;
   if (InpCorner == 3) {x_pn = x_coor + x_size - 2*x_step - 2*x_rect; y_pn = y_coor + y_rect;}

   if (!RectLabelCreate(0,obj_name[3],0,x_pn,y_pn,x_rect,y_rect,rect_3_cl,BORDER_FLAT,InpCorner,
        rect_3_cl,STYLE_SOLID,0,InpBackRect,InpSelection,InpHidden,0)) {
      return;
   }  

   // Четвёртый прямоугольник
   x_pn = x_coor + 3*x_rect + 4*x_step; y_pn = y_coor + x_step;
   if (InpCorner == 1)  x_pn = x_coor + x_size - 3*x_step - 3*x_rect;
   if (InpCorner == 2)  y_pn = y_coor + y_rect;
   if (InpCorner == 3) {x_pn = x_coor + x_size - 3*x_step - 3*x_rect; y_pn = y_coor + y_rect;}

   if (!RectLabelCreate(0,obj_name[4],0,x_pn,y_pn,x_rect,y_rect,rect_4_cl,BORDER_FLAT,InpCorner,
        rect_4_cl,STYLE_SOLID,0,InpBackRect,InpSelection,InpHidden,0)) {
      return;
   }

   // Пятый прямоугольник
   x_pn = x_coor + 4*x_rect + 5*x_step; y_pn = y_coor + x_step;
   if (InpCorner == 1)  x_pn = x_coor + x_size - 4*x_step - 4*x_rect;
   if (InpCorner == 2)  y_pn = y_coor + y_rect;
   if (InpCorner == 3) {x_pn = x_coor + x_size - 4*x_step - 4*x_rect; y_pn = y_coor + y_rect;}

   if (!RectLabelCreate(0,obj_name[5],0,x_pn,y_pn,x_rect,y_rect,rect_5_cl,BORDER_FLAT,InpCorner,
        rect_5_cl,STYLE_SOLID,0,InpBackRect,InpSelection,InpHidden,0)) {
      return;
   }

   // Первая линия
   x_pn = x_coor + 5*x_rect + 6*x_step; y_pn = y_coor + x_step;
   if (InpCorner == 1)  x_pn = x_coor + x_size - 5*x_step - 5*x_rect;
   if (InpCorner == 2)  y_pn = y_coor + y_rect;
   if (InpCorner == 3) {x_pn = x_coor + x_size - 5*x_step - 5*x_rect; y_pn = y_coor + y_rect;}

   if (!RectLabelCreate(0,obj_name[6],0,x_pn,y_pn,x_rect,y_line,line_1_cl,BORDER_FLAT,InpCorner,
        line_1_cl,STYLE_SOLID,0,InpBackRect,InpSelection,InpHidden,0)) {
      return;
   }

   // Вторая линия
   x_pn = x_coor + 5*x_rect + 6*x_step; y_pn = y_coor + y_rect;
   if (InpCorner == 1)  x_pn = x_coor + x_size - 5*x_step - 5*x_rect;
   if (InpCorner == 2)  y_pn = y_coor + x_step;
   if (InpCorner == 3) {x_pn = x_coor + x_size - 5*x_step - 5*x_rect; y_pn = y_coor + x_step;}

   if (!RectLabelCreate(0,obj_name[7],0,x_pn,y_pn,x_rect,y_line,line_2_cl,BORDER_FLAT,InpCorner,
        line_2_cl,STYLE_SOLID,0,InpBackRect,InpSelection,InpHidden,0)) {
      return;
   }
}
//+------------------------------------------------------------------+
//| Создает прямоугольную метку                                      |
//+------------------------------------------------------------------+
bool RectLabelCreate(const long             chart_ID=0,               // ID графика
                     const string           name="RectLabel",         // имя метки
                     const int              sub_window=0,             // номер подокна
                     const int              x=0,                      // координата по оси X
                     const int              y=0,                      // координата по оси Y
                     const int              width=50,                 // ширина
                     const int              height=18,                // высота
                     const color            back_clr=C'236,233,216',  // цвет фона
                     const ENUM_BORDER_TYPE border=BORDER_SUNKEN,     // тип границы
                     const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
                     const color            clr=clrRed,               // цвет плоской границы (Flat)
                     const ENUM_LINE_STYLE  style=STYLE_SOLID,        // стиль плоской границы
                     const int              line_width=1,             // толщина плоской границы
                     const bool             back=false,               // на заднем плане
                     const bool             selection=false,          // выделить для перемещений
                     const bool             hidden=true,              // скрыт в списке объектов
                     const long             z_order=0)                // приоритет на нажатие мышью
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- создадим прямоугольную метку
   if (ObjectFind(name) == -1)
      ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0);

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);              // установим координаты метки
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);              // установим размеры метки
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);         // установим цвет фона
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border);       // установим тип границы
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);            // установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);                // установим цвет плоской рамки (в режиме Flat)
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);              // установим стиль линии плоской рамки
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);         // установим толщину плоской границы
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);                // отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);     // включим (true) или отключим (false) режим перемещения метки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);            // скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);           // установим приоритет на получение события нажатия мыши на графике

   return(true);
}
//+------------------------------------------------------------------+
//| Удаляет прямоугольную метку                                      |
//+------------------------------------------------------------------+
bool RectLabelDelete(const long   chart_ID=0,       // ID графика
                     const string name="RectLabel") // имя метки
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- удалим метку
   if (ObjectFind(chart_ID,name) >= 0)
      ObjectDelete(chart_ID,name);
   //--- успешное выполнение
   return(true);
}
//+------------------------------------------------------------------+
//| Функция получает цвет фона графика.                              |
//+------------------------------------------------------------------+
color ChartBackColorGet(const long chart_ID=0)
  {
//--- подготовим переменную для получения цвета
   long result=clrNONE;
//--- сбросим значение ошибки
   ResetLastError();
//--- получим цвет фона графика
   if(!ChartGetInteger(chart_ID,CHART_COLOR_BACKGROUND,0,result))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- вернем значение свойства графика
   return((color)result);
  }

//+------------------------------------------------------------------+
//| Cоздает прямоугольник по заданным координатам                    |
//+------------------------------------------------------------------+
bool RectangleCreate(const long            chart_ID=0,        // ID графика
                     const string          name="Rectangle",  // имя прямоугольника
                     const int             sub_window=0,      // номер подокна
                     datetime              time1=0,           // время первой точки
                     double                price1=0,          // цена первой точки
                     datetime              time2=0,           // время второй точки
                     double                price2=0,          // цена второй точки
                     const color           clr=clrRed,        // цвет прямоугольника
                     const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий прямоугольника
                     const int             width=2,           // толщина линий прямоугольника
                     const bool            fill=false,        // заливка прямоугольника цветом
                     const bool            back=false,        // на заднем плане
                     const bool            selection=true,    // выделить для перемещений
                     const bool            hidden=true,       // скрыт в списке объектов
                     const long            z_order=0)         // приоритет на нажатие мышью
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- создадим прямоугольник по заданным координатам
   if (ObjectFind(name) == -1)
      ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);             //--- установим цвет прямоугольника
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);           //--- установим стиль линий прямоугольника
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);           //--- установим толщину линий прямоугольника
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);             //--- включим (true) или отключим (false) режим заливки прямоугольника
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);             //--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);  //--- включим (true) или отключим (false) режим выделения прямоугольника для перемещений
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);    //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
                                                                  //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
                                                                  //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);         //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);        //--- установим приоритет на получение события нажатия мыши на графике

   return(true);
}
//+------------------------------------------------------------------+
//| Удаляет прямоугольник                                            |
//+------------------------------------------------------------------+
bool RectangleDelete(const long   chart_ID=0,       // ID графика
                     const string name="Rectangle") // имя прямоугольника
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- удалим прямоугольник
   if (ObjectFind(chart_ID,name) >= 0)
      ObjectDelete(chart_ID,name);

   return(true);
}
//+------------------------------------------------------------------+
//| Создает линию тренда по заданным координатам                     |
//+------------------------------------------------------------------+
bool TrendCreate(const long            chart_ID=0,        // ID графика
                 const string          name="TrendLine",  // имя линии
                 const int             sub_window=0,      // номер подокна
                 datetime              time1=0,           // время первой точки
                 double                price1=0,          // цена первой точки
                 datetime              time2=0,           // время второй точки
                 double                price2=0,          // цена второй точки
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             width=1,           // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            ray_left=false,    // продолжение линии влево
                 const bool            ray_right=false,   // продолжение линии вправо
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0)         // приоритет на нажатие мышью
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- создадим трендовую линию по заданным координатам
   if (ObjectFind(name) == -1)
      ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);             //--- установим цвет линии
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);           //--- установим стиль отображения линии
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);           //--- установим толщину линии
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);             //--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);  //--- включим (true) или отключим (false) режим перемещения линии мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);    //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
                                                                  //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
                                                                  //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);     //--- включим (true) или отключим (false) режим продолжения отображения линии влево
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);   //--- включим (true) или отключим (false) режим продолжения отображения линии вправо
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);         //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);        //--- установим приоритет на получение события нажатия мыши на графике

   return(true);
}
//+------------------------------------------------------------------+
//| Функция удаляет линию тренда с графика.                          |
//+------------------------------------------------------------------+
bool TrendDelete(const long   chart_ID=0,       // ID графика
                 const string name="TrendLine") // имя линии
{
   //--- сбросим значение ошибки
   ResetLastError();
   //--- удалим линию тренда
   if (!ObjectDelete(chart_ID,name))
   {
      Print(__FUNCTION__,
            ": не удалось удалить линию тренда! Код ошибки = ",GetLastError());
      return(false);
   }
   //--- успешное выполнение
   return(true);
}
+ -
Цитировать Ответить

17.05.2020, в 14:39
Никита
Аватар гостя
Регистрация: нет
Сообщений: 7
Рейтинг: 1

Ребята здравствуйте! Подскажите пожалуйста, как выложить здесь картинку? Нажимаю на ссылку “картинка”(чуть выше где пишется само сообщение), выбираю картинку через “обзор”, и пишется “ошибка загрузки картинки”… Помогите пожалуйста!!! Добавлено сообщение 17.05.2020, в 15:03 Добавлено сообщение 17.05.2020, в 15:04[url=https://radikal.ru][img]https://b.radikal.ru/b04/2005/31/924852670359.png[/img][/url] Добавлено сообщение 17.05.2020, в 15:08https://gyazo.com/803a4dd76348412d3fe8b372c018b38f

+ -
Цитировать Ответить


Подписаться без комментирования