На самом деле, switch, который я привёл рисиует на всех стандартных ТФ чётко и примерно на одинаковом расстоянии. Вопрос в другом. Это как-бы не очень удобно и громоздко.
Кстати, по поводу параметра double pr. Полагаю, Вы переусердствовали. Здесь int'а более чем достаточно. А так весьма интересное решение.
В точку! Что-то я сразу об этом не подумал.
На самом деле был когда-то int, потом сделал double, довольно часто нужно именно дробное значение, чтоб выглядело красиво на графике.
Здесь всё очевидно. barHighPrice() и barLowPrice() это хай и лоу бара, на индексе, котором рисуется кружочек, relativeDistance() относительное расстояние,рассчитанное есс-но так:
//==================================================================================================================================================================================// Возвращает расстояние равное запрошенному количеству процентов (percent) от экрана. =============================================================================================double Draw :: relativeDistance(constdouble percent) {
return (ChartGetDouble(0, CHART_PRICE_MAX) - ChartGetDouble(0, CHART_PRICE_MIN)) / 100 * percent;
}
По цифрам видно, что всё чётко. Кружочки, если верить цифрам находятся выше и ниже на одинаковом расстояние от хай и лоу бара соответственно. Но на графике видим совсем иное. Дичь какая-то. Хотя, расстояние не фиксированное, а относительно экрана рассчитанное. Делаю вывод, что придётся подбирать процент как ни крути..
нужно задавать разный угол привязки - OBJPROP_ANCHOR
Угол привязки то причём здесь? Ведь я создаю объект на основании цены и времени открытия бара. Т.е. угол привязки графика вообще не участвует в этом процессе. Всё верно, оказывается нужно было задать способ привязки.
Думал всё в порядке, оказалось, что не работает такой вариант:
//==================================================================================================================================================================================// Возвращает расстояние равное запрошенному количеству процентов (percent) от экрана. =============================================================================================double Draw :: relativeDistance(constdouble percent) {
return (ChartGetDouble(0, CHART_PRICE_MAX) - ChartGetDouble(0, CHART_PRICE_MIN)) / 100 * percent;
}
//==================================================================================================================================================================================// Отрисовывает wingdings-символ над/под баром с индексом barIndex. ================================================================================================================void Draw :: wingdings(string objName, // Название объектаconst ENUM_LOCATION location, // Расположение wingdings-символаconstlong wingdingsCode, // Код wingdings-символаconstint wingdingsWidth, // Ширина wingdings-символаconstcolor wingdingsColor, // Цвет wingdings-символаconstint barIndex, // Индекса бара, у которого нужно отрисовать wingdings-символconstdouble percent) { // Расстояние от бара на индексе barIndex до wingdings-символа, в процентах//---
objName += "_" + TimeToString(barOpenTime(barIndex), TIME_DATE|TIME_MINUTES);
if (location == LOCATION_ABOVE) {
// ObjectCreate(0, objName, OBJ_ARROW, 0, barOpenTime(barIndex), barHighPrice(barIndex) + relativeDistance(percent));ObjectCreate(0, objName, OBJ_ARROW, 0, 0, 0);
ObjectSetInteger(0, objName, OBJPROP_ANCHOR, ANCHOR_UPPER);ObjectSetInteger(0, objName, OBJPROP_TIME, 0, barOpenTime(barIndex));
ObjectSetDouble(0, objName, OBJPROP_PRICE, 0, barHighPrice(barIndex) + relativeDistance(percent));
}
elseif (location == LOCATION_BELOW) {
// ObjectCreate(0, objName, OBJ_ARROW, 0, barOpenTime(barIndex), barLowPrice(barIndex) - relativeDistance(MathAbs(percent)));ObjectCreate(0, objName, OBJ_ARROW, 0, 0, 0);
ObjectSetInteger(0, objName, OBJPROP_ANCHOR, ANCHOR_LOWER);ObjectSetInteger(0, objName, OBJPROP_TIME, 0, barOpenTime(barIndex));
ObjectSetDouble(0, objName, OBJPROP_PRICE, 0, barLowPrice(barIndex) - relativeDistance(percent));
}
ObjectSetInteger(0, objName, OBJPROP_ARROWCODE, wingdingsCode);
ObjectSetInteger(0, objName, OBJPROP_WIDTH, wingdingsWidth);
ObjectSetInteger(0, objName, OBJPROP_COLOR, wingdingsColor);
ChartRedraw();
}
Хотя, как я понял, OBJPROP_ANCHOR задаёт именно то место, координату которой я задаю. Но на выходе всё-равно не одинаковое расстояние от хая до объекта и от лоя до объекта. Привязку задал, координаты задал.. Что ещё нужно?
Так получилось. Справка не доделанная. Каким с какого переполоха все wingdings-символы стали вдруг срелками, а не объектами... Это просто дичь. Есс-но, я изначально это не проверял. Наделялся, что ситуация более адекватна. Оказывается, нужно перебирать всё, не обращая внимания не логику и принадлежность обрабатываемого объекта к какому-то виду, так сказать.
Viktar Dzemikhau: Каким с какого переполоха все wingdings-символы стали вдруг срелками, а не объектами...
Все смешалось в доме Облонских...
Стрелки - это и есть объекты. В коде, который Вы показываете, объекты создаются типа "стрелка" (OBJ_ARROW). Но ведь можно создать объект типа OBJ_TEXT и назначить ему имя шрифта Wingdings. Тогда вариантов размеров такого объекта будет намного больше, чем 6.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
На самом деле, switch, который я привёл рисиует на всех стандартных ТФ чётко и примерно на одинаковом расстоянии. Вопрос в другом. Это как-бы не очень удобно и громоздко.
Кстати, по поводу параметра double pr. Полагаю, Вы переусердствовали. Здесь int'а более чем достаточно. А так весьма интересное решение.
В точку! Что-то я сразу об этом не подумал.
На самом деле был когда-то int, потом сделал double, довольно часто нужно именно дробное значение, чтоб выглядело красиво на графике.
Оказалось, что всё это годится для одной стороны. Если взять 2 стороны, то всё-равно кака***
На скрине выведены в журнал данные:
Здесь всё очевидно. barHighPrice() и barLowPrice() это хай и лоу бара, на индексе, котором рисуется кружочек, relativeDistance() относительное расстояние,рассчитанное есс-но так:
По цифрам видно, что всё чётко. Кружочки, если верить цифрам находятся выше и ниже на одинаковом расстояние от хай и лоу бара соответственно. Но на графике видим совсем иное. Дичь какая-то. Хотя, расстояние не фиксированное, а относительно экрана рассчитанное. Делаю вывод, что придётся подбирать процент как ни крути..
По ходу терминал гонит.нужно задавать разный угол привязки - OBJPROP_ANCHOR
нужно задавать разный угол привязки - OBJPROP_ANCHOR
Угол привязки то причём здесь? Ведь я создаю объект на основании цены и времени открытия бара. Т.е. угол привязки графика вообще не участвует в этом процессе. Всё верно, оказывается нужно было задать способ привязки.
Думал всё в порядке, оказалось, что не работает такой вариант:
Хотя, как я понял, OBJPROP_ANCHOR задаёт именно то место, координату которой я задаю. Но на выходе всё-равно не одинаковое расстояние от хая до объекта и от лоя до объекта. Привязку задал, координаты задал.. Что ещё нужно?
Кстати, вызываю функцию так:
ENUM_ARROW_ANCHOR (для OBJ_ARROW),
ENUM_ANCHOR_POINT (для OBJ_LABEL, OBJ_BITMAP_LABEL и OBJ_TEXT)
ENUM_ARROW_ANCHOR
Идентификатор
Описание
ANCHOR_TOP
Точка привязки для стрелки находится сверху
ANCHOR_BOTTOM
Точка привязки для стрелки находится внизу
Каким с какого переполоха все wingdings-символы стали вдруг срелками, а не объектами...
Все смешалось в доме Облонских...
Стрелки - это и есть объекты. В коде, который Вы показываете, объекты создаются типа "стрелка" (OBJ_ARROW). Но ведь можно создать объект типа OBJ_TEXT и назначить ему имя шрифта Wingdings. Тогда вариантов размеров такого объекта будет намного больше, чем 6.