Chiến lược mở rộng dài và ngắn dựa trên đường trung bình chuyển động nhiều khung thời gian và MACD

Tác giả:ChaoZhang, Ngày: 2024-01-03 12:15:46
Tags:

img

Tổng quan

Chiến lược này tận dụng đầy đủ các chức năng của đường trung bình chuyển động theo hàm số nhân đa khung thời gian (MTF EMA) để xác định hướng xu hướng và chỉ số MACD để tạo ra các tín hiệu giao dịch, trong khi thiết lập giá dừng lỗ và lấy lợi nhuận với chỉ số ATR. Chiến lược này phù hợp với các cặp tiền kỹ thuật số và fiat có xu hướng mạnh và hoạt động tốt hơn trong các thị trường có xu hướng mạnh.

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

1. Phán quyết xu hướng sử dụng MTF EMA

Đường trung bình di chuyển theo hàm số nhân nhiều khung thời gian (MTF EMA) có thể hiển thị đường trung bình di chuyển của nhiều khung thời gian trên cùng một biểu đồ để xác định tình trạng dài / ngắn tổng thể của một tài sản.

Khi giá trên EMA MTF 1 giờ và EMA MTF 1 giờ dưới EMA MTF 15 phút, nó được định nghĩa là xu hướng tăng. Khi giá dưới EMA MTF 1 giờ và EMA MTF 1 giờ trên EMA MTF 15 phút, nó được định nghĩa là xu hướng giảm.

2. MACD tạo tín hiệu giao dịch

Khi đường MACD vượt qua trên đường tín hiệu từ dưới, một tín hiệu mua được tạo ra. Khi nó vượt qua dưới từ trên, một tín hiệu bán được tạo ra. Đồng thời, một giới hạn chéo được thiết lập cho đường MACD và đường tín hiệu để tránh các tín hiệu sai.

3. Thiết lập Stop Loss và Take Profit với ATR

Chỉ số ATR được sử dụng để thiết lập giá dừng lỗ và lấy lợi nhuận. ATR có thể thiết lập một cách năng động các khoảng cách dừng lỗ và lấy lợi nhuận hợp lý dựa trên sự biến động của thị trường.

Chiến lược giao dịch

Các tín hiệu vị trí mở

Tín hiệu dài: Xu hướng tăng và MACD vượt trên Đường tín hiệu và giá trị chéo dưới giới hạn Tín hiệu ngắn: Xu hướng giảm và MACD vượt dưới Đường tín hiệu và giá trị chéo lớn hơn giới hạn

Các tín hiệu đóng vị trí

Lợi nhuận dài: Giá phá vỡ thông qua ATR lấy giá lợi nhuận Giá dừng lỗ dài: Giá vượt qua giá dừng lỗ ATR Lợi nhuận ngắn: Giá phá vỡ thông qua ATR lấy giá lợi nhuận Giá dừng lỗ ngắn: Giá vượt qua giá dừng lỗ ATR

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nó sử dụng đầy đủ các điểm mạnh của MTF EMA trong việc xác định xu hướng và MACD trong việc tạo ra tín hiệu giao dịch. MTF EMA có thể đánh giá rõ hướng xu hướng tổng thể và tránh giao dịch thường xuyên trong các thị trường hỗn loạn. Chỉ số MACD có thể nắm bắt tốt hơn những thay đổi ngắn hạn trong mô hình giá và tạo ra tín hiệu giao dịch. Sử dụng cả hai cùng nhau đảm bảo nắm bắt xu hướng trong khi có được nhiều cơ hội giao dịch hơn. Ngoài ra, sử dụng chỉ số ATR để theo dõi stop loss và lấy lợi nhuận một cách năng động có thể kiểm soát hiệu quả rủi ro của các giao dịch cá nhân.

Rủi ro và giải pháp

Có hai rủi ro chính đối với chiến lược này: Thứ nhất, nếu không có xu hướng rõ ràng, MTF EMA có thể tạo ra các tín hiệu không chính xác, dẫn đến tổn thất; thứ hai, chỉ số MACD thường tạo ra các tín hiệu gây hiểu lầm khi giá thay đổi đáng kể, có thể dẫn đến giao dịch quá mức. Đối với rủi ro đầu tiên, các tham số MTF EMA có thể được điều chỉnh thích hợp để phù hợp hơn với các thay đổi xu hướng giá; rủi ro thứ hai có thể được giảm thiểu bằng cách thiết lập giới hạn chéo cho chỉ số MACD.

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

Các khía cạnh sau đây của chiến lược có thể được tối ưu hóa:

  1. Điều chỉnh các tham số chu kỳ của MTF EMA để phù hợp hơn với các đặc điểm giá của các công cụ giao dịch khác nhau

  2. Tối ưu hóa các thông số đường tín hiệu và đường trung bình di chuyển nhanh và chậm của chỉ số MACD để có tín hiệu tốt hơn

  3. Kiểm tra các tham số chu kỳ ATR khác nhau và stop loss/take profit multiples để có lợi nhuận tốt nhất

  4. Thêm các chỉ số phụ trợ khác vào các tín hiệu lọc

Tóm lại

Chiến lược mở cửa dài và ngắn này kết hợp các phương pháp của MTF EMA để đánh giá xu hướng, MACD để tạo tín hiệu giao dịch và ATR để dừng lỗ và kiếm lợi nhuận năng động. Nó có thể đạt được lợi nhuận tốt trong các thị trường có xu hướng rõ ràng. Có rất nhiều chỗ để tối ưu hóa các thông số và tối ưu hóa chiến lược này để đạt được hiệu suất tốt hơn. Tuy nhiên, cần phải kiểm soát rủi ro và tránh giao dịch mù quáng trong các thị trường hỗn loạn.


/*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/
// © Steven A. Zmuda Burke / stevenz17
//@version=4
// From Date Inputs
fromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 04, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2022, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 05, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2022, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

// Input
strategy("LONG", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, slippage=1, commission_type=strategy.commission.percent, 
     commission_value=0.015)
SOURCE = input(title = "═════════════════════ SOURCE ═════════════════════", defval = false, type = input.bool)
sourcehl2 = input(title="Source hl2 or (open+close)/2 ?",type=input.bool,defval=true)
source = sourcehl2 ? hl2 : ((open+close)/2)

//MTF EMA
MTFEMA = input(title = "════════════════════ MTF EMA ════════════════════", defval = false, type = input.bool)

res1=input(title="MTF EMA 1", type=input.resolution, defval="60")
len1 = input(title = "EMA Period 1", type=input.integer, defval=70, minval=1)
ema1 = ema(source, len1)
emaStep1 = security (syminfo.tickerid, res1, ema1, barmerge.gaps_off, barmerge.lookahead_off)
mtf1 = emaStep1

res2=input(title="MTF EMA 2", type=input.resolution, defval="15")
len2 = input(title = "EMA Period 2", type=input.integer, defval=68, minval=1)
ema2 = ema(source, len2)
emaStep2 = security (syminfo.tickerid, res2, ema2, barmerge.gaps_off, barmerge.lookahead_off)
mtf2 = emaStep2

t1 = plot(mtf1, linewidth=4, color= color.aqua, title="EMA")
t2 = plot(mtf2, linewidth=4, color= color.navy, title="EMA")
fill(t1, t2, transp = 70, color = mtf1 > mtf2 ? color.red : color.green)

///MACD
MACD= input(title = "═════════════════════ MACD ══════════════════════", defval = false, type = input.bool)
MACDsource=close
fastLength = input(13, minval=1, title="MACD fast moving average")
slowLength=input(18,minval=1, title="MACD slow moving average")
signalLength=input(24,minval=1, title="MACD signal line moving average")
MacdEmaLength =input(9, title="MACD EMA period", minval=1)
useEma = input(true, title="Use EMA (otherwise SMA)")
useOldAlgo = input(false, title="Use normal MACD")
Lmacsig=input(title="LONG MACD and signal crossover limit",type=input.integer,defval=180)

// Fast line
ma1= useEma ? ema(MACDsource, fastLength) : sma(MACDsource, fastLength) 
ma2 = useEma ?  ema(ma1,fastLength) :  sma(ma1,fastLength) 
fastMA = ((2 * ma1) - ma2)

// Slow line
mas1=  useEma ? ema(MACDsource , slowLength) :  sma(MACDsource , slowLength)
mas2 =  useEma ? ema(mas1 , slowLength): sma(mas1 , slowLength)
slowMA = ((2 * mas1) - mas2)

// MACD line
macd = fastMA - slowMA

// Signal line
emasig1 = ema(macd, signalLength)
emasig2 = ema(emasig1, signalLength)
signal = useOldAlgo ? sma(macd, signalLength) : (2 * emasig1) - emasig2

hist = macd - signal

histline = hist > 0 ? color.green : color.red

//MACD ribbon
macdribbon=input(title="Show MACD ribbon?",type=input.bool,defval=false)
macdx=input(title="MACD ribbon multiplier", type=input.integer, defval=3, minval=1)

leadLine1 = macdribbon ? macd*macdx + source : na
leadLine2 = macdribbon ? signal*macdx + source : na
leadLine3 = hist + source

//MACD plot
p3 = plot(leadLine1, color= color.green, title="MACD", transp = 100, linewidth = 8)
p4 = plot(leadLine2, color= color.red, title="Signal", transp = 100, linewidth = 8)
fill(p3, p4, transp = 20, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

plot((leadLine3), color = histline, title="Histogram", linewidth = 3) 


l="TEst"

upHist = (hist > 0) ? hist : 0
downHist = (hist <= 0) ? hist : 0

p1 = plot(upHist, color=color.green, transp=40, style=plot.style_columns, title='Positive delta')
p2 = plot(downHist, color=color.green, transp=40, style=plot.style_columns, title='Negative delta') 

zeroLine = plot(macd, color=color.black, transp=0, linewidth=2, title='MACD line')
signalLine = plot(signal, color=color.gray, transp=0, linewidth=2, title='Signal')

ribbonDiff = color.green
fill(zeroLine, signalLine, color=ribbonDiff)

circleYPosition = signal
plot(ema(macd,MacdEmaLength) , color=color.red, transp=0, linewidth=2, title='EMA on MACD line')

ribbonDiff2 = hist > 0 ? color.green : color.red
plot(crossunder(signal,macd) ? circleYPosition : na,style=plot.style_circles, linewidth=4, color=ribbonDiff, title='Dots')


//STOCHASTIC
stochchch= input(title = "═══════════════════ STOCHASTIC ════════════════════", defval = false, type = input.bool)
StochOn = input(title="Stochastic On?",type=input.bool,defval=true)
periodK = input(10, title="K", minval=1)
periodD = input(1, title="D", minval=1)
smoothK = input(3, title="Smooth", minval=1)
stochlimit = input(30, title="Stoch value crossover", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)

stochSignal = StochOn ? (d < stochlimit ? true : false) : true

pp= input(1, title="avg price length", minval=1)
p = ema (source, pp)
K = k + p

plot(k, title="%K", color=#0094FF)
plot(d, title="%D", color=#FF6A00)
h0 = hline(72, "Upper Band", color=#606060)
h1 = hline(20, "Lower Band", color=#606060)
fill(h0, h1, color=#9915FF, transp=80, title="Background")



//Long 
LS= "════════════════════════════════ LONG CONDITIONS ═══════════════════════════"

uptrend = close > mtf1 and mtf1 < mtf2
downtrend = close < mtf1 and mtf1 > mtf2 

crossMACD = crossunder(macd,signal) 

LongBuy = uptrend and stochSignal? crossMACD and signal < Lmacsig and macd < Lmacsig : na

LONG = strategy.position_size > 0
SHORT = strategy.position_size < 0
FLAT = strategy.position_size == 0 

plotshape(LongBuy, style=shape.xcross, text="LONG", color=color.green)

//ATR & TP/SL

ATRTPSLX= input(title = "═════════════════ LONG SL ═════════════════", defval = false, type = input.bool)

maxIdLossPcnt = input(5, "Max Intraday Loss(%)", type=input.float, minval=0.0, step=0.1)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

SSL2=input(title="Long Stop Loss when MTF EMA cross?",type=input.bool,defval=false)

SSLOP = LONG  and crossunder(source, mtf1) 

SlossPercOn = input(title="Long Stop Loss (%) on?",type=input.bool,defval=false)
SlossPerc = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=4.7) * 0.01
SSpricePerc = LONG and SlossPercOn? strategy.position_avg_price * (-1 - SlossPerc) : na
plot(series = SSpricePerc, linewidth=2, color= color.maroon,style=plot.style_linebr, title="Long Stop Loss %") 
SSLX = LONG and crossunder(source, SSpricePerc)

SSLatr= input(title="Long Stop Loss ATR?",type=input.bool,defval=true)
useStructure=input(title="Look back for High/Lows?",type=input.bool,defval=true)
Slookback=input(title="How far to look back for High/Lows:",type=input.integer,defval=18,minval=1)
SatrLenghth=input(title="Long ATR Lenghth",type=input.integer,defval=9,minval=1)
SatrStopMultiplier=input(title="Long ATR Stop x ?", type=input.float,defval=4.3, minval=0.1,step=0.1)

Satr = atr(SatrLenghth)
LongStop = SSLatr ? ((useStructure ? lowest(low, Slookback) : source) - Satr * SatrStopMultiplier) : na

SStop = crossunder(source,LongStop)

plot(Satr, color=color.blue, title="ATR", transp=100)
plot(series = uptrend ? LongStop : na, color=color.red, style=plot.style_linebr, title="Long Trailing Stop", transp=0)


ATRTPSLXX= input(title = "═════════════════ LONG TP ═════════════════", defval = false, type = input.bool)

TpPercOn = input(title="Long Take Profit (%) on?",type=input.bool,defval=true)
TpPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=5.3) * 0.01
TppricePerc = LONG and TpPercOn? strategy.position_avg_price * (-1 + TpPerc) : na
plot(series = TppricePerc, linewidth=2, color= color.lime,style=plot.style_linebr, title="Long Take Profit %") 
TPLX = LONG and crossunder(source, TppricePerc)

TP1=input(title="1 Long Take Profit On?",type=input.bool,defval=true)

useStructure1=input(title="Look back for High/Lows?",type=input.bool,defval=true)
STplookback=input(title="How far to look back for High/Lows for 1 TP",type=input.integer,defval=12,minval=1)
STpatrLenghth=input(title="Long ATR Lenghth 1 TP",type=input.integer,defval=24,minval=1)
SatrProfitMultiplier = input(title="First Long ATR Take Profit x ?", type=input.float,defval=5.5, minval=0.1,step=0.1)
STpatr = atr(STpatrLenghth)
LongTakeProfit = (useStructure1 ? highest(high, STplookback) : source) + STpatr * SatrProfitMultiplier
LongTP = TP1 ? crossover(source, LongTakeProfit): false
plot(series = uptrend ? LongTakeProfit: na , color=color.green, style=plot.style_linebr, title="Long Trailing Take Profit", transp=0)


// Bar color
barcolor(cross(macd, signal) ? (macd - signal > 0 ? (uptrend and macd < 0 and signal < 0 ? color.yellow : na) : (downtrend and macd > 0 and signal > 0 ? color.blue : na)) : na)

// Strategy ATR

GOLONG = LongBuy and SSLatr and FLAT

if GOLONG and TP1
    strategy.entry(id="Entry LONG 1TP", long=true,comment="Entry Long")
    strategy.exit("Long Profit or Loss 1TP","Entry LONG 1TP", limit=LongTakeProfit, stop=LongStop)
if SSLX
    strategy.close(id="Entry LONG 1TP", comment="% Long SL EXIT")
if TPLX
    strategy.close(id="Entry LONG 1TP", comment="% Long TP EXIT")
    
if SSLOP and SSL2
    strategy.close(id="Entry LONG 1TP", comment="MTF EMA cross EXIT")    
    
if (not time_cond)
    strategy.close_all()
    strategy.cancel_all()    


//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

//@version=4

Thêm nữa