
Chiến lược phá vỡ động lực tự điều chỉnh động lực động là một chiến lược giao dịch định lượng cao sử dụng các chỉ số động lực tự điều chỉnh và nhận dạng hình dạng biểu đồ. Chiến lược này thích nghi với biến động thị trường bằng cách điều chỉnh động lực theo chu kỳ động lực động và kết hợp nhiều điều kiện lọc để nhận diện cơ hội phá vỡ xu hướng có xác suất cao.
Chu kỳ chuyển động:
Tính năng tính toán và làm mịn:
Đánh giá xu hướng:
Nhận dạng hình dạng:
Tín hiệu giao dịch được tạo ra:
Quản lý giao dịch:
Khả năng thích nghi:
Cơ chế xác nhận đa dạng:
Thời gian chính xác:
Quản lý rủi ro:
Tính linh hoạt và tùy chỉnh:
Mối nguy cơ đột phá giả:
Vấn đề về sự chậm trễ:
Những hạn chế của việc rút khỏi hệ thống này:
Sự phụ thuộc quá nhiều vào một khung thời gian:
Tính nhạy cảm của tham số:
Tích hợp nhiều khung thời gian:
Động lực dừng lỗ:
Phân tích hồ sơ khối lượng:
Tối ưu hóa học máy:
Chỉ số cảm xúc tích hợp:
Phân tích liên quan:
Chiến lược phá vỡ động lực tự điều chỉnh động động là một hệ thống giao dịch cao cấp kết hợp các phương pháp phân tích kỹ thuật và định lượng. Bằng cách điều chỉnh động lượng theo chu kỳ động, xác định hình thức ăn mòn và kết hợp với nhiều điều kiện lọc, chiến lược này có thể tự động nắm bắt các cơ hội phá vỡ xu hướng có xác suất cao trong các môi trường thị trường khác nhau. Mặc dù có một số rủi ro vốn có, chẳng hạn như phá vỡ giả và nhạy cảm với tham số, chiến lược có tiềm năng nâng cao hơn nữa tính ổn định và lợi nhuận của nó thông qua các hướng tối ưu hóa được đề xuất, chẳng hạn như phân tích khung thời gian đa, quản lý rủi ro động và ứng dụng học máy.
/*backtest
start: 2024-06-28 00:00:00
end: 2024-07-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ironperol
//@version=5
strategy("Adaptive Momentum Strategy", overlay=true, margin_long=100, margin_short=100)
// Input parameters for customization
src = input.source(close, title="Source")
min_length = input.int(10, minval=1, title="Minimum Length")
max_length = input.int(40, minval=1, title="Maximum Length")
ema_smoothing = input.bool(true, title="EMA Smoothing")
ema_length = input.int(7, title="EMA Length")
percent = input.float(2, title="Percent of Change", minval=0, maxval=100) / 100.0
// Separate body size filters for current and previous candles
min_body_size_current = input.float(0.5, title="Minimum Body Size for Current Candle (as a fraction of previous body size)", minval=0)
min_body_size_previous = input.float(0.5, title="Minimum Body Size for Previous Candle (as a fraction of average body size of last 5 candles)", minval=0)
close_bars = input.int(3, title="Number of Bars to Hold Position", minval=1) // User-defined input for holding period
//######################## Calculations ##########################
// Initialize dynamic length variable
startingLen = (min_length + max_length) / 2.0
var float dynamicLen = na
if na(dynamicLen)
dynamicLen := startingLen
high_Volatility = ta.atr(7) > ta.atr(14)
if high_Volatility
dynamicLen := math.max(min_length, dynamicLen * (1 - percent))
else
dynamicLen := math.min(max_length, dynamicLen * (1 + percent))
momentum = ta.mom(src, int(dynamicLen))
value = ema_smoothing ? ta.ema(momentum, ema_length) : momentum
// Calculate slope as the difference between current and previous value
slope = value - value[1]
// Calculate body sizes
currentBodySize = math.abs(close - open)
previousBodySize = math.abs(close[1] - open[1])
// Calculate average body size of the last 5 candles
avgBodySizeLast5 = math.avg(math.abs(close[1] - open[1]), math.abs(close[2] - open[2]), math.abs(close[3] - open[3]), math.abs(close[4] - open[4]), math.abs(close[5] - open[5]))
//######################## Long Signal Condition ##########################
// Function to determine if the candle is a bullish engulfing
isBullishEngulfing() =>
currentOpen = open
currentClose = close
previousOpen = open[1]
previousClose = close[1]
isBullish = currentClose >= currentOpen
wasBearish = previousClose <= previousOpen
engulfing = currentOpen <= previousClose and currentClose >= previousOpen
bodySizeCheckCurrent = currentBodySize >= min_body_size_current * previousBodySize
bodySizeCheckPrevious = previousBodySize >= min_body_size_previous * avgBodySizeLast5
isBullish and wasBearish and engulfing and bodySizeCheckCurrent and bodySizeCheckPrevious
// Long signal condition
longCondition = isBullishEngulfing() and slope > 0
// Plotting long signals on chart
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="Long", title="Long Condition")
// Alerts for long condition
if (longCondition)
alert("Long condition met", alert.freq_once_per_bar_close)
//######################## Short Signal Condition ##########################
// Function to determine if the candle is a bearish engulfing
isBearishEngulfing() =>
currentOpen = open
currentClose = close
previousOpen = open[1]
previousClose = close[1]
isBearish = currentClose <= currentOpen
wasBullish = previousClose >= previousOpen
engulfing = currentOpen >= previousClose and currentClose <= previousOpen
bodySizeCheckCurrent = currentBodySize >= min_body_size_current * previousBodySize
bodySizeCheckPrevious = previousBodySize >= min_body_size_previous * avgBodySizeLast5
isBearish and wasBullish and engulfing and bodySizeCheckCurrent and bodySizeCheckPrevious
// Short signal condition
shortCondition = isBearishEngulfing() and slope < 0
// Plotting short signals on chart
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="Short", title="Short Condition")
// Alerts for short condition
if (shortCondition)
alert("Short condition met", alert.freq_once_per_bar_close)
//######################## Trading Logic ##########################
// Track the bar number when the position was opened
var int longEntryBar = na
var int shortEntryBar = na
// Enter long trade on the next candle after a long signal
if (longCondition and na(longEntryBar))
strategy.entry("Long", strategy.long)
longEntryBar := bar_index + 1
// Enter short trade on the next candle after a short signal
if (shortCondition and na(shortEntryBar))
strategy.entry("Short", strategy.short)
shortEntryBar := bar_index + 1
// Close long trades `close_bars` candles after entry
if (not na(longEntryBar) and bar_index - longEntryBar >= close_bars)
strategy.close("Long")
longEntryBar := na
// Close short trades `close_bars` candles after entry
if (not na(shortEntryBar) and bar_index - shortEntryBar >= close_bars)
strategy.close("Short")
shortEntryBar := na