Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#4026

Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?

#4027

не совсем, гораздо ниже Bid


Ну тем более! Нельзя ставить тейкпрофит buy-ордера ниже цены его открытия! Допустим, цена открытия buy-ордера 1.0450. Не даст Вам МТ поставить тейк ниже 1.0450. Ну это же абсурд получается: купили дороже - продали дешевле. Не может такой вариант быть тейкпрофитом. Это уже стоплосс.
#4028


Есть пользовательский индикатор который рисует трендовую линию (луч). Периодически перерисовывает ее. Луч создается на основе двух точек, индексы массива 0 и 1 прыгают с бара на бар, поэтому стандартная функция iCustom не подходит.(Язык mql4)
Вопрос такой: Как в током случае перенести луч в советник?

Вроде разобрался, через ChartApplyTemplate, по другому никак.
Вся бяка была в том что при тесте надо на график кидать индюк и применять визуализацию, жутко не удобно, особенно при оптимизации.

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

Что делааать?



А если разобрать и понять логику работы индикатора, и просто в сове прописать алгоритм действий по этой логике, без использования внешнего индикатора ?
#4029


Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?



Нужно в подходящем Вам способе вывода информации прописать значение функции:
ObjectGet( string object_name, // имя объекта
int index // идентификатор свойства );
где в качестве свойства объекта указываем вначале OBJPROP_PRICE1, а затем OBJPROP_PRICE2

Как-то так ...
#4030



Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?



Нужно в подходящем Вам способе вывода информации прописать значение функции:
ObjectGet( string object_name, // имя объекта
int index // идентификатор свойства );
где в качестве свойства объекта указываем вначале OBJPROP_PRICE1, а затем OBJPROP_PRICE2

Как-то так ...
Ничего не понял)
#4031




Народ подскажите пожалуйста.У меня при нажатии определенной кнопки рисуются прямоугольники,мне надо чтоб верхняя и нижняя границы прямоугольника подсвечивались ценовой меткой.Что прописать в коде надо?



Нужно в подходящем Вам способе вывода информации прописать значение функции:
ObjectGet( string object_name, // имя объекта
int index // идентификатор свойства );
где в качестве свойства объекта указываем вначале OBJPROP_PRICE1, а затем OBJPROP_PRICE2

Как-то так ...
Ничего не понял)


Прямого, простого способа нет для решения Вашего вопроса. (или может конечно я его не знаю)
Я вижу два пути решения -
1) У объекта прямоугольник есть Описание, которое можно вывести на объект, включив опцию терминала показывать описание объекта, соответсвенно в описание мы программно вписываем ценовые координаты
прямоугольника
2) Размещаем где то текст с указанием ценовых координат, при чем еще надо будет думать как этот текст
разместить рядом с нужны объектом (или просто его печатать например в углу графика, правда если прямоугольников несколько, то тут тоже надо думать как быть)

Какой способ выбрать это Ваш выбор.
И потом в этот способ мы вставляем значения функции ObjectGet, с именем вашего объекта и ценами верхней и нижней линии.

Изменено 26 декабря, 2016 пользователем AndreyGold

#4032

Вот код,там прописано описание объекта


Цитата

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

#4033


Вот код,там прописано описание объекта


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

#4034

Нашел способ для отображения прямоугольника по конкретным точкам каждого дня.
Отображение происходит по 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);

25-12-2016_17-27-54.png

#4035

Спасибо. Наверно так и буду делвть.

Изменено 27 декабря, 2016 пользователем mihascor

#4036

Вот что я хочу сделать.

#4037


Вот что я хочу сделать.



Для этого нужно название объекта знать - имя гляньте на графике прямоугольника судя по тексту он
вот так должен называться "NKZ__". Так нет ?
#4038

Да абсолютно верно!


Добавлено: 26-12-2016 17:57:56

Народ помогите кто-нибудь.

Изменено 26 декабря, 2016 пользователем l33trade

#4039

Привет! Подскажите, как можно рассчитать максимальную цену за n-баров и обозначить ее на графике, ну хотя бы горизонтальной линией.

Спойлер

#4040

Суть есть некий индикатор,который в окно данных при наличии сигнала на селл/бай генерит сигнал.
Как эту цену с буфера окна данных считать?

EURGBPM15.png

#4041


Вот код,там прописано описание объекта


Спойлер

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

#4042

1.У Вас прямоугольники рисуются каждый день? Имена прямоугольников новые каждый день? Или имя одинаковое каждый раз?
2.Чтобы фиксировать значения на весь день, сделайте, чтобы значения обновлялись только в определенное время ежедневно.

Честно сказать поверхностно прочитал, в вопрос не вникал досконально. Просто мысли вслух...

#4043

Можно так

   //--- находим максимальную цену за 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);

#4044

Работает,но небольшой косяк

Спойлер



Добавлено: 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

#4045

Работает,но небольшой косяк


Попробуйте использовать price3 и price4.
#4046

Пробовал.Та метка что косо вставала,встала куда надо,но другая метка вообще исчезла.


Добавлено: 26-12-2016 20:13:58

Все дошарил. Спасибо тебе огромное помог)

Добавлено: 26-12-2016 20:21:41


Работает,но небольшой косяк


Попробуйте использовать price3 и price4.

Слушай сейчас начал наносить зоны для тех анализа и заметил такую штуку.Ценовые метки рисуются только один раз,то есть только для одной зоны.Если нанести вторую,меток нету.

Изменено 26 декабря, 2016 пользователем l33trade

#4047

Подскажите как получить значение в советнике с окна данных.а именно sell buffer Buy buffer
?

EURGBPM15.png

#4049

//Не считывает данные

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 );

EURGBPM15.png
120.jpg

#4050

Заработало!!! Спасибо!!!

На решение меня навело имя объекта, которое присваивается каждый день новое.

Такими строчками теперь получаю желаемые цены:

Цитата

double MaxP=ObjectGetDouble(0,"AS"+i,OBJPROP_PRICE1,0); // где AS - название моего прямоугольника

double MinP=ObjectGetDouble(0,"AS"+i,OBJPROP_PRICE2,0);

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025