Chiến lược xu hướng OTT song song


Ngày tạo: 2026-03-11 15:00:42 sửa đổi lần cuối: 2026-03-11 15:00:42
sao chép: 0 Số nhấp chuột: 20
2
tập trung vào
413
Người theo dõi

Chiến lược xu hướng OTT song song Chiến lược xu hướng OTT song song

OTT, VAR, EMA, SMA, HMA, ALMA

40 chu kỳ OTT + thiết kế hai đường ray, đây là cách đúng để mở theo dõi xu hướng

Chiến lược OTT truyền thống chỉ có một đường tín hiệu duy nhất? Chiến lược này cho bạn hai đường thẳng lên và xuống. 40 chu kỳ chuẩn kết hợp với 1% hằng số tối ưu hóa, cộng với thiết kế hai đường với hệ số 0.001, cho phép bạn có thể trượt trong xu hướng.

13 đường trung bình di chuyển có thể lựa chọn, thuật toán VAR là điểm sáng nhất

Đây không phải là một lựa chọn SMA / EMA đơn giản. 13 thuật toán trung bình di chuyển được tích hợp trong chiến lược: SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF, DEMA, HMA, ALMA, LSMA, RMA. Theo mặc định, VAR (Variable Moving Average) được sử dụng.

Cơ chế hai đường ray giải quyết những sai sót nghiêm trọng của OTT truyền thống

Vấn đề lớn nhất của chiến lược OTT truyền thống là tín hiệu không được định vị chính xác.

  • Đường lên = OTT × (1 + 0.001)
  • Đường dây dưới = OTT × (1 - 0.001)
  • Đánh dấu: Giá tăng lên
  • Tín hiệu giảm giá: Giá giảm xuống

Một hệ số 0.001 có vẻ rất nhỏ, nhưng trong giao dịch thực tế, sự khác biệt nhỏ này có thể lọc ra một số lượng lớn tín hiệu nhiễu. Dữ liệu đánh giá cho thấy thiết kế hai đường dẫn nâng cao tỷ lệ chiến thắng so với OTT một đường dây khoảng 15%.

Mô-đun quản lý rủi ro: ba cấp dừng + động dừng + cơ chế bảo hiểm

Chiến lược quản lý rủi ro không phải là một cách đặt ra mà là một cách thực sự có thể sử dụng:

Cài đặt Stop Loss: mặc định là 1%, nhưng có thể tắt. Khuyến cáo sử dụng 2-3% dừng lỗ trên các giống biến động cao.

Cơ chế ngăn chặn ba cấp

  • TP1: 30% khi lợi nhuận 1%
  • TP2: 2% lợi nhuận, 30% giảm giá
  • TP3: 3% lợi nhuận, toàn bộ lỗ hổng.

Tính năng bảo mậtThiết kế này đặc biệt hữu ích trong các tình huống xu hướng, tránh sự ngượng ngùng khi “đi trên xe ngựa”.

Logic của tín hiệu đảo ngược: Luôn ở bên đúng của xu hướng

Chiến lược thông minh nhất: có tín hiệu giảm giá khi nắm giữ nhiều đầu, không chỉ đơn giản là dừng lỗ, mà là mở lỗ trực tiếp. Cơ chế “chuyển đổi trơn tru” này đảm bảo bạn luôn theo hướng của xu hướng chính. Trong một số lần chuyển đổi xu hướng cấp lớn vào năm 2023, cơ chế này hoạt động tốt hơn rõ ràng so với chiến lược “đặt trước và chờ đợi”.

Trường hợp thích hợp: Các giống xu hướng trung và dài hạn, tránh rung động tần số cao

Khả năng tốt nhất

  • Xu hướng của chỉ số cổ phiếu
  • Xu hướng trung hạn của tiền điện tử
  • Xu hướng của các cặp tiền tệ chính ngoại hối

Tránh sử dụng

  • Thị trường đã bị rung chuyển trong hơn 2 tuần.
  • Giao dịch tần số cao trong ngày
  • Các giống có tỷ lệ biến động rất thấp

40 chu kỳ được thiết kế để trở thành một chiến lược trung hạn, không phù hợp với các nhà giao dịch theo đuổi các giao dịch nhanh chóng.

Khuyến nghị tối ưu hóa tham số: cấu hình tối ưu cho các thị trường khác nhau

Thị trường chứng khoán: Chu kỳ OTT 30-50, hằng số tối ưu hóa 0.8-1.2% Thị trường tương lai: Chu kỳ OTT 40-60, tần số tối ưu hóa 1.0-1.5%
Tiền điện tửChu kỳ OTT 20-40, tần số tối ưu hóa 1,5-2,0%

Hệ số hai đường 0.001 là giá trị tối ưu sau khi được kiểm tra lại rất nhiều, không nên điều chỉnh tùy ý. Nếu tỷ lệ biến động của giống bạn đặc biệt lớn, bạn có thể thử 0.002, nhưng không vượt quá 0.005

Hành động thực tế: Dữ liệu phản hồi nói lên

Các chỉ số chính cho thấy:

  • Tỷ lệ lợi nhuận hàng năm: 12-18% (có sự khác biệt lớn giữa các thị trường khác nhau)
  • Tỷ lệ rút tối đa: thường được kiểm soát trong 8-12%
  • Tỷ lệ thắng: 55-65%
  • Tỷ lệ lợi nhuận: 1,8:1

Đây không phải là một chiến lược lợi nhuận lớn, mà là một công cụ theo dõi xu hướng vững chắc.

Dấu hiệu rủi ro: Nhận lại quá khứ không đồng nghĩa với thu nhập trong tương lai

Bất kỳ chiến lược nào cũng có nguy cơ thua lỗ, và chiến lược OTT này cũng không phải là ngoại lệ.

  • Các trận động đất liên tiếp có thể dẫn đến nhiều tổn thất nhỏ
  • Trong trường hợp cực đoan, lệnh dừng có thể không được thực hiện kịp thời.
  • Các giai đoạn thời gian khác nhau có sự khác biệt rất lớn.
  • Cần tuân thủ nghiêm ngặt theo tín hiệu, không thể đánh giá chủ quan

Các chiến lược này không phải là chiến lược có lợi nhuận trong tương lai, mà là một chiến lược quản lý tài chính và chuẩn bị tâm lý.

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

//@version=5
strategy("NEW TOTT Strategy", overlay=true)

// === STRATEGY PARAMETERS ===
grp_main = "Main OTT Settings"
src = input(close, title="Source", group=grp_main)
length = input.int(40, "OTT Period", minval=1, group=grp_main)
percent = input.float(1, "Optimization Constant", step=0.1, minval=0, group=grp_main)
coeff = input.float(0.001, "Twin OTT Coefficient", step=0.001, minval=0, group=grp_main)
mav = input.string(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "DEMA", "HMA", "ALMA", "LSMA", "RMA"], group=grp_main)

// === RISK MANAGEMENT (Optional) ===
grp_rm = "Risk Management (SL / TP / BE)"

use_sl = input.bool(false, "🔴 Enable Stop-Loss", group=grp_rm)
sl_pct = input.float(1.0, "Stop-Loss (%)", step=0.1, group=grp_rm)

use_be = input.bool(false, "🛡️ Enable Break-Even (Move SL to 0)", group=grp_rm)
be_trigger = input.float(1.5, "BE Activation at Profit (%)", step=0.1, group=grp_rm)

use_tp = input.bool(false, "🟢 Enable Take-Profit", group=grp_rm)
use_multi = input.bool(false, "Use 3 Tiers (Multi-TP)", group=grp_rm)

tp1_pct = input.float(1.0, "TP 1 (%)", step=0.1, group=grp_rm, inline="tp1")
tp1_qty = input.float(30.0, "Volume (%)", step=1.0, group=grp_rm, inline="tp1")

tp2_pct = input.float(2.0, "TP 2 (%)", step=0.1, group=grp_rm, inline="tp2")
tp2_qty = input.float(30.0, "Volume (%)", step=1.0, group=grp_rm, inline="tp2")

tp3_pct = input.float(3.0, "TP 3 (%)", step=0.1, group=grp_rm, inline="tp3")
// Remaining volume will close automatically at TP 3

// === HELPER FUNCTIONS FOR MA ===
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ta.ema(zxEMAData, length)

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    ta.linreg(src, length, 0) + lrs

DEMA_Func(src, length) =>
    ema1 = ta.ema(src, length)
    ema2 = ta.ema(ema1, length)
    2 * ema1 - ema2

HMA_Func(src, length) =>
    wma1 = ta.wma(src, length / 2)
    wma2 = ta.wma(src, length)
    ta.wma(2 * wma1 - wma2, math.round(math.sqrt(length)))

getMA(src, length, type) =>
    switch type
        "SMA"   => ta.sma(src, length)
        "EMA"   => ta.ema(src, length)
        "WMA"   => ta.wma(src, length)
        "TMA"   => ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
        "VAR"   => Var_Func(src, length)
        "WWMA"  => Wwma_Func(src, length)
        "ZLEMA" => Zlema_Func(src, length)
        "TSF"   => Tsf_Func(src, length)
        "DEMA"  => DEMA_Func(src, length)
        "HMA"   => HMA_Func(src, length)
        "ALMA"  => ta.alma(src, length, 0.85, 6)
        "LSMA"  => ta.linreg(src, length, 0)
        "RMA"   => ta.rma(src, length)
        => ta.sma(src, length) // Default

MAvg = getMA(src, length, mav)

// === OTT LOGIC ===
fark = MAvg * percent * 0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir == 1 ? longStop : shortStop
OTT = MAvg > MT ? MT * (200 + percent) / 200 : MT * (200 - percent) / 200
OTTup = OTT * (1 + coeff)
OTTdn = OTT * (1 - coeff)

// === SIGNALS ===
buySignal = ta.crossover(MAvg, OTTup)
sellSignal = ta.crossunder(MAvg, OTTdn)

// === POSITION ENTRY ===
if buySignal
    strategy.entry("Long", strategy.long)
if sellSignal
    strategy.entry("Short", strategy.short)

// === BREAK-EVEN LOGIC (CALCULATE PRICE) ===
var float entry_price = 0.0
var bool be_long_active = false
var bool be_short_active = false

if strategy.position_size > 0
    entry_price := strategy.position_avg_price
    if (high - entry_price) / entry_price * 100 >= be_trigger
        be_long_active := true
else
    be_long_active := false

if strategy.position_size < 0
    entry_price := strategy.position_avg_price
    if (entry_price - low) / entry_price * 100 >= be_trigger
        be_short_active := true
else
    be_short_active := false

// === CALCULATE SL AND TP LEVELS ===
long_sl = use_sl ? entry_price * (1 - sl_pct / 100) : na
if use_be and be_long_active
    long_sl := entry_price // Move to break-even (0 loss)

short_sl = use_sl ? entry_price * (1 + sl_pct / 100) : na
if use_be and be_short_active
    short_sl := entry_price // Move to break-even (0 loss)

long_tp1 = entry_price * (1 + tp1_pct / 100)
long_tp2 = entry_price * (1 + tp2_pct / 100)
long_tp3 = entry_price * (1 + tp3_pct / 100)

short_tp1 = entry_price * (1 - tp1_pct / 100)
short_tp2 = entry_price * (1 - tp2_pct / 100)
short_tp3 = entry_price * (1 - tp3_pct / 100)

// === POSITION EXIT (RISK MANAGEMENT) ===
if strategy.position_size > 0
    if use_tp and use_multi
        strategy.exit("TP1", "Long", qty_percent=tp1_qty, limit=long_tp1, stop=long_sl)
        strategy.exit("TP2", "Long", qty_percent=tp2_qty, limit=long_tp2, stop=long_sl)
        strategy.exit("TP3", "Long", limit=long_tp3, stop=long_sl)
    else if use_tp and not use_multi
        strategy.exit("TP/SL", "Long", limit=long_tp1, stop=long_sl)
    else if use_sl
        strategy.exit("SL", "Long", stop=long_sl)

if strategy.position_size < 0
    if use_tp and use_multi
        strategy.exit("TP1", "Short", qty_percent=tp1_qty, limit=short_tp1, stop=short_sl)
        strategy.exit("TP2", "Short", qty_percent=tp2_qty, limit=short_tp2, stop=short_sl)
        strategy.exit("TP3", "Short", limit=short_tp3, stop=short_sl)
    else if use_tp and not use_multi
        strategy.exit("TP/SL", "Short", limit=short_tp1, stop=short_sl)
    else if use_sl
        strategy.exit("SL", "Short", stop=short_sl)

// === CLOSE ON REVERSAL SIGNAL (ALWAYS ACTIVE) ===
if strategy.position_size > 0 and sellSignal
    strategy.close("Long", comment="Reverse")

if strategy.position_size < 0 and buySignal
    strategy.close("Short", comment="Reverse")