
Chiến lược này là sử dụng kết hợp hai chỉ số động lực để khám phá nhiều cơ hội giao dịch hơn. Chỉ số đầu tiên là chiến lược đảo ngược chỉ số ngẫu nhiên chậm và nhanh mà Wolf Jansen đưa ra trong cuốn sách của mình. Chỉ số thứ hai là giá tổng hợp theo xu hướng của John Ehlers.
Nguyên tắc của chiến lược đảo ngược chỉ số ngẫu nhiên nhanh chậm trong phần đầu tiên là: làm nhiều khi giá đóng cửa thấp hơn giá đóng cửa ngày trước hai ngày liên tiếp và đường nhanh cao hơn đường chậm; làm trống khi giá đóng cửa cao hơn giá đóng cửa ngày trước hai ngày liên tiếp và đường nhanh thấp hơn đường chậm.
Công thức tính toán cho giá tổng hợp theo xu hướng của phần hai là:
DSP = EMA ((HL/2, 0.25 chu kỳ) - EMA ((HL/2, 0.5 chu kỳ)
Trong đó, HL / 2 là điểm trung bình giá cao thấp, 0.25 chu kỳ EMA đại diện cho xu hướng ngắn hạn của giá, 0.5 chu kỳ EMA đại diện cho xu hướng dài hạn của giá. Giá tổng hợp xu hướng đi đại diện cho mức tăng giảm của giá so với chu kỳ thống trị của nó.
Chiến lược này xem xét tổng hợp hai tín hiệu chỉ số. Chỉ khi hai chỉ số phát ra tín hiệu mua hoặc bán cùng một lúc, thì sẽ mở vị trí.
Chiến lược này sử dụng hai chỉ số động lực khác nhau để nâng cao chất lượng tín hiệu bằng cách lọc kép và kiểm soát rủi ro trong khi duy trì tần suất giao dịch. Tuy nhiên, cần lưu ý đến các hạn chế của chỉ số và tối ưu hóa các tham số một cách thích hợp. Nếu có thể tối ưu hóa liên tục, chiến lược này có khả năng thu được lợi nhuận vượt quá mức lớn.
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 18/11/2019
// This is combo strategies for get a cumulative signal.
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50.
// The strategy sells at market, if close price is lower than the previous close price
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// Detrended Synthetic Price is a function that is in phase with the
// dominant cycle of real price data. This DSP is computed by subtracting
// a half-cycle exponential moving average (EMA) from the quarter cycle
// exponential moving average.
// See "MESA and Trading Market Cycles" by John Ehlers pages 64 - 70.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
vFast = sma(stoch(close, high, low, Length), KSmoothing)
vSlow = sma(vFast, DLength)
pos = 0.0
pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0)))
pos
D_DSP(Length, SellBand, BuyBand) =>
pos = 0.0
xHL2 = hl2
xEMA1 = ema(xHL2, Length)
xEMA2 = ema(xHL2, 2 * Length)
xEMA1_EMA2 = xEMA1 - xEMA2
pos := iff(xEMA1_EMA2 > SellBand, 1,
iff(xEMA1_EMA2 < BuyBand, -1, nz(pos[1], 0)))
pos
strategy(title="Combo Backtest 123 Reversal & D_DSP (Detrended Synthetic Price) V 2", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
LengthDSP = input(14, minval=1)
SellBand = input(-25)
BuyBand = input(25)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posD_DSP = D_DSP(LengthDSP, SellBand, BuyBand)
pos = iff(posReversal123 == 1 and posD_DSP == 1 , 1,
iff(posReversal123 == -1 and posD_DSP == -1, -1, 0))
possig = iff(reverse and pos == 1, -1,
iff(reverse and pos == -1 , 1, pos))
if (possig == 1)
strategy.entry("Long", strategy.long)
if (possig == -1)
strategy.entry("Short", strategy.short)
if (possig == 0)
strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )