
Chiến lược này sử dụng chỉ số MACD để xác định hướng xu hướng, kết hợp với đường trung bình EMA và đường trung bình SMA như một phán đoán phụ trợ. Tín hiệu nhập là đường tín hiệu trên đường thẳng MACD và xu hướng lên, dừng là giá giảm theo đường dừng động được tính toán bởi ATR. Chiến lược này cũng thiết lập ra trận đấu, đầu tiên bằng phẳng một phần của vị trí thu lợi nhuận, sau đó khi giá đạt đến mức tăng lớn, một phần bằng phẳng để đảm bảo lợi nhuận lớn, và cuối cùng là theo dõi vị trí cho đến khi dừng lỗ.
Khi đường EMA nhanh đi qua đường EMA chậm, nó cho thấy xu hướng thay đổi giá ngắn hạn tốt hơn xu hướng dài hạn và được coi là tín hiệu mua. Đồng thời, đường SMA chậm đi qua đường EMA nhanh cũng cho thấy xu hướng tăng giá ngắn hạn tốt hơn đường dài hạn. Do đó, kết hợp với đường MACD thẳng đi qua đường tín hiệu và tín hiệu chéo EMA & SMA theo xu hướng, có thể xác định thời gian nhập cảnh mạnh hơn.
Sử dụng ATR để tính toán điểm dừng. ATR có thể phản ánh hiệu quả phạm vi biến động của giá. Khi giá giảm xuống phạm vi biến động, nó sẽ thoát khỏi điểm dừng.
Bắt đầu với một số lượng lớn, trước tiên bạn sẽ xóa một phần lợi nhuận của vị trí sau khi giá tăng nhẹ. Sau đó, bạn sẽ xóa một phần lợi nhuận của vị trí khi giá tăng mạnh. Cuối cùng, bạn sẽ theo dõi một phần vị trí và giữ cho đến khi điểm dừng lỗ kích hoạt dừng lỗ.
Tối ưu hóa các tham số MACD để đánh giá xu hướng chính xác hơn
Tối ưu hóa tham số chu kỳ ATR để giảm lỗ phù hợp hơn
Tối ưu hóa tỷ lệ ra lệnh và kiểm soát vị trí, giảm rủi ro bị vướng vào
Tăng dừng di động hoặc cân nhắc các chỉ số dao động để tối ưu hóa dừng lỗ
Chiến lược tổng hợp sử dụng nhiều chỉ số như MACD, EMA / SMA để đánh giá xu hướng để có được thời gian nhập cảnh chính xác. Đồng thời sử dụng ATR dừng lỗ nổi để khóa lợi nhuận và theo dõi xu hướng để đạt được hiệu quả tốt hơn.
/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Deobald
//@version=4
strategy("MACD Strategy", overlay=true)
// FUNCTIONS
Ema(src,p) =>
ema = 0.
sf = 2/(p+1)
ema := nz(ema[1] + sf*(src - ema[1]),src)
Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)
Atr(p) =>
atr = 0.
Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
atr := nz(atr[1] + (Tr - atr[1])/p,Tr)
/// TREND
ribbon_period = input(34, "Period", step=1)
leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)
p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)
// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)
// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)
long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)
long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)
// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)
// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long
///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod() => true
if testPeriod()
strategy.entry("long", strategy.long, comment="Long", when=entry_long)
strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
strategy.close_all("long", when=exit_long, comment="exit long" )
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")