Ichimoku Cloud, MACD dan Strategi Pengesanan Trend Berbilang Jangka Masa Berasaskan Stochastic

Penulis:ChaoZhang, Tarikh: 2024-02-05 10:30:45
Tag:

img

Ringkasan

Strategi ini mengintegrasikan Ichimoku Cloud, purata bergerak, MACD, Stochastic dan penunjuk ATR untuk mengenal pasti dan mengesan trend merentasi pelbagai jangka masa.

Logika Strategi

  1. Ichimoku Cloud menilai arah trend jangka sederhana dan panjang. Harga CLOSE melintasi di atas garisan giliran Ichimoku dan garis asas adalah isyarat kenaikan, dan melintasi di bawah mereka adalah isyarat penurunan.

  2. MACD menilai trend jangka pendek dan situasi overbought / oversold. Histogram MACD melintasi di atas garis isyarat MACD adalah isyarat kenaikan, dan melintasi di bawah adalah isyarat penurunan.

  3. Stochastic KD menilai zon overbought/oversold. Lini K yang melintasi di atas 20 adalah isyarat kenaikan, dan melintasi di bawah 80 adalah isyarat penurunan.

  4. Rata-rata bergerak menilai trend jangka sederhana. Penembusan harga di atas MA adalah isyarat kenaikan, dan melintasi di bawah adalah isyarat penurunan.

  5. Mengintegrasikan isyarat dari penunjuk di atas untuk menapis beberapa isyarat palsu dan membentuk isyarat trend lestari yang berkemungkinan tinggi.

  6. Gunakan ATR untuk mengira harga stop loss dan mengambil keuntungan. Gunakan kelipatan tertentu ATR sebagai stop loss dan mengambil keuntungan bit untuk mengawal risiko.

Kelebihan

  1. Mengenal pasti trend dalam pelbagai jangka masa untuk meningkatkan ketepatan isyarat.

  2. Gunakan kombinasi penunjuk secara meluas untuk menapis isyarat palsu dengan berkesan.

  3. Hentikan kerugian berasaskan ATR & mengambil keuntungan dengan ketara had kerugian setiap perdagangan.

  4. Ketegasan syarat kemasukan yang boleh disesuaikan memenuhi selera risiko yang berbeza.

Risiko

  1. Trend mengikut alam gagal untuk mengesan pembalikan yang disebabkan oleh peristiwa black swan.

  2. Stop loss ATR yang ideal sukar untuk ditiru sepenuhnya dalam perdagangan langsung.

  3. Tetapan parameter yang tidak betul boleh membawa kepada overtrading atau ketepatan isyarat yang tidak mencukupi.

  4. Penyesuaian parameter diperlukan untuk menyesuaikan produk dan persekitaran pasaran yang berbeza.

Kawasan Peningkatan

  1. Memperkenalkan pembelajaran mesin untuk membantu menilai titik pembalikan trend.

  2. Mengoptimumkan nilai parameter pengganda ATR untuk produk yang berbeza.

  3. Menggabungkan faktor lain seperti perubahan jumlah untuk meningkatkan ketepatan isyarat terobosan.

  4. Terus mengoptimumkan parameter berdasarkan hasil backtest untuk mencari kombinasi parameter terbaik.

Ringkasan

Strategi ini memanfaatkan Ichimoku Cloud, MACD, Stochastic dan banyak lagi untuk pengenalan trend pelbagai jangka masa, menangkap trend sambil mengelakkan terperangkap oleh peristiwa angsa hitam.


/*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)

//}



Lebih lanjut