EMA và chiến lược giao thoa khối lượng tích lũy cho dài ngắn

Tác giả:ChaoZhang, Ngày: 2023-09-20 11:48:34
Tags:

Tổng quan

Chiến lược này kết hợp các chỉ số EMA và khối lượng tích lũy, tạo ra tín hiệu mua và bán dựa trên tình huống chéo của chúng để xác định xu hướng.

Chiến lược logic

Chỉ số EMA 50 ngày và chỉ số khối lượng tích lũy 100 ngày được tính toán. Khi EMA vượt qua trên khối lượng tích lũy từ dưới, một tín hiệu mua được tạo ra để mua dài. Khi EMA vượt qua dưới khối lượng tích lũy từ trên, một tín hiệu bán được tạo ra để mua ngắn.

Trong các vị trí, các chiến lược dừng lỗ cố định và lấy lợi nhuận được thực hiện. Stop loss được thiết lập ở mức 8% dưới giá nhập cảnh. Lợi nhuận được thiết lập ở mức 8% trên giá nhập cảnh, với việc đóng một phần vị trí khi giá đạt mức lấy lợi nhuận.

Phân tích lợi thế

Chiến lược kết hợp chỉ số xu hướng EMA và khối lượng tích lũy chỉ số dòng tiền, tận dụng cả thông tin giá và khối lượng để xác định hiệu quả xu hướng trung bình dài hạn.

Thời gian EMA có thể được điều chỉnh tự do cho các sản phẩm khác nhau. Cả giao dịch dài và ngắn đều được thực hiện cho giao dịch tuyến tính. Các thử nghiệm ngược lại cho thấy hiệu suất tốt trong thời gian xu hướng.

Phân tích rủi ro

Sự phụ thuộc quá mức vào các đường trung bình động có thể dẫn đến sự sụp đổ trong quá trình hợp nhất giới hạn phạm vi. Lợi nhuận cố định và dừng lỗ cũng có thể dẫn đến việc thoát sớm hoặc dừng quá lớn. Chỉ có các yếu tố giá và khối lượng được xem xét mà không có các yếu tố khác.

Việc mở rộng các khoảng thời gian trung bình động có thể làm giảm các tín hiệu sai. Các chỉ số bổ sung như biến động, RSI cũng có thể giúp đánh giá. Tối ưu hóa các cơ chế lấy lợi nhuận và dừng lỗ, thông qua các điểm dừng, lối ra động v.v. có thể có lợi.

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

  1. Kiểm tra và tối ưu hóa các kết hợp tham số EMA để tìm các thiết lập tối ưu.

  2. Kết hợp các chỉ số kỹ thuật khác để tạo thành một hệ thống tổng thể.

  3. Áp dụng máy học để dự đoán xu hướng và cải thiện hiệu suất EMA.

  4. Tối ưu hóa chiến lược lấy lợi nhuận và dừng lỗ bằng cách kết hợp các điểm dừng, lối ra động v.v.

  5. Đưa ra các mô-đun quản lý vốn cho kích thước vị trí năng động.

  6. Tùy chỉnh các tham số dựa trên đặc điểm sản phẩm để tạo thành tập hợp chiến lược.

Tóm lại

Ý tưởng của chiến lược kết hợp EMA và khối lượng để xác định xu hướng là rõ ràng. Nhưng sự phụ thuộc quá mức vào đường trung bình động và lối ra cố định có những nhược điểm. Thêm nhiều chỉ số đánh giá và tối ưu hóa lối ra có thể cải thiện độ bền. Nhìn chung nó cung cấp một ý tưởng sử dụng dữ liệu giá và khối lượng để theo dõi xu hướng.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 2h
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("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(50, 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(false, 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)

vwapValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

plot(emaVal, title="EMA", color=color.green,  transp=25)
plot(vwapValue, title="Cumulate Volumne / VWAP", color=color.orange,  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)

//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+(stopLoss*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="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) 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=(close<vwapValue and close<open  and close[1] < vwapValue  and close[1]<open[1] and close<close[1])  and emaVal>=vwapValue 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  close<shortTakeProfit )  //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<vwapValue and close>vwapValue and open>vwapValue and close>open )   or (crossover(emaVal,vwapValue))  ) 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"   ) )




Thêm nữa