Sử Dụng Các Hàm Đồ Họa Mức Thấp Trong AFL (Low-Level Graphics Functions)

ha.anh
8 Min Read

Giới thiệu

Trong AFL (AmiBroker Formula Language), ngoài các hàm đồ họa mức cao như Plot(), bạn còn có thể sử dụng các hàm đồ họa mức thấp (low-level graphics functions) để tạo các hiển thị hoàn toàn tùy biến và chuyên nghiệp. Các hàm này cung cấp một giao diện lập trình mô phỏng API GDI của Windows, được thiết kế đặc biệt dành cho những người dùng nâng cao, giúp bạn vẽ bất kỳ hình dạng nào, định dạng văn bản phức tạp, hay thậm chí tạo hiệu ứng đồ họa động.

Những điểm cần lưu ý:

  1. Tiền tố Gfx: Tất cả các hàm đồ họa mức thấp bắt đầu bằng tiền tố Gfx, ví dụ: GfxMoveTo, GfxLineTo, GfxTextOut,…

  2. Không cần quản lý tài nguyên GDI: Không giống như lập trình Windows gốc, bạn không cần xóa hoặc giải phóng các đối tượng như bút, cọ, hay font sau khi sử dụng.

  3. 3 chế độ chồng lớp đồ họa:

    • GfxSetOverlayMode(0): Vẽ Gfx lên trên biểu đồ bình thường (mặc định).

    • GfxSetOverlayMode(1): Biểu đồ vẽ đè lên Gfx.

    • GfxSetOverlayMode(2): Chỉ vẽ Gfx, không vẽ gì khác (biểu đồ/lưới/tên chart,…).

Các hàm Gfx phổ biến

Vẽ hình cơ bản:

  • GfxMoveTo(x, y) – di chuyển con trỏ đến tọa độ.

  • GfxLineTo(x, y) – vẽ đường thẳng từ điểm hiện tại đến điểm mới.

  • GfxRectangle(x1, y1, x2, y2) – vẽ hình chữ nhật.

  • GfxEllipse(x1, y1, x2, y2) – vẽ hình elip.

  • GfxCircle(x, y, radius) – vẽ hình tròn.

  • GfxPolygon(x1, y1, x2, y2, …) – vẽ đa giác kín.

  • GfxPolyline(x1, y1, x2, y2, …) – vẽ các đoạn thẳng nối tiếp.

Vẽ văn bản:

  • GfxTextOut(“text”, x, y) – in văn bản tại tọa độ chỉ định.

  • GfxDrawText(“text”, left, top, right, bottom, format=0) – vẽ văn bản căn chỉnh trong ô.

Chọn màu và kiểu vẽ:

  • GfxSelectPen(color, width, style) – chọn bút vẽ.

  • GfxSelectSolidBrush(color) – chọn cọ tô đặc.

  • GfxSelectFont(“fontname”, size, weight, italic, underline) – chọn font chữ.

  • GfxSetTextColor(color) – đặt màu văn bản.

  • GfxSetBkColor(color) – đặt màu nền.

  • GfxSetBkMode(mode) – đặt chế độ nền (minh bạch hoặc không).

  • GfxGradientRect(x1, y1, x2, y2, fromcolor, tocolor) – tô màu gradient.

Tính năng nâng cao trong phiên bản mới

1. Chế độ tọa độ – GfxSetCoordsMode()

Cho phép bạn chọn:

  • mode = 0 (mặc định): tọa độ pixel (dựa theo độ phân giải màn hình).

  • mode = 1: tọa độ theo bar và giá (bar/price), giúp tích hợp dễ dàng hơn với biểu đồ Plot().

Ví dụ:

afl

Copy code

GfxSetCoordsMode(1); // bật chế độ bar/price

GfxEllipse(bar, Close[bar]+1, bar+1, Close[bar]);

 

2. Lớp Z-axis – GfxSetZOrder()

Xác định thứ tự vẽ đồ họa chồng lên nhau:

  • GfxSetZOrder(0) – lớp mặc định.

  • GfxSetZOrder(-1), (-2), … – vẽ dưới.

  • GfxSetZOrder(1), (2), … – vẽ trên.

Ví dụ minh họa

Ví dụ 1: Biểu đồ hình tròn (Pie Chart) thể hiện tỷ lệ cổ đông

afl

Copy code

GfxSetOverlayMode(2); // Chỉ vẽ đồ họa

 

HInsiders = GetFnData(“InsiderHoldPercent”);

HInst = GetFnData(“InstitutionHoldPercent”);

 

function DrawPiePercent(x, y, r, startpct, endpct)

{

    PI = 3.1415926;

    sa = 2 * PI * startpct / 100;

    ea = 2 * PI * endpct / 100;

    xsa = x + r * sin(sa);

    ysa = y + r * cos(sa);

    xea = x + r * sin(ea);

    yea = y + r * cos(ea);

    GfxPie(x – r, y – r, x + r, y + r, xsa, ysa, xea, yea);

}

 

Đoạn sau tiếp tục chọn màu, hiển thị chú giải và tạo văn bản cho từng phần hình tròn.

Ví dụ 2: Bảng dữ liệu giá và khối lượng (như bảng tính Excel)

afl

Copy code

CellHeight = 20;

CellWidth = 100;

GfxSelectFont(“Tahoma”, CellHeight/2);

 

function PrintInCell(text, row, col)

{

    GfxDrawText(text, col * CellWidth, row * CellHeight, (col + 1)*CellWidth, (row + 1)*CellHeight, 0);

}

 

PrintInCell(“Mở”, 0, 0);

PrintInCell(“Cao”, 0, 1);

PrintInCell(“Thấp”, 0, 2);

PrintInCell(“Đóng”, 0, 3);

PrintInCell(“KL”, 0, 4);

 

for (i = 1; i < 10 AND i < BarCount; i++)

{

    PrintInCell(StrFormat(“%g”, O[i]), i, 0);

    PrintInCell(StrFormat(“%g”, H[i]), i, 1);

    PrintInCell(StrFormat(“%g”, L[i]), i, 2);

    PrintInCell(StrFormat(“%g”, C[i]), i, 3);

    PrintInCell(StrFormat(“%g”, V[i]), i, 4);

}

 

Ví dụ 3: Vòng tròn màu chuyển động và văn bản động

afl

Copy code

GfxSetOverlayMode(1);

Plot(C, “Giá”, colorDefault, styleLine);

 

PI = 3.1415926;

k = (GetPerformanceCounter()/100) % 256;

 

for (i = 0; i < 256; i++)

{

    x = 2 * PI * i / 256;

    GfxMoveTo(100+k, 100);

    GfxSelectPen(ColorHSB((i + k) % 256, 255, 255), 4);

    GfxLineTo(100+k + 100*sin(x), 100 + 100*cos(x));

}

GfxSetTextColor(colorRed);

GfxTextOut(“Hiển thị đồ họa nâng cao”, 20, 128 – k/2);

 

Ví dụ 4: Căn chỉnh biểu đồ với tọa độ pixel

afl

Copy code

Plot(C, “Giá”, colorBlack, styleLine);

GfxSetOverlayMode(0);

 

Miny = Status(“axisminy”);

Maxy = Status(“axismaxy”);

fvb = Status(“firstvisiblebar”);

lvb = Status(“lastvisiblebar”);

 

pxwidth = Status(“pxwidth”);

pxheight = Status(“pxheight”);

 

TotalBars = lvb – fvb;

 

GfxSelectSolidBrush(colorRed);

 

for (i = 0; i < TotalBars AND i < (BarCount – fvb); i++)

{

    x = 5 + i * (pxwidth – 56 – 10) / (TotalBars + 1);

    y = 5 + (C[i + fvb] – Miny) * (pxheight – 10) / (Maxy – Miny);

    GfxRectangle(x – 1, pxheight – y – 1, x + 2, pxheight – y + 2);

}

 

Kết luận

Các hàm Gfx trong AFL là công cụ cực kỳ mạnh mẽ, cho phép bạn vượt ra ngoài giới hạn của các biểu đồ tiêu chuẩn. Với khả năng kiểm soát từng pixel, các lập trình viên có thể tạo ra:

  • Giao diện dashboard nâng cao

  • Biểu đồ hình tròn, biểu đồ cột tùy chỉnh

  • Kết xuất dữ liệu dưới dạng bảng

  • Chồng lớp, hiệu ứng động, highlight vùng quan trọng,…

Việc thành thạo đồ họa mức thấp giúp bạn biến AmiBroker trở thành một công cụ trực quan và linh hoạt không chỉ cho phân tích kỹ thuật, mà còn cho trình bày dữ liệu và tương tác trực tiếp với người dùng.

 

TAGGED:
Share This Article
Leave a Comment