• 24ºC, Clear
  • Wednesday, 21st January, 2026
  • Trang Chủ
  • Bộ Lọc
  • Nhận Định Thị Trường
  • Phân Tích Doanh Nghiệp
  • Amibroker
    • Code AFL
    • Tự học Amibroker
  • Kiến Thức Đầu Tư
    • Chỉ Báo Kỹ Thuật
    • Phân Tích Cơ Bản
    • Phương Pháp Sóng Elliot
    • Phương Pháp Wyckoff/VSA
    • Vĩ Mô Liên Thị Trường
  • Liên hệ
  • Giới Thiệu
Mới Nhất
  • Phân tích VN-Index ngày 11/08
  • Phân tích HAH
  • Bài 46: Trở thành nhà giao dịch chuyên nghiệp
  • Bài 45: GFX Functions – Bảng trạng thái giao dịch Amibroker
  1. Trang chủ
  2. Amibroker
  3. Tự học Amibroker
  4. Bài 25: User Defined Functions – User Defined Functions Amibroker
Bài 25: User Defined Functions – User Defined Functions Amibroker

Xem nhanh:

  • Hàm Tự Định Nghĩa (UDF) Là Gì? Tại Sao Chúng Ta Cần Nó?
  • Cú Pháp Cơ Bản Của Hàm Tự Định Nghĩa Trong AFL
  • Ví Dụ Thực Tế: Hàm IsUp() – Kiểm Tra Nến Tăng
  • Lưu Trữ Hàm Tự Định Nghĩa (#include và Thư Mục Include)

Chào các bạn! Trong hành trình lập trình các chỉ báo và chiến lược giao dịch bằng Amibroker Formula Language (AFL), bạn chắc chắn đã quen thuộc với rất nhiều hàm dựng sẵn (built-in functions) mà Amibroker cung cấp (ví dụ: EMA(), MACD(), Cross(),…). Tuy nhiên, sẽ có những lúc bạn cần thực hiện một tác vụ cụ thể, phức tạp hoặc lặp đi lặp lại mà không có hàm dựng sẵn nào giải quyết được một cách tối ưu. Lúc này, hàm tự định nghĩa (User-Defined Functions – UDF) chính là giải pháp!

Hàm Tự Định Nghĩa (UDF) Là Gì? Tại Sao Chúng Ta Cần Nó?

Hàm tự định nghĩa (UDF) là những khối mã mà bạn tự viết để thực hiện một công việc cụ thể. Thay vì lặp lại cùng một đoạn code phức tạp nhiều lần trong các phần khác nhau của công thức AFL, bạn có thể đóng gói nó vào một hàm và gọi hàm đó bất cứ khi nào cần.

Lợi ích của việc sử dụng UDF:

  • Tăng khả năng đọc hiểu (Readability): Thay vì một đoạn code dài, phức tạp, bạn chỉ cần thấy một tên hàm đơn giản và dễ hiểu. Điều này giúp code của bạn sạch sẽ, dễ đọc và dễ bảo trì hơn rất nhiều.
  • Tái sử dụng mã (Code Reusability): Bạn viết code một lần, sau đó có thể gọi lại hàm đó ở bất kỳ đâu trong công thức AFL của mình hoặc thậm chí trong các công thức khác mà không cần viết lại toàn bộ. Điều này tiết kiệm thời gian và công sức đáng kể.
  • Dễ dàng bảo trì và sửa lỗi (Maintainability): Nếu có lỗi hoặc cần thay đổi logic, bạn chỉ cần sửa trong định nghĩa hàm một lần duy nhất, thay vì phải tìm và sửa ở nhiều nơi khác nhau.
  • Trừu tượng hóa: UDF cho phép bạn tập trung vào “cái gì” hàm làm, thay vì phải đi sâu vào “cách thức” nó làm mỗi khi bạn sử dụng nó.

Cú Pháp Cơ Bản Của Hàm Tự Định Nghĩa Trong AFL

Để tạo một hàm tự định nghĩa, bạn cần tuân thủ cú pháp sau:

function TenHam(thamSo1, thamSo2, ...)
{
    // Thân hàm: Nơi chứa logic xử lý
    // Các câu lệnh, tính toán, vòng lặp, điều kiện
    
    return KetQua; // Giá trị hoặc mảng mà hàm sẽ trả về
}

Giải thích các thành phần:

  • function: Từ khóa bắt buộc để khai báo rằng đây là một hàm.
  • TenHam: Tên mà bạn muốn đặt cho hàm của mình. Tên hàm phải tuân thủ quy tắc đặt tên biến trong AFL (không có khoảng trắng, không bắt đầu bằng số, không trùng với từ khóa hoặc hàm dựng sẵn).
  • (thamSo1, thamSo2, ...): Danh sách các tham số (parameters) mà hàm sẽ nhận vào. Các tham số này giống như các biến mà bạn truyền dữ liệu vào hàm để hàm xử lý. Một hàm có thể không có tham số nào (()) hoặc có nhiều tham số, phân cách bằng dấu phẩy.
  • { ... }: Dấu ngoặc nhọn, bao bọc thân hàm (function body). Đây là nơi chứa tất cả các câu lệnh, logic tính toán mà hàm sẽ thực hiện.
  • return KetQua;: Từ khóa return được sử dụng để trả về một giá trị hoặc một mảng kết quả sau khi hàm đã hoàn thành công việc của nó. Một hàm có thể trả về một số, một chuỗi, hoặc một mảng. Nếu một hàm không có câu lệnh return hoặc return không có giá trị, nó sẽ trả về Null hoặc 0 (tùy ngữ cảnh).

Ví Dụ Thực Tế: Hàm IsUp() – Kiểm Tra Nến Tăng

Hãy tạo một hàm đơn giản để kiểm tra xem một thanh nến có phải là nến tăng hay không (giá đóng cửa cao hơn giá đóng cửa của nến trước đó). Hàm này sẽ nhận một mảng giá trị đầu vào (Input) và trả về một mảng kết quả (1 nếu nến tăng, 0 nếu nến giảm/đứng yên).

// Định nghĩa hàm IsUp()
function IsUp(Input)
{
    // Khai báo một mảng tạm thời để lưu kết quả
    ResultArray = Null; 

    // Duyệt qua từng thanh nến (bắt đầu từ thanh thứ 2 - BarIndex 1)
    // vì thanh nến đầu tiên không có nến trước đó để so sánh
    for (i = 1; i < BarCount; i++)
    {
        // Nếu Input của thanh nến hiện tại cao hơn Input của thanh nến trước đó
        if (Input[i] > Input[i-1])
        {
            ResultArray[i] = 1; // Gán 1 (True)
        }
        else // Ngược lại (Input[i] <= Input[i-1])
        {
            ResultArray[i] = 0; // Gán 0 (False)
        }
    }
    
    return ResultArray; // Trả về mảng kết quả
}

// --- Gọi và sử dụng hàm đã định nghĩa ---
// Ví dụ: Kiểm tra xem nến đóng cửa có phải là nến tăng không
NenDongCuaTang = IsUp(Close);

// Plot kết quả lên biểu đồ
Plot(Close, "Close", colorBlack, styleCandle);
Plot(NenDongCuaTang, "Nến Đóng Cửa Tăng (1=True, 0=False)", colorRed, styleLine);

Phân tích ví dụ:

  • function IsUp(Input): Khai báo hàm IsUp nhận một tham số là Input (có thể là Close, Open, High, Low, hoặc bất kỳ mảng nào).
  • for (i = 1; i < BarCount; i++): Vòng lặp bắt đầu từ BarIndex = 1 vì chúng ta cần so sánh với Input[i-1].
  • if (Input[i] > Input[i-1]): Logic kiểm tra nến tăng.
  • ResultArray[i] = 1; hoặc 0;: Gán kết quả vào mảng tạm thời.
  • return ResultArray;: Trả về mảng kết quả.
  • NenDongCuaTang = IsUp(Close);: Đây là cách bạn gọi (call) hàm. Chúng ta truyền mảng Close làm đối số cho tham số Input. Kết quả trả về (mảng ResultArray) sẽ được gán vào biến NenDongCuaTang.

Lưu Trữ Hàm Tự Định Nghĩa (#include và Thư Mục Include)

Để tái sử dụng các UDF mà không cần sao chép code mỗi lần, bạn nên lưu chúng vào một file riêng và sử dụng chỉ thị #include.

Các bước lưu trữ và sử dụng UDF:

  1. Lưu file hàm:

    • Mở một cửa sổ Formula Editor mới trong Amibroker (File -> New -> Formula).
    • Dán (hoặc viết) toàn bộ định nghĩa hàm của bạn vào đó (ví dụ, hàm IsUp ở trên).
    • Lưu file này vào thư mục .../AmiBroker/Formulas/Include/ với định dạng .afl. Ví dụ: MyFunctions.afl hoặc IsUpFunction.afl.
    • Mẹo: Nên lưu mỗi hàm hoặc nhóm hàm có liên quan vào một file .afl riêng biệt để dễ quản lý.
  2. Sử dụng hàm trong công thức khác:

    • Mở công thức AFL mà bạn muốn sử dụng hàm đó.
    • Ở đầu công thức, thêm dòng #include với tên file bạn vừa lưu:
      #include "IsUpFunction.afl" // Hoặc "MyFunctions.afl"
      
      // Sau đó bạn có thể gọi hàm IsUp() bình thường
      NenDongCuaTang = IsUp(Close);
      Plot(NenDongCuaTang, "Nến Tăng", colorRed, styleLine);
      
    • Amibroker sẽ tự động tìm và nạp code từ file IsUpFunction.afl vào công thức hiện tại.

Lưu ý quan trọng:

  • Nếu bạn gặp lỗi khi sử dụng #include, hãy kiểm tra trong Tools -> Preferences -> AFL và đảm bảo tùy chọn “Standard includes folder” được bật và trỏ đúng đến thư mục .../AmiBroker/Formulas/Include/.
  • Tên file trong #include phải khớp chính xác (bao gồm cả phần mở rộng .afl).
file function

file function

file gọi function

file gọi function

Kết quả

Kết quả

UDF là một công cụ mạnh mẽ giúp bạn tổ chức code AFL một cách chuyên nghiệp, dễ đọc và dễ bảo trì, mở ra cánh cửa cho việc phát triển các chiến lược giao dịch phức tạp và hiệu quả hơn.

  • trancotam
❮ Prev Next ❯
Chia sẻ: Facebook WhatsApp Twitter
Chia sẻ với ứng dụng khác

Tin Xem Nhiều

Bài 1: Chiến Lược Bảo Vệ Vốn Hiệu Quả Khi Đầu Tư (Phần 1)
Chỉ Báo Kỹ Thuật
Bài 1: Chiến Lược Bảo Vệ Vốn Hiệu Quả Khi Đầu Tư…
21 Tháng 5, 2025
Phân tích BFC
Phân Tích Doanh Nghiệp
Phân tích BFC
14 Tháng 7, 2025
Bài 46: Trở thành nhà giao dịch chuyên nghiệp
Tự học Amibroker
Bài 46: Trở thành nhà giao dịch chuyên nghiệp
22 Tháng 6, 2025
Phân tích HAH
Phân Tích Doanh Nghiệp
Phân tích HAH
15 Tháng 7, 2025
Bảng công cụ phân tích thị trường
Chưa phân loại
Bảng công cụ phân tích thị trường
13 Tháng 5, 2025
Donation
Phóng to ảnh

TADOSO là nền tảng chia sẻ kiến thức và kinh nghiệm đầu tư tài chính, đặc biệt trong lĩnh vực chứng khoán, nhằm kết nối và nâng cao tư duy cho nhà đầu tư cá nhân tại Việt Nam. Với triết lý "Tạo dựng – Đồng hành – Sở hữu", TADOSO hướng đến xây dựng cộng đồng học hỏi minh bạch, trung lập, không bị chi phối bởi tổ chức tài chính nào.

Newsletter

Hãy để lại mail để chúng tôi có thể phục vụ bạn tốt hơn

Donation - Buy me a coffee

Donation

Copyright © All rights reserved | This template is made with by Tran Co Tam

  • Terms of use
  • Privacy Policy
  • Contact
Zalo Messenger
×

Liên hệ