Chiến lược hợp nhất trung bình động động lượng


Ngày tạo: 2024-01-25 11:39:00 sửa đổi lần cuối: 2024-01-25 11:39:00
sao chép: 0 Số nhấp chuột: 682
1
tập trung vào
1617
Người theo dõi

Chiến lược hợp nhất trung bình động động lượng

Tổng quan

Chiến lược này chủ yếu sử dụng HMA di chuyển và EMA hình thành cân bằng đường để xác định thời gian mua. Khi HMA đeo EMA được coi là kết thúc của sự cân bằng, tạo ra xu hướng tăng mới, do đó mua cùng lúc với EMA đeo trên HMA.

Chiến lược này kết hợp với chỉ số RSI để phát hiện tình trạng quá mua quá bán. Mua được phép khi RSI thấp hơn 70 và xem xét một phần dừng khi RSI cao hơn 80.

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

Chiến lược này sử dụng 200 chu kỳ EMA và HMA để xây dựng hệ thống đường trung bình. Trong đó, chỉ số HMA là một chỉ số trung bình di chuyển nhạy cảm hơn dựa trên thiết kế cải tiến của EMA. Khi HMA đeo EMA, nó cho thấy giai đoạn thu hẹp kết thúc và giá cổ phiếu bắt đầu tăng.

Trong trường hợp đã tạo vị trí, nếu giá cổ phiếu giảm trở lại, HMA sẽ giảm EMA một lần nữa, cho thấy việc cân bằng mới bắt đầu, tất cả sẽ bị xóa. Trong khi đó, nếu RSI trên 80 sẽ bị dừng một phần 20% để ngăn chặn tổn thất.

Lịch lý giao dịch của chiến lược này khá đơn giản, chủ yếu là giao dịch đa chiều của HMA và EMA, kết hợp với phán đoán cao và thấp của RSI, tạo thành một chiến lược giao dịch mạnh mẽ hơn.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là sử dụng EMA và HMA để cân bằng hình thức giao dịch, có thể lọc phần lớn các lỗ hổng sai, do đó tăng tỷ lệ lợi nhuận. Đồng thời, sự trợ giúp của chỉ số RSI cũng có thể kiểm soát rủi ro hiệu quả, sự kết hợp của cả hai làm cho chiến lược này rất phù hợp với thị trường biến động.

Ngoài ra, chiến lược chỉ sử dụng 3 chỉ số và logic đơn giản, điều này làm cho các tham số của nó được tối ưu hóa và đo lường lại dễ dàng hơn, có lợi cho việc xác minh và cải thiện chiến lược.

Phân tích rủi ro

Mặc dù chiến lược này có một số ưu điểm, nhưng vẫn có một số rủi ro cần lưu ý. Ví dụ, thời gian giữ vị trí có thể dài hơn, cần có sự hỗ trợ tài chính đầy đủ. Nếu gặp phải thời gian sắp xếp ngang, không thể thoát khỏi lỗ nhanh chóng, dễ bị tổn thất.

Ngoài ra, chiến lược này phụ thuộc chủ yếu vào chỉ số đường trung bình, nếu giá phá vỡ bất thường, các biện pháp ngăn chặn có thể không có tác dụng và mang lại rủi ro lớn hơn. Ngoài ra, cài đặt tham số cũng ảnh hưởng đến hiệu suất của chiến lược, cần phải thử nghiệm rất nhiều để tìm ra tham số tối ưu.

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

Với những rủi ro nêu trên, chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Kết hợp với chỉ số biến động, điều chỉnh vị trí động theo biến động của thị trường.

  2. Tăng khả năng đánh giá các chỉ số xu hướng, tránh các giao dịch đảo ngược không cần thiết.

  3. Tối ưu hóa các tham số trung bình di chuyển để nó gần gũi hơn với các đặc điểm thị trường hiện tại.

  4. Sử dụng thời gian để giảm bớt thiệt hại, tránh được các vấn đề về tổn thất đơn lẻ.

Tóm tắt

Chiến lược này nói chung là một chiến lược biến động tổng hợp đơn giản và tương đối cổ điển. Nó được sử dụng chủ yếu cho giao dịch ngắn và trung hạn của chỉ số cổ phiếu và cổ phiếu phổ biến, có thể có được giá trị Alpha tương đối ổn định. Với việc tối ưu hóa các tham số và tăng cường các biện pháp kiểm soát rủi ro, hiệu suất của chiến lược này vẫn có nhiều chỗ nâng cao.

Mã nguồn chiến lược
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee

//@version=4
strategy(title="EMA_HMA_RSI_Strategy", overlay=true, pyramiding=2,     default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD)  //default_qty_value=10, default_qty_type=strategy.fixed, 

//longCondition = crossover(sma(close, 14), sma(close, 28))
//if (longCondition)
    //strategy.entry("My Long Entry Id", strategy.long)

//shortCondition = crossunder(sma(close, 14), sma(close, 28))
//if (shortCondition)
  //  strategy.entry("My Short Entry Id", strategy.short)

//HMA
HMA(src1, length1) =>  wma(2 * wma(src1, length1/2) - wma(src1, length1), round(sqrt(length1)))

var stopLossVal=0.00

//variables BEGIN
length=input(200,title="EMA and HMA Length")   //square root of 13

rsiLength=input(13, title="RSI Length")

takePartialProfits = input(true, title="Take Partial Profits (if this selected, RSI 13 higher reading over 80 is considered for partial closing ) ")

stopLoss = input(title="Stop Loss%", defval=8, minval=1)
//variables  END

//RSI 
rsi13=rsi(close,rsiLength)


ema200=ema(close,length)
hma200=HMA(close,length)

//exitOnAroonOscCrossingDown = input(true, title="Exit when Aroon Osc cross down zero ")


// Drawings

//Aroon oscillator

arronUpper = 100 * (highestbars(high, length+1) + length)/length
aroonLower = 100 * (lowestbars(low, length+1) + length)/length

aroonOsc  = arronUpper - aroonLower

aroonMidpoint = 0
//oscPlot = plot(aroonOsc, color=color.green)
//midLine= plot(aroonMidpoint, color=color.green)
//topLine = plot(90,style=plot.style_circles, color=color.green)
//bottomLine = plot(-90,style=plot.style_circles, color=color.red)

//fill(oscPlot, midLine, color=aroonOsc>0?color.green:color.red, transp=50)
//fill(topLine,bottomLine, color=color.blue)
//fill(topLine,oscPlot, color=aroonOsc>90?color.purple:na, transp=25)


// RSI 
//plot(rsi13, title="RSI", linewidth=2, color=color.purple)
//hline(50, title="Middle Line", linestyle=hline.style_dotted)
//obLevel = hline(80, title="Overbought", linestyle=hline.style_dotted)
//osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted)
//fill(obLevel, osLevel, title="Background", color=rsi13 >=30 ? color.green:color.purple, transp=65)  // longTermRSI >=50

hullColor = hma200 > hma200[2] ? #00ff00 : #ff0000

plot(hma200, title="HULL 200", color=hullColor,  transp=25)
plot(ema200, title="EMA 200", color=color.orange)

//Entry--
strategy.initial_capital = 50000
strategy.entry(id="Long Entry", comment="LE", qty=(strategy.initial_capital * 0.10)/close, long=true,  when=strategy.position_size<1 and hma200 < ema200   and  hma200 > hma200[2]  and rsi13<70 )     //  // aroonOsc<0

//Add
if(strategy.position_size>=1 and  close < strategy.position_avg_price and  ( crossover(rsi13,30) or  crossover(rsi13,40) ) )   // hma200 < ema200   and  hma200 > hma200[2]   and hma200[2] < hma200[3] )  //and crossover(rsi13,30)  aroonOsc<0    //and hma200 > hma200[2]  and hma200[2] <= hma200[3]  //crossover(rsi13,30)
    qty1=(strategy.initial_capital * 0.10)/close
    //stopLossVal:= abs(strategy.position_size)>1 ?  ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 
    strategy.entry(id="Long Entry", comment="Add", qty=qty1, long=true )     //crossover(close,ema34)  //and close>ema34  //crossover(rsi5Val,rsiBuyLine)  --   SL="+tostring(stopLossVal, "####.##")


//stopLossVal:= abs(strategy.position_size)>1 ? strategy.position_avg_price*(1-0.5) : 0.00 

stopLossVal:= abs(strategy.position_size)>1 ?  ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 
//stopLossVal:= abs(strategy.position_size)>1 ?  strategy.position_avg_price*(1-stopLoss*0.01) :  0.00

barcolor(color=strategy.position_size>=1? rsi13>80 ? color.purple: color.blue:na)

//close partial
if(takePartialProfits==true)
    strategy.close(id="Long Entry", comment="Partial X  points="+tostring(close - strategy.position_avg_price, "####.##"),  qty_percent=20 , when=abs(strategy.position_size)>=1 and crossunder(rsi13, 80)  and close > strategy.position_avg_price  )   //close<ema55 and rsi5Val<20 //ema34<ema55



//close All
//if(exitOnAroonOscCrossingDown)
  //  strategy.close(id="Long Entry", comment="Exit All points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and crossunder(aroonOsc, 0) )   //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89

//close All on stop loss
strategy.close(id="Long Entry", comment="Stoploss X points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and close < stopLossVal  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89

strategy.close(id="Long Entry", comment="hmaXema X points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and close > strategy.position_avg_price  and  crossunder(hma200,ema200)  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89