Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
не совсем, гораздо ниже Bid
Ну тем более! Нельзя ставить тейкпрофит buy-ордера ниже цены его открытия! Допустим, цена открытия buy-ордера 1.0450. Не даст Вам МТ поставить тейк ниже 1.0450. Ну это же абсурд получается: купили дороже - продали дешевле. Не может такой вариант быть тейкпрофитом. Это уже стоплосс.
Есть пользовательский индикатор который рисует трендовую линию (луч). Периодически перерисовывает ее. Луч создается на основе двух точек, индексы массива 0 и 1 прыгают с бара на бар, поэтому стандартная функция iCustom не подходит.(Язык mql4)
Вопрос такой: Как в током случае перенести луч в советник?
Вроде разобрался, через ChartApplyTemplate, по другому никак.
Вся бяка была в том что при тесте надо на график кидать индюк и применять визуализацию, жутко не удобно, особенно при оптимизации.
Ни чего не выйдет, если будет загружен из советника шаблон, он загрузится со своими настройками.
Что делааать?
А если разобрать и понять логику работы индикатора, и просто в сове прописать алгоритм действий по этой логике, без использования внешнего индикатора ?
Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?
Нужно в подходящем Вам способе вывода информации прописать значение функции:
ObjectGet( string object_name, // имя объекта
int index // идентификатор свойства );
где в качестве свойства объекта указываем вначале OBJPROP_PRICE1, а затем OBJPROP_PRICE2
Как-то так ...
Ничего не понял)
Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?
Нужно в подходящем Вам способе вывода информации прописать значение функции:
ObjectGet( string object_name, // имя объекта
int index // идентификатор свойства );
где в качестве свойства объекта указываем вначале OBJPROP_PRICE1, а затем OBJPROP_PRICE2
Как-то так ...
Ничего не понял)
Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?
Нужно в подходящем Вам способе вывода информации прописать значение функции:
ObjectGet( string object_name, // имя объекта
int index // идентификатор свойства );
где в качестве свойства объекта указываем вначале OBJPROP_PRICE1, а затем OBJPROP_PRICE2
Как-то так ...
Прямого, простого способа нет для решения Вашего вопроса. (или может конечно я его не знаю)
Я вижу два пути решения -
1) У объекта прямоугольник есть Описание, которое можно вывести на объект, включив опцию терминала показывать описание объекта, соответсвенно в описание мы программно вписываем ценовые координаты
прямоугольника
2) Размещаем где то текст с указанием ценовых координат, при чем еще надо будет думать как этот текст
разместить рядом с нужны объектом (или просто его печатать например в углу графика, правда если прямоугольников несколько, то тут тоже надо думать как быть)
Какой способ выбрать это Ваш выбор.
И потом в этот способ мы вставляем значения функции ObjectGet, с именем вашего объекта и ценами верхней и нижней линии.
Изменено 26 декабря, 2016 пользователем AndreyGold
Вот код,там прописано описание объекта
Цитатаif (lparam == HotKey3 && !zonaUpdate || zonaUpdate == 3)
{
if (!zonaUpdateInfo)
{
zonaUpdateInfo = Info[InfoKey].NKZ;
if (Info[InfoKey].NKZ }
double NKZ = zonaUpdateInfo;
if (NKZ == 0)
{
Comment("Недельная зона не задана!");
if (sound) PlaySound(sound_Error);
return;
}
price2 = price1 - NKZ * _Point * HiLow;
if (NKZ_mode == 1)
{
price3 = price2 - NKZ * _Point * 0.1 * HiLow;
price4 = price2;
}
else if (NKZ_mode == 2)
{
price3 = price2 + NKZ * _Point * 0.1 * HiLow;
price4 = price2;
}
else
{
price3 = price2 + NKZ * _Point * 0.05 * HiLow;
price4 = price2 - NKZ * _Point * 0.05 * HiLow;
}
DrawZone("NKZ__", "Нкз - " + NKZ + "п.", time1, price1, time1 + NKZ_angle, price2, price3, price4, NKZ_length, NKZ_color, NKZ_timeframe, zonaUpdateInfo);
return;
}
Где надо прописать?
Изменено 26 декабря, 2016 пользователем l33trade
Вот код,там прописано описание объекта
if (lparam == HotKey3 && !zonaUpdate || zonaUpdate == 3)
{
if (!zonaUpdateInfo)
{
zonaUpdateInfo = Info[InfoKey].NKZ;
if (Info[InfoKey].NKZ }
double NKZ = zonaUpdateInfo;
if (NKZ == 0)
{
Comment("Недельная зона не задана!");
if (sound) PlaySound(sound_Error);
return;
}
price2 = price1 - NKZ * _Point * HiLow;
if (NKZ_mode == 1)
{
price3 = price2 - NKZ * _Point * 0.1 * HiLow;
price4 = price2;
}
else if (NKZ_mode == 2)
{
price3 = price2 + NKZ * _Point * 0.1 * HiLow;
price4 = price2;
}
else
{
price3 = price2 + NKZ * _Point * 0.05 * HiLow;
price4 = price2 - NKZ * _Point * 0.05 * HiLow;
}
DrawZone("NKZ__", "Нкз - " + NKZ + "п.", time1, price1, time1 + NKZ_angle, price2, price3, price4, NKZ_length, NKZ_color, NKZ_timeframe, zonaUpdateInfo);
return;
}
Где надо прописать?
Это не весь код - я так понимаю у Вас функция DrawZone() непосредственно чертит. Это не функция MQL4 это пользовательская функция. Если хотите, чтобы цены указывались над объектом, надо понять какая переменная из ("NKZ__", "Нкз - " + NKZ + "п.", time1, price1, time1 + NKZ_angle, price2, price3, price4, NKZ_length, NKZ_color, NKZ_timeframe, zonaUpdateInfo) является именно описанием объекта.
А если просто на графике указать уровень цен, то тут есть цены price2, price3, price4 из них две, скорее всего являются границами прямоугольника, которые вас интересует. Какие - опять же надо смотреть функцию DrawZone. Если доступа нет к ней то просто поперебирайте параметры и вставьте функцию
Comment(price2); или Comment(price3); или Comment(price4); перед return в левом верхнем углу будут
уровни цен прямоугольника.
Есть еще один путь - это программно искать объект на графике и у него пытаться изменить срисовать параметр цены (функция ObjectGetDouble), но для этого надо знать имя объекта там поиск по имени идет.
Изменено 26 декабря, 2016 пользователем AndreyGold
Нашел способ для отображения прямоугольника по конкретным точкам каждого дня.
Отображение происходит по 2-м координатам (p1, t1) и (p2, t2). 
Всё работает хорошо, но когда пытаюсь вытащить значения цен р1 и р2 в советник, то значения цен соответствуют первому объекту на истории, а не последнему.
Не могу понять в чем ошибка.
Думал через команду ObjectSet фиксируются значения. Пробовал достать через ObjectGet, но итог тот же - соответствуют 1-му значению.
Как можно зафиксировать эти значения на весь день, а на следующий день - обновить?
Может можно как то по-другому решить проблему - мне просто интересно максимальная и минимальная цены, к примеру, в период с 00:00 до 10:00 и фиксация их на весь день.
Вот часть кода где вычисляю значения координат и тут же отправляю в Comment. Однако на графике одно, а в комменте другое
Цитата
datetime t1, t2, t3;
double p1, p2;
int b1, b2;
t1=StrToTime(TimeToStr(dt, TIME_DATE)+" "+tb); //время начала рисования прямоугольника, к примеру 00:00
t2=StrToTime(TimeToStr(dt, TIME_DATE)+" "+te); //время конца рисования прямоугольника, к примеру 23:55
t3=StrToTime(TimeToStr(dt, TIME_DATE)+" "+tc); //время конца расчета цены для 2-ой координаты, к примеру 10:00 (т.е. прямоугольник перестает обновляться за ценой)
b1=iBarShift(NULL, 0, t1);
b2=iBarShift(NULL, 0, t3);
p1=High[iHighest(NULL, 0, MODE_HIGH, b1-b2+1, b2)];
p2=Low[iLowest (NULL, 0, MODE_LOW , b1-b2+1, b2)];
ObjectSet(no, OBJPROP_TIME1 , t1);
ObjectSet(no, OBJPROP_PRICE1, p1);
ObjectSet(no, OBJPROP_TIME2 , t2);
ObjectSet(no, OBJPROP_PRICE2, p2);
Comment(" p1 = " + p1 + " p2 = " + p2);
Вот что я хочу сделать.
Вот что я хочу сделать.
Для этого нужно название объекта знать - имя гляньте на графике прямоугольника судя по тексту он
вот так должен называться "NKZ__". Так нет ?
Да абсолютно верно!
Добавлено: 26-12-2016 17:57:56
Народ помогите кто-нибудь.
Изменено 26 декабря, 2016 пользователем l33trade
Привет! Подскажите, как можно рассчитать максимальную цену за n-баров и обозначить ее на графике, ну хотя бы горизонтальной линией.

Суть есть некий индикатор,который в окно данных при наличии сигнала на селл/бай генерит сигнал.
Как эту цену с буфера окна данных считать?
Вот код,там прописано описание объектаСпойлерif (lparam == HotKey3 && !zonaUpdate || zonaUpdate == 3)
{
if (!zonaUpdateInfo)
{
zonaUpdateInfo = Info[InfoKey].NKZ;
if (Info[InfoKey].NKZ }
double NKZ = zonaUpdateInfo;
if (NKZ == 0)
{
Comment("Недельная зона не задана!");
if (sound) PlaySound(sound_Error);
return;
}
price2 = price1 - NKZ * _Point * HiLow;
if (NKZ_mode == 1)
{
price3 = price2 - NKZ * _Point * 0.1 * HiLow;
price4 = price2;
}
else if (NKZ_mode == 2)
{
price3 = price2 + NKZ * _Point * 0.1 * HiLow;
price4 = price2;
}
else
{
price3 = price2 + NKZ * _Point * 0.05 * HiLow;
price4 = price2 - NKZ * _Point * 0.05 * HiLow;
}
DrawZone("NKZ__", "Нкз - " + NKZ + "п.", time1, price1, time1 + NKZ_angle, price2, price3, price4, NKZ_length, NKZ_color, NKZ_timeframe, zonaUpdateInfo);
//--- создадим ценовые метки
ObjectCreate(0,"ARROW_1",OBJ_ARROW_LEFT_PRICE,0,time1,price1);
ObjectCreate(0,"ARROW_2",OBJ_ARROW_LEFT_PRICE,0,time1,price2);
return;
}
Где надо прописать?
Можно сделать так (под spoiler)
Изменено 26 декабря, 2016 пользователем SilverKZ
1.У Вас прямоугольники рисуются каждый день? Имена прямоугольников новые каждый день? Или имя одинаковое каждый раз?
2.Чтобы фиксировать значения на весь день, сделайте, чтобы значения обновлялись только в определенное время ежедневно.
Честно сказать поверхностно прочитал, в вопрос не вникал досконально. Просто мысли вслух...
Можно так
//--- находим максимальную цену за n-баров
int n = 1000;
double max_price = High[iHighest(NULL,0,MODE_HIGH,n,0)];
//--- создадим горизонтальную линию
ObjectCreate(0,"HLINE_MAX",OBJ_HLINE,0,0,max_price);
Работает,но небольшой косяк

Добавлено: 26-12-2016 19:55:46
Вот есть еще кусок кода,отвечающий за рисование этой зоны
Цитата// Рисуем зону
if (price1 > price2) name += "_H"; else name += "_L";
name += "_" + info;
if (price3 bool cr = ObjectCreate(name, OBJ_RECTANGLE, 0, 0, 0, 0, 0);
ObjectSet(name, OBJPROP_TIME1, time2);
ObjectSet(name, OBJPROP_PRICE1, price3);
if (!ObjectGet(name, OBJPROP_TIME2))
ObjectSet(name, OBJPROP_TIME2, correctWeekend(time2, time2 + length)); // Если time2 не задан у объекта, тогда задаем, т.к. это новый объект (иначе у зоны отредктирована длина)
ObjectSet(name, OBJPROP_PRICE2, price4);
ObjectSetText(name, descr); // Описание
if (cr) ObjectSet(name, OBJPROP_COLOR, clr); // Цвет
ObjectSet(name, OBJPROP_TIMEFRAMES, timeframe); // Таймфрейм для отображения
ObjectSet(name, OBJPROP_SELECTED, false); // Снять выделение с объекта
ObjectSet(name, OBJPROP_BACK, true); // Рисовать объект в фоне
Изменено 26 декабря, 2016 пользователем l33trade
Работает,но небольшой косяк
Попробуйте использовать price3 и price4.
Пробовал.Та метка что косо вставала,встала куда надо,но другая метка вообще исчезла.
Добавлено: 26-12-2016 20:13:58
Все дошарил. Спасибо тебе огромное помог)
Добавлено: 26-12-2016 20:21:41
Работает,но небольшой косяк
Попробуйте использовать price3 и price4.
Слушай сейчас начал наносить зоны для тех анализа и заметил такую штуку.Ценовые метки рисуются только один раз,то есть только для одной зоны.Если нанести вторую,меток нету.
Изменено 26 декабря, 2016 пользователем l33trade
Подскажите как получить значение в советнике с окна данных.а именно sell buffer Buy buffer
?
Почитайте описание функции iCustom().
https://docs.mql4.com/ru/indicators/icustom
//Не считывает данные
IndicatorShortName("CandleType");
datetime some_time=D'2016.12.23 128:30';//Дата сигнала
int shift=iBarShift(Symbol(), Period(),some_time);//высчитываем смещение в барах
Alert(shift);
double val =iCustom(Symbol(), Period(), "PivotPointReversal_x2_1_49","Show_P4_patern", 1,shift );
Alert(val );
double val1 =iCustom(Symbol(), Period(), "Sell Buffer","Show_P4_patern", 1, shift);
Alert(val1 );
Заработало!!! Спасибо!!!
На решение меня навело имя объекта, которое присваивается каждый день новое.
Такими строчками теперь получаю желаемые цены:
Цитатаdouble MaxP=ObjectGetDouble(0,"AS"+i,OBJPROP_PRICE1,0); // где AS - название моего прямоугольника
double MinP=ObjectGetDouble(0,"AS"+i,OBJPROP_PRICE2,0);
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем