Нужна помощь

 
Подскажите, кто если знает, как в mql5 нарисовать круг с заливкой внутри?
 
Igor Nagorniuk:
Подскажите, кто если знает, как в mql5 нарисовать круг с заливкой внутри?

Документация точно знает.

В этом примере нужно присвоить значение true аргументу fill при вызове функции EllipseCreate.

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ELLIPSE
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_ELLIPSE
  • www.mql5.com
Эллипс. Примечание Для эллипса можно установить режим заливки при помощи свойства OBJPROP_FILL . Пример Следующий скрипт создает и перемещает на...
 
Igor Nagorniuk:
Подскажите, кто если знает, как в mql5 нарисовать круг с заливкой внутри?

Ещё в MQL5 для создания круга с заливкой на графике используется класс CCanvas из стандартной библиотеки. 

Основные моменты создания круга с заливкой в MQL5:

  1. Подключение библиотеки: Используется #include <Canvas\Canvas.mqh> для работы с графическими объектами.
  2. Создание Canvas: Метод CreateBitmapLabel() создает область для рисования на графике.
  3. Рисование круга:
    • FillCircle() - создает заливку круга
    • Circle() - рисует контур круга
  4. Управление цветом: Функция ColorToARGB() преобразует цвет MQL5 в формат ARGB с поддержкой прозрачности.
  5. Координаты: Указываются в пикселях относительно созданного canvas
  6. Вот пример исходного кода:
//+------------------------------------------------------------------+
//|                                                  CircleExample.mq5 |
//|                        Copyright 2025, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#include <Canvas\Canvas.mqh>

// Входные параметры
input int circle_x = 100;        // X координата центра круга
input int circle_y = 100;        // Y координата центра круга
input int circle_radius = 50;    // Радиус круга
input color fill_color = clrBlue; // Цвет заливки
input color border_color = clrRed; // Цвет границы
input int border_width = 2;      // Толщина границы

// Глобальные переменные
CCanvas canvas;
string canvas_name = "CircleCanvas";

//+------------------------------------------------------------------+
//| Функция инициализации индикатора                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // Создаем объект canvas на графике
    if(!canvas.CreateBitmapLabel(canvas_name, 0, 0, 300, 300, COLOR_FORMAT_ARGB_NORMALIZE))
    {
        Print("Ошибка создания canvas");
        return INIT_FAILED;
    }
    
    // Очищаем canvas белым цветом
    canvas.Erase(ColorToARGB(clrWhite, 255));
    
    // Рисуем круг с заливкой
    DrawFilledCircle();
    
    // Обновляем отображение
    canvas.Update();
    
    return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| Функция рисования круга с заливкой                                |
//+------------------------------------------------------------------+
void DrawFilledCircle()
{
    // Заливаем круг цветом
    canvas.FillCircle(circle_x, circle_y, circle_radius, ColorToARGB(fill_color, 255));
    
    // Рисуем границу круга
    if(border_width > 0)
    {
        for(int i = 0; i < border_width; i++)
        {
            canvas.Circle(circle_x, circle_y, circle_radius - i, ColorToARGB(border_color, 255));
        }
    }
}

//+------------------------------------------------------------------+
//| Функция деинициализации                                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // Удаляем объект canvas
    canvas.Destroy();
    ObjectDelete(0, canvas_name);
}

//+------------------------------------------------------------------+
//| Функция обработки каждого тика                                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
    // В данном примере обновление происходит только при инициализации
    return rates_total;
}

//+------------------------------------------------------------------+
//| Альтернативная функция для создания нескольких кругов            |
//+------------------------------------------------------------------+
void DrawMultipleCircles()
{
    // Очищаем canvas
    canvas.Erase(ColorToARGB(clrWhite, 255));
    
    // Рисуем несколько кругов разных размеров и цветов
    canvas.FillCircle(80, 80, 30, ColorToARGB(clrRed, 180));
    canvas.FillCircle(150, 80, 25, ColorToARGB(clrGreen, 180));
    canvas.FillCircle(220, 80, 35, ColorToARGB(clrBlue, 180));
    
    // Рисуем круг с градиентной заливкой (имитация)
    for(int r = 40; r > 0; r--)
    {
        uint alpha = (uint)(255 * r / 40);
        canvas.Circle(150, 200, r, ColorToARGB(clrYellow, alpha));
    }
    
    // Обновляем отображение
    canvas.Update();
}

//+------------------------------------------------------------------+
//| Функция для создания круга в определенной области графика        |
//+------------------------------------------------------------------+
void DrawCircleOnChart(double price_level, datetime time_point, int radius_pixels)
{
    // Преобразуем координаты цены и времени в пиксели
    int x, y;
    if(ChartTimePriceToXY(0, 0, time_point, price_level, x, y))
    {
        // Создаем новый canvas для этого круга
        CCanvas chart_canvas;
        string obj_name = "CircleAt_" + TimeToString(time_point);
        
        if(chart_canvas.CreateBitmapLabel(obj_name, x - radius_pixels, y - radius_pixels, 
                                         radius_pixels * 2, radius_pixels * 2, COLOR_FORMAT_ARGB_NORMALIZE))
        {
            // Делаем фон прозрачным
            chart_canvas.Erase(ColorToARGB(clrNONE, 0));
            
            // Рисуем круг
            chart_canvas.FillCircle(radius_pixels, radius_pixels, radius_pixels, 
                                   ColorToARGB(clrGold, 150));
            
            // Обновляем
            chart_canvas.Update();
        }
    }
}