You are on page 1of 36

Pine Script (TradingView) - Hướng dẫn từng bước

Mục lục

1. Pine script là gì?


2. Tại sao tôi nên sử dụng tập lệnh Pine?
3. Tại sao tôi không nên sử dụng tập lệnh Pine?
4. Các lựa chọn thay thế để sử dụng Pine script là gì?
5. Làm cách nào để bắt đầu với tập lệnh Pine?
6. Làm thế nào để truy xuất giá của Apple trong tập lệnh Pine?
7. Làm thế nào để lấy SMA (20) của Apple trong tập lệnh Pine?
8. Làm thế nào để kiểm tra lại một chiến lược chéo trung bình động với Pine Script?
9. Làm thế nào để đặt chốt lời và dừng lỗ?
10. Làm thế nào để kích hoạt giao dịch với Apple khi Google tăng 5%?
11. Làm thế nào để sửa đổi các tập lệnh của chúng tôi mà không cần mã hóa?
12. Làm thế nào để lập mưu với tập lệnh Pine?
13. Làm cách nào để tạo chỉ báo tùy chỉnh bằng tập lệnh Pine?
14. Lời kết

Tập lệnh Pine là gì?


Pine script là một ngôn ngữ lập trình được tạo bởi TradingView để kiểm tra lại các chiến lược
giao dịch và tạo các chỉ báo tùy chỉnh.
Pine script được thiết kế để nhẹ và trong hầu hết các trường hợp, bạn có thể đạt được mục tiêu
của mình với ít dòng mã hơn so với các ngôn ngữ lập trình khác. 
Nó không dựa trên bất kỳ ngôn ngữ cụ thể nào, nhưng nếu bạn đã sử dụng Python, bạn sẽ có xu
hướng chọn nó nhanh chóng và nhận thấy những điểm tương đồng.
Mã tập lệnh Pine có thể được tạo trong trình biên tập Pine, một phần của nền tảng biểu đồ trực
tuyến của TradingView.

Tại sao tôi nên sử dụng tập lệnh Pine?


Dữ liệu tích hợp - Đây là một dữ liệu lớn. Kiểm tra chiến lược hoặc tạo chỉ báo bằng các ngôn
ngữ khác liên quan đến việc tìm nguồn dữ liệu của riêng bạn.
Điều đó không chỉ có nghĩa là bạn phải tìm một nơi để lấy dữ liệu của mình mà sau đó bạn cũng
sẽ phải định dạng nó theo một cách nhất định và toàn bộ quá trình này có thể tốn nhiều thời gian.
TradingView có rất nhiều dữ liệu có sẵn trong tầm tay bạn, sẵn sàng truy cập chỉ với một dòng
mã. 
Dễ học - Cú pháp tập lệnh thông có thể đọc được và đơn giản hơn các ngôn ngữ lập trình khác. 
Ngoài ra, bạn không phải mất nhiều thời gian cho việc kiểm tra và xử lý lỗi vì TradingView sẽ lo
phần lớn việc đó cho bạn.
Cơ sở người dùng và thư viện mở rộng - Người dùng TradingView có tùy chọn xuất bản các chỉ
số và chiến lược của họ lên thư viện TradingView.
Có quyền truy cập vào mã nguồn mở là một cách tuyệt vời để học hỏi từ các lập trình viên khác.
Ngoài ra, trong một số trường hợp, ai đó có thể đã viết mã cho những gì bạn đang theo đuổi.
»Quantopian đã ngừng hoạt động. Một giải pháp thay thế để xem xét là QuantConnect.
 
QuantConnect là một nền tảng giao dịch thuật toán và phản hồi dựa trên trình duyệt.
 
Liên kết: QuantConnect - Hướng dẫn đầy đủ
 
Nội dung nổi bật:

 Tạo chiến lược dựa trên các yếu tố alpha như tình cảm, tiền điện tử, hành động của công
ty và dữ liệu vĩ mô (dữ liệu do QuantConnect cung cấp).
 Kiểm tra lại và giao dịch nhiều loại tài sản và ETF ngành (dữ liệu do QuantConnect cung
cấp).
 Chiến lược cấp phép cho quỹ đầu cơ (trong khi bạn giữ IP) thông qua Luồng Alpha của
QuantConnect.

Tại sao tôi không nên sử dụng tập lệnh Pine?


Lý do chính khiến bạn không muốn sử dụng tập lệnh Pine là bạn bị giới hạn trong vũ trụ
TradingView.
Dưới đây là một số hạn chế cụ thể -
Dữ liệu - Nếu TradingView không cung cấp dữ liệu bạn đang theo dõi, bạn đã gặp may.
Được cấp, TradingView có một cơ sở dữ liệu rất toàn diện về các nguồn cấp dữ liệu. Nhưng nếu
chiến lược của bạn liên quan đến giao dịch các thị trường ít người biết đến, thì dữ liệu giá có thể
không có sẵn.
Điều này mở rộng ra bên ngoài dữ liệu giá. Một số chiến lược liên quan đến dữ liệu kinh tế hoặc
thống kê. TradingView cung cấp một số dữ liệu (chủ yếu là dữ liệu Quandl) trong danh mục này
nhưng nó bị giới hạn tại thời điểm này.
Nếu bạn sử dụng dữ liệu thay thế trong chiến lược của mình, bạn có thể dễ dàng sử dụng một
ngôn ngữ lập trình khác linh hoạt hơn.
Thư viện bên ngoài - Tập lệnh thông không thích hợp nếu bạn đang tìm cách tận dụng các thư
viện bên ngoài để thực hiện những việc như Học máy.
Có những lựa chọn thay thế tốt hơn nếu chiến lược của bạn dựa vào việc sử dụng khoa học dữ
liệu hoặc các thư viện của bên thứ ba khác.
»Kiểm tra cách chúng tôi sử dụng TradingView để tìm các cặp giao dịch một cách trực quan.
 
Liên kết: Giao dịch theo cặp - Hướng dẫn trong thế giới thực
 

Các lựa chọn thay thế để sử dụng Pine script là gì?


TD Ameritrade's thinkorswim - nền tảng này có rất nhiều điểm giống với Pine Script. 
Nó sử dụng một ngôn ngữ độc quyền được gọi là thinkScript và lưu trữ dữ liệu giá cả trong các
mảng theo cách tương tự như tập lệnh Pine.
Dữ liệu được tích hợp sẵn và nền tảng này hướng tới việc tạo các chỉ số và chiến lược tùy chỉnh.
Ninjatrader - Nền tảng này cũng sử dụng một ngôn ngữ độc quyền được gọi là Ninjascript. Ngôn
ngữ này không hoàn toàn độc quyền vì nó dựa trên C #.
Ninjatrader có một chút linh hoạt hơn vì nó cho phép bạn kết nối với các nguồn cấp dữ liệu tùy
chỉnh.
Nếu bạn đã quen với C #, C hoặc C ++, đây có thể là một giải pháp thay thế khả thi.

Làm cách nào để bắt đầu với tập lệnh Pine?


Bắt đầu với Pine script thực sự đơn giản, không có gì để tải xuống hoặc cài đặt. 
Nếu bạn đã có tài khoản với TradingView, chỉ cần truy cập trang của họ.
Nếu bạn chưa có tài khoản, hãy điều hướng đến www.tradingview.com. Từ đó, bạn sẽ thấy một
hộp đăng nhập ở góc trên bên phải.

Có một số tùy chọn một cú nhấp chuột để đăng ký hoặc sử dụng phương pháp email / mật khẩu
truyền thống.
Có tài khoản cho phép bạn lưu các tập lệnh của mình vào đám mây TradingView và cung cấp
khả năng thêm các chỉ báo tùy chỉnh vào biểu đồ của bạn.
Sau khi đăng ký, hãy khởi chạy nền tảng biểu đồ bằng cách nhấp vào biểu đồ trong menu hoặc
bằng cách điều hướng đến www.tradingview.com/chart

Cái nhìn đầu tiên về trình chỉnh sửa Pine Editor


thông là nơi chúng ta sẽ tạo mã của mình. Để khởi chạy nó, hãy nhấp vào Pine Editor ở cuối màn
hình của bạn.

Một màn hình sẽ bật lên trông giống như hình dưới đây. 

Trong tập lệnh Pine, bạn sẽ tạo một chỉ báo hoặc một chiến lược. Chúng tôi sẽ thảo luận rộng rãi
về sự khác biệt trong bài viết này. 
Nếu bạn đang theo dõi, màn hình bạn đang xem bây giờ là tập lệnh bắt đầu mặc định để tạo chỉ
báo.
Hãy chạy qua nó từng dòng một.
// Mã nguồn này tuân theo các điều khoản của Giấy phép Công cộng
Mozilla 2.0 tại https://mozilla.org/MPL/2.0/
Dòng đầu tiên chỉ đơn giản là một nhận xét. Các chú thích trong tập lệnh Pine bắt đầu bằng hai
dấu gạch chéo về phía trước.
// © JigneshDavda
Dòng thứ hai cũng là một nhận xét, nó được tự động điền với tên người dùng TradingView của
bạn.
// @ version = 4
Ở dòng thứ tư, bạn có thể cho rằng chúng tôi có một nhận xét khác. Tuy nhiên, dòng này có một
chút khác biệt.
Đây được gọi là một chỉ thị trình biên dịch. Nó cho phép trình biên dịch biết chúng ta muốn sử
dụng phiên bản Pine script nào.
Bạn có thể bỏ qua hai dòng chú thích đầu tiên nếu muốn, nhưng chỉ thị trình biên dịch là bắt
buộc trong tất cả các tập lệnh.
study ("My Script")
Dòng 5 là một khai báo. Đây là nơi bạn chỉ định xem bạn có đang tạo một chỉ báo còn được gọi
là một nghiên cứu hay không.
Giải pháp thay thế là tạo ra một chiến lược, nhưng chúng tôi sẽ bắt đầu với nghiên cứu. 
Phần thứ hai của Dòng 5, trong dấu ngoặc kép, là tên mà chúng tôi sẽ gán cho nghiên cứu cụ thể
này. Mặc định là Tập lệnh của tôi.
plot (đóng)
Dòng 6 chứa lệnh plot. Như bạn có thể đã đoán, điều này yêu cầu TradingView vẽ một biến cụ
thể.
Trong trường hợp này, biến đóng sẽ được vẽ biểu đồ. Đây là một biến tích hợp có chứa giá
đóng cửa của thanh mới nhất.
Hãy nhấn Thêm vào biểu đồ ở phía trên bên phải của trình chỉnh sửa Pine.

Bạn sẽ được nhắc lưu tập lệnh.


Sau khi được lưu, biểu đồ của bạn sẽ có một cửa sổ mới chứa biểu đồ giá đóng cửa từ biểu đồ
chính của bạn.
Cửa sổ này được gọi là cửa sổ dữ liệu. Trong hình trên, đây là biểu đồ đường được vẽ bằng màu
xanh lam.
Lưu ý rằng cửa sổ dữ liệu hiển thị “Tập lệnh của tôi” ở góc trên bên trái. Điều này kéo bất cứ thứ
gì được nhập vào Dòng 5 của mã của chúng tôi, nơi chúng tôi đã khai báo tên cho nghiên cứu.
Và bạn đã có nó, nghiên cứu đầu tiên của chúng tôi và chúng tôi thậm chí không cần viết bất kỳ
mã nào!
Làm thế nào để lấy lại giá của Apple?
Trong ví dụ đầu tiên của chúng tôi, chúng tôi vẽ biểu đồ giá đóng cửa. Tập lệnh Pine sẽ tự động
làm điều đó cho bất kỳ biểu đồ nào bạn đã mở.
Trong trường hợp này, chúng tôi đã có biểu đồ hàng giờ về Bitcoin đang mở.
Nhưng nếu bạn muốn lấy dữ liệu cho một nội dung khác thì sao? Hãy xem qua một ví dụ mà
chúng tôi lấy giá của Apple ngay cả khi chúng tôi không mở biểu đồ của nó.
Mọi tập lệnh sẽ bắt đầu bằng một vài dòng trong đó chúng tôi đặt chỉ thị trình biên dịch. Chúng
tôi cũng cho biết đó là một nghiên cứu hoặc chiến lược mà chúng tôi đang tạo ra và chỉ định một
cái tên.
// @ version = 4
study ("giá của Apple")
Trong trường hợp này, chúng tôi đang tạo một nghiên cứu. Tên của nghiên cứu này là giá của
Apple.
Tiếp theo, chúng ta phải nói với Pine script rằng chúng ta quan tâm đến một nội dung khác với
những gì hiện đang hiển thị trên biểu đồ.
Để làm điều này, chúng ta có thể sử dụng hàm security ().
security ()
Một tính năng thú vị của Pine script là trợ giúp luôn có sẵn dễ dàng nếu bạn đang làm việc với cú
pháp mà bạn chưa từng làm việc trước đây.
Ví dụ: chúng ta có thể di chuột qua chức năng của mình và nó sẽ hiển thị một mô tả ngắn gọn.

Để biết thêm thông tin chi tiết, bạn có thể khởi chạy cửa sổ trợ giúp. Để thực hiện việc này, hãy
nhấn CTRL trong khi nhấp vào chức năng trên PC. Hoặc, trên máy Mac, nhấn CMD trong khi
nhấp vào chức năng.
Hàm trợ giúp làm rõ cú pháp và thậm chí có các ví dụ hữu ích.
security ("AAPL", "D", close)
Chúng tôi đã sử dụng cú pháp tương tự như ví dụ trong đoạn mã trên. Giá trị đầu tiên trong hàm
bảo mật là biểu tượng mã đánh dấu là AAPL. 
Sau đó, chúng tôi đặt khung thời gian thành hàng ngày. Và cuối cùng, chúng tôi đã nói với Pine
script rằng chúng tôi quan tâm đến giá đóng cửa.
Chúng ta có thể lưu giá trị trả về của hàm vào một biến.
apple_price = security ("AAPL", "D", close)
Bây giờ, biến apple_price sẽ chứa giá đóng hàng ngày mới nhất của cổ phiếu Apple.
Các nghiên cứu được tạo trong tập lệnh Pine cần phải có ít nhất một đầu ra, nếu không tập lệnh
này sẽ tạo ra lỗi trình biên dịch.
Hãy vẽ biểu đồ của biến của chúng ta để nó thỏa mãn quy tắc tập lệnh Pine về việc có một đầu
ra.
plot (apple_price)
Sau khi lưu và thêm vào biểu đồ, đây là màn hình của chúng ta trông như thế nào.

Bây giờ chúng ta có biểu đồ giá đóng cửa hàng ngày của Apple trong cửa sổ dữ liệu trong khi
cửa sổ chính hiển thị biểu đồ hình nến của Microsoft.
Mã đầy đủ:
// @ version = 4
study ("price of Apple")
// Nhận giá của Apple
apple_price = security ("AAPL", "D", close)

plot (apple_price)

Làm thế nào để lấy SMA (20) của Apple?


Bây giờ chúng ta có thể truy cập giá cổ phiếu của Apple, hãy xem qua một ví dụ về cách lấy
đường trung bình động đơn giản. 
Quy trình tương tự có thể được sử dụng để áp dụng bất kỳ chỉ số nào.
Chúng tôi sẽ bắt đầu với các khai báo cơ bản của chúng tôi và sử dụng chức năng bảo mật mà
chúng tôi đã tạo trong ví dụ cuối cùng của chúng tôi.
// @ version = 4
study ("Nhận 20 SMA của Apple")

// Nhận giá của Apple


apple_price = security ("AAPL", "D", close) // 1 ngày
Nếu bạn không muốn mua 20 SMA dành riêng cho AAPL, bạn có thể bỏ qua định nghĩa bảo mật
và chỉ sử dụngđược tích hợp sẵn đóng biến.
Điều này sẽ lấy giá đóng cửa cho bất kỳ bảo mật nào bạn đang hiển thị trong cửa sổ biểu đồ
chính của mình.
Có một chức năng trợ giúp cho chỉ báo SMA được tích hợp trong tập lệnh Pine. Để truy cập nó,
chúng ta chỉ cần sử dụng hàm sma ().
sma (apple_price, 20)
Tham số đầu tiên chúng ta cần truyền vào là giá trị. Trong trường hợp này, chúng tôi đang sử
dụng giá đóng cửa của Apple mà chúng tôi đã lưu trữ trongcủa apple_pricemình biến.
Tham số thứ hai là độ dài của SMA. Chúng tôi đang tìm kiếm một SMA 20 kỳ.
Cuối cùng, chúng tôi sẽ gán dữ liệu SMA cho một biến riêng biệt và sau đó vẽ biểu đồ của nó.
apple_sma = sma (apple_price, 20)

plot (apple_sma)
Đường trung bình động đơn giản của Apple hiện được vẽ trên cửa sổ dữ liệu của chúng ta.
Đường trung bình động thường được vẽ trên biểu đồ chính. Chúng tôi có thể đạt được điều đó
với một sửa đổi nhỏ trong mã của chúng tôi.
study ("Nhận 20 SMA của Apple", overlay = true)
Bằng cách thêm overlay = True vào khai báo nghiên cứu, chúng tôi có thể vẽ biểu đồ dữ
liệu của mình trực tiếp vào cửa sổ biểu đồ chính thay vì cửa sổ dữ liệu.
Mã đầy đủ:
// @ version = 4
study ("Nhận 20 SMA của Apple")

// Nhận giá của Apple


apple_price = security ("AAPL", "D", close) // 1 ngày

// Tính 20 SMA của Apple


apple_sma = sma (apple_price, 20)
plot (apple_sma)

Làm thế nào để kiểm tra lại một chiến lược chéo trung bình động với Pine Script?
Chúng tôi đã xem xét các chỉ số, hay còn được gọi là một nghiên cứu. Hãy cùng xem các chiến
lược trong Pine script.
Trong ví dụ tiếp theo, chúng tôi sẽ tạo chiến lược chéo qua đường trung bình động với một vài
tham số bổ sung. Sau đó, chúng tôi sẽ kiểm tra lại chiến lược trong TradingView.
// @ version = 4
strategy ("My Strategy", overlay = true)
Để tạo một chiến lược, chúng tôi hoán đổi phần khai báo nghiên cứu với phần khai báo chiến
lược.
// Tạo chỉ báo
shortSMA = sma (close, 10)
longSMA = sma (close, 30)
Điều đầu tiên chúng ta muốn làm là tạo hai đường trung bình động và gán dữ liệu cho các biến. 
rsi = rsi (đóng, 14)
Chúng tôi cũng sẽ tạo một chỉ báo RSI sẽ được sử dụng để xác nhận các mục nhập và thoát của
chúng tôi.
Chiến lược này sẽ được chạy trên biểu đồ chính nên chúng ta không cần sử dụng hàm security ()
ở đây.
Tiếp theo, chúng tôi muốn xác định các điều kiện giao nhau của chúng tôi. May mắn thay,
TradingView đã có một chức năng tích hợp cho điều đó, vì vậy chúng tôi không cần phải viết mã
theo cách thủ công.
// Chỉ định điều kiện chéo
longCondition = chéo (shortSMA, longSMA)
shortCondition = chéo (shortSMA, longSMA)
Chúng ta có hai điều kiện, điều kiện đầu tiên là khi SMA ngắn, 10 chu kỳ, vượt lên trên SMA 30
chu kỳ dài hơn.
Điều kiện thứ hai là ngược lại vì chúng tôi đã sử dụng chức năng crossunder trái ngược với chéo.
Cả hai điều kiện này đều được lưu vào các biến. Vì vậy, khi xảy ra sự giao nhau hoặc kết hợp
chéo, các biến này sẽ được cập nhật thành True, một giá trị Boolean.
Chúng ta có thể sử dụng câu lệnh if để kiểm tra xem điều kiện có được thay đổi thành True hay
không và sau đó thực hiện giao dịch dựa trên trường hợp đó.
if (longCondition)
    strategy.entry ("long", strategy.long, 100, when = rsi> 50)
Hàm strategy.entry tích hợp được sử dụng để nhập giao dịch. Đây là các tham số được
truyền vào hàm.

1. "Long" - đây là ID thương mại. Chúng tôi sẽ không sử dụng nó trong ví dụ này. Tuy
nhiên, nếu bạn định đóng hoặc hủy giao dịch, nó có thể được thực hiện với ID này.
2. chiến lược.long - đây là một biến được tích hợp sẵn cho Pine script biết rằng chúng ta
muốn sử dụng lâu dài.
3. 100 - số lượng cổ phiếu chúng tôi muốn giao dịch
4. khi = rsi> 50 - đây là một tham số bổ sung cho biết tập lệnh thông chỉ thực hiện giao dịch
nếu RSI cao hơn 50.

Cú pháp cho các mục nhập ngắn của chúng tôi sẽ theo một định dạng rất giống nhau .
if (shortCondition)
    strategy.entry ("short", strategy.short, 100, when = rsi <50)
Vì chúng tôi đang chạy một chiến lược, chúng tôi không phải vẽ bất cứ thứ gì hoặc chỉ định đầu
ra. 
Nhưng dù sao thì chúng tôi cũng sẽ làm như vậy. Sẽ rất tốt nếu bạn nhìn thấy đường SMA trên
biểu đồ để chúng tôi có thể xác nhận rằng các giao dịch đã diễn ra khi chúng đáng lẽ phải có.
// Vẽ biểu đồ của Đường trung bình di chuyển thành biểu đồ
(shortSMA)
(longSMA, color = color.black)
Nếu chúng ta lưu và thêm vào biểu đồ, chiến lược sẽ chạy và tự động mở cửa sổ Trình kiểm tra
chiến lược sẽ hiển thị một số thống kê quan trọng.
Đây là màn hình của chúng ta trông như thế nào.
Theo mặc định, một tab mới sẽ mở ra hiển thị số liệu thống kê tổng quan cho chiến lược. Bạn có
thể nhấp qua Tóm tắt Hiệu suất hoặc Danh sách Giao dịch để xem các thống kê khác.
Chiến lược sẽ chạy trên khung thời gian được hiển thị trên biểu đồ của bạn. 
Bạn có thể dễ dàng chuyển qua các khung thời gian khác nhau bằng cách sử dụng các tùy chọn
khung thời gian trong menu ở đầu màn hình. Chiến lược sẽ tự động cập nhật dựa trên khung thời
gian mới đã chọn.
Mã đầy đủ:
// @ version = 4
strategy ("My Strategy", overlay = true)
// Tạo chỉ báo
shortSMA = sma (close, 10)
longSMA = sma (close, 30)
rsi = rsi (close, 14)

// Chỉ định điều kiện chéo


longCondition = chéo (shortSMA, longSMA)
shortCondition = chéo (shortSMA, longSMA)

// Thực hiện giao dịch nếu điều kiện là Đúngđiều kiện


nếu (dài)lược.entrylược.long
    chiến("dài", chiến, 100, khi = rsi> 50 )

if (shortCondition)
    strategy.entry ("short", strategy.short, 100, when = rsi <50)

// Vẽ đường trung bình động của biểu đồ thành biểu đồ


(shortSMA)
âm mưu (longSMA, color = color.black)

Làm thế nào để đặt chốt lời và dừng lỗ?


Trong ví dụ cuối cùng của chúng tôi, việc thực hiện giao dịch được xác định bởi các điểm giao
nhau và điểm chéo của đường trung bình.
Chúng tôi sẽ xây dựng trên kịch bản này và đặt các lệnh dừng lỗ và chốt lời cụ thể. Chúng ta có
thể sử dụng Phạm vi Đúng Trung bình (ATR) để tính toán các mức cho những giá trị này.
Chỉ báo ATR tính toán chuyển động trung bình trên số thanh được chỉ định cuối cùng. Đây là
một cách tốt để tính đến những thay đổi trong biến động.
Chúng tôi đã khai báo một số chỉ báo, chúng tôi sẽ thêm chỉ báo ATR vào danh sách.
// Tạo chỉ báo
shortSMA = sma (đóng, 10)
longSMA = sma (đóng, 30)
rsi = rsi (đóng, 14)
atr = atr (14)
Theo các điều kiện giao dịch của mình, chúng tôi có thể thực hiện các tính toán cần thiết cho
lệnh dừng lỗ và chốt lời.
if (longCondition)
    stopLoss = low - atr * 2
    takeProfit = high + atr * 2Strategy.long
    strategy.entry ("long",, 100, when = rsi> 50)
    strategy.exit ("exit", "long", stop = stopLoss, limit =
takeProfit)
Trong đoạn mã trên, chúng tôi tính toán mức dừng lỗ bằng cách lấy mức thấp nhất của thanh tại
thời điểm nhập và trừ phạm vi thực trung bình nhân với hai.
Vì vậy, nếu cổ phiếu di chuyển trung bình 5 đô la trên mỗi thanh, chúng tôi đang đặt mức chốt
lời của mình dưới mức thấp 10 đô la.
Một phép tính tương tự cũng được thực hiện cho việc chốt lời.
Cuối cùng, chúng tôi chỉ định điều kiện thoát bằng cách sử dụng hàm strategy.exit (). Đây là các
thông số đã được chuyển qua.

1. "Exit" - đây là mã giao dịch để thoát ra khỏi giao dịch.


2. 'long' - đây là ID mà chúng tôi đã đặt trước đây khi tham gia giao dịch. Điều này sẽ cho
Pine script biết vị trí mà chúng tôi đang cố gắng thoát ra.
3. stop = stopLoss - chúng tôi đang chỉ định rằng mức chứa trong biến stopLoss nên được
sử dụng làm lệnh dừng để thoát khỏi giao dịch.
4. limit = takeProfit = chúng tôi đang chỉ định rằng mức có trong biến takeProfit nên được
sử dụng một lệnh giới hạn để thoát khỏi giao dịch.

Cú pháp cho điều kiện ngắn của chúng tôi là tương tự mặc dù một số tính toán hơi khác một
chút.
if (shortCondition)
    stopLoss = high + atr * 2
    takeProfit = low - atr * 2
    strategy.entry ("short", strategy.short, 100, when = rsi <50)
    strategy.exit ("exit", "short", stop = stopLoss, limit =
takeProfit)
Phần còn lại của script vẫn không thay đổi so với ví dụ trước. Hãy chạy nó và xem chiến lược
của chúng tôi đã làm như thế nào.
Các lối ra của chúng tôi đang hoạt động và được vẽ trên biểu đồ chính của chúng tôi cùng với
các mục dài và ngắn.
Mã đầy đủ:
// @ version = 4
chiến lược ("Chốt lời & dừng lỗ", overlay = true)

// Tạo chỉ báo


shortSMA = sma (đóng, 10)
longSMA = sma (đóng, 30)
rsi = rsi (đóng, 14 )
atr = atr (14)

// Chỉ định điều kiện chéo


longCondition = chéo (shortSMA, longSMA)
shortCondition = chéo (shortSMA, longSMA)

// Thực hiện giao dịch nếu điều kiện là Đúng


nếu (longCondition)
    stopLoss = low - atr * 2
    takeProfit = high + atr * 2
    strategy.entry ("long",100, when = rsi> 50)
    Strategy.long,strategy.exit ("exit", "long", stop = stopLoss,
limit = takeProfit)

if (shortCondition)
    stopLoss = high + atr * 2
    takeProfit = low - atr * 2Strategy.short
    strategy.entry ("short",, 100, when = rsi <50)
    strategy.exit ("exit", "short", stop = stopLoss, limit =
takeProfit)

// Vẽ đường trung bình động của đồbiểu đồ


thị(shortSMA)
(longSMA, color = color.black)

Làm thế nào để kích hoạt giao dịch với Apple khi Google tăng 5%?
Chúng tôi thấy rằng chức năng bảo mật có thể được sử dụng để hiển thị dữ liệu cho các cổ phiếu
không được hiển thị trên màn hình. 
Chúng tôi sẽ sử dụng nó để tạo ra một chiến lược sẽ thực hiện giao dịch với Apple nếu Google di
chuyển nhiều hơn 5%.
Đây là một chiến lược đảo ngược có ý nghĩa, vì vậy nếu Google tăng hơn 5%, chúng tôi sẽ bán
Apple. Nếu Google giảm hơn 5% thì chúng tôi có thể mua Apple.
Điều đầu tiên chúng tôi sẽ làm là lưu trữ giá mở cửa và đóng cửa hàng ngày của Google vào một
biến số.
// @ version = 4
chiến lược ("Giao dịch theo cặp: Apple & Google")

google_close = security ("GOOG", "D", close)


google_open = security ("GOOG", "D", open)
Sau đó, chúng tôi có thể thực hiện tính toán để xác định phần trăm thay đổi giá.
price_change = google_close / google_open
 price_change Biếnhiện nắm giữ tính toán. Vì vậy, ví dụ: nếu Google mở cửa ở mức 100 đô
la và tăng 5% để đóng cửa ở mức 105 đô la, thì price_change biếnsẽ là 105/100, là 1,05.
Nhưng nếu Google mở cửa ở mức 100 đô la và giảm 5% để đóng cửa ở mức 95 đô la, thì biến số
sẽ đọc 95/100, tức là 0,95.
Vì vậy, chúng tôi biết rằng nếu Google từ chối 5% trở lên, price_change biếnsẽ là 0,95 trở
xuống và chúng tôi muốn kéo dài thời gian. Đây là cú pháp để làm điều đó.
if price_change <0.95
    strategy.entry ("long", strategy.long, 100)
Và cú pháp rút gọn nếu Google tăng hơn 5%.
if price_change> 1,05Strategy.short
    strategy.entry ("short",, 100)
Bạn có thể nhận thấy rằng chúng tôi đã không đề cập đến giá cổ phiếu của Apple trong mã. Tất
cả những gì chúng ta cần làm là mở một biểu đồ AAPL và nó sẽ tự động biết để thực hiện các
giao dịch trong Apple.
Cuối cùng, chúng tôi sẽ vẽ biểu đồprice_change biếntrong cửa sổ dữ liệu. Nó không cần
thiết, nhưng thật tuyệt khi thấy và chúng tôi có thể xác nhận rằng các giao dịch đang được thực
hiện đúng như mong muốn.
plot (price_change)
Và đây là kết quả của chiến lược của chúng tôi.
Chỉ có bốn giao dịch như biến động 5% là rất hiếm. Chúng ta có thể cần phải xem nhiều giao
dịch hơn thế để xác định xem đó có phải là một chiến lược tốt hay không.
Có vẻ như nó đã làm rất tốt khi chọn ra mức thấp như vậy trong tháng 3!
Mã đầy đủ:
// @ version = 4
chiến lược ("Giao dịch theo cặp: Apple & Google")

google_close = security ("GOOG", "D", close)


google_open = security ("GOOG", "D", open)
price_change = google_close /

google_open nếu price_change <0,95


    strategy.entry ("long", chiến, 100)

lược.longnếu price_change> 1,05lược.entry


    chiến("ngắn", chiến, 100)

lược.shortâm mưu (price_change)

Làm thế nào để sửa đổi các tập lệnh của chúng tôi mà không cần mã hóa?
Một tính năng thú vị về Pine script là chúng ta có thể tạo các đầu vào tùy chỉnh để dễ dàng thay
đổi các thông số của chiến lược và chỉ số của chúng ta.

Hãy xem chỉ báo ATR tiêu chuẩn được cung cấp trong Tradingivew. Lưu ý rằng việc sửa đổi độ
dài và thậm chí cả màu sắc dễ dàng như thế nào thông qua tab Kiểu.
Chúng ta có thể đạt được điều tương tự đối với các nghiên cứu và chiến lược được tạo trong Pine
script bằng cách sử dụng hàm input ().
Đây là một ví dụ về hàm đầu vào sẽ cho phép người dùng tùy chỉnh phần trăm thay đổi từ ví dụ
chiến lược cuối cùng.
longTrigger = input (title = "% thay đổi cho các mục ngắn", type
= input.float, defval = 5)

shortTrigger = input (title = "% thay đổi cho các mục dài", type
= input.float, defval = 5)
chúng ta hãy đi thông qua các tham số được truyền qua hàm input ().

1. title - đây là nơi chúng tôi chỉ định văn bản mà người dùng nhìn thấy khi cố gắng thay đổi
giá trị của thông số cụ thể đó.
2. loại - chúng tôi phải cho TradingView biết loại giá trị nào cần chấp nhận. Vì người dùng
có thể nhập một số chẳng hạn như 4.2, chúng tôi đã sử dụng float.
3. defval - đây là giá trị mặc định. 

Nếu bạn không chắc chắn những giá trị nào sẽ sử dụng cho loại, bạn luôn có thể sử dụng chức
năng tự động hoàn thành để xem những gì có sẵn. 
Chỉ cần nhập một phần của cú pháp và sau đó nhấn CTRL + phím cách trên PC hoặc CMD +
phím cách trên máy Mac.

Bây giờ chúng tôi có thể nhận được các giá trị từ người dùng. Nhưng họ sẽ nhập một giá trị
chẳng hạn như 5 (%). Chúng ta cần chuyển giá trị này thành 1,05 cho các câu lệnh if của chúng
ta.
longTrigger: = 1 - longTrigger / 100
shortTrigger: = 1 + shortTrigger / 100
Và chúng ta cần thay đổi các câu lệnh if để xem các biến mới được tạo của chúng ta dựa trên đầu
vào của người dùng thay vì các giá trị được mã hóa cứng trước đó.
if price_change <longTrigger
    strategy.entry ("long",, 100)

Strategy.longif price_change> shortTrigger


Strategy.entryStrategy.short
    ("short",, 100)
Để truy cập các tùy chọn đầu vào, hãy nhấp vào biểu tượng bánh răng bên cạnh tên chiến lược
của bạn trong cửa sổ dữ liệu.

Giá trị tùy chỉnh hiện có thể được đặt cho phần trăm thay đổi được sử dụng trong chiến lược.
Ngoài ra còn có một cửa sổ Thuộc tính cho phép bạn đặt các tùy chọn tùy chỉnh cho các phần
khác của chiến lược.
Và một cửa sổ Kiểu để tùy chỉnh các tùy chọn vẽ đồ thị.
Mã đầy đủ:
// @ version = 4
chiến lược ("Giao dịch theo cặp: Đầu vào")

longTrigger = input (title = "% Thay đổi cho các mục nhập ngắn",
type = input.float, defval = 5)
shortTrigger = input (title = "% Thay đổi cho các mục nhập dài ",
type = input.float, defval = 5)

longTrigger: = 1 - longTrigger / 100


shortTrigger: = 1 + shortTrigger / 100

google_close = security (" GOOG "," D ", close)


google_open = security ( "GOOG", "D", open)

price_change = google_close /

google_open if price_change <longTrigger


    strategy.entry ("long", strategy.long, 100)
if price_change> shortTriggerStrategy.short
    strategy.entry ("short",, 100 )

lô đất (price_change)

Làm thế nào để lập mưu với tập lệnh Pine?


Cho đến nay, chúng tôi đã sử dụng hàm plot () tiêu chuẩn để vẽ một số thứ nhất định lên màn
hình. Tập lệnh thông có một số lệnh khác mà chúng ta có thể sử dụng cho đầu ra của mình và
chúng ta sẽ xem qua một vài lệnh trong số đó.
Lập kế hoạch giờ thị trường ngoại hối
Biết khi nào thị trường mở và đóng cửa là điều cần lưu tâm. Điều này có thể khá khó khăn để tìm
ra đối với các nhà giao dịch ngoại hối.
Forex giao dịch 24 giờ một ngày và 5 ngày một tuần. Các thị trường khác nhau trên thế giới mở
và đóng cửa trong ngày tác động đến sự biến động của tiền tệ. 
Hãy lập trình một nghiên cứu sẽ cho chúng ta biết qua biểu đồ khi nào thị trường dự kiến sẽ bận
rộn nhất.
Hầu hết các nhà giao dịch ngoại hối đang chú ý đến phiên London và New York. Chúng tôi sẽ
bắt đầu bằng cách xác định thời gian cho các phiên này.
// @ version = 4
study ("Forex Sessions", overlay = true)

London = time (timeframe.period, "0700-1500")


NY = time (timeframe.period, "1200-2000")
Chúng tôi đã sử dụng ở đây hàm time () để tạo khoảng thời gian. Trong các thông số, chúng tôi
đang sử dụng 0700 UTC cho thời gian bắt đầu của phiên London và 1500 UTC cho thời gian kết
thúc.
Biến London bây giờ sẽ chứa thời gian thanh nếu thanh nằm trong khoảng thời gian đó. Nếu
không, nó sẽ hiển thị NaN (không phải giá trị).
Chúng ta có thể sử dụng câu lệnh if để xem để kiểm tra đầu ra của London biến.
val = if (na (London))
    1
else
    0
Trong đoạn mã trên, chúng ta đang sử dụng một hàm tích hợp có tên na (). Điều này làm là kiểm
tra xem biến có giá trị NaN hay không.
nếu Londonbiếntrả về Nan, điều đó có nghĩa là thanh này nằm ngoài giờ giao dịch của London.
Trong trường hợp này, một biến có tên là val sẽ được gán là số nguyên 1. Nếu không,
valbiếnsẽ được đặt bằng 0.
Cuối cùng, chúng ta vẽ biểu đồ củamới được tạo valbiến.
plot (val)
Đây là biểu đồ của chúng tôi trông như thế nào sau khi lưu và thêm nghiên cứu này vào biểu đồ.
Điều đó trông không quá tốt. Nó được hiển thị chính xác khi thị trường London mở cửa, nhưng
việc vẽ các giá trị đó đã khiến các giá trị nến của chúng tôi trở nên khó đọc.
Chúng ta có thể vẽ biểu đồ trong cửa sổ dữ liệu để các nến dễ nhìn hơn, nhưng vẫn không dễ
dàng để hình dung thị trường mở và đóng.
Ngoài ra, mã trông không quá đẹp.
Hãy bắt đầu bằng cách sử dụng câu lệnh if một dòng để làm sạch mã của chúng ta một chút. 
na (Luân Đôn)? 1: 0
Đoạn mã này thực hiện chức năng tương tự như câu lệnh if trước đó. Chúng ta không cần sử
dụng valbiếntrong trường hợp này. Hãy chia nhỏ cú pháp.
na (London)
Phần này đang kiểm tra xem Londonbiếncó chứa giá trị NaN hay không.
? 1: 0
Dấu chấm hỏi ở đây là dạng rút gọn cho câu lệnh if / else.
Phần sau dấu hỏi là phần quan trọng. Ở đây có hai số được phân tách bằng dấu hai chấm. Số
trước dấu hai chấm, 1 trong trường hợp này, là số sẽ được trả về trong trường hợp câu lệnh if là
đúng.
Số sau dấu hai chấm, 0 trong trường hợp này, được trả về khi câu lệnh if trả về false.
Sau đó, chúng ta có thể lấy toàn bộ cú pháp và gói nó trong một hàm âm mưu, tiết kiệm công sức
lưu trữ nó vào một biến trước tiên.
plot (na (London)? 1: 0)
Vì vậy, bây giờ chúng tôi đã làm sạch câu lệnh if thành một đoạn mã một dòng.
Để làm cho biểu đồ dễ đọc hơn, chúng ta có thể vẽ một màu nền khác nếu thị trường London mở
cửa.
Để làm điều này, chúng ta hoán đổi hàm plot () với hàm bgcolor (). Điều này cho phép chúng tôi
thay đổi màu nền.
bgcolor (na (London)? 1: 0)
Ngoài ra, chúng tôi sẽ chỉ định màu cho thời điểm thị trường mở cửa.
bgcolor (na (London)? na: color.blue)
Biểu đồ của chúng tôi đang bắt đầu đẹp hơn rất nhiều!
Điều cuối cùng chúng tôi sẽ làm là thêm mã để xem liệu thị trường New York có mở cửa hay
không và đặt nền thành màu xanh lục nếu có.
bgcolor (na (NY)? na: color.green)
Bạn sẽ nhận thấy rằng có ba màu trên biểu đồ bên dưới. 
Đó là bởi vì có sự trùng lặp giữa phiên London và New York, đây thường là thời điểm dễ biến
động nhất trong ngày.
Giờ đây, chúng ta có thể dễ dàng xem các phiên và nhanh chóng chọn ra những thứ như mức cao
nhất trong giao dịch châu Âu hoặc mức thấp được in trong thời gian chồng chéo.
Mã đầy đủ:
// @ version = 4
study ("Forex Sessions", overlay = true)

Tokyo = time (timeframe.period, "0000-0800")


London = time (timeframe.period, "0700-1500")
NY = time (timeframe.period, "1200-2000")

bgcolor (na (Tokyo)? na: color.fuchsia)


bgcolor (na (London)? na: color.blue)
bgcolor (na (NY)? na: color.green )

Vẽ chú thích
Có một số tùy chọn để in chú thích. Ví dụ, bạn có thể sử dụng hàm hline () để vẽ một mức ngang
trên biểu đồ.
Có một hàm plotchar () cho phép bạn vẽ các ký tự ASCII trên biểu đồ của mình. Điều này
thường được sử dụng để vẽ một ghi chú ở trên cùng hoặc ở dưới cùng của thanh giá.
Một hàm vẽ biểu đồ phổ biến khác là plothape () cho phép bạn vẽ các hình dạng khác nhau. Cách
này khá phổ biến vì rất nhiều người sử dụng nó để vẽ các mũi tên trên đầu hoặc cuối thanh để
hiển thị tín hiệu mua hoặc bán.
Để có danh sách đầy đủ các chú thích khác nhau có sẵn, hãy xem tổng quan về Chú thích trong
hướng dẫn sử dụng Pine script.
Làm cách nào để tạo chỉ báo tùy chỉnh trong tập lệnh Pine?
Chúng tôi sẽ tạo một chỉ báo đa khung thời gian.
Điều này dựa trên chiến lược mở rộng quy mô mà tôi đã sử dụng khi mới bắt đầu giao dịch. Đó
là một chiến lược đảo chiều có nghĩa là hoạt động tốt trong đầu phiên giao dịch Châu Á trên thị
trường ngoại hối khi mọi thứ nói chung là yên tĩnh.
Chiến lược sử dụng Dải Bollinger trên biểu đồ 5 phút và RSI trên biểu đồ 1 phút.
Ý tưởng là tìm kiếm sự phân kỳ rsi trên biểu đồ 1 phút khi giá đạt đến dải Bollinger trên hoặc
dưới trên biểu đồ 5 phút.
Mục tiêu tiềm năng là đường giữa của dải Bollinger 5 phút hoặc đường dưới của dải Bollinger 1
phút.
Hình ảnh trên là một ví dụ về chiến lược. Chỉ báo phiên Forex mà chúng tôi đã sử dụng trong ví
dụ trước được sử dụng ở đây để hiển thị khi phiên giao dịch Châu Á mở cửa.
Chiến lược này hoạt động tốt nhất trong nửa đầu của phiên giao dịch, sau đó rủi ro về sự đột phá
hoặc di chuyển theo hướng có xu hướng tăng lên.
Khi tôi giao dịch chiến lược này, tôi phải mở hai biểu đồ, biểu đồ 1 phút và biểu đồ 5 phút.
Nhưng ví dụ trên cho thấy các dải Bollinger 5 phút được vẽ trực tiếp trên biểu đồ 1 phút. Chúng
tôi sẽ tạo chỉ báo này trong tập lệnh Pine.
// @ version = 4
study (title = "TF BBands cao hơn", shorttitle = "TF BBands",
overlay = true)
Chúng tôi bắt đầu bằng cách khai báo tên cho tập lệnh và cho biết đó là một nghiên cứu. Một tiêu
đề ngắn hơn cũng có thể được thêm vào, đây là tên sẽ được hiển thị trên bảng xếp hạng.

Tiếp theo, chúng tôi đặt một số đầu vào của người dùng. Chúng tôi có thể sao chép hầu hết các
đầu vào từ chỉ báo dải Bollinger thông thường (như thể hiện trong hình trên) cho chỉ báo tùy
chỉnh của chúng tôi.
// Lấy đầu vào của người dùng
tf = input (title = "BBands Timeframe", type = input.resolution,
defval = "5")
len = input (title = "Length", type = input.integer, defval = 20)
stddev = input (title = 'StdDev', type = input.integer, defval =
2)
 Chúng ta có thể tạo chỉ báo dải Bollinger từ một chức năng trợ giúp được tích hợp sẵn. 
[middle, upper, Lower] = bb (close, len, stddev)
Có ba giá trị được trả về từ hàm này. Dải dưới, dải giữa và dải trên. Chúng được lưu riêng lẻ vào
các biến.
Các giá trị phải được tính toán trên một khung thời gian khác. Chúng ta có thể sử dụng hàm
security () để trỏ đến khung thời gian do người dùng chọn. 
Điều này được lưu trữ trong biến tf được tạo bởi đầu vào của người dùng trước đó.
hbbandsMid = security (syminfo.tickerid, tf, middle,
barmerge.gaps_on, barmerge.lookahead_off)
hbbandsUpper = security (syminfo.tickerid, tf, upper,
barmerge.gaps_on, barmerge.lookahead_off)
hbbandsLower = security (syminfof ,tickerid low,
barmerge.gaps_on, barmerge.lookahead_off)
Biểu tượng mã chứng khoán vẫn giữ nguyên, vì vậy chúng tôi đã sử dụngbiểu tượng
syminfo.tickerid ,này sẽ trả về bất kỳ mã nào đang được hiển thị trên biểu đồ chính.
Và điều đó làm được, tất cả những gì còn lại là vẽ chỉ báo mới.
plot (hbbandsMid)
plot (hbbandsUpper)
plot (hbbandsLower)
Bây giờ chúng ta có thể thấy các dải Bollinger từ biểu đồ 5 phút được hiển thị trên biểu đồ 1
phút.
Các đầu vào cho phép dễ dàng tùy chỉnh các thông số dải Bollinger và cho phép chỉ báo này hoạt
động với bất kỳ tổ hợp khung thời gian nào.
Mã đầy đủ:
// @ version = 4
study (title = "TF BBands cao hơn", shorttitle = "TF BBands",
overlay = true)

// Lấy đầu vào của người dùng


tf = input (title = "Khung thời gian BBands", type = input.
Resolution, defval = "60")
len = input (title = "Length", type = input.integer, defval = 20)
stddev = input (title = 'StdDev', type = input.integer, defval =
2)

[middle , upper, Lower] = bb (close, len, stddev)

hbbandsMid = security (syminfo.tickerid, tf, middle,


barmerge.gaps_on, barmerge.lookahead_off)
hbbandsUpper = security (syminfo.tickerid, tf, upper,
barmerge.gaps_on, barmerge.lookahead_off)
hbbandsLower = security (syminfo.tickerid, tf, Lower,
barmerge.gaps_on, barmerge.lookahead_off)

plot (hbbandsMid)
plot (hbbandsUpper)
plot (hbbandsLower)

Lời kết
Nếu bạn đã theo dõi cùng với các ví dụ, bạn sẽ có một ý tưởng tốt về những gì Pine script có thể
thực hiện.
Nhìn chung, có rất nhiều điều bạn có thể làm với Pine script, mặc dù nó có những hạn chế nhất
định. Bạn có thể lập ra một chiến lược thực sự nhanh chóng khi bạn hiểu rõ mọi thứ.
Từ đó, luôn có một tùy chọn để sử dụng logic đó và lập trình nó sang một ngôn ngữ khác nếu
bạn muốn xây dựng dựa trên nó và tận dụng các thư viện của bên thứ ba.
Các chức năng vẽ biểu đồ rất tuyệt vời và khả năng tạo các chỉ báo tùy chỉnh thực sự hữu ích cho
cả người giao dịch thủ công và hệ thống tự động.
Các số liệu thống kê toàn diện được cung cấp cho các chiến lược cũng là một điểm cộng lớn cho
Pine script.
TradingView có một số tài nguyên nếu bạn muốn nâng cao kỹ năng viết mã Pine script của mình
thêm một bước nữa.

Một số chức năng trợ giúp đã được thảo luận trong bài viết này. Ngoài ra, cũng có một tùy chọn
trợ giúp từ bên trong trình chỉnh sửa Pine.
Dưới đây là một số tài nguyên khác - 

1. Hướng dẫn bắt đầu nhanh - Đây là ví dụ về một nghiên cứu và chia nhỏ tập lệnh xuống
từng dòng.
2. Hướng dẫn sử dụng Pine Script v4Hướng dẫn -chi tiết cho Pine script.
3. Blog TradingView - Thông báo về các tính năng mới thường chứa mã mẫu
4. Thư viện tập lệnh TradingViewThư viện -nghiên cứu và chiến lược tập lệnh mã nguồn
mở Pine.

Tùy chọn cuối cùng trong danh sách là một nguồn tuyệt vời vì thường một nhà giao dịch khác có
thể đã viết mã cho nghiên cứu hoặc chiến lược mà bạn đang theo đuổi.
Nó cũng là một nguồn tốt để rút ra các ý tưởng từ đó xây dựng các chỉ số hoặc chiến lược của
riêng bạn.
Nếu bạn muốn thử một số ví dụ, bạn có thể tải xuống tất cả mã bằng một cú nhấp chuột trên
GitHub. Chỉ cần nhấp vào nút màu xanh lá cây và chọn tải xuống zip. Mã sẽ nằm trong tệp văn
bản có thể được sao chép sang trình chỉnh sửa Pine của Tradingview.

You might also like