Chiến lược này kết hợp chỉ số stochastic để đánh giá điểm đảo ngược quá mua quá bán và chỉ số MACD để xác định xu hướng đảo ngược, để thực hiện chiến lược giao dịch đảo ngược mua thấp bán cao. Đồng thời thiết lập theo dõi dừng lỗ để khóa lợi nhuận, có thể kiểm soát rủi ro hiệu quả.
Sử dụng chỉ số stochastic để đánh giá tình trạng quá mua quá bán. Dòng ngày 9 thấp hơn 20 là vùng quá bán, cao hơn 80 là vùng quá mua, tạo ra tín hiệu đảo ngược.
Đường MACD phá vỡ đường tín hiệu báo hiệu đường trung bình đảo ngược, gợi ý xu hướng đảo ngược.
Khi stochastic reversal và MACD reversal xuất hiện cùng một lúc, hãy thực hiện thêm blanking.
Thiết lập theo dõi dừng. Sau khi đi vào xu hướng, khi giá đạt đến một tỷ lệ lợi nhuận nhất định, theo dõi dừng bắt đầu; sau đó, đường dừng theo dõi giá lên kênh.
Khi có tín hiệu đảo ngược, hãy đóng vị trí ban đầu và đặt lại đường dừng lỗ.
Kết hợp nhiều chỉ số đánh giá để tăng độ chính xác tín hiệu
Chỉ số stochastic có thể xác định hiệu quả các khu vực quá mua quá bán
MACD có thể nắm bắt sự đảo ngược đường trung bình trước, nắm bắt xu hướng đảo ngược
Thiết lập theo dõi dừng lỗ, bảo vệ lợi nhuận tốt
Dữ liệu phản hồi đầy đủ, tín hiệu chiến lược rõ ràng
Các tham số có thể được tối ưu hóa, dễ dàng điều chỉnh tham số
Khó khăn trong việc tối ưu hóa danh mục đa chỉ số
Các tín hiệu đảo ngược có thể gây ra sự hiểu lầm và cần phải xác minh các chỉ số
Tiếp theo, các nhà nghiên cứu đã tiến hành một cuộc nghiên cứu mới.
Các chỉ số stochastic và MACD đều có sự chậm trễ
Giao dịch thường xuyên có thể dẫn đến chi phí giao dịch cao hơn
Cố gắng thêm nhiều chỉ số để tạo ra một hệ thống giao dịch vững chắc hơn
Kiểm tra các tham số khác nhau của chu kỳ để tìm kiếm sự kết hợp tham số tốt nhất
Phát triển các thiết lập tham số thích ứng và cập nhật các tham số tối ưu trong thời gian thực
Thiết lập dừng rút để kiểm soát rút tối đa
Tham gia chỉ số khối lượng giao dịch để tránh sai lầm do giá lệch
Đặt mức dừng tối thiểu để tính đến tác động của chi phí giao dịch
Chiến lược này kết hợp các chỉ số stochastic và các chỉ số MACD, có khả năng nhận biết mạnh mẽ về lựa chọn thời điểm giao dịch đảo ngược. Chạy theo dõi các cơ chế dừng lỗ cũng có thể khóa lợi nhuận một cách hiệu quả. Tuy nhiên, giao dịch đảo ngược vẫn có một số rủi ro, cần sử dụng nhiều chỉ số để xác minh và tiếp tục tối ưu hóa các tham số.
/*backtest
start: 2022-09-14 00:00:00
end: 2023-06-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
////////////////////////////////////////////////////////////
// @CoinDigger
//
// Credits for the base strategy go to HPotter
//
// I've just added a trail stop, basic leverage simulation and stop loss
//
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 28/01/2021
// 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
// MACD – Moving Average Convergence Divergence. The MACD is calculated
// by subtracting a 26-day moving average of a security's price from a
// 12-day moving average of its price. The result is an indicator that
// oscillates above and below zero. When the MACD is above zero, it means
// the 12-day moving average is higher than the 26-day moving average.
// This is bullish as it shows that current expectations (i.e., the 12-day
// moving average) are more bullish than previous expectations (i.e., the
// 26-day average). This implies a bullish, or upward, shift in the supply/demand
// lines. When the MACD falls below zero, it means that the 12-day moving average
// is less than the 26-day moving average, implying a bearish shift in the
// supply/demand lines.
// A 9-day moving average of the MACD (not of the security's price) is usually
// plotted on top of the MACD indicator. This line is referred to as the "signal"
// line. The signal line anticipates the convergence of the two moving averages
// (i.e., the movement of the MACD toward the zero line).
// Let's consider the rational behind this technique. The MACD is the difference
// between two moving averages of price. When the shorter-term moving average rises
// above the longer-term moving average (i.e., the MACD rises above zero), it means
// that investor expectations are becoming more bullish (i.e., there has been an
// upward shift in the supply/demand lines). By plotting a 9-day moving average of
// the MACD, we can see the changing of expectations (i.e., the shifting of the
// supply/demand lines) as they occur.
//
// 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
MACD(fastLength,slowLength,signalLength) =>
pos = 0.0
fastMA = ema(close, fastLength)
slowMA = ema(close, slowLength)
macd = fastMA - slowMA
signal = sma(macd, signalLength)
pos:= iff(signal < macd , 1,
iff(signal > macd, -1, nz(pos[1], 0)))
pos
strategy(title="Combo Backtest 123 Reversal & MACD Crossover with Trail and Stop", shorttitle="ComboReversal123MACDWithStop", overlay = false, precision=8,default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, currency="USD", commission_type=strategy.commission.percent, commission_value=0.075)
leverage=input(2,"leverage",step=1)
percentOfEquity=input(100,"percentOfEquity",step=1)
sl_trigger = input(10, title='Stop Trail Trigger %', type=input.float)/100
sl_trail = input(5, title='Stop Trail %', type=input.float)/100
sl_inp = input(10, title='Stop Loss %', type=input.float)/100
Length = input(100, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(2, minval=1)
Level = input(1, minval=1)
//-------------------------
fastLength = input(10, minval=1)
slowLength = input(19,minval=1)
signalLength=input(24,minval=1)
xSeria = input(title="Source", type=input.source, defval=close)
reverse = input(false, title="Trade reverse")
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2015, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2999, title = "To Year", minval = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
////////////////////////////////////////////////////////////////////////////////
////////////////////// STOP LOSS CALCULATIONS //////////////////////////////
///////////////////////////////////////////////////
cond() => barssince(strategy.position_size[1] == 0 and (strategy.position_size > 0 or strategy.position_size < 0)) > 0
lastStopLong = 0.0
lastStopLong := lastStopLong[1] != strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) and lastStopLong[1] != 0.0 ? lastStopLong[1] : strategy.position_size > 0 ? (cond() and close > strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price + (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))) : 0
lastStopShort = 0.0
lastStopShort := lastStopShort[1] != strategy.position_avg_price + (strategy.position_avg_price * (sl_inp)) and lastStopShort[1] != 9999999999.0 ? lastStopShort[1] : strategy.position_size < 0 ? (cond() and close < strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price - (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))) : 9999999999.0
longStopPrice = 0.0
longStopPrice2 = 0.0
longStopPrice3 = 0.0
shortStopPrice = 0.0
longStopPrice := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice[1])
else
0
longStopPrice2 := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*2))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*2))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice2[1])
else
0
longStopPrice3 := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*4))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*3))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice3[1])
else
0
shortStopPrice := if strategy.position_size < 0
originalStop = strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger))
trail = strategy.position_avg_price - (strategy.position_avg_price * (sl_trail))
stopValue = low < trigger ? trail : 999999
min(stopValue, originalStop, shortStopPrice[1])
else
999999
///////////////////////////////////////////////////
///////////////////////////////////////////////////
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posMACD = MACD(fastLength,slowLength, signalLength)
pos = iff(posReversal123 == 1 and posMACD == 1 , 1,
iff(posReversal123 == -1 and posMACD == -1, -1, 0))
possig = pos
quantity = max(0.000001,min(((strategy.equity*(percentOfEquity/100))*leverage/open),100000000))
if (possig == 1 and time_cond)
strategy.entry("Long", strategy.long, qty=quantity)
if (possig == -1 and time_cond)
strategy.entry("Short", strategy.short, qty=quantity)
if (strategy.position_size > 0 and possig == -1 and time_cond)
strategy.close_all()
if (strategy.position_size < 0 and possig == 1 and time_cond)
strategy.close_all()
if ((strategy.position_size < 0 or strategy.position_size > 0) and possig == 0)
strategy.close_all()
//EXIT TRADE @ TSL
if strategy.position_size > 0
strategy.exit(id="Long", stop=longStopPrice)
if strategy.position_size < 0
strategy.exit(id="Short", stop=shortStopPrice)