Bài viết này giải thích chi tiết một chiến lược giao dịch định lượng dựa trên phân tích xu hướng động lực. Nó tổng hợp các chỉ số như đường trung bình động, MACD và RSI để xác định động lực giá và nắm bắt các cơ hội xu hướng trung dài hạn.
I. Chiến lược logic
Các chỉ số đánh giá chính bao gồm:
EMA để đánh giá xu hướng qua các giai đoạn khác nhau.
MACD để phát hiện sự thay đổi động lượng ngắn hạn.
RSI để kiểm tra mức mua quá mức / bán quá mức.
ATR cho việc tính toán stop loss và take profit.
Nó kết hợp các chỉ số này để xác định các sự đột phá mạnh mẽ và bền vững báo hiệu sự bắt đầu của xu hướng nhập khẩu thương mại.
Khi EMA ngắn hạn dao động thường xuyên, nó đánh giá thị trường là dao động.
MACD đánh giá sức mạnh động lực, RSI tránh theo đuổi đỉnh và đáy. ATR đặt dừng lỗ và lấy lợi nhuận kiểm soát rủi ro cho mỗi giao dịch.
II. Lợi thế của Chiến lược
Ưu điểm lớn nhất là sự bổ sung của các chỉ số, có thể xác định hiệu quả sự khởi đầu của xu hướng trung bình dài hạn.
Một lợi thế khác là dừng lỗ và lấy lợi nhuận, khóa lợi nhuận xu hướng và quản lý rủi ro.
Cuối cùng, các khoảng thời gian EMA từng giai đoạn cho phép các mục xu hướng trơn tru ở các mức động lực khác nhau.
III. Các rủi ro tiềm ẩn
Tuy nhiên, chiến lược này cũng có những rủi ro sau:
Thứ nhất, việc phát hiện xu hướng có thể chậm lại, gây ra cơ hội bị bỏ lỡ.
Thứ hai, những điểm dừng bị đặt quá chặt có nguy cơ bị dừng sớm.
Cuối cùng, áp lực giảm cần chuẩn bị tâm lý.
IV. Tóm tắt
Tóm lại, bài viết này đã giải thích một chiến lược định lượng dựa trên phân tích xu hướng động lực. Nó tổng hợp các chỉ số như trung bình động, MACD và RSI để xác định hướng xu hướng. Với điều chỉnh tham số thích hợp, nó có thể kiểm soát rủi ro và đạt được lợi nhuận ổn định. Nhưng rủi ro như sự chậm trễ của chỉ số cần phải được xem xét.
/*backtest start: 2023-08-14 00:00:00 end: 2023-08-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("QuantCat Mom Finder Strateg (1H)", overlay=true) //Series to sum the amount of crosses in EMA for sideways trend/noise filtering //can change EMA lengths, can change to SMA's/WMA's e.t.c lookback_value = 60 minMA = 20 midMA = 40 maxMA = 60 ema25_crossover = (crossover(close, ema(close, minMA))) == true ? 1 : 0 ema25_crossover_sum = sum(ema25_crossover, lookback_value) ///potentially change lookback value to alter results ema50_crossover = (crossover(close, ema(close, midMA))) == true ? 1 : 0 ema50_crossover_sum = sum(ema50_crossover, lookback_value) ///potentially change lookback value to alter results ema75_crossover = (crossover(close, ema(close, maxMA))) == true ? 1 : 0 ema75_crossover_sum = sum(ema75_crossover, lookback_value) ///potentially change lookback value to alter results ema25_crossunder = (crossunder(close, ema(close, minMA))) == true ? 1 : 0 ema25_crossunder_sum = sum(ema25_crossunder, lookback_value) ///potentially change lookback value to alter results ema50_crossunder = (crossunder(close, ema(close, midMA))) == true ? 1 : 0 ema50_crossunder_sum = sum(ema50_crossunder, lookback_value) ///potentially change lookback value to alter results ema75_crossunder = (crossunder(close, ema(close, maxMA))) == true ? 1 : 0 ema75_crossunder_sum = sum(ema75_crossunder, lookback_value) ///potentially change lookback value to alter results4 //Boolean series declaration //can change amount of times crossed over the EMA verification to stop sideways trend filtering (3) maxNoCross=2 macdmidlinebull=-0.5 macdmidlinebear=0.5 [macdLine, signalLine, histLine] = macd(close, 12, 26, 9) //--------------- //Series Creation bullishMacd = (macdLine > signalLine) and (macdLine > macdmidlinebull) ? true : false bearishMacd = (macdLine < signalLine) and (macdLine < macdmidlinebear) ? true : false bullRsiMin = 50 //53 initial values bullRsiMax = 60 //61 bearRsiMin = 40 //39 bearRsiMax = 50 //47 basicBullCross25bool = ((ema25_crossover_sum < ema50_crossover_sum) and (ema25_crossover_sum < ema75_crossover_sum) and (ema25_crossover_sum < maxNoCross) and crossover(close, ema(close, minMA)) and (rsi(close, 14) > bullRsiMin) and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false basicBullCross50bool = ((ema50_crossover_sum < ema25_crossover_sum) and (ema50_crossover_sum < ema75_crossover_sum) and (ema50_crossover_sum < maxNoCross) and crossover(close, ema(close, midMA)) and (rsi(close, 14) > bullRsiMin) and (basicBullCross25bool == false) and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false basicBullCross75bool = ((ema75_crossover_sum < ema25_crossover_sum) and (ema75_crossover_sum < ema50_crossover_sum) and (ema75_crossover_sum < maxNoCross) and crossover(close, ema(close, maxMA)) and (rsi(close, 14) > bullRsiMin) and (basicBullCross25bool == false) and (basicBullCross50bool == false) and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false basicBearCross25bool = ((ema25_crossunder_sum < ema50_crossunder_sum) and (ema25_crossunder_sum < ema75_crossunder_sum) and (ema25_crossunder_sum < maxNoCross) and crossunder(close, ema(close, minMA)) and (rsi(close, 14) <bearRsiMax) and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false basicBearCross50bool = ((ema50_crossunder_sum < ema25_crossunder_sum) and (ema50_crossunder_sum < ema75_crossover_sum) and (ema50_crossunder_sum < maxNoCross) and crossunder(close, ema(close, midMA)) and (rsi(close, 14) < bearRsiMax) and (basicBearCross25bool == false) and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false basicBearCross75bool = ((ema75_crossunder_sum < ema25_crossunder_sum) and (ema75_crossunder_sum < ema50_crossunder_sum) and (ema75_crossunder_sum < maxNoCross) and crossunder(close, ema(close, maxMA)) and (rsi(close, 14) < bearRsiMax) and (basicBearCross25bool == false) and (basicBearCross50bool == false) and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false //STRATEGY //can change lookback input on ATR atrLkb = input(14, minval=1, title='ATR Stop Period') atrRes = input("D", title='ATR Resolution') atr = security(syminfo.tickerid, atrRes, atr(atrLkb)) longCondition = (basicBullCross25bool or basicBullCross50bool or basicBullCross75bool) == true if (longCondition) strategy.entry("Long", strategy.long) shortCondition = (basicBearCross25bool or basicBearCross50bool or basicBearCross75bool) == true if (shortCondition) strategy.entry("Short", strategy.short) // Calc ATR Stops // can change atr multiplier to affect stop distance/tp distance, and change "close" to ema values- could try ema 50 stopMult = 0.6 //0.6 is optimal longStop = na longStop := shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * stopMult) : longStop[1] shortStop = na shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * stopMult) : shortStop[1] //Calc ATR Target targetMult = 2.2 //2.2 is optimal for crypto x/btc pairs longTarget = na longTarget := shortCondition ? na : longCondition and strategy.position_size <=0 ? close + (atr*targetMult) : longTarget[1] shortTarget = na shortTarget := longCondition ? na : shortCondition and strategy.position_size >=0 ? close - (atr*targetMult) : shortTarget[1] // Place the exits strategy.exit("Long ATR Stop", "Long", stop=longStop, limit=longTarget) strategy.exit("Short ATR Stop", "Short", stop=shortStop, limit=shortTarget) //Bar color series longColour = longCondition ? lime : na shortColour = shortCondition ? red : na // Plot the stoplosses and targets plot(longStop, style=linebr, color=red, linewidth=2, title='Long ATR Stop') plot(shortStop, style=linebr, color=red, linewidth=2, title='Short ATR Stop') plot(longTarget, style=linebr, linewidth=2, color=lime, title='Long ATR Target') plot(shortTarget, linewidth=2, style=linebr, color=lime, title='Long ATR Target') barcolor(color=longColour) barcolor(color=shortColour) alertcondition(((basicBullCross25bool or basicBullCross50bool or basicBullCross75bool)==true), title='Long Entry', message='Bullish Momentum Change!') alertcondition(((basicBearCross25bool or basicBearCross50bool or basicBearCross75bool)==true), title='Short Entry', message='Bearish Momentum Change!')