Chiến lược theo dõi xu hướng động lực

Tác giả:ChaoZhang, Ngày: 2023-11-07 16:49:49
Tags:

img

Tổng quan

Chiến lược này dựa trên phân tích xu hướng của đường trung bình động và khối lượng, thiết lập các chỉ số động lực và thực hiện các hoạt động mua và bán bằng cách theo dõi xu hướng.

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

  1. Tính toán EMA của giá đóng cửa và EMA tích lũy của khối lượng
  2. Khi kết thúc vượt qua EMA, nó được đánh giá là xu hướng tăng và vị trí dài được thực hiện
  3. Khi tiếp tục tăng, đóng chéo trên 2 lần EMA tích lũy, thêm vào vị trí dài
  4. Đặt chỉ số RSI, khi RSI vượt quá 90, đóng 1/3 vị trí để lấy lợi nhuận
  5. Khi đóng chéo dưới EMA, nó được đánh giá là xu hướng giảm, đóng tất cả các vị trí dài
  6. Khi đóng chéo dưới EMA, nó được đánh giá là xu hướng giảm, mua vị trí ngắn
  7. Đặt đường dừng lỗ ở tỷ lệ phần trăm cố định của giá nhập cảnh
  8. Lợi nhuận của vị trí ngắn giống như vị trí dài

Phân tích lợi thế

Những lợi thế chính của chiến lược này là:

  1. Sử dụng EMA để đánh giá xu hướng có thể theo dõi xu hướng một cách hiệu quả
  2. Sử dụng EMA tích lũy khối lượng để đánh giá những thay đổi xu hướng thực sự
  3. Chỉ số RSI theo dõi động lực cho việc thu lợi nhuận
  4. Kiểm soát rủi ro tốt với lệnh dừng lỗ
  5. Có thể thích nghi với các điều kiện thị trường khác nhau, các thông số có thể được điều chỉnh linh hoạt

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. EMA đang tụt hậu, có thể bỏ lỡ những bước ngoặt
  2. Khối lượng có thể không luôn phản ánh xu hướng thực tế
  3. Lượng lỗ dừng cố định có thể quá cơ chế
  4. Quá nhiều tham số làm cho điều chỉnh tham số khó khăn
  5. Tần suất giao dịch cao dẫn đến chi phí giao dịch cao

Giải pháp rủi ro:

  1. Tối ưu hóa các thông số EMA để giảm chậm trễ
  2. Kết hợp với các chỉ số khác để xác nhận tín hiệu âm lượng
  3. Tối ưu hóa điểm dừng lỗ dựa trên điều kiện thị trường
  4. Đơn giản hóa các tham số, chỉ giữ các thiết lập chính
  5. Thư giãn stop loss và tần suất giao dịch một cách thích hợp

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

Chiến lược này có thể được tối ưu hóa trong các khía cạnh sau:

  1. Kiểm tra các thiết lập tham số EMA khác nhau để tìm kết hợp tối ưu
  2. Thêm số nhân âm lượng như đánh giá cường độ tín hiệu cho nhập
  3. Kết hợp với MACD, KD và các chỉ số khác để xác nhận nhập cảnh
  4. Tối ưu hóa tỷ lệ dừng lỗ theo đặc điểm của các cổ phiếu cụ thể
  5. Tối ưu hóa tần suất giao dịch để giảm chi phí giao dịch

Tóm lại

Tóm lại, đây là một chiến lược theo dõi xu hướng dựa trên hệ thống trung bình động. Ý tưởng cốt lõi là sử dụng EMA để xác định hướng xu hướng và xác nhận nhập cảnh bằng chỉ số động lượng VOLUME. Nó có thể được tối ưu hóa liên tục thông qua điều chỉnh tham số và được hỗ trợ bởi các chỉ số khác để xác nhận thêm. Nhìn chung, đây là một chiến lược theo dõi xu hướng linh hoạt, có thể mang lại lợi nhuận tốt sau khi sử dụng thành thạo.


/*backtest
start: 2023-10-30 00:00:00
end: 2023-11-06 00:00:00
period: 5m
basePeriod: 1m
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("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=5, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(25, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(true, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

cumValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

emaCumValue1=ema(cumValue, emaLength)
emaCumValue2=ema(cumValue, emaLength*2)

emaCumValueHistory=ema(cumValue[emaLength], emaLength)


//vwapVal1=vwap(hlc3)

rsiVal=rsi(close,5)

plotEma=plot(emaVal, title="EMA", color=color.green,  transp=25)
//plot(vwapValue, title="Cumulate Volumne", color=color.orange,  linewidth=2, transp=25)
//plot(vwapVal1, title="vwapVal1", color=color.purple,  linewidth=1, transp=25)
plotCum=plot(emaCumValue1, title="emaVwapValue", color=color.purple,  linewidth=2, transp=35)
plot(emaCumValue2, title="emaVwapValue", color=color.yellow,  linewidth=3, transp=25)
fill(plotEma,plotCum, color=emaVal>emaCumValue1 ? color.lime : color.red, transp=35, title="ema and cum area")

plot(emaCumValueHistory, title="emaCumValueHistory", color=color.black,  linewidth=2, transp=25)



//bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

//strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=strategy.position_size==0 and crossover(emaVal, emaCumValue1)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//re-entry
rentryCondition1=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValue2 and crossover(close, emaCumValue2) and close>open and  (tradeDirection=="LONG")
strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition1 )

rentryCondition2=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValueHistory and crossover(close, emaCumValueHistory) and close>open and  (tradeDirection=="LONG")
//strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition2 )    


//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )
//if(takePartialProfits==true)
    //strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])

strategy.close(id="LE", comment="PExit Points=>"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and  takePartialProfits == true and close>=takeProfit and crossunder(rsiVal,90) )

profitVal=    strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )

//strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="Exit Points=>"+tostring(close-strategy.position_avg_price, "###.##"), when=  crossunder(emaVal, emaCumValue1) and (tradeDirection=="LONG") )


strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=crossunder(emaVal, emaCumValue1) and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)


//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  crossover(rsiVal,15) )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<emaCumValue1 and close>emaCumValue1 and open>emaCumValue1 and close>open )   or (crossover(emaVal,emaCumValue1))  ) and (tradeDirection=="SHORT") )

//strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )
strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  crossover(emaVal, emaCumValue1)   and (tradeDirection=="SHORT"   ) )



Thêm nữa