Как увеличить размер Wingdings-символа? - страница 2

 
Viktar Dzemikhau:

На самом деле, switch, который я привёл рисиует на всех стандартных ТФ чётко и примерно на одинаковом расстоянии. Вопрос в другом. Это как-бы не очень удобно и громоздко.

Кстати, по поводу параметра double pr. Полагаю, Вы переусердствовали. Здесь int'а более чем достаточно. А так весьма интересное решение.

В точку! Что-то я сразу об этом не подумал.

На самом деле был когда-то int, потом сделал double, довольно часто нужно именно дробное значение, чтоб выглядело красиво на графике.

 

Оказалось, что всё это годится для одной стороны. Если взять 2 стороны, то всё-равно кака***

На скрине выведены в журнал данные:

2018.09.17 13:51:35.316 drawWingdings (GBPUSD,H1)       barHighPrice(barIndex) = 1.30897
2018.09.17 13:51:35.316 drawWingdings (GBPUSD,H1)       relativeDistance(percent) = 0.00018
2018.09.17 13:51:35.316 drawWingdings (GBPUSD,H1)       barHighPrice(barIndex) + relativeDistance(percent) = 1.30915000
2018.09.17 13:51:35.316 drawWingdings (GBPUSD,H1)       barLowPrice(barIndex) = 1.30776
2018.09.17 13:51:35.316 drawWingdings (GBPUSD,H1)       relativeDistance(percent) = -0.00018
2018.09.17 13:51:35.324 drawWingdings (GBPUSD,H1)       barLowPrice(barIndex) - relativeDistance(percent) = 1.30758

Здесь всё очевидно. barHighPrice() и barLowPrice() это хай и лоу бара, на индексе, котором рисуется кружочек, relativeDistance() относительное расстояние,рассчитанное есс-но так:

//==================================================================================================================================================================================
// Возвращает расстояние равное запрошенному количеству процентов (percent) от экрана. =============================================================================================
double Draw :: relativeDistance(const double percent) {
  return (ChartGetDouble(0, CHART_PRICE_MAX) - ChartGetDouble(0, CHART_PRICE_MIN)) / 100 * percent;
}

По цифрам видно, что всё чётко. Кружочки, если верить цифрам находятся выше и ниже на одинаковом расстояние от хай и лоу бара соответственно. Но на графике видим совсем иное. Дичь какая-то. Хотя, расстояние не фиксированное, а относительно экрана рассчитанное. Делаю вывод, что придётся подбирать процент как ни крути..

По ходу терминал гонит.
 

нужно задавать разный угол привязки - OBJPROP_ANCHOR

 
Taras Slobodyanik:

нужно задавать разный угол привязки - OBJPROP_ANCHOR

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

 

Думал всё в порядке, оказалось, что не работает такой вариант:

//==================================================================================================================================================================================
// Возвращает расстояние равное запрошенному количеству процентов (percent) от экрана. =============================================================================================
double Draw :: relativeDistance(const double 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-символа
                       const long wingdingsCode,       // Код wingdings-символа
                       const int wingdingsWidth,       // Ширина wingdings-символа
                       const color wingdingsColor,     // Цвет wingdings-символа
                       const int barIndex,             // Индекса бара, у которого нужно отрисовать wingdings-символ
                       const double 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));
  }
  else if (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 задаёт именно то место, координату которой я задаю. Но на выходе всё-равно не одинаковое расстояние от хая до объекта и от лоя до объекта. Привязку задал, координаты задал.. Что ещё нужно?

Кстати, вызываю функцию так:

  Draw :: wingdings("The Dot", LOCATION_ABOVE, 159, 2, clrBlue, 6, 0.5);
  Draw :: wingdings("The Dot", LOCATION_BELOW, 159, 2, clrRed, 7, 0.5);
 

ENUM_ARROW_ANCHOR (для OBJ_ARROW),

ENUM_ANCHOR_POINT (для OBJ_LABEL, OBJ_BITMAP_LABEL и OBJ_TEXT)


ENUM_ARROW_ANCHOR

Идентификатор

Описание

ANCHOR_TOP

Точка привязки для стрелки находится сверху

ANCHOR_BOTTOM

Точка привязки для стрелки находится внизу

 
Так получилось. Справка не доделанная. Каким с какого переполоха все wingdings-символы стали вдруг срелками, а не объектами... Это просто дичь. Есс-но, я изначально это не проверял. Наделялся, что ситуация более адекватна. Оказывается, нужно перебирать всё, не обращая внимания не логику и принадлежность обрабатываемого объекта к какому-то виду, так сказать.
 
Viktar Dzemikhau:
Каким с какого переполоха все wingdings-символы стали вдруг срелками, а не объектами... 

Все смешалось в доме Облонских...

Стрелки - это и есть объекты. В коде, который Вы показываете, объекты создаются типа "стрелка" (OBJ_ARROW). Но ведь можно создать объект типа OBJ_TEXT и назначить ему имя шрифта Wingdings. Тогда вариантов размеров такого объекта будет намного больше, чем 6.

Причина обращения: