• 24ºC, Clouds
  • 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 20: Flow Control Statements – Vòng lặp For AFL
Bài 20: Flow Control Statements – Vòng lặp For AFL

Xem nhanh:

  • Làm Chủ Vòng Lặp For Trong Amibroker AFL: Lập Trình Logic Giao Dịch Nâng Cao
  • Vòng Lặp (Looping) Là Gì? Tại Sao Chúng Ta Cần Nó?
  • Vòng Lặp For: Cú Pháp Và Cơ Chế Hoạt Động
  • Ví Dụ Thực Tế Với Vòng Lặp For
  • 1. Tính toán giá trung bình của mỗi thanh nến và lưu vào một mảng mới
  • 2. Vẽ hình MUA/BÁN trên mỗi thanh nến với For loop và If-Else

Làm Chủ Vòng Lặp For Trong Amibroker AFL: Lập Trình Logic Giao Dịch Nâng Cao

Chào các bạn! Trong các bài học trước về các câu lệnh điều khiển luồng (Flow Control Statements), chúng ta đã khám phá cách If-Else cho phép chúng ta ra quyết định dựa trên điều kiện “thanh nến theo thanh nến” (bar by bar). Tuy nhiên, nếu bạn muốn thực hiện một thao tác hoặc kiểm tra một điều kiện lặp đi lặp lại trên mỗi thanh nến của biểu đồ, hay trên một tập hợp lớn các thanh nến, chúng ta cần đến một khái niệm mạnh mẽ hơn: Vòng lặp (Looping).


Vòng Lặp (Looping) Là Gì? Tại Sao Chúng Ta Cần Nó?

Vòng lặp là một quá trình trong lập trình cho phép bạn thực hiện cùng một tập hợp các câu lệnh (hoặc một hoạt động) lặp đi lặp lại nhiều lần. Trong bối cảnh AFL (Amibroker Formula Language), điều này thường có nghĩa là thực hiện một hành động trên mỗi thanh nến trong một phạm vi dữ liệu nhất định.

Tại sao vòng lặp lại cần thiết?

  • Thực thi “Bar by Bar” toàn diện: Như ví dụ trong video trước, chúng ta chỉ có thể kiểm tra tín hiệu MUA/BÁN và vẽ hình cho một thanh nến cụ thể. Với vòng lặp, chúng ta có thể làm điều đó cho tất cả các thanh nến trên biểu đồ một cách tự động.
  • Xử lý các điều kiện phức tạp: Có những logic giao dịch mà các hàm AFL có sẵn không thể giải quyết đơn giản được. Vòng lặp cho phép bạn tự định nghĩa các bước xử lý dữ liệu phức tạp trên từng thanh nến hoặc giữa các thanh nến liền kề.
  • Thao tác nâng cao trên mảng: Mặc dù AFL rất mạnh trong việc xử lý mảng trực tiếp, nhưng đôi khi bạn cần truy cập và thay đổi giá trị của từng phần tử trong mảng dựa trên các điều kiện động, hoặc tạo ra các mảng mới dựa trên các tính toán tuần tự mà chỉ vòng lặp mới làm được.

Thuật ngữ “Iteration” (lặp lại) cũng thường được dùng để chỉ quá trình thực hiện một lần lặp trong vòng lặp.

Trong Amibroker, có ba loại vòng lặp chính:

  1. For loop (Vòng lặp For): Phổ biến nhất và được sử dụng rộng rãi nhất trong mọi ngôn ngữ lập trình, bao gồm AFL. Nó lý tưởng khi bạn biết chính xác số lần lặp hoặc phạm vi lặp.
  2. While loop (Vòng lặp While): Lặp chừng nào một điều kiện còn đúng.
  3. Do-While loop (Vòng lặp Do-While): Tương tự như While nhưng đảm bảo khối lệnh được thực thi ít nhất một lần trước khi kiểm tra điều kiện.

Mặc dù cả ba loại vòng lặp đều có thể giải quyết nhiều vấn đề, nhưng vòng lặp For là công cụ đa năng nhất và sẽ là trọng tâm chính của chúng ta vì nó có thể xử lý hầu hết các tác vụ nâng cao trong AFL.


Vòng Lặp For: Cú Pháp Và Cơ Chế Hoạt Động

Cú pháp cơ bản của vòng lặp For trong AFL:

for (initialization; condition; expression)
{
    statement(s); // Các câu lệnh sẽ được lặp lại
}

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

  1. initialization (Khởi tạo):

    • Đây là phần được thực thi chỉ một lần khi vòng lặp bắt đầu.
    • Nó thường dùng để khởi tạo một biến đếm vòng lặp. Trong AFL, chúng ta thường dùng biến i và gán nó bằng 0 (i = 0), đại diện cho BarIndex của thanh nến đầu tiên.
    • Ví dụ: i = 0;
  2. condition (Điều kiện):

    • Biểu thức này được kiểm tra trước mỗi lần lặp.
    • Nếu điều kiện là True, khối lệnh bên trong vòng lặp sẽ được thực thi.
    • Nếu điều kiện là False, vòng lặp sẽ dừng lại và chương trình sẽ tiếp tục thực thi các dòng code sau vòng lặp.
    • Trong AFL, chúng ta thường sử dụng điều kiện i < BarCount - 1; để đảm bảo vòng lặp chạy từ thanh nến đầu tiên (BarIndex = 0) đến thanh nến cuối cùng (BarCount - 1).
    • Ví dụ: i < BarCount - 1;
  3. expression (Biểu thức tăng/giảm):

    • Biểu thức này được thực thi sau mỗi lần lặp thành công.
    • Nó thường dùng để cập nhật biến đếm (tăng hoặc giảm giá trị).
    • Trong AFL, để duyệt qua từng thanh nến, chúng ta thường tăng i lên 1 sau mỗi lần lặp: i++ (tương đương i = i + 1).
    • Ví dụ: i++
  4. statement(s) (Các câu lệnh):

    • Đây là khối code sẽ được thực thi lặp đi lặp lại nếu condition là True.
    • Hãy nhớ sử dụng dấu ngoặc nhọn {} để bao bọc khối lệnh này, đặc biệt nếu có nhiều hơn một câu lệnh.

Cách hoạt động của For loop:

  1. Khởi tạo initialization.
  2. Kiểm tra condition.
  3. Nếu True: Thực thi statement(s).
  4. Thực thi expression.
  5. Quay lại bước 2.
  6. Nếu False: Dừng vòng lặp.

Ví Dụ Thực Tế Với Vòng Lặp For

1. Tính toán giá trung bình của mỗi thanh nến và lưu vào một mảng mới

Chúng ta sẽ tạo một mảng mới (AverageValues) để lưu trữ giá trị (High + Low) / 2 cho từng thanh nến.

// Khởi tạo một mảng rỗng (Null Values) để lưu kết quả
// (SetBarsRequired(0) đảm bảo BarIndex bắt đầu từ 0)
SetBarsRequired(0);
AverageValues = Null;

// Vòng lặp For để duyệt qua từng thanh nến
for (i = 0; i < BarCount; i++) // Lặp từ BarIndex 0 đến BarCount-1
{
    // Tính giá trung bình cho thanh nến thứ i và gán vào AverageValues[i]
    AverageValues[i] = (High[i] + Low[i]) / 2;
}

// Plot mảng kết quả lên biểu đồ
Plot(AverageValues, "Gia TB Moi Nen", colorGreen, styleLine);

Giải thích:

  • AverageValues = Null;: Khởi tạo một mảng rỗng để các giá trị được gán vào sau này.
  • i < BarCount;: Điều kiện này đảm bảo vòng lặp chạy đến thanh nến cuối cùng có BarIndex là BarCount - 1.
  • AverageValues[i] = (High[i] + Low[i]) / 2;: Trong mỗi lần lặp, chúng ta tính toán giá trị trung bình cho thanh nến tại BarIndex i và gán nó vào vị trí tương ứng trong mảng AverageValues.

2. Vẽ hình MUA/BÁN trên mỗi thanh nến với For loop và If-Else

Đây là cách chúng ta áp dụng vòng lặp For để giải quyết vấn đề vẽ hình cho mọi thanh nến mà chúng ta đã thấy trong ví dụ If-Else trước đó.

// Khai báo và tính toán các đường EMA
FastEMA = EMA(Close, 5);
SlowEMA = EMA(Close, 20);

// Định nghĩa tín hiệu mua/bán (dạng mảng)
BuySignal = Cross(FastEMA, SlowEMA);
SellSignal = Cross(SlowEMA, FastEMA);

// Khởi tạo mảng để lưu hình dạng (ban đầu là Null)
SetBarsRequired(0); // Đảm bảo BarIndex bắt đầu từ 0
ShapeArray = Null;

// Vòng lặp For để duyệt qua từng thanh nến
for (i = 0; i < BarCount; i++)
{
    // Kiểm tra tín hiệu MUA cho thanh nến thứ i
    if (BuySignal[i])
    {
        ShapeArray[i] = shapeUpArrow; // Gán hình mũi tên lên nếu có tín hiệu MUA
    }
    // Nếu không có MUA, kiểm tra tín hiệu BÁN
    else if (SellSignal[i])
    {
        ShapeArray[i] = shapeDownArrow; // Gán hình mũi tên xuống nếu có tín hiệu BÁN
    }
    // Nếu không có cả MUA và BÁN, giữ nguyên Null hoặc gán shapeNone nếu muốn rõ ràng hơn
    // else
    // {
    //     ShapeArray[i] = shapeNone;
    // }
}

// Plot các đường EMA và giá
Plot(Close, "Close", colorBlack, styleCandle);
Plot(FastEMA, "Fast EMA", colorBlue, styleLine);
Plot(SlowEMA, "Slow EMA", colorRed, styleLine);

// Plot các hình dạng đã lưu trong ShapeArray lên biểu đồ
PlotShapes(ShapeArray, IIf(ShapeArray == shapeUpArrow, colorGreen, colorRed), 0,
           IIf(ShapeArray == shapeUpArrow, Low - 0.05 * ATR(10), High + 0.05 * ATR(10)), 0);
Ví dụ

Ví dụ


Kết quả

Kết quả

Giải thích:

  • Chúng ta tạo một mảng ShapeArray với các Null Values ban đầu.
  • Vòng lặp For duyệt qua mỗi thanh nến bằng cách sử dụng BarIndex (i).
  • Bên trong vòng lặp, chúng ta sử dụng If-Else để kiểm tra BuySignal[i] hoặc SellSignal[i] và gán hình dạng tương ứng (shapeUpArrow hoặc shapeDownArrow) vào ShapeArray[i].
  • Sau khi vòng lặp hoàn tất, ShapeArray sẽ chứa các giá trị hình dạng (hoặc Null Values nếu không có tín hiệu) cho mỗi thanh nến.
  • Cuối cùng, chúng ta sử dụng PlotShapes() với toàn bộ mảng ShapeArray để vẽ các hình lên biểu đồ một cách hiệu quả.

Vòng lặp For là một công cụ cực kỳ mạnh mẽ, cho phép bạn xử lý dữ liệu chi tiết ở cấp độ “thanh nến theo thanh nến” và xây dựng những chiến lược giao dịch phức tạp không thể thực hiện được chỉ với các hàm AFL cơ bản. Hãy luyện tập thật nhiều với nó để khai thác tối đa sức mạnh của Amibroker!

  • 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ệ