Управление цветом графических построений.

 

Необходимо разные экземпляры определенного графического инструмента, любого, ну например, закрашенные треугольники, выводить с помощью индикатора разными цветами. При выводе одним цветом накладывающиеся друг на друга графические элементы плохо различаются. Однотипных графических элементов может быть много. Если задавать цвет в индикаторе через отдельные параметры, то:

во-первых, количество задаваемых цветов - величина переменная, а следовательно и количество параметров непонятно сколько надо задать;

во-вторых, засорять индикатор огромным количеством параметров для задания цвета не хочется.

Очень хорошо бы сделать это через строковую внешнюю переменную, в которой перечислить через запятую названия цветов. Потом программно выделять подстроки. Таким образом всего через одну переменную задавалось бы большое количество цветов. Любое количество. Но нет функции, которая преобразовывала бы текстовое название цвета в тип COLOR.

Есть предложение раширить язык. Добавить функцию StrToColor(string).

Тогда можно будет присваивать...

color CustomColor;

CustomColor=StrToColor("DarkBlu");

Полчаем CustomColor=DarkBlu;

Если имеется уже готовый способ такого преобразования, прошу написать об этом.

С уважением, Евгений

 
Теоретически, можно написать такую пользовательскую функцию, которая будет преобразовывать текстовок название цвета в тип color, но не думаю, что она будет востребована - https://docs.mql4.com/ru/basis/types/color
Соответстивие каждому названию своего значения можно получить даже их html-страницы справки - https://docs.mql4.com/ru/constants/colors
Сам я при необходимости задаю цвета через внешние переменные типа color, например, вот так был изменен индикатор Market Profile - 'MarketProfile'
Кроме того, цвета можно привязать к символу и тайм-фрейму. Но всех вариантов, конечно, не предусмотреть.
 
Не так уж и сложно, два массива, в одном строковом имя, во втором color - цвет. На ините покрутить немного его, чтобы переменные заполнить. На 30 минут делов.
 
Integer писал (а):
Не так уж и сложно, два массива, в одном строковом имя, во втором color - цвет. На ините покрутить немного его, чтобы переменные заполнить. На 30 минут делов.
Такое решение тоже рассматривал. Но когда индикатор уже занимает объем более 6000 строк кода. В скомпилированном виде более 200 К, то задание таких массивов сильно увеличит объем. Не хотелось бы. В крайнем случае задам несколько внешних переменных. Фиксированно.
 
Rosh писал (а):
Теоретически, можно написать такую пользовательскую функцию, которая будет преобразовывать текстовок название цвета в тип color, но не думаю, что она будет востребована - https://docs.mql4.com/ru/basis/types/color

С востребованностью также вопрос. Согласен, что лишнее не нужно делать. Мой вопрос возник из-за функциональной недостаточности языка и метатрейдера. Приходится изворачиваться.
 
color fStrToColor(string aName){
 
   color tColor[]={  Black, DarkGreen, DarkSlateGray, Olive, Green, Teal, Navy, Purple, 
                     Maroon, Indigo, MidnightBlue, DarkBlue, DarkOliveGreen, SaddleBrown, 
                     ForestGreen, OliveDrab, SeaGreen, DarkGoldenrod, DarkSlateBlue, 
                     Sienna, MediumBlue, Brown, DarkTurquoise, DimGray, LightSeaGreen, 
                     DarkViolet, FireBrick, MediumVioletRed, MediumSeaGreen, Chocolate, 
                     Crimson, SteelBlue, Goldenrod, MediumSpringGreen, LawnGreen, 
                     CadetBlue, DarkOrchid, YellowGreen, LimeGreen, OrangeRed, DarkOrange, 
                     Orange, Gold, Yellow, Chartreuse, Lime, SpringGreen, Aqua, DeepSkyBlue, 
                     Blue, Magenta, Red, Gray, SlateGray, Peru, BlueViolet, LightSlateGray, 
                     DeepPink, MediumTurquoise, DodgerBlue, Turquoise, RoyalBlue, SlateBlue, 
                     DarkKhaki, IndianRed, MediumOrchid, GreenYellow, MediumAquamarine, 
                     DarkSeaGreen, Tomato, RosyBrown, Orchid, MediumPurple, PaleVioletRed, 
                     Coral, CornflowerBlue, DarkGray, SandyBrown, MediumSlateBlue, Tan, 
                     DarkSalmon, BurlyWood, HotPink, Salmon, Violet, LightCoral, SkyBlue, 
                     LightSalmon, Plum, Khaki, LightGreen, Aquamarine, Silver, LightSkyBlue, 
                     LightSteelBlue, LightBlue, PaleGreen, Thistle, PowderBlue, PaleGoldenrod, 
                     PaleTurquoise, LightGray, Wheat, NavajoWhite, Moccasin, LightPink, 
                     Gainsboro, PeachPuff, Pink, Bisque, LightGoldenrod, BlanchedAlmond, 
                     LemonChiffon, Beige, AntiqueWhite, PapayaWhip, Cornsilk, LightYellow, 
                     LightCyan, Linen, Lavender, MistyRose, OldLace, WhiteSmoke, Seashell, 
                     Ivory, Honeydew, AliceBlue, LavenderBlush, MintCream, Snow, White
                  };  
   string tName[]={   "Black", "DarkGreen", "DarkSlateGray", "Olive", "Green", "Teal", "Navy", "Purple", 
                     "Maroon", "Indigo", "MidnightBlue", "DarkBlue", "DarkOliveGreen", "SaddleBrown", 
                     "ForestGreen", "OliveDrab", "SeaGreen", "DarkGoldenrod", "DarkSlateBlue", 
                     "Sienna", "MediumBlue", "Brown", "DarkTurquoise", "DimGray", "LightSeaGreen", 
                     "DarkViolet", "FireBrick", "MediumVioletRed", "MediumSeaGreen", "Chocolate", 
                     "Crimson", "SteelBlue", "Goldenrod", "MediumSpringGreen", "LawnGreen", 
                     "CadetBlue", "DarkOrchid", "YellowGreen", "LimeGreen", "OrangeRed", "DarkOrange", 
                     "Orange", "Gold", "Yellow", "Chartreuse", "Lime", "SpringGreen", "Aqua", "DeepSkyBlue", 
                     "Blue", "Magenta", "Red", "Gray", "SlateGray", "Peru", "BlueViolet", "LightSlateGray", 
                     "DeepPink", "MediumTurquoise", "DodgerBlue", "Turquoise", "RoyalBlue", "SlateBlue", 
                     "DarkKhaki", "IndianRed", "MediumOrchid", "GreenYellow", "MediumAquamarine", 
                     "DarkSeaGreen", "Tomato", "RosyBrown", "Orchid", "MediumPurple", "PaleVioletRed", 
                     "Coral", "CornflowerBlue", "DarkGray", "SandyBrown", "MediumSlateBlue", "Tan", 
                     "DarkSalmon", "BurlyWood", "HotPink", "Salmon", "Violet", "LightCoral", "SkyBlue", 
                     "LightSalmon", "Plum", "Khaki", "LightGreen", "Aquamarine", "Silver", "LightSkyBlue", 
                     "LightSteelBlue", "LightBlue", "PaleGreen", "Thistle", "PowderBlue", "PaleGoldenrod", 
                     "PaleTurquoise", "LightGray", "Wheat", "NavajoWhite", "Moccasin", "LightPink", 
                     "Gainsboro", "PeachPuff", "Pink", "Bisque", "LightGoldenrod", "BlanchedAlmond", 
                     "LemonChiffon", "Beige", "AntiqueWhite", "PapayaWhip", "Cornsilk", "LightYellow", 
                     "LightCyan", "Linen", "Lavender", "MistyRose", "OldLace", "WhiteSmoke", "Seashell", 
                     "Ivory", "Honeydew", "AliceBlue", "LavenderBlush", "MintCream", "Snow", "White"
                  };
      aName=StringTrimLeft(StringTrimRight(aName));      
         for(int i=0;i<ArraySize(tName);i++){
            if(aName==tName[i])return(tColor[i]);
         }
      return(Red);                                     
                  
}
 
Непонятки с цветом LightGoldenRod, редактор не подсвечивает его, или в справке неправильно назван
 
Integer писал (а):
// Непонятки с цветом LightGoldenRod, редактор не подсвечивает его,
// или в справке неправильно назван, заменен на красный - Bisque, Red, BlanchedAlmond


Действительно, если задается в переменной цвет LightGoldenRod, то компилятор выдает ошибку. Хорошо бы, чтобы разработчики обратили внимание на это.

Надо проверить, как этот цвет будет работать при задании его программно.

 
Integer писал (а):
Непонятки с цветом LightGoldenRod, редактор не подсвечивает его, или в справке неправильно назван

В справке он, скорее всего, назван правильно. При задании этого цвета компилятор выдает ошибку. А если просто написать это слово и после наведения на него курсора и нажатии F1 появляется справка с таблицей цветов. Это ошибка... компилятора...

 
LightGoldenrod, а не LightGoldenRod
 

Точно. Ошибка в слове.

Слава, а почему нельзя сделать, чтобы эти слова в некоторых случаях распознавались как цвет. Ведь сейчас они распознаются как цвет при задании цвета этими словами. А если задать в строковой переменной наименование цвета. И потом значению переменной типа color присвоить значение этой строковой переменной. Чтобы при этом не было ошибки. То есть чтобы происходило неявное преобразование типа.???