Chiến lược này là một hệ thống giao dịch định lượng dựa trên các tín hiệu chéo trung bình di chuyển đơn giản (SMA) đa giai đoạn. Nó chủ yếu xác định các cơ hội rút lui trong xu hướng tăng dài hạn. Chiến lược sử dụng SMA của năm giai đoạn khác nhau (5, 10, 20, 60 và 120 ngày) để xác định xu hướng thị trường và cơ hội giao dịch thông qua các vị trí tương đối và tín hiệu chéo.
Logic cốt lõi bao gồm một số thành phần chính:
Chiến lược này xây dựng một hệ thống giao dịch tập trung vào việc nắm bắt các cơ hội giảm trong xu hướng tăng dài hạn thông qua việc sử dụng phối hợp các SMA nhiều giai đoạn. Thiết kế của nó thực tế và đơn giản, cung cấp khả năng hiểu biết và thực thi tốt. Sự mạnh mẽ và đáng tin cậy của chiến lược có thể được tăng thêm thông qua việc giới thiệu lọc biến động, xác nhận khối lượng và các biện pháp tối ưu hóa khác.
/*backtest start: 2019-12-23 08:00:00 end: 2025-01-04 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=6 strategy("Long-Term Growing Stock Strategy", overlay=true) // Date Range // STEP 1. Create inputs that configure the backtest's date range useDateFilter = input.bool(true, title="Filter Date Range of Backtest",group="Backtest Time Period") backtestStartDate = input(timestamp("1 Jan 2014"),title="Start Date", group="Backtest Time Period",tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " +"zone of the chart or of your computer.") backtestEndDate = input(timestamp("31 Dec 2024"), title="End Date", group="Backtest Time Period") // STEP 2. See if current bar falls inside the date range inTradeWindow = true // Calculate EMAs // ema20 = ta.ema(close, ema20_length) // ema60 = ta.ema(close, ema60_length) // ema120 = ta.ema(close, ema120_length) sma5 = ta.sma(close, 5) sma10 = ta.sma(close, 10) sma20 = ta.sma(close, 20) sma60 = ta.sma(close, 60) sma120 = ta.sma(close, 120) // Long-term growth condition: EMA 20 > EMA 60 > EMA 120 longTermGrowth = sma20 > sma60 // and ema60 > ema120 // Entry condition: Stock closes below EMA 20 and then rises back above EMA 10 // entryCondition = ta.crossover(close, ema20) or (close[1] < ema20[1] and close > ema20) entryCondition = sma5[1] <= sma20[1] and sma5 > sma20 // ta.crossover(sma5, sma20) // Exit condition: EMA 20 drops below EMA 60 // exitCondition = ema5 < ema60 or (year == 2024 and month == 12 and dayofmonth == 30) exitCondition = ta.crossover(sma20, sma5) // Execute trades if entryCondition and inTradeWindow strategy.entry("Long Entry", strategy.long) if exitCondition and inTradeWindow strategy.close("Long Entry") // plotchar(true, char="sma5: " + str.tostring(sma5)) // plotchar(true, char="sma5: " + sma20) // label.new(x=bar_index, y=high + 10, text="SMA 5: " + str.tostring(sma5), color=color.blue, style=label.style_label_down, textcolor=color.white, size=size.small) // label.new(x=bar_index, y=low, text="SMA 20: " + str.tostring(sma20), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small) // x = time + (time - time[1]) * offset_x // var label lab = na // label.delete(lab) // lab := label.new(x=x, y=0, text=txt, xloc=xloc.bar_time, yloc=yloc.belowbar, color=color.red, textcolor=color.black, size=size.normal, style=label.style_label_up) // label.set_x(lab, x) // Plot EMAs for visualization // plot(ema20, color=color.red, title="EMA 20") // plot(ema60, color=color.green, title="EMA 60") // plot(ema120, color=color.blue, title="EMA 120")