
Chiến lược này dựa trên sự kết hợp của giá phá vỡ và quay trở lại đường trung bình, sử dụng nhiều chỉ số để xác nhận và lọc để đánh giá và theo dõi xu hướng. Chiến lược này phù hợp với giao dịch ngắn và trung bình, khóa lợi nhuận nhỏ thông qua cơ chế nhập cảnh và thoát ra nghiêm ngặt.
Sử dụng đường trung bình HMA làm đường chuẩn để xác định xu hướng của giá. Giá cao hơn đường trung bình là tăng giá, giá thấp hơn đường trung bình là giảm giá.
Kênh SSL được sử dụng như một chỉ số xác nhận, xác nhận xu hướng thông qua hướng của kênh và mối quan hệ giá cả.
TDFI được sử dụng như một chỉ số định lượng, để đánh giá khả năng. Chỉ khi đạt được một mức độ nhất định, bạn mới có thể tham gia.
Chỉ số RVI là chỉ số thoát, khi hình dạng đường RVI thay đổi, đánh giá xu hướng kết thúc, thoát khỏi vị trí.
Chỉ số ATR tính toán điểm dừng lỗ và điểm dừng.
Điều kiện nhập cảnh: Giá vượt qua đường chuẩn, hướng SSL phù hợp với giá, TDFI đạt ngưỡng.
Điều kiện xuất cảnh: RVI đường chỉ số hình dạng thay đổi, hoặc giá trở lại phá vỡ đường chuẩn và SSL kênh
Sử dụng kết hợp các chỉ số để đánh giá, có thể lọc hiệu quả các đột phá giả.
Điều kiện nhập cảnh nghiêm ngặt với Exit dừng, có thể kiểm soát một lần dừng.
Tận dụng xu hướng giá để kiếm thêm lợi nhuận.
Các tham số chỉ số có thể được tối ưu hóa và điều chỉnh cho các sản phẩm và chu kỳ khác nhau.
Không thể đánh giá được xu hướng sẽ thay đổi, có thể có nguy cơ tiếp tục tăng/giảm quá mức.
Hoạt động ngắn hạn, có nguy cơ giao dịch quá mức.
Cài đặt điểm dừng có ảnh hưởng chủ quan, có thể quá thoải mái hoặc quá chặt chẽ.
Thiết lập tham số không đúng có thể dẫn đến giao dịch thường xuyên hoặc không đủ.
Tăng các chỉ số đánh giá xu hướng để đảm bảo tính chính xác của xu hướng.
Thêm chỉ số tín hiệu đảo ngược để giảm khả năng tăng / giảm quá tải.
Cân nhắc ATR Trailing Stop để giảm lỗ.
Kiểm tra các hệ thống đồng tuyến khác nhau để tìm hướng tối ưu hóa tham số.
Tối ưu hóa tham số chỉ số, điều chỉnh tham số cho các loại giao dịch cụ thể.
Chiến lược này xác nhận thông qua nhiều chỉ số để xác định tín hiệu giao dịch chính xác hơn. Cơ chế dừng lỗ nghiêm ngặt kiểm soát tổn thất đơn lẻ. Chiến lược này phù hợp với những người quen thuộc với hoạt động phân tích kỹ thuật, có thể điều chỉnh các tham số để thích ứng với các chu kỳ thị trường khác nhau.
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Designed per No Nonsense Forex VP rules
//Made to be as modular as possible, so we can swap the indicators in and out.
//Originated from causecelebre
//Tried to put in as much VP rules as possible
///////////////////////////////////////////////////
//Rules Implemented:
///////////////////////////////////////////////////
// - SL 1.5 x ATR
// - TP 1 x ATR
//
// - Entry conditions
//// - Entry within 1 candles of baseline + 1 x confirmation + volume
//// - Entry only if baseline is < 1 x ATR
// - Exit conditions
//// - Exit on exit indicator or when baseline or confirmation flip
///////////////////////////////////////////////////
//Trades entries
///////////////////////////////////////////////////
// - First entry L1 or S1 with standard SL and TP
// - Second entry L2 or S2 with standard SL and exit upon the exit conditions
///////////////////////////////////////////////////
//Included Indicators and settings
///////////////////////////////////////////////////
// - Baseline = HMA 20
// - Confirmtion = SSL 10
// - Volume = TDFI 4
// - Exit = RVI 4
///////////////////////////////////////////////////
//Credits
// Strategy causecelebre https://www.tradingview.com/u/causecelebre/
// TDFI causecelebre https://www.tradingview.com/u/causecelebre/
// SSL Channel ErwinBeckers https://www.tradingview.com/u/ErwinBeckers/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
strategy(title="NNFX Strategy | jh", overlay = true )
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **** Set the main stuff ****
///////////////////////////////////////////////////
//Price
price = close
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ATR stuff
///////////////////////////////////////////////////
atrLength = input(14, "ATR Length")
slMultiplier = input(1.5, "SL")
tpMultiplier = input(1, "TP")
atr = atr(atrLength)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **** Baseline ****
///////////////////////////////////////////////////
///////////////////////////////////////////////////
//HMA 20
///////////////////////////////////////////////////
hmaslowlength = input(20, minval=1)
src = input(close, title="Source")
slowhullma = wma(2*wma(src, hmaslowlength/2)-wma(src, hmaslowlength), round(sqrt(hmaslowlength)))
plot(slowhullma, title = "baseline", color = yellow, linewidth=2, transp=0)
///////////////////////////////////////////////////
// Base Signals
///////////////////////////////////////////////////
///////////////////////////////////////////////////
baseline = slowhullma
//Signals based on crossover
//baseShort = crossover(baseLine, price)
//baseLong = crossover(price, baseLine)
//Signals based on signal position
b_Short = baseline > price ? 1 : 0
l_Long = baseline < price ? 1 : 0
baseShort = b_Short
baseLong = l_Long
///////////////////////////////////////////////////
//ATR Check
///////////////////////////////////////////////////
distBasefromPrice = abs(baseline - price)
atrCheck = distBasefromPrice <= atr ? 1 : 0
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **** Confirmation ****
///////////////////////////////////////////////////
///////////////////////////////////////////////////
//SSL Channel
///////////////////////////////////////////////////
sslLen=input(title="SSL Period", defval=10)
smaHigh=sma(high, sslLen)
smaLow=sma(low, sslLen)
Hlv = na
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh: smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh
///////////////////////////////////////////////////
//Confirm Signals
///////////////////////////////////////////////////
c_Up = sslUp
c_Down = sslDown
//Signals based on crossover
c_Long = crossover(c_Up, c_Down)
c_Short = crossover(c_Down, c_Up)
confirmLong = c_Long
confirmShort = c_Short
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **** Volume Indicator Start ****
///////////////////////////////////////////////////
///////////////////////////////////////////////////
//TDFI
///////////////////////////////////////////////////
lookback = input(4, title = "TDFI Lookback")
filterHigh = input(0.05, title = "Filter High")
filterLow = input(-0.05, title = "Filter Low")
mma = ema(price * 1000, lookback)
smma = ema(mma, lookback)
impetmma = mma - mma[1]
impetsmma= smma - smma[1]
divma = abs(mma - smma)
averimpet = (impetmma + impetsmma) / 2
number = averimpet
pow = 3
result = na
for i = 1 to pow - 1
if i == 1
result := number
result := result * number
tdf = divma * result
ntdf = tdf / highest(abs(tdf), lookback * 3)
///////////////////////////////////////////////////
//Volume Signals
///////////////////////////////////////////////////
v_Long = ntdf > filterHigh ? 1 : 0
v_Short = filterLow > ntdf ? 1 : 0
volumeLong = v_Long
volumeShort = v_Short
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **** Exit Indicator ****
///////////////////////////////////////////////////
///////////////////////////////////////////////////
//RVI 4
///////////////////////////////////////////////////
rgvlen = input(4, title="RVI Length", minval=1)
rvi = sum(swma(close-open), rgvlen)/sum(swma(high-low),rgvlen)
sig = swma(rvi)
///////////////////////////////////////////////////
//Exit Signals
///////////////////////////////////////////////////
e_Short = crossover(rvi, sig)
e_Long = crossover(sig, rvi)
exitOutofShort = e_Short
exitOutofLong = e_Long
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **************************** Logic to handle NNFX rules ****************************
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Checking for base and confirmation indication with 1 candle difference
baseandConfirmLong = ((baseLong[0] and confirmLong[0]) or (baseLong[1] and confirmLong[0]) or (baseLong[1] and confirmLong[1]) or (baseLong[0] and confirmLong[1])) ? 1 : 0
baseandConfirmShort = ((baseShort[0] and confirmShort[0]) or (baseShort[1] and confirmShort[0]) or (baseShort[1] and confirmShort[1]) or (baseShort[0] and confirmShort[1])) ? 1 : 0
//Combining with volume with 1 candle difference
enterLong = ((baseandConfirmLong[0] and volumeLong[0]) or (baseandConfirmLong[1] and volumeLong[0]) or (baseandConfirmLong[1] and volumeLong[1]) or (baseandConfirmLong[0] and volumeLong[1])) ? 1 : 0
enterShort = ((baseandConfirmShort[0] and volumeShort[0]) or (baseandConfirmShort[1] and volumeShort[0]) or (baseandConfirmShort[1] and volumeShort[1]) or (baseandConfirmShort[0] and volumeShort[1])) ? 1 : 0
//Exit on base or confirmation flip over
baseandConfirmFliptoShort = ((baseShort[0] or confirmShort[0]) or (baseShort[1] or confirmShort[0]) or (baseShort[1] or confirmShort[1]) or (baseShort[0] or confirmShort[1])) ? 1 : 0
baseandConfirmFliptoLong = ((baseLong[0] or confirmLong[0]) or (baseLong[1] or confirmLong[0]) or (baseLong[1] or confirmLong[1]) or (baseLong[0] or confirmLong[1])) ? 1 : 0
//Exit on base and confirmation flip or exit indicator
exitLong = exitOutofLong or baseandConfirmFliptoShort ? 1 : 0
exitShort = exitOutofShort or baseandConfirmFliptoLong ? 1 : 0
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Entries and Exits
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (year>2009)
//Long entries with standard 1.5 ATR for SL, 1 ATR for TP
long_sl = price - atr * slMultiplier
long_tp = price + atr * tpMultiplier
strategy.entry("L1", strategy.long, when = enterLong and atrCheck)
strategy.exit("L1 SL Exit", "L1", stop = long_sl, limit = long_tp)
strategy.close("L1", when = exitLong)
//Long entries with no TP
strategy.entry("L2", strategy.long, when = enterLong and atrCheck)
strategy.exit("L2 SL Exit", "L2", stop = long_sl)
strategy.close("L2", when = exitLong)
//Short entries with standard 1.5 ATR for SL, 1 ATR for TP
short_sl = price + atr * slMultiplier
short_tp = price - atr * tpMultiplier
strategy.entry("S1", strategy.short, when = enterShort and atrCheck)
strategy.exit("S1 SL Exit", "Short1", stop = short_sl, limit = short_tp)
strategy.close("S1", when = exitShort)
//Short entries with no TP
strategy.entry("S2", strategy.short, when = enterShort and atrCheck)
strategy.exit("S2 Exit", stop = short_sl)
strategy.close("S2", when = exitShort)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//End
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////