基于Ichimoku云图、MACD和Stochastic的多时间框架趋势跟踪策略

Author: ChaoZhang, Date: 2024-02-05 10:30:45
Tags:

基于Ichimoku云图、MACD和Stochastic的多时间框架趋势跟踪策略

概述

本策略融合了Ichimoku云图、移动平均线、MACD、Stochastic和ATR等多个指标,实现多时间框架下的趋势识别和跟踪。在获得较高概率的趋势信号后,采用ATR周期止损止盈方式进行风险控制。

策略原理

  1. Ichimoku云图判断中长线趋势方向。CLOSE价格上穿云图的转折线和基准线为多头信号,下穿为空头信号。

  2. MACD判断短线趋势和超买超卖情况。MACD柱线上穿信号线为多头信号,下穿为空头信号。

  3. Stochastic KD判断超买超卖区。K线上穿20为多头信号,下穿80为空头信号。

  4. 移动平均线判断中期趋势。收盘价上穿移动平均线为多头信号,下穿为空头信号。

  5. 综合以上多个指标信号,过滤掉部分假信号,形成高概率的持续性趋势信号。

  6. 基于ATR计算止损止盈价格。以一定的ATR倍数作为止损位和止盈位,实现风险控制。

策略优势

  1. 多时间框架识别趋势,提高信号准确率。

  2. 广泛运用指标组合过滤技术,有效过滤假信号。

  3. ATR周期性止损止盈,最大程度控制单笔损失。

  4. 可自定义入场条件严格程度,满足不同风险偏好。

策略风险

  1. 以趋势跟踪为主,无法识别突发事件带来的逆转。

  2. ATR周期性止损可能过于理想化,实盘中难以完全复制。

  3. 参数设置不当可能导致交易频率过高或信号识别准确率不足。

  4. 需要调整参数找到平衡,适应不同品种和市场环境。

策略优化方向

  1. 增加机器学习算法,辅助判断趋势转折点。

  2. 优化ATR倍数参数,不同品种可以设置不同倍数。

  3. 结合交易量变化等其他因素,提高突破信号的准确率。

  4. 根据回测结果不断优化参数,找到最佳参数组合。

总结

本策略综合运用Ichimoku云图、MACD、Stochastic等多个指标进行多时间框架的趋势识别,在抓住趋势的同时尽量避免被突发事件套牢。ATR周期性止损止盈方式有效控制单笔亏损,是一种值得推荐的趋势跟踪策略。通过引入更多辅助判断指标和机器学习方法,本策略还有进一步优化的空间。


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

//}



更多内容