Chiến lược đảo ngược rùa Eltrut

Tác giả:ChaoZhang, Ngày: 2023-09-27 16:30:51
Tags:

Tổng quan

Chiến lược này sử dụng các chỉ số kỹ thuật xuyên giai đoạn để xác định hướng xu hướng, kết hợp với lọc xu hướng và lọc biến động, để đạt được giao dịch theo dõi xu hướng có rủi ro thấp.

Chiến lược logic

  1. Sử dụng các bước đột phá điểm cao thấp để xác định tín hiệu mua và bán. Đi ngắn khi giá vượt qua mức cao 7 giai đoạn và đi dài khi nó vượt qua mức thấp 7 giai đoạn.

  2. Chỉ số Trendflex xác định hướng xu hướng chính. Chỉ số này kết hợp các kỹ thuật làm mịn đôi và có thể xác định hiệu quả các đoạn trung tâm xu hướng. Giá trị trên 1 cho thấy xu hướng tăng, trong khi giá trị dưới -1 cho thấy xu hướng giảm. Ở đây chúng ta yêu cầu Trendflex > 1 cho dài và < -1 cho ngắn, do đó lọc các trạng thái hợp nhất.

  3. Sử dụng Bollinger Bands để xác định phạm vi dao động. Tránh mua dài và mua ngắn khi giá đóng nằm trong dải.

  4. Sử dụng stop loss di chuyển và lấy lợi nhuận để quản lý các vị trí.

Phân tích lợi thế

  1. Các chỉ số chéo thời gian kết hợp với các kỹ thuật làm mịn đôi có thể xác định hiệu quả hướng xu hướng và tránh các thị trường dao động.

  2. Xem xét cả hướng xu hướng và mô hình biến động làm cho tín hiệu giao dịch đáng tin cậy hơn.

  3. Các thiết lập dừng lỗ và lấy lợi nhuận hợp lý khóa lợi nhuận và ngăn chặn tổn thất mở rộng.

  4. Chiến lược tương đối đơn giản và dễ thực hiện.

Phân tích rủi ro

  1. Các tín hiệu đột phá có thể có những đột phá sai, dẫn đến các giao dịch sai.

  2. Các tham số chu kỳ cố định không thể thích nghi với những thay đổi của thị trường.

  3. Thiếu giá dừng lại không thể ngăn chặn tổn thất lớn từ điều kiện thị trường cực đoan.

  4. Các điểm lấy lợi nhuận và dừng lỗ cố định không thể được điều chỉnh một cách thông minh theo biến động thị trường.

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

  1. Xem xét thêm các chỉ số đánh giá xu hướng để tạo thành một sự kết hợp chiến lược để cải thiện độ chính xác đánh giá.

  2. Thêm các mô-đun nhận dạng dao động để tạm dừng giao dịch khi dao động nghiêm trọng để giảm rủi ro.

  3. Đưa ra các thuật toán học máy để đạt được tối ưu hóa tham số động.

  4. Thêm các mô-đun dừng lỗ giá để dừng lỗ khi lỗ đạt đến ngưỡng nhất định.

  5. Tính toán tỷ lệ lấy lợi nhuận và dừng lỗ dựa trên sự biến động của thị trường để đạt được điều chỉnh thông minh về lấy lợi nhuận và dừng lỗ.

Tóm lại

Nhìn chung, chiến lược này tương đối ổn định và đáng tin cậy, đồng thời cũng có chỗ để cải thiện. Ý tưởng cốt lõi là xác định hướng xu hướng qua các chu kỳ, và sau đó lọc bằng các chỉ số sức mạnh xu hướng và chỉ số biến động để tạo ra các tín hiệu chất lượng cao. Chiến lược đơn giản và thực tế này rất phù hợp để theo dõi xu hướng trung và dài hạn. Bằng cách giới thiệu nhiều phán đoán có điều kiện và tối ưu hóa tham số động, hiệu ứng chiến lược có thể được cải thiện hơn nữa.


/*backtest
start: 2023-08-27 00:00:00
end: 2023-09-26 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Eltrut", shorttitle="Eltrut Strat", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075)

testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


// R E F L E X / T R E N D F L E X

f_supersmoother(_src,_len)=>
    pi = 2 * asin(1)
    _a = exp(-sqrt(2) * pi / _len)
    _c2 = 2 * _a * cos(sqrt(2) * pi / _len)
    _c3 = -_a * _a
    _c1 = 1 - _c2 - _c3
    _out = 0.0
    _out := _c1 * _src + _c2 * nz(_out[1],nz(_src[1],_src)) + _c3 * nz(_out[2],nz(_src[2],nz(_src[1],_src)))

f_IQIFM(_src1,_max)=>
    _src = _src1 < 0.001 ? _src1 * 10000 : _src1
    _imult = 0.635, _qmult = 0.338 , _inphase = 0.0, _quad = 0.0
    _re = 0.0, _im = 0.0, _deltaphase = 0.0, _instper = 0.0, _per = 0.0, _v4 = 0.0
    _v1 = _src - nz(_src[7])
    _inphase := 1.25 * (nz(_v1[4]) - _imult * _v1[2]) + _imult * nz(_inphase[3])
    _quad := _v1[2] - _qmult * _v1 + _qmult * nz(_quad[2])
    _re := 0.2 * (_inphase * _inphase[1] + _quad * _quad[1]) + 0.8 * nz(_re[1])
    _im := 0.2 * (_inphase * _quad[1] - _inphase[1] * _quad) + 0.8 * nz(_im[1])
    if _re != 0.0
        _deltaphase := atan(_im / _re)
    for i = 0 to _max
        _v4 := _v4 + _deltaphase[i]
        if _v4 > 4 * asin(1) and _instper == 0.0
            _instper := i
    if _instper == 0.0
        _instper := nz(_instper[1])
    _per := 0.25 * _instper + 0.75 * nz(_per[1])
    _per

f_flex(_src1, _fixed_len, _reflex) =>
    _src = _src1
    _len = _fixed_len 
    _ss1 = f_supersmoother(_src, _len)
    _ss = _ss1
    _slope = (_ss[_len] - _ss) / _len
    _sum = 0.0
    for _i = 1 to _len
        _c1 = _reflex ? _ss + _i * _slope - _ss[_i] : _ss - _ss[_i]
        _sum := _sum + _c1
    _sum := _sum / _len
    _ms = 0.0
    _ms := 0.04 * pow(_sum,2) + 0.96 * nz(_ms[1])
    _flex1 = _ms != 0 ? _sum / sqrt(nz(_ms)) : 0.0
    _flex = _flex1
    _flex

rflx = f_flex(close, 20, true)  
trndflx = f_flex(close, 20, false)   

// S I G N A L
hi7 = highest(7)
lo7 = lowest(7)
long_cond = crossunder(close, lo7[1])
short_cond = crossover(close, hi7[1])

// F I L T E R S

long_filter1 = trndflx < 1
short_filter1 = trndflx > -1

basis = sma(close, 35)
dev = 3 * stdev(close, 35)
long_filter2 = close > basis - dev
short_filter2 = close < basis + dev

// S T R A T E G Y

long = long_cond and long_filter1 and long_filter2
short = short_cond and short_filter1 and short_filter2

if( true)
    strategy.entry("Long", strategy.long, when = long)
    strategy.entry("Long", strategy.long, when = short)


// User Options to Change Inputs (%)
stopPer = input(3, title='Stop Loss %', type=input.float) / 100
takePer = input(9, title='Take Profit %', type=input.float) / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

if strategy.position_size > 0 
    strategy.exit(id="Exit Long", stop=longStop, limit=longTake)
if strategy.position_size < 0 
    strategy.exit(id="Exit Short", stop=shortStop, limit=shortTake)


// P L O T 

plotshape(long, color = #1e90ff, text = "", style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(short, color = #ff69b4, text = "", style=shape.triangledown, location=location.abovebar, size=size.tiny)

alertcondition(long, "Long", "Enter Long")
alertcondition(short, "Short", "Enter S")

Thêm nữa