Xu hướng theo chiến lược với đường trung bình động và mô hình nến

Tác giả:ChaoZhang, Ngày: 2024-02-02 17:53:43
Tags:

img

Tổng quan

Chiến lược này kết hợp trung bình động để xác định hướng xu hướng và các mô hình nến để xác định các điểm đảo ngược tiềm năng, để thực hiện xu hướng sau khi giao dịch. Chiến lược đầu tiên sử dụng trung bình động để đánh giá hướng xu hướng tổng thể, và sau đó tìm kiếm các mô hình nến đảo ngược tiềm năng như tín hiệu đầu vào dọc theo hướng xu hướng để theo dõi xu hướng.

Nguyên tắc chiến lược

Chiến lược này sử dụng đường trung bình di chuyển đơn giản 10 ngày để xác định xu hướng giá. Khi giá trên đường trung bình di chuyển, nó được coi là xu hướng tăng; khi giá dưới đường trung bình di chuyển, nó được coi là xu hướng giảm.

Sau khi xác định hướng xu hướng, chiến lược sẽ đánh giá các điểm đảo ngược xu hướng tiềm năng dựa trên một loạt các mô hình nến tăng và giảm. Các mô hình tăng phổ biến bao gồm Morning Star, Bullish Engulfing, Three White Soldiers, vv; các mô hình giảm phổ biến bao gồm Evening Star, Three Black Crows, vv. Khi một tín hiệu tăng được xác định trong xu hướng tăng, chiến lược sẽ đặt lệnh mua; khi một tín hiệu giảm được xác định trong xu hướng giảm, chiến lược sẽ đặt lệnh bán.

Ngoài ra, chiến lược cũng kết hợp các mức hỗ trợ và kháng cự chính để xác định giá nhập khẩu cụ thể. Ví dụ, khi mua trong xu hướng tăng, nó sẽ mua khi phá vỡ mức hỗ trợ đầu tiên.

Ưu điểm

Ưu điểm lớn nhất của chiến lược này là nó kết hợp cả đánh giá xu hướng và tín hiệu đảo ngược để có thể nắm bắt các điểm chuyển hướng xu hướng một cách kịp thời để theo dõi xu hướng.

Ngoài ra, việc kết hợp phán đoán mô hình nến cũng tăng khả năng xử lý các sự kiện bất ngờ. Khi một sự kiện có khả năng thấp gây ra sự đột phá sai trên thị trường, mô hình nến có thể đóng vai trò lọc để tránh các giao dịch sai.

Rủi ro

Rủi ro chính của chiến lược này nằm ở độ chính xác của cài đặt tham số trung bình động và phán đoán mô hình nến. Nếu thời gian trung bình động được đặt không đúng, nó sẽ dẫn đến xác định xu hướng sai; nếu phán đoán mô hình nến có lỗi, nó cũng sẽ dẫn đến các quyết định giao dịch sai.

Ngoài ra, các mô hình nến đảo ngược không thể đảm bảo sự đảo ngược xu hướng với sự chắc chắn 100%, vì vậy vẫn có một số rủi ro trong chiến lược.

Hướng dẫn tối ưu hóa

Chúng ta có thể xem xét điều chỉnh các tham số của đường trung bình động một cách năng động và áp dụng các giai đoạn trung bình động khác nhau trong các giai đoạn thị trường khác nhau. Chúng ta cũng có thể giới thiệu các phương pháp học máy để đào tạo các mô hình đánh giá mẫu nến bằng cách sử dụng dữ liệu lịch sử để cải thiện độ chính xác đánh giá.

Ngoài ra, chúng tôi cũng có thể xem xét kết hợp nhiều yếu tố hơn để đánh giá xu hướng và các khu vực nóng, chẳng hạn như thay đổi khối lượng giao dịch, chỉ số biến động, vv, để làm cho chiến lược toàn diện hơn và mạnh mẽ hơn.

Kết luận

Nói chung, chiến lược này rất phù hợp để theo dõi xu hướng trung hạn trên thị trường chứng khoán và có thể đạt được lợi nhuận tương đối cao và ổn định. Nếu được tối ưu hóa hơn nữa, nó có tiềm năng trở thành một chiến lược định lượng hoạt động tốt. Nếu các nhà đầu tư nắm bắt được việc sử dụng chiến lược này, họ cũng có thể sử dụng nó để xây dựng cổ phần dài hạn để kiểm soát rủi ro cổ phiếu cá nhân trong khi nhận được lợi nhuận dư thừa tốt hơn.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trend Following Strategy with Candlestick Patterns", overlay=true)

// Moving Average
ma_period = input(10, title="Moving Average Period")
moving_average = ta.sma(close, ma_period)

// Candlestick Patterns
// Custom Function
abs(x) => x >= 0 ? x : -x

// Candlestick Patterns
isDoji() =>
    (close - open) <= (high - low) * 0.1

isMarubozuWhite() =>
    close == high and open == low and close > open

isHammer() =>
    (high - low) >= 3 * abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and (open - low) / (0.001 + high - low) > 0.6

isInvertedHammer() =>
    (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

isLongLowerShadow() =>
    (low - close) > 2 * abs(open - close) and (low - open) / (0.001 + high - low) > 0.6

isUpsideTasukiGap() =>
    close[1] < open[1] and open > close and open > close[1] and close < open[1]

isRisingWindow() =>
    high[1] < low and close > open

isPiercing() =>
    close[1] < open[1] and close > open and close > ((open + low) / 2) and close < open[1] and open < close[1]

isBullishEngulfing() =>
    close[1] < open[1] and close > open and high > high[1] and low < low[1]

isTweezerBottom() =>
    low == ta.valuewhen(low == ta.lowest(low, 10), low, 0) and low == ta.valuewhen(low == ta.lowest(low, 20), low, 0)

isBullishAbandonedBaby() =>
    close[2] < open[2] and close[1] > open[1] and low[1] > ta.valuewhen(high == ta.highest(high, 2), high, 0) and open > close and close > ta.valuewhen(high == ta.highest(high, 2), high, 0)

isMorningStar() =>
    close[2] < open[2] and close[1] < open[1] and close > open[1] and open < close[2] and open > close[1]

isMorningDojiStar() =>
    close[2] < open[2] and close[1] < open[1] and isDoji() and close > open[1] and open < close[2] and open > close[1]

isDragonflyDoji() =>
    isDoji() and (high - close) / (0.001 + high - low) < 0.1 and (open - low) / (0.001 + high - low) > 0.6

isThreeWhiteSoldiers() =>
    close[2] < open[2] and close[1] < open[1] and close > open and open < close[2] and open < close[1] and close > open[1]

isRisingThreeMethods() =>
    close[4] < open[4] and close[1] < open[1] and close > open and open < close[4] and open < close[1] and close > open[1]

isMarubozuBlack() =>
    close == low and open == high and open > close

isGravestoneDoji() =>
    isDoji() and (close - low) / (0.001 + high - low) < 0.1 and (high - open) / (0.001 + high - low) > 0.6

isHangingMan() =>
    (high - low) >= 4 * abs(open - close) and (open - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

isLongUpperShadow() =>
    (high - open) > 2 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6

isDownsideTasukiGap() =>
    close[1] > open[1] and open < close and open < close[1] and close > open[1]

isFallingWindow() =>
    low[1] > high and close < open

isDarkCloudCover() =>
    close[1] > open[1] and close < open and close < ((open + high) / 2) and close > open[1] and open > close[1]

isBearishEngulfing() =>
    close[1] > open[1] and close < open and high > high[1] and low < low[1]

isTweezerTop() =>
    high == ta.valuewhen(high == ta.highest(high, 10), high, 0) and high == ta.valuewhen(high == ta.highest(high, 20), high, 0)

isAbandonedBaby() =>
    close[2] > open[2] and close[1] < open[1] and high[1] < ta.valuewhen(low == ta.lowest(low, 2), low, 0) and open < close and close < ta.valuewhen(low == ta.lowest(low, 2), low, 0)

isEveningDojiStar() =>
    close[2] > open[2] and close[1] > open[1] and isDoji() and close < open[1] and open > close[2] and open < close[1]

isEveningStar() =>
    close[2] > open[2] and close[1] > open[1] and close < open[1] and open > close[2] and open < close[1]

isThreeBlackCrows() =>
    close[2] > open[2] and close[1] > open[1] and close < open and open > close[2] and open > close[1] and close < open[1]

isFallingThreeMethods() =>
    close[4] > open[4] and close[1] > open

isShootingStar() =>
    (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

doji = isDoji()
marubozuWhite = isMarubozuWhite()
hammer = isHammer()
invertedHammer = isInvertedHammer()
longLowerShadow = isLongLowerShadow()
upsideTasukiGap = isUpsideTasukiGap()
risingWindow = isRisingWindow()
piercing = isPiercing()
bullishEngulfing = isBullishEngulfing()
tweezerBottom = isTweezerBottom()
bullishAbandonedBaby = isBullishAbandonedBaby()
morningStar = isMorningStar()
morningDojiStar = isMorningDojiStar()
dragonflyDoji = isDragonflyDoji()
threeWhiteSoldiers = isThreeWhiteSoldiers()
risingThreeMethods = isRisingThreeMethods()
marubozuBlack = isMarubozuBlack()
gravestoneDoji = isGravestoneDoji()
hangingMan = isHangingMan()
longUpperShadow = isLongUpperShadow()
downsideTasukiGap = isDownsideTasukiGap()
fallingWindow = isFallingWindow()
darkCloudCover = isDarkCloudCover()
bearishEngulfing = isBearishEngulfing()
tweezerTop = isTweezerTop()
abandonedBaby = isAbandonedBaby()
eveningDojiStar = isEveningDojiStar()
eveningStar = isEveningStar()
threeBlackCrows = isThreeBlackCrows()
fallingThreeMethods = isFallingThreeMethods()
shootingStar = isShootingStar()
isBullishPattern() =>
    (isMarubozuWhite() or isHammer() or isInvertedHammer() or isDoji() or isMorningStar() or isBullishEngulfing() or isThreeWhiteSoldiers() or isMarubozuBlack() or isHangingMan() or isDownsideTasukiGap() or isDarkCloudCover())

isBearishPattern() =>
    (isMarubozuBlack() or isInvertedHammer() or isLongUpperShadow() or isTweezerTop() or isGravestoneDoji() or isEveningStar() or isBearishEngulfing() or isThreeBlackCrows() or isShootingStar())

isBullishCandle = isBullishPattern()
isBearishCandle = isBearishPattern()

// Calculate Pivot Points
pivotPoint(high, low, close) =>
    (high + low + close) / 3

r1 = pivotPoint(high[1], low[1], close[1]) * 2 - low[1]
s1 = pivotPoint(high[1], low[1], close[1]) * 2 - high[1]

r2 = pivotPoint(high[1], low[1], close[1]) + (high[1] - low[1])
s2 = pivotPoint(high[1], low[1], close[1]) - (high[1] - low[1])

r3 = high[1] + 2 * (pivotPoint(high[1], low[1], close[1]) - low[1])
s3 = low[1] - 2 * (high[1] - pivotPoint(high[1], low[1], close[1]))
// Trend Identification
is_uptrend = close > moving_average
is_downtrend = close < moving_average
// Entry and Exit Conditions with Trend Identification
enterLong = is_uptrend and isBullishCandle and close > r1
exitLong = is_uptrend and (bearishEngulfing or doji or close < s1)

enterShort = is_downtrend and isBearishCandle and close < s1
exitShort = is_downtrend and (bullishEngulfing or doji or close > r1)



// Strategy Execution
if enterLong and strategy.position_size == 0 and strategy.position_size[1] == 0 and close > r1
    strategy.entry("Buy", strategy.long, qty=1)

if exitLong and strategy.position_size > 0
    strategy.close("Buy")

if enterShort and strategy.position_size == 0 and close < s1
    strategy.entry("Sell", strategy.short, qty=1)

if exitShort and strategy.position_size < 0
    strategy.close("Sell")


// Stop-Loss and Trailing Stop-Loss
stop_loss_pct = input(2.0, title="Stop Loss Percentage")
trailing_stop_loss_pct = input(1.0, title="Trailing Stop Loss Percentage")
trailing_stop_loss_active = input(true, title="Trailing Stop Loss Active")

// Stop-Loss
stop_loss_level = strategy.position_avg_price * (1 - stop_loss_pct / 100)
strategy.exit("Stop Loss", "Buy", loss=stop_loss_level)

// Trailing Stop-Loss


// Plotting Moving Average
plot(moving_average, color=color.blue, title="Moving Average", linewidth=2)

// Plotting Candlestick Patterns
plotshape(isBullishCandle, title="Bullish Candle", location=location.belowbar, color=color.green, style=shape.labelup)
plotshape(isBearishCandle, title="Bearish Candle", location=location.abovebar, color=color.red, style=shape.labeldown)

// Plotting Support and Resistance Levels
//hline(r1, "Resistance Level 1", color=color.red, linestyle=hline.style_dotted)
//hline(s1, "Support Level 1", color=color.green, linestyle=hline.style_dotted)


Thêm nữa