Chào bạn,
Ở bài trước mình đã cùng nhau lên 1 cái khung sườn để tổ chức code một cách hiệu quả. Hôm nay mình sẽ cùng nhau tìm hiểu về một kiểu dữ liệu rất quan trọng của pinescript. Đó chính là Time series
Okay, vậy time serise là gì ?
Time series là một cấu trúc dùng để lưu trữ một chuỗi các dữ liệu mà dữ liệu đó có thể thay đổi theo thời gian.
Ví dụ: open là một biến build-in của pinescript. Nó lưu trữ giá mở cửa của từng cây nến đang được hiển thị trên chart. Khi bạn đang mở chart 1H thì mỗi giá trị trong series open sẽ là giá mở cửa của từng cây nến 1H.
Như ở bài Execution model, các bạn đã biết rằng code pinescript sẽ được thực thi lặp đi lặp lại trên từng cây nến. Và khi bạn sử dụng biến open thì nó sẽ là giá trị mở cửa của cây nến tại thời điểm code đang được thực thi.
Để truy cập vào dữ liệu quá khứ của biến time series, bạn có thể dùng toán tử [ ].
VD open[1] là để lấy giá trị giá mở cửa của cây nến ngay đằng trước cây nến đang được thực thi.
Khi bạn dùng biến open thì mặc định pinescript sẽ hiểu là open[0], tức là giá trị open của cây nến hiện tại.
Nhiều bạn sẽ thấy time series giống như một array ở các ngôn ngữ lập trình khác. Thực ra thì chúng ta có thể hiểu rằng time series và array có một vài chỗ tương đồng như vậy cũng được.
Nhưng thực tế là chúng rất khác nhau nhé. Ban đầu pinescript còn không có khái niệm array. Mãi đến 2 version gần đây là v4 và v5 thì pinescript mới bổ sung thêm array vào code của mình.
Kiểu time series kết hợp cùng việc code pinescript được thực thi liên tiếp trên từng cây nến sẽ giúp chúng ta làm việc với chart một cách hiệu quả và đơn giản hơn.
Okay, lý thuyết suông thì khó mà hiểu hết được. Chúng ta cùng nhau làm một vài ví dụ đơn giản nhé
Ở những bài trước thì mình có một đoạn code đơn giản là hiển thị lên màn hình giá đóng cửa tăng lên 10% (tăng lên 10% cho dễ nhìn thôi)
// © DucTri_dev //@version=5 indicator(title = "Hello World", shorttitle = "Hello",overlay = true ) giaDongCua = close * 1.1 plot(giaDongCua)
Giờ cùng phân tích xem code xem chạy như nào nhé.
Như ở hình trên, tại thời điểm cây nến đầu tiên, khi code được chạy lần đầu tiên. Giá close = 4285.08 => biến giaDongCua sẽ = 4285.08 * 1.1 = 4713.59. Và giá trị đó được vẽ lên màn hình như ở hình trên.
Sang đến cây nến thứ, code lại được thực thi một lần nữa. Tại thời điểm cây nến thứ 2 này, biến close có giá trị bằng 4108.37. Vì vậy nên biến giaDongCua sẽ có giá trị là 4108.37 * 1.1 = 4519.21, và được vẽ lên màn hình như hình trên.
Các bạn có thể thấy biến close lưu trữ giá trị của series các giá đóng cửa của từng cây nến có trên chart. Mỗi khi code được thực thi trên cây nến nào thì biến close sẽ có giá trị bằng giá đóng cửa tại cây nến đó.
Code sẽ được thực thi tương tự như vậy, lần lượt từ trái sang phải cho đến cây nến cuối cùng bên phải (cây nến hiện tại).
Nhiều function mặc định của pinescript nhận biến đầu vào có kiểu series hoặc trả ra kết quả là một biến kiểu series. Điều này cũng sẽ giúp việc code của chúng ta sẽ đơn giản hơn.
Ví dụ đoạn code sau sẽ tính tổng của tất cả các giá close từ cây nến 0 đến cây nến hiện tại
// © DucTri_dev //@version=5 indicator(title = "Hello World", shorttitle = "Hello" ) tongGiaDongCua = ta.cum(close) plot(tongGiaDongCua)
Tương tự như mình đã phân tích ở trên. Đoạn code này sẽ được thực thi lần đầu tiên tại cây nến số 0. Lúc này giá đóng của là 4285.08.
Hàm ta.cum(bienDauVao) sẽ trả ra tổng tất cả các phần tử được của bienDauVao. Biến đầu vào trong trường hợp này là close
Lúc này thì hàm ta.cum(close) sẽ trả ra giá trị bằng 4285.08. Vì ở cây nến đầu tiên thì series close mới chỉ có 1 phần tử có giá trị là 4285.08. Nên biến tongGiaDongCua cũng có giá trị là 4285.08. Và được vẽ lên chart như hình trên
Sang đến cây nến thứ 2, giá đóng cửa là 4108.37. Lúc này thì series close có 2 giá trị là 4285.08 (ở cây nến đầu tiên) và 4108.37.
Hàm ta.cum(close) sẽ tính tổng các phần tử có trong series close nên lúc này hàm ta.cum(close) sẽ trả ra giá trị = 4108.37 + 4285.08 = 8393.45.
Vì vậy biến tongGiaDongCua sẽ = 8393.45 và được hiện lên chart như hình trên.
Việc này sẽ được thực hiện lặp đi lặp lại, từ trái sang phải, từ cây nến đầu tiên có trên chart cho đến cây nến hiện tại.
Với bài toán: “Tính tổng của tất cả giá close từ cây nến 0 đến cây nến hiện tại”. Nếu bạn dùng ngôn ngữ khác, ví dụ như python hoặc javascript thì việc giải bài toán trên sẽ phức tạp hơn 1 chút.
Nhưng với pinescript, bạn chỉ cần giải quyết nó với đúng 1 câu lệnh ta.cum(close).
Đó chính là sự đơn giản và tiện lợi của time series và cơ chế thực thi trên từng cây nến của pinescript mà mình có highlight ở phần trên
Okay bài này đến đây thôi, nếu có gì chưa hiểu thì bạn hãy đọc lại và tự code lại để hiểu thêm. Và hãy cứ thoải mái comment nhé. Mình sẽ cố gắng trả lời hết những comment của các bạn.
Bài sau chúng ta sẽ nói về các toán tử cơ bản trong pinescript.
Hẹn gặp lại các bạn ở bài tiếp theo !