Chiến lược này sử dụng MACD để xác định hướng xu hướng, kết hợp với đường chéo EMA và SMA để xác nhận. Tín hiệu đầu vào là khi biểu đồ MACD vượt qua trên đường tín hiệu và xu hướng tăng. Stop loss được đặt ở mức giá dưới mức dừng dừng ATR nổi. Chiến lược cũng thoát một phần để kiếm lợi nhuận, thoát nhiều hơn khi giá tăng lớn hơn và giữ một số vị trí với stop dừng lại cho đến khi stop stop bị tấn công.
Khi EMA nhanh hơn vượt qua trên EMA chậm hơn, nó cho thấy xu hướng ngắn hạn tốt hơn xu hướng dài hạn, báo hiệu mua. Trong khi đó, đường SMA nhanh hơn vượt qua đường SMA chậm hơn cũng gợi ý động lực tăng mạnh hơn trong ngắn hạn. Vì vậy, sự kết hợp của đường MACD vượt qua trên tín hiệu và xu hướng tăng dựa trên đường chéo EMA & SMA giúp xác định các tín hiệu đầu vào mạnh hơn.
ATR được sử dụng để tính toán mức dừng lỗ. ATR có thể đo lường hiệu quả phạm vi biến động giá. Khi giá phá vỡ dưới phạm vi này, stop loss được kích hoạt. Thời gian ATR có thể được điều chỉnh - thời gian ngắn hơn cho phép dừng chính xác hơn nhưng dễ dàng dừng lại, trong khi thời gian dài hơn cho phép dừng rộng hơn nhưng mạnh mẽ hơn. Mức dừng cũng theo dõi giá tăng, đạt được hiệu ứng theo xu hướng.
Rõ ràng, một số người đã từng sử dụng một số phương pháp như: (i.e. (i.e. (i.e. (i.e. (i.e. (i.e. (i.e. (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.
Nguy cơ tín hiệu sai từ chỉ số MACD và xu hướng.
Rủi ro của ATR dừng lỗ bị tấn công. Có thể tăng thời gian ATR hoặc stop loss nhân.
Rủi ro của vị trí sau bị mắc kẹt giảm kích thước vị trí sau và cắt giảm mất mát trong thời gian.
Tối ưu hóa các thông số MACD để đánh giá xu hướng tốt hơn
Tối ưu hóa thời gian ATR để có mức dừng lỗ tốt hơn
Tối ưu hóa tỷ lệ thoát và kích thước vị trí để giảm rủi ro bị mắc kẹt
Xem xét thêm chuyển đổi lấy lợi nhuận hoặc chỉ số biến động để cải thiện dừng lỗ
Chiến lược này kết hợp MACD, EMA / SMA và các chỉ số khác để xác định thời gian xu hướng và nhập chính xác. ATR dừng lỗ nổi giúp khóa lợi nhuận trong khi theo xu hướng. Các bước ra được phân chia để lấy lợi nhuận, đảm bảo lợi nhuận và giữ vị trí trong thời gian. Nhìn chung nó ổn định với kết quả tốt. Nhưng các tham số và lối ra có thể được tối ưu hóa hơn nữa để có lợi nhuận 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")