Chiến lược theo dõi xu hướng nhiều khung thời gian dựa trên đám mây Ichimoku, MACD và Stochastic

Tác giả:ChaoZhang, Ngày: 2024-02-05 10:30:45
Tags:

img

Tổng quan

Chiến lược này tích hợp các chỉ số Ichimoku Cloud, moving average, MACD, Stochastic và ATR để xác định và theo dõi xu hướng trên nhiều khung thời gian.

Chiến lược logic

  1. Ichimoku Cloud đánh giá hướng xu hướng trung hạn và dài hạn. Giá CLOSE vượt trên đường quay và đường cơ sở của Ichimoku là tín hiệu tăng, và vượt dưới chúng là tín hiệu giảm.

  2. MACD đánh giá xu hướng ngắn hạn và tình huống mua quá mức / bán quá mức.

  3. Stochastic KD đánh giá các vùng mua quá mức / bán quá mức. Đường K vượt trên 20 là tín hiệu tăng, và vượt dưới 80 là tín hiệu giảm.

  4. Moving average đánh giá xu hướng trung hạn. Giá đóng vượt trên MA là tín hiệu tăng, và vượt dưới là tín hiệu giảm.

  5. Tích hợp các tín hiệu từ các chỉ số trên để lọc ra một số tín hiệu sai và hình thành các tín hiệu xu hướng bền vững có xác suất cao.

  6. Sử dụng ATR để tính giá dừng lỗ và lấy lợi nhuận. Sử dụng một số lần số ATR như là dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro.

Ưu điểm

  1. Xác định xu hướng trên nhiều khung thời gian để cải thiện độ chính xác tín hiệu.

  2. Sử dụng rộng rãi các kết hợp chỉ số để lọc hiệu quả các tín hiệu sai.

  3. ATR dựa trên dừng lỗ & lấy lợi nhuận hạn chế đáng kể cho mỗi lỗ giao dịch.

  4. Sự nghiêm ngặt có thể tùy chỉnh của các điều kiện nhập cảnh phục vụ cho các ham muốn rủi ro khác nhau.

Rủi ro

  1. Xu hướng theo tự nhiên không thể phát hiện sự đảo ngược do các sự kiện thiên nga đen.

  2. ATR dừng lỗ lý tưởng là khó để tái tạo đầy đủ trong giao dịch trực tiếp.

  3. Cài đặt tham số không chính xác có thể dẫn đến giao dịch quá mức hoặc độ chính xác tín hiệu không đủ.

  4. Điều chỉnh tham số là cần thiết để phù hợp với các sản phẩm và môi trường thị trường khác nhau.

Các lĩnh vực cải tiến

  1. Đưa ra máy học để giúp đánh giá các điểm đảo ngược xu hướng.

  2. Tối ưu hóa các giá trị tham số nhân ATR cho các sản phẩm khác nhau.

  3. Kết hợp các yếu tố khác như thay đổi âm lượng để cải thiện độ chính xác tín hiệu đột phá.

  4. Tiếp tục tối ưu hóa các tham số dựa trên kết quả backtest để tìm kết hợp tham số tốt nhất.

Tóm lại

Chiến lược này tận dụng Ichimoku Cloud, MACD, Stochastic và nhiều hơn nữa để xác định xu hướng nhiều khung thời gian, nắm bắt xu hướng trong khi tránh bị mắc kẹt bởi các sự kiện thiên nga đen.


/*backtest
start: 2024-01-05 00:00:00
end: 2024-02-04 00:00:00
period: 4h
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/
// © FXFUNDINGMATE

//@version=4
strategy(title="FXFUNDINGMATE TREND INDICATOR", overlay=true)

//Ichimoku Cloud
conversionPeriods = input(9, minval=1, title="Conversion Line Length")
basePeriods = input(26, minval=1, title="Base Line Length")
laggingSpan2Periods = input(52, minval=1, title="Lagging Span 2 Length")
displacement = input(26, minval=1, title="Displacement")
donchian(len) => avg(lowest(len), highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = avg(conversionLine, baseLine)[displacement - 1]
leadLine2 = donchian(laggingSpan2Periods)[displacement - 1]


//macd
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)

fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


//kd
periodK = input(5, title="%K Length", minval=1)
smoothK = input(3, title="%K Smoothing", minval=1)
periodD = input(3, title="%D Smoothing", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)


//atr
atrlength = input(title="Atr Length", defval=8, minval=1)
SMulti = input(title="Stop loss multi Atr", defval=1.0)
TMulti = input(title="Take profit multi Atr", defval=1.0)
smoothing = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
ma_function(source, length) =>
	if smoothing == "RMA"
		rma(source, length)
	else
		if smoothing == "SMA"
			sma(source, length)
		else
			if smoothing == "EMA"
				ema(source, length)
			else
				wma(source, length)
atr = ma_function(tr(true), atrlength)


operation_type = input(defval = "Both", title = "Position side", options = ["Long", "Short", "Both"])
operation = operation_type == "Long" ? 1 : operation_type == "Short" ? 2 : 3
showlines = input(true,  title="Show sl&tp lines")

// MA
sma_len = input(100, title="MA Length", type=input.integer)
sma = sma(close, sma_len)

longCond = crossover(k, 20) and macd > 0 and close > sma and close > leadLine1 and close > leadLine2
shortCond = crossunder(k, 80)  and macd < 0 and close < sma and close < leadLine1 and close < leadLine2

entry_price  = float(0.0) //set float
entry_price := strategy.position_size != 0 or longCond or shortCond ? strategy.position_avg_price : entry_price[1]
entry_atr = valuewhen(longCond or shortCond, atr,0)
short_stop_level     = float(0.0)   //set float
short_profit_level   = float(0.0)   //set float
long_stop_level      = float(0.0)   //set float
long_profit_level    = float(0.0)   //set float
short_stop_level    := entry_price + SMulti * entry_atr
short_profit_level  := entry_price - TMulti * entry_atr
long_stop_level     := entry_price - SMulti * entry_atr
long_profit_level   := entry_price + TMulti * entry_atr


//  Strategy Backtest Limiting Algorithm
i_startTime = input(defval = timestamp("1 Jan 2020 00:00 +0000"), title = "Backtesting Start Time", type = input.time)
i_endTime = input(defval = timestamp("31 Dec 2025 23:59 +0000"), title = "Backtesting End Time", type = input.time)
timeCond = true

if (operation == 1 or operation == 3)
    strategy.entry("long" , strategy.long , when=longCond and timeCond, alert_message = "Long")
    strategy.exit("SL/TP", from_entry = "long" , limit = long_profit_level , stop = long_stop_level , alert_message = "Long exit")

if (operation == 2 or operation == 3)
    strategy.entry("short", strategy.short, when=shortCond and timeCond, alert_message="Short")
    strategy.exit("SL/TP", from_entry = "short", limit = short_profit_level , stop = short_stop_level , alert_message = "Short exit")
    
if time > i_endTime  
    strategy.close_all(comment = "close all", alert_message = "close all")
    
plot(showlines and strategy.position_size <= 0 ? na : long_stop_level,    color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size <= 0 ? na : long_profit_level,  color=color.lime, style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_stop_level,   color=color.red,  style=plot.style_linebr, linewidth = 2)
plot(showlines and strategy.position_size >= 0 ? na : short_profit_level, color=color.lime, style=plot.style_linebr, linewidth = 2)

//}



Thêm nữa