Chiến lược định hướng xuyên chu kỳ


Ngày tạo: 2023-09-27 16:30:51 sửa đổi lần cuối: 2023-09-27 16:30:51
sao chép: 0 Số nhấp chuột: 684
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này sử dụng các chỉ số kỹ thuật xuyên chu kỳ để 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 để thực hiện giao dịch theo dõi xu hướng có rủi ro thấp.

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

  1. Sử dụng phá vỡ điểm cao thấp để đánh giá tín hiệu mua bán. Khi giá phá vỡ mức cao 7 chu kỳ, hãy nhìn xuống và khi phá vỡ mức thấp 7 chu kỳ, hãy nhìn nhiều hơn.

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

  3. Sự biến động của Bollinger Bands mang lại sự nhận biết khu vực chấn động. Khi giá gần ở trong vùng, hãy tránh làm quá nhiều.

  4. Sử dụng dừng di động và dừng di động để quản lý vị trí.

Phân tích lợi thế

  1. Các chỉ số xuyên thời kỳ kết hợp với kỹ thuật vuông hai, có thể xác định hiệu quả hướng xu hướng và tránh bị ảnh hưởng bởi thị trường rung động.

  2. Trong khi đó, các tín hiệu giao dịch được tính đến hướng xu hướng và quy luật biến động để có thể tin cậy hơn.

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

  4. Các chiến lược rất đơn giản, dễ hiểu và dễ thực hiện.

Phân tích rủi ro

  1. Các tín hiệu phá vỡ có thể xảy ra phá vỡ giả, do đó tạo ra giao dịch sai. Bạn có thể xem xét thêm các điều kiện ngắt quãng.

  2. Các tham số chu kỳ cố định không thể thích ứng với sự thay đổi của thị trường, bạn có thể xem xét các tham số tối ưu hóa động.

  3. Không có giá dừng, không thể ngăn chặn thiệt hại lớn từ các hoạt động cực đoan.

  4. Điểm dừng lỗ là cố định, không thể điều chỉnh thông minh theo biến động thị trường.

Hướng tối ưu hóa

  1. Có thể xem xét thêm các chỉ số đánh giá xu hướng, tạo ra một danh mục chiến lược, tăng độ chính xác đánh giá.

  2. Thêm mô-đun nhận diện động đất, tạm dừng giao dịch khi động đất mạnh, giảm rủi ro.

  3. Giới thiệu thuật toán học máy để tối ưu hóa động của tham số.

  4. Thêm mô-đun dừng lỗ giá, bạn có thể dừng lỗ và rút ra khi lỗ đạt đến một mức giảm giá nhất định.

  5. Điều chỉnh thông minh cho Stop Loss dựa trên tỷ lệ Stop Loss dựa trên biến động thị trường.

Tóm tắt

Chiến lược này nói chung là khá ổn định và đáng tin cậy, đồng thời cũng có một số không gian cải tiến. Ý tưởng cốt lõi là đánh giá xu hướng xu hướng xuyên chu kỳ, sau đó kết hợp với chỉ số cường độ xu hướng và chỉ số dao động để lọc, để phát ra tín hiệu chất lượng cao. Chiến lược này đơn giản và thực tế, rất phù hợp để theo dõi xu hướng đường dài.

Mã nguồn chiến lược
/*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")