Bắt đầu
Thiết lập PineBag một lần, sau đó chuẩn bị bài kiểm tra đầu tiên của bạn sau vài phút.
Bạn cần ba thứ
- Google Chrome 116 hoặc mới hơn.
- Tài khoản TradingView đã đăng nhập có quyền truy cập vào các mã giao dịch mà bạn muốn kiểm tra.
- Tệp Pine Script khai báo
strategy(), không chỉindicator().
Cài đặt và mở PineBag
-
Cài đặt tiện ích mở rộng.
Sử dụng nút cài đặt PineBag. Ghim tiện ích mở rộng nếu bạn muốn truy cập nhanh. -
Mở biểu đồ TradingView.
Đăng nhập trước, sau đó mở bất kỳ thị trường và khung thời gian được hỗ trợ nào. -
Tải lại tab biểu đồ.
Thực hiện việc này sau khi cài đặt hoặc cập nhật PineBag để biểu đồ có thể kết nối. -
Mở PineBag.
Chọn biểu tượng PineBag. Chỉ báo kết nối chuyển sang màu xanh khi biểu đồ sẵn sàng.
Bảng điều khiển bên cạnh, điều khiển bằng điều khiển
Các con số trên giao diện thực khớp với phần giải thích. Không có gì trong hình ảnh này là một mô hình.
1
2
3
4
5
6
7
8
9
10
11
- 1Chiến lược
Chiến lược đã tải. Nhấp vào thẻ để mở trong trình soạn thảo; biểu tượng thùng rác ở tiêu đề mục sẽ xóa nó.
- 2Tóm tắt cuộc chạy
Khung thời gian, vốn, quy mô đặt hàng và hoa hồng sẽ được sử dụng.
- 3Tìm kiếm
Mở tìm kiếm biểu tượng TradingView để bạn có thể thêm mã cổ phiếu đủ điều kiện trao đổi.
- 4Sao chép túi
Sao chép từng mã, một
EXCHANGE:SYMBOLtrên mỗi dòng. - 5Dán túi
Chấp nhận dòng, dấu phẩy, dấu chấm phẩy hoặc dấu cách và bỏ qua các bản sao.
- 6Xóa
Yêu cầu nhấp lần thứ hai, sao chép các mã rồi xóa danh sách; «Dán mã» sẽ khôi phục lại.
- 7Thẻ mã cổ phiếu
Hiển thị túi hiện tại. Sử dụng × để xóa một ký hiệu; cộng lên 500.
- 8Chạy backtest
Xác thực thiết lập và bắt đầu chạy danh mục đầu tư tuần tự.
- 9Báo cáo
Lưu cục bộ 50 báo cáo mới nhất và xuất JSON hoặc CSV.
- 10Số ngày còn lại
Active days: 05— Số ngày còn lại. - 11Hỗ trợ
Hỗ trợ có sẵn cho các yêu cầu kỹ thuật, thanh toán, cấp phép và quyền riêng tư.
Tải chiến lược
- Chọn nguồn.
Thả một.pinevào Chiến lược hoặc mở Trình chỉnh sửa và dán mã. - Sửa mọi thông báo xác thực.
Tập lệnh phải chứastrategy(). PineBag hiển thị lỗi rõ ràng nếu không thể sử dụng được. - Kiểm tra tóm tắt.
Xác nhận tên tập lệnh, khung thời gian, vốn và kích thước lệnh hiển thị ở trên Chạy.
indicator(), hãy chuyển đổi nó thành chiến lược trước khi chạy PineBag.Mẫu chiến lược
Mỗi trường trong tab Properties của TradingView tương ứng với một đối số của strategy(). Hãy giữ các giá trị dưới dạng hằng số có tên ở đầu tập lệnh: với ưu tiên tập lệnh, mọi mã đều được kiểm thử với cùng giả định.
TIMEFRAMEKhung thời gian
INITIAL_CAPITAL · CURRENCYVốn ban đầu
ORDER_SIZE · ORDER_SIZE_TYPEKích thước lệnh mặc định
PYRAMIDINGNhồi lệnh
BAR_MAGNIFIERChi tiết thanh nến
CALC_EVERY_TICK · CALC_ON_FILLSThực thi tập lệnh
COMMISSION · COMMISSION_TYPEHoa hồng
MARGIN_LONG · MARGIN_SHORTĐòn bẩy long và short
SLIPPAGETrượt giá
LIMIT_FILL_TICKSKhớp lệnh giới hạn
FILL_ON_BAR_CLOSEĐộ trễ khớp lệnh
runtime.error()Dừng tập lệnh trên mọi khung thời gian khác.
//@version=6
// ============================================================================
// Trend breakout · ATR risk — PineBag strategy template
// ============================================================================
// ----------------------------------------------------------------------------
// STRATEGY PROPERTIES (TradingView: Settings → Properties)
// ----------------------------------------------------------------------------
// TIMEFRAME takes a standard TradingView interval. Paste one of these, by the
// lowest TradingView plan that has it (tradingview.com/pricing, Charts):
// Basic days "1D" "1W" "1M" "3M" "6M" "12M"
// Essential minutes "1" "3" "5" "15" "30" "45"
// hours "60" "120" "180" "240"
// ranges "1R" "10R" "100R" "1000R"
// Premium seconds "1S" "5S" "10S" "15S" "30S" "45S"
// Ultimate ticks "1T" "10T" "100T" "1000T"
// Other intervals are custom and not used: a week is "1W", not "7D".
const string TIMEFRAME = "1D" // Chart timeframe
const float INITIAL_CAPITAL = 100000 // Initial capital
const string CURRENCY = currency.USD // Initial capital currency
const float ORDER_SIZE = 100 // Default order size
const string ORDER_SIZE_TYPE = strategy.percent_of_equity // Order size: % of equity
const int PYRAMIDING = 1 // Pyramiding
const bool BAR_MAGNIFIER = false // Bar detalization: Default (4 ticks per bar)
const bool CALC_EVERY_TICK = false // Script execution: On bar close
const bool CALC_ON_FILLS = false // Script execution: no recalculation after fills
const float COMMISSION = 0 // Commission
const string COMMISSION_TYPE = strategy.commission.percent // Commission: Percent
const float MARGIN_LONG = 100 // Long leverage 1x (leverage = 100 / margin)
const float MARGIN_SHORT = 100 // Short leverage 1x
const int SLIPPAGE = 0 // Slippage, ticks
const int LIMIT_FILL_TICKS = 0 // Limit order execution: Requested price
const bool FILL_ON_BAR_CLOSE = false // Order execution delay: One tick
strategy("Trend breakout · ATR risk", overlay = true,
initial_capital = INITIAL_CAPITAL,
currency = CURRENCY,
default_qty_type = ORDER_SIZE_TYPE,
default_qty_value = ORDER_SIZE,
pyramiding = PYRAMIDING,
use_bar_magnifier = BAR_MAGNIFIER,
calc_on_every_tick = CALC_EVERY_TICK,
calc_on_order_fills = CALC_ON_FILLS,
commission_type = COMMISSION_TYPE,
commission_value = COMMISSION,
margin_long = MARGIN_LONG,
margin_short = MARGIN_SHORT,
slippage = SLIPPAGE,
backtest_fill_limits_assumption = LIMIT_FILL_TICKS,
process_orders_on_close = FILL_ON_BAR_CLOSE)
// Stops with a clear message on any other timeframe; PineBag reads TIMEFRAME
// and selects it for the run.
if timeframe.period != TIMEFRAME
runtime.error("Switch the chart to the " + TIMEFRAME + " timeframe.")
// ----------------------------------------------------------------------------
// INPUT SETTINGS (TradingView: Settings → Inputs)
// ----------------------------------------------------------------------------
fastLength = input.int(20, "Fast EMA", minval = 1)
slowLength = input.int(50, "Slow EMA", minval = 2)
breakoutLength = input.int(20, "Breakout lookback", minval = 2)
atrLength = input.int(14, "ATR length", minval = 1)
atrStop = input.float(2.0, "ATR stop multiplier", minval = 0.1, step = 0.1)
// ----------------------------------------------------------------------------
// CALCULATIONS
// ----------------------------------------------------------------------------
fast = ta.ema(close, fastLength)
slow = ta.ema(close, slowLength)
atr = ta.atr(atrLength)
highestBefore = ta.highest(high, breakoutLength)[1]
// ----------------------------------------------------------------------------
// ENTRIES AND EXITS
// ----------------------------------------------------------------------------
longSignal = fast > slow and close > highestBefore
if longSignal and strategy.position_size == 0
strategy.entry("Long", strategy.long)
stopPrice = strategy.position_avg_price - atr * atrStop
strategy.exit("ATR stop", "Long", stop = stopPrice)
// ----------------------------------------------------------------------------
// PLOTS
// ----------------------------------------------------------------------------
plot(fast, "Fast EMA", color = color.rgb(0, 153, 255))
plot(slow, "Slow EMA", color = color.rgb(123, 97, 255))
Giá trị TIMEFRAME
Ghi một khoảng thời gian chuẩn của TradingView trong dấu ngoặc kép. Khoảng nào tải được tùy thuộc vào gói TradingView của bạn, như liệt kê tại tradingview.com/pricing.
Ngày, tuần và tháng.
"1D" "1W" "1M" "3M" "6M" "12M"
Phút, giờ và thanh range. Phút không có chữ cái; một giờ là 60.
"1" "3" "5" "15" "30" "45""60" "120" "180" "240""1R" "10R" "100R" "1000R"
Khoảng thời gian theo giây.
"1S" "5S" "10S" "15S" "30S" "45S"
Khoảng thời gian theo tick.
"1T" "10T" "100T" "1000T"
const string TIMEFRAME = "1D" // 1 day
// const string TIMEFRAME = "1W" // 1 week
// const string TIMEFRAME = "240" // 4 hours
// const string TIMEFRAME = "15" // 15 minutes
// const string TIMEFRAME = "30S" // 30 seconds, Premium and higher
Khối lượng lệnh: phần trăm, số tiền hoặc số lượng
ORDER_SIZE chứa con số, còn ORDER_SIZE_TYPE cho biết con số đó nghĩa là gì. Cả hai cùng điền vào trường Order size trong tab Properties của TradingView.
strategy.percent_of_equity
Phần trăm vốn hiện tại. 10 nghĩa là 10% vốn cho mỗi giao dịch.
strategy.cash
Số tiền theo đơn vị tiền tệ của chiến lược. 1000 nghĩa là 1.000 USD cho mỗi giao dịch.
strategy.fixed
Số lượng hợp đồng, cổ phiếu hoặc coin. 0.5 nghĩa là 0,5 BTC cho mỗi giao dịch.
qty = …
Khối lượng mặc định chỉ áp dụng cho lệnh không có qty riêng. Lệnh vào có qty = … sẽ dùng giá trị đó.
// 10% of equity per trade
const float ORDER_SIZE = 10
const string ORDER_SIZE_TYPE = strategy.percent_of_equity
// 1,000 USD per trade (CURRENCY = currency.USD)
// const float ORDER_SIZE = 1000
// const string ORDER_SIZE_TYPE = strategy.cash
// 0.5 contracts, shares or coins per trade
// const float ORDER_SIZE = 0.5
// const string ORDER_SIZE_TYPE = strategy.fixed
Biến của riêng bạn
Hãy đặt cài đặt cho logic chiến lược của riêng bạn trong một khối INPUT SETTINGS riêng. Mỗi lệnh gọi input.int(), input.float() hoặc input.bool() trở thành một trường trong tab Inputs của TradingView, nên bạn có thể chỉnh mà không cần sửa mã.
// ----------------------------------------------------------------------------
// INPUT SETTINGS (TradingView: Settings → Inputs)
// ----------------------------------------------------------------------------
fastLength = input.int(20, "Fast EMA", minval = 1)
slowLength = input.int(50, "Slow EMA", minval = 2)
breakoutLength = input.int(20, "Breakout lookback", minval = 2)
atrLength = input.int(14, "ATR length", minval = 1)
atrStop = input.float(2.0, "ATR stop multiplier", minval = 0.1, step = 0.1)