Chiến lược theo xu hướng động lượng


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

Chiến lược theo xu hướng động lượng

Tổng quan

Chiến lược này dựa trên phân tích xu hướng của trung bình di chuyển và khối lượng giao dịch, thiết lập chỉ số động lượng và thực hiện giao dịch theo xu hướng.

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

  1. Tính EMA trung bình của giá đóng và EMA trung bình tích lũy của khối lượng giao dịch
  2. Khi gần trên đeo EMA đánh giá là xu hướng tăng lên, thực hiện thao tác đa đầu
  3. Khi tiếp tục tăng, đóng cửa trên đường trung bình 2 lần của EMA tích lũy, thêm nhiều vị trí
  4. Thiết lập chỉ số RSI, khi RSI vượt quá 90 thì giảm 13 lệnh và kết thúc
  5. Khi Close vượt qua EMA, đánh giá là xu hướng giảm và xóa tất cả các vị trí đầu nhiều
  6. Khi Close vượt qua EMA, đánh giá là xu hướng giảm, thực hiện giao dịch tháo gỡ
  7. Thiết lập một đường dừng lỗ, đường dừng là một phần trăm cố định của giá nhập
  8. Tiếp theo, bạn có thể sử dụng các công cụ khác nhau để tạo ra các kết quả.

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 đường trung bình EMA để đánh giá xu hướng, có thể theo dõi xu hướng hiệu quả
  2. Sử dụng EMA tích lũy của khối lượng giao dịch để đánh giá sự thay đổi xu hướng thực sự
  3. Theo dõi chỉ số động lực RSI để kiếm lợi nhuận
  4. Kiểm soát rủi ro, có đường dừng lỗ
  5. Các tham số có thể được điều chỉnh linh hoạt để phù hợp với các tình huống khác nhau

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 trung bình tạo ra sự chậm trễ, có thể bỏ lỡ điểm biến
  2. Số lượng giao dịch không nhất thiết phản ánh xu hướng thực tế
  3. Lãi suất dừng cố định có thể quá cơ khí
  4. Có quá nhiều tham số, rất khó để điều chỉnh.
  5. Giao dịch thường xuyên, chi phí giao dịch cao

Những giải pháp rủi ro:

  1. Tối ưu hóa các tham số EMA, giảm sự chậm trễ
  2. Giao dịch tín hiệu xác nhận kết hợp với các chỉ số khác
  3. Tối ưu hóa điểm dừng lỗ theo tình hình thị trường
  4. Giảm thiểu các tham số, chỉ giữ lại các thiết lập chính
  5. Giới hạn hạn lỗ hổng và tần suất giao dịch thích hợp

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

Chiến lược này có thể được tối ưu hóa theo 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 ra sự kết hợp tối ưu
  2. Tăng VOLUME nhân để xác định tín hiệu nhập vào mạnh hoặc yếu
  3. Kết hợp các chỉ số khác như MACD, KD và xác nhận nhập học
  4. Tối ưu hóa tỷ lệ dừng lỗ theo đặc điểm của một cổ phiếu cụ thể
  5. Tối ưu hóa tần số giao dịch, giảm phí giao dịch

Tóm tắt

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

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