Chiến lược đảo chiều xu hướng


Ngày tạo: 2026-02-28 11:10:30 sửa đổi lần cuối: 2026-03-06 14:15:32
sao chép: 8 Số nhấp chuột: 135
2
tập trung vào
413
Người theo dõi

Chiến lược đảo chiều xu hướng Chiến lược đảo chiều xu hướng

Chiến lược Flip

ATR, L1, ADAPTIVE, BREAKEVEN, PARTIAL_TP

Đây không phải là một chiến lược theo dõi xu hướng thông thường, mà là một hệ thống thông minh để “lật mặt”.

Trong khi hầu hết các chiến lược xu hướng đều bị tấn công nhiều lần trong thị trường bất ổn, chiến lược này đã giải quyết vấn đề cốt lõi:Chuyển vị trí ngay lập tức khi xu hướng đảo ngượcKhông chỉ đơn giản là dừng lỗ, mà là chuyển đổi trực tiếp từ đầu nhiều đầu vào đầu rỗng, chuyển đổi trực tiếp từ đầu rỗng sang đầu nhiều đầu. Thiết kế này cho thấy hiệu quả sử dụng vốn cao hơn trong phản hồi.

Bộ lọc tự điều chỉnh L1: 0,6 chu kỳ nhanh hơn trung bình di chuyển truyền thống

L1 Proximal Filter là trung tâm của chiến lược, nó không phải là đường trung bình bình thường mà bạn đã từng thấy.Tỷ lệ tự điều chỉnh là 0,6 và ATR gấp 1,5 lần, có nghĩa là bộ lọc sẽ chỉ phản ứng khi giá thay đổi hơn 1, 5 lần ATR 200 chu kỳ. Thiết kế này nhận ra sự thay đổi xu hướng nhanh hơn khoảng 0,6 chu kỳ so với EMA truyền thống, đồng thời lọc 60% tiếng ồn thị trường.

Đường trung bình di chuyển truyền thống theo dõi giá một cách thụ động, và bộ lọc L1 chủ động dự đoán xu hướng. Khi thị trường có xu hướng thực sự, nó sẽ phản ứng nhanh hơn đường K 2-3 đường SMA.

Ba chế độ nhập học: chế độ A có tỷ lệ thắng cao nhất, chế độ B có tần suất cao nhất, chế độ C có rủi ro thấp nhất

Mô hình A (thay đổi xu hướng): Chờ bộ lọc L1 xác nhận xu hướng đảo ngược, tỷ lệ thắng khoảng 65%, nhưng tín hiệu ít hơn Mô hình B (giá vượt qua): Giá vượt qua dây lọc khi vào, tần số tín hiệu cao hơn 40% so với mô hình A, nhưng nguy cơ phá vỡ giả tăng lên Mô hình C (các xác nhận trì hoãn): Xu hướng thay đổi sau một chu kỳ nhập cảnh, tỷ lệ chiến thắng ổn định nhất nhưng có thể bỏ lỡ điểm nhập cảnh tốt nhất

Dữ liệu thực nghiệm cho thấy thị trường chấn động được đề xuất sử dụng mô hình A, mô hình B1 của thị trường xu hướng đơn phương hoạt động tốt nhất.

Lập luận đảo ngược là năng lực cạnh tranh cốt lõi: Tỷ lệ sử dụng vốn tăng 80%

Khi người nắm giữ nhiều vị trí đầu tiên gặp phải xu hướng giảm, chiến lược không chỉ đơn giản là giảm vị trí, mà là giảm vị trí.Nhanh chóng dọn dẹp và mở đầu.Các thiết kế này nổi bật trong thị trường xu hướng:

  • Chiến lược truyền thống: nhiều đầu dừng → quan sát → quay trở lại vô tuyến ((lạc 2-3 chu kỳ)
  • Chiến lược đảo ngược: đa đầu→ trực tiếp đầu rỗng ((truy chuyển không chậm trễ)

Theo khảo sát, trong các thị trường có xu hướng rõ ràng, cơ chế đảo ngược này có tỷ lệ sử dụng vốn cao hơn 80% so với các phương pháp truyền thống.

Quản lý rủi ro: 0.5% kích hoạt bảo hiểm, 2% dừng một phần, không bao giờ để lợi nhuận trở thành lỗ

Cơ chế bảo lãnh: Khi biến động đạt 0,5%, giá dừng lỗ sẽ tự động điều chỉnh gần giá mở cửa, đảm bảo không chuyển từ lợi nhuận sang thua lỗ Một phần ngứa“Sau khi tăng 2% thì tự động xóa 20% vị trí, để lợi nhuận của bạn được an toàn” ATR giảm độngATR chu kỳ: 200 đảm bảo chiến lược thích ứng với sự biến động của các thị trường khác nhau

Ý tưởng cốt lõi của hệ thống quản lý rủi ro này là:Tiêu chí của tôi là không bao giờ bỏ lỡ những gì tôi có được.

Kịch bản áp dụng rõ ràng: Thị trường xu hướng hoạt động tốt, thị trường chấn động cần thận trọng

Môi trường hoạt động tốt nhất

  • Thị trường xu hướng đơn phương (bull market/bear market)
  • Tỷ lệ dao động trung bình của các giống ((trong ngày dao động 1-3%)
  • Các giống chính có tính di động

Tránh sử dụng cảnh

  • Chu kỳ nhỏ của rung động tần số cao (dưới 5 phút)
  • Thị trường ngang có tỷ lệ biến động rất thấp
  • Các giống nhỏ có tính di chuyển kém

Khuyến cáo thiết lập tham số: cấu hình tối ưu cho các môi trường thị trường khác nhau

Thị trường chứng khoán: ATR nhân 1.5, tự thích ứng 0.6, sử dụng mô hình A Tiền điện tử: ATR nhân 2.0, tự thích ứng 0.8, sử dụng mô hình B1
Thị trường ngoại hối: ATR nhân 1,2, tự thích ứng 0,5, sử dụng mô hình A

Bảo hiểm kích hoạt đề xuất điều chỉnh theo biến động của giống: 1% cho giống biến động cao và 0,3% cho giống biến động thấp.

Dấu hiệu rủi ro: Lợi nhuận trong quá khứ không bằng lợi nhuận trong tương lai, kiểm soát rủi ro nghiêm ngặt là cơ sở để tồn tại

Rủi ro rõ ràng

  • Thị trường chấn động có thể có những tổn thất nhỏ liên tục
  • Trong trường hợp cực đoan, việc lật ngược có thể được thực hiện vào thời điểm tồi tệ nhất.
  • Điểm trượt và phí xử lý sẽ ảnh hưởng đáng kể đến thu nhập thực tế
  • Sự khác biệt lớn trong các giai đoạn khác nhau

Yêu cầu kiểm soát gió

  • Lỗ hổng rủi ro một lần không vượt quá 2% tài khoản
  • Ngưng giao dịch sau 3 lần thua lỗ liên tiếp
  • Kiểm tra định kỳ về tính phù hợp của tham số
  • Thiết bị này có thể được sử dụng cho các mục đích khác nhau.

Bản chất của chiến lược này là thay thế sự yếu đuối của con người bằng kỷ luật thuật toán, nhưng với điều kiện là bạn phải tuân thủ các quy tắc một cách nghiêm ngặt.

Mã nguồn chiến lược
/*backtest
start: 2025-02-28 00:00:00
end: 2026-02-26 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT","balance":500000,"fee":[0,0]}]
*/

// © LuxAlgo — CC BY-NC-SA 4.0
//@version=6
strategy("Trend Strategy Flip",overlay=true)

// Colors
color BULL_COLOR = #089981
color BEAR_COLOR = #f23645

// Marker colors
color COL_LONG_ENTRY   = color.new(#00ff00, 0)
color COL_SHORT_ENTRY  = color.new(#ff0000, 0)
color COL_FLIP_LONG    = color.new(#00ff00, 0)
color COL_FLIP_SHORT   = color.new(#ff0000, 0)
color COL_TP_LONG      = color.new(#ffd700, 0)
color COL_TP_SHORT     = color.new(#ff8c00, 0)
color COL_BE           = color.new(#0066ff, 0)

// Inputs
srcInput      = input.source(close, "Source")
atrMultInput  = input.float(1.5, "ATR Multiplier")
muInput       = input.float(0.6, "Adaptation Rate (μ)")

entryMode    = input.string("A",  "Entry Mode",       options=["A","B","C"])
entrySubMode = input.string("B1", "Early Entry Type", options=["B1","B2"])

exitMode  = input.string("By Trend Change", "Exit Mode",
                         options=["By Trend Change","By Price Cross","Both"])
useLongs  = input.bool(true,  "Enable Longs")
useShorts = input.bool(true,  "Enable Shorts")

useBreakeven  = input.bool(true,  "Use Breakeven")
beTriggerPerc = input.float(0.5,  "BE Trigger %")
beOffsetPerc  = input.float(0.0,  "BE Offset %")

usePartialTP   = input.bool(true, "Use Partial TP")
tpPerc         = input.float(2.0, "TP % for Partial Close")
tpQtyPerc      = input.float(20.0, "Close % at TP")


// ---------------------------------------------------------
// L1 Filter
// ---------------------------------------------------------
float atr200    = ta.atr(200)
float threshold = atr200 * atrMultInput
var float z = na
var float v = 0.0

if bar_index == 0
    z := srcInput
else
    float zPrev = z[1]
    float vPrev = v[1]
    float zPred = zPrev + vPrev
    float zTemp = zPred + muInput * (srcInput - zPred)
    float diff  = zTemp - zPrev
    v := math.abs(diff) > threshold ? math.sign(diff)*(math.abs(diff)-threshold) : 0
    z := zPrev + v

// Trend
var int trend = 0
if z > z[1]
    trend := 1
else if z < z[1]
    trend := -1

bool upChange   = trend == 1 and trend[1] == -1
bool downChange = trend == -1 and trend[1] == 1

// ---------------------------------------------------------
// Entry logic
// ---------------------------------------------------------
bool longA  = upChange
bool shortA = downChange

bool longB1  = srcInput > z and srcInput[1] <= z[1]
bool shortB1 = srcInput < z and srcInput[1] >= z[1]

bool longB2  = v > 0 and v[1] <= 0
bool shortB2 = v < 0 and v[1] >= 0

bool longC  = upChange[1]
bool shortC = downChange[1]

bool longEntryRaw  = entryMode == "A" ? longA  : entryMode == "B" ? (entrySubMode == "B1" ? longB1  : longB2) : longC
bool shortEntryRaw = entryMode == "A" ? shortA : entryMode == "B" ? (entrySubMode == "B1" ? shortB1 : shortB2) : shortC

bool longEntry  = longEntryRaw  and useLongs
bool shortEntry = shortEntryRaw and useShorts

bool inLong  = strategy.position_size > 0
bool inShort = strategy.position_size < 0

// ---------------------------------------------------------
// Exit logic
// ---------------------------------------------------------
bool priceAbove = srcInput > z
bool priceBelow = srcInput < z

bool exitLong =
     exitMode == "By Trend Change" ? downChange :
     exitMode == "By Price Cross"  ? priceBelow :
                                     (downChange or priceBelow)

bool exitShort =
     exitMode == "By Trend Change" ? upChange :
     exitMode == "By Price Cross"  ? priceAbove :
                                     (upChange or priceAbove)

// ---------------------------------------------------------
// Breakeven levels
// ---------------------------------------------------------
float beLong  = na
float beShort = na

if useBreakeven and strategy.position_size != 0
    float entry = strategy.position_avg_price
    float profit = (close - entry) / entry * 100 * (inLong ? 1 : -1)

    if inLong and profit >= beTriggerPerc
        beLong := entry * (1 + beOffsetPerc / 100)

    if inShort and profit >= beTriggerPerc
        beShort := entry * (1 - beOffsetPerc / 100)

// ---------------------------------------------------------
// Flip logic (fixed HUD update)
// ---------------------------------------------------------
bool flipLongToShort = inLong and downChange
bool flipShortToLong = inShort and upChange

if flipLongToShort
    strategy.close("Long")
    strategy.entry("Short", strategy.short)


if flipShortToLong
    strategy.close("Short")
    strategy.entry("Long", strategy.long)


// ---------------------------------------------------------
// Entry tracking
// ---------------------------------------------------------
bool newLongEntry  = longEntry  and not inLong  and not inShort
bool newShortEntry = shortEntry and not inShort and not inLong

if newLongEntry
    strategy.entry("Long", strategy.long)


if newShortEntry
    strategy.entry("Short", strategy.short)


// ---------------------------------------------------------
// Breakeven exits
// ---------------------------------------------------------
if inLong and not na(beLong)
    strategy.exit("Long BE", from_entry="Long", stop=beLong)

if inShort and not na(beShort)
    strategy.exit("Short BE", from_entry="Short", stop=beShort)

// ---------------------------------------------------------
// Partial TP logic
// ---------------------------------------------------------
float tpLong  = na
float tpShort = na

if usePartialTP and strategy.position_size != 0
    float entry = strategy.position_avg_price
    if inLong
        tpLong := entry * (1 + tpPerc / 100)
    if inShort
        tpShort := entry * (1 - tpPerc / 100)

if usePartialTP
    if inLong and not na(tpLong)
        strategy.exit("Long TP Partial", from_entry="Long", limit=tpLong, qty_percent=tpQtyPerc)
    if inShort and not na(tpShort)
        strategy.exit("Short TP Partial", from_entry="Short", limit=tpShort, qty_percent=tpQtyPerc)

// ---------------------------------------------------------
// Previous position state
// ---------------------------------------------------------
bool wasLong  = strategy.position_size[1] > 0
bool wasShort = strategy.position_size[1] < 0

// ---------------------------------------------------------
// LuxAlgo Trend Visuals
// ---------------------------------------------------------
color zColor = trend == 1 ? BULL_COLOR : BEAR_COLOR

zPlot   = plot(z, "L1 Proximal Filter", color=zColor, linewidth=3)
srcPlot = plot(srcInput, "Source Plot", color=na)

bool showFill = (trend == 1 and srcInput > z) or (trend == -1 and srcInput < z)

color fillTopColor    = showFill ? color.new(zColor, 50)  : na
color fillBottomColor = showFill ? color.new(zColor, 100) : na

fill(srcPlot, zPlot, srcInput, z, fillTopColor, fillBottomColor, "Trend Fill")

float switchVal   = (upChange or downChange) ? z[1] : na
color switchColor = upChange ? BULL_COLOR : BEAR_COLOR

plot(switchVal, "Trend Switch Dot", color=switchColor, style=plot.style_circles, linewidth=4, offset=-1)

// ---------------------------------------------------------
// TP & BE lines (transparent, disappear when inactive)
// ---------------------------------------------------------
float tpLine = inLong ? tpLong : inShort ? tpShort : na
plot(tpLine, "TP Line", color=color.new(color.yellow, 60), style=plot.style_linebr, linewidth=2)

float beLine = inLong ? beLong : inShort ? beShort : na
plot(beLine, "BE Line", color=color.new(COL_BE, 60), style=plot.style_linebr, linewidth=2)

// ---------------------------------------------------------
// BE marker (simple & perfect)
// ---------------------------------------------------------
float beLinePrev = beLine[1]

bool beLongHit  = not na(beLinePrev) and na(beLine) and wasLong
bool beShortHit = not na(beLinePrev) and na(beLine) and wasShort

plotshape(beLongHit,  "Long BE Hit",  shape.square, location.belowbar, COL_BE, size=size.small)
plotshape(beShortHit, "Short BE Hit", shape.square, location.abovebar, COL_BE, size=size.small)

// ---------------------------------------------------------
// TP markers (only real partial exits)
// ---------------------------------------------------------
bool sizeReducedLong  = wasLong  and strategy.position_size < strategy.position_size[1] and strategy.position_size > 0
bool sizeReducedShort = wasShort and strategy.position_size > strategy.position_size[1] and strategy.position_size < 0

bool tpLongHit  = sizeReducedLong  and not na(tpLong)
bool tpShortHit = sizeReducedShort and not na(tpShort)

plotshape(tpLongHit,  "Long TP Partial Hit",  shape.circle, location.abovebar, COL_TP_LONG, size=size.small)
plotshape(tpShortHit, "Short TP Partial Hit", shape.circle, location.belowbar, COL_TP_SHORT, size=size.small)

// ---------------------------------------------------------
// Entry markers
// ---------------------------------------------------------
plotshape(longEntry,  "Long Entry",  shape.triangleup,   location.belowbar, COL_LONG_ENTRY,  size=size.small)
plotshape(shortEntry, "Short Entry", shape.triangledown, location.abovebar, COL_SHORT_ENTRY, size=size.small)

// ---------------------------------------------------------
// Flip markers
// ---------------------------------------------------------
plotshape(flipLongToShort, "Flip L→S", shape.diamond, location.abovebar, COL_FLIP_SHORT, size=size.small)
plotshape(flipShortToLong, "Flip S→L", shape.diamond, location.belowbar, COL_FLIP_LONG, size=size.small)

// ---------------------------------------------------------
// Alerts
// ---------------------------------------------------------
alertcondition(longEntry,        "Long Entry",        "TSF LONG ENTRY")
alertcondition(shortEntry,       "Short Entry",       "TSF SHORT ENTRY")
alertcondition(flipLongToShort,  "Flip Long→Short",   "TSF FLIP SHORT")
alertcondition(flipShortToLong,  "Flip Short→Long",   "TSF FLIP LONG")
alertcondition(tpLongHit,        "Long TP Partial",   "TSF LONG TP PARTIAL")
alertcondition(tpShortHit,       "Short TP Partial",  "TSF SHORT TP PARTIAL")
alertcondition(beLongHit,        "Long BE",           "TSF LONG BE")
alertcondition(beShortHit,       "Short BE",          "TSF SHORT BE")