이 전략은 여러 이동 평균 크로스오버와 변동성 필터링에 기반한 트렌드-추천 거래 시스템이다. 시장 트렌드를 식별하기 위해 다른 기간의 세 이동 평균을 활용하고 4번째 이동 평균을 황소/곰 시장 결정의 기준으로 사용합니다. 이 전략은 또한 낮은 변동성 환경에서 거래를 피하기 위해 변동성 지표를 거래 필터로 통합합니다. 그것은 긴 포지션과 짧은 포지션을 지원하며 유연한 포지션 관리 및 스톱-러스 메커니즘을 제공합니다.
이동 평균 선택: 전략은 트렌드를 결정하기 위해 세 가지 주요 이동 평균 (단기, 중기 및 장기) 을 사용합니다. 사용자는 미리 정의된 이동 평균 6 개 중 하나를 선택할 수 있으며, 각각은 계산 기간, 데이터 소스 및 유형 (예: SMA, EMA) 를 포함한 매개 변수와 개별적으로 구성 할 수 있습니다.
트렌드 결정
황소/곰 시장 결정: 선택적 인 네 번째 이동 평균은 황소 및 곰 시장의 분할선으로 사용될 수 있습니다. 가격은 이 라인을 넘어서면 긴 위치만 허용되며, 이 라인을 넘어서면 짧은 위치만 허용됩니다.
변동성 필터: 가장 높고 가장 낮은 가격에 기반한 변동성 지표가 사용됩니다. 전략은 변동성이 사용자가 정의 한 임계치를 초과 할 때만 거래 신호를 생성합니다.
입력 논리:
출구 논리:
스톱 로스: 사용자가 사용자 지정할 수 있는 고정된 비율의 스톱 로스를 사용합니다.
포지션 관리: 사용자에 의해 사용자 지정 될 수 있는 각 거래에 대한 계좌 자금의 고정 비율을 사용합니다.
다차원 트렌드 분석: 여러 이동 평균을 사용하여 전략은 잘못된 신호를 줄여 시장 트렌드를 더 포괄적으로 포착 할 수 있습니다.
유연한 매개 변수 구성: 사용자는 MA 유형, 기간 및 데이터 소스를 포함한 다른 시장 및 거래 도구의 특성에 따라 다양한 매개 변수를 유연하게 조정할 수 있습니다.
변동성 필터링: 변동성 지표를 포함함으로써 전략은 낮은 변동성 환경에서 거래를 피할 수 있으며 신호 품질을 향상시킵니다.
황소/곰 시장 적응: 선택적 인 황소/곰 시장 결정 메커니즘은 전략이 다른 시장 환경에 더 잘 적응 할 수 있도록 허용하며 역동 트렌드 거래를 줄입니다.
동적 포지션 관리: 주식 기반 포지션 관리 방법은 계좌 크기가 변화함에 따라 자동으로 거래 크기를 조정합니다.
다층 리스크 제어: 변동성 필터링, 트렌드 확인, 부분적인 포지션 폐쇄 및 고정 스톱 로스 등의 여러 리스크 제어 메커니즘을 포함한다.
양방향 거래: 다양한 시장 조건에서 거래 기회를 허용하는 긴 포지션과 짧은 포지션을 지원합니다.
시각 보조: 전략은 차트에 다양한 이동 평균과 거래 신호 라벨을 그래프로 표시하여 직관적인 분석과 백테스팅을 용이하게합니다.
뒤떨어진 성격: 이동 평균은 본질적으로 뒤떨어진 지표이며, 이는 수익성에 영향을 미치는 약간 지연된 입출시기를 초래할 수 있습니다.
저변 시장에서의 낮은 성과: 옆으로, 불안정한 시장에서 전략은 종종 잘못된 신호를 생성하여 과잉 거래 및 손실로 이어질 수 있습니다.
매개 변수 민감성: 전략의 성능은 매개 변수 설정에 크게 의존하며, 다른 시장과 시간 프레임은 다른 매개 변수 조합을 요구할 수 있습니다.
마감 위험: 트렌드 반전 시 전략은 포지션을 완전히 제때 종료하지 않을 수 있으며, 잠재적으로 상당한 마감으로 이어질 수 있습니다.
기술 지표에 지나친 의존: 전략은 완전히 기술 지표에 기반하여 근본적인 요소를 무시하여 주요 뉴스 또는 이벤트 중 성적 부진으로 이어질 수 있습니다.
자금 관리 위험: 고정 비율의 포지션 크기 방법은 연속 손실 중 과도한 위험 노출을 초래할 수 있습니다.
스톱 로스 설정: 고정 비율의 스톱 로스는 모든 시장 환경에 적합하지 않을 수 있으며 높은 변동성 기간 동안 조기 종료로 이어질 수 있습니다.
적응 매개 변수: 시장 조건에 따라 이동 평균 매개 변수와 변동성 임계치를 동적으로 조정하는 적응 메커니즘을 도입합니다.
다중 시간 프레임 분석: 추세 결정의 정확성을 향상시키기 위해 더 길고 짧은 시간 프레임의 정보를 통합합니다.
변동성 지표 최적화: 더 정확한 시장 상태를 평가하기 위해 ATR 또는 볼링거 대역폭과 같은 더 정교한 변동성 지표를 사용하는 것을 고려하십시오.
모멘텀 지표 통합: RSI 또는 MACD와 같은 모멘텀 지표를 결합하여 출입 및 출출 시기를 최적화합니다.
개선된 스톱 로스 메커니즘: 시장 변동에 더 잘 적응하기 위해 트레일링 스톱 또는 ATR 기반의 동적 스톱 로스를 구현합니다.
시장 정서 통합: VIX와 같은 시장 정서 지표를 통합하여 다른 시장 환경에서 전략 성과를 최적화하십시오.
포지션 관리 최적화: 더 나은 위험 통제를 위해 변동성 또는 현재 이익/손실에 기반한 동적 포지션 크기를 구현합니다.
기본 필터 추가: 중요한 경제 데이터 발표 또는 회사 수익 보고서와 같은 기본 요소를 고려하여 고위험 기간 동안 거래를 피하십시오.
기계 학습 최적화: 기계 학습 알고리즘을 사용하여 매개 변수 조합과 결정 규칙을 최적화하여 전략 적응성을 향상시킵니다.
백테스팅과 프론트 테스트: 전략의 견고성을 확인하기 위해 다른 시장과 기간에서 더 포괄적인 백테스팅과 프론트 테스트를 수행합니다.
변동성 필터와 함께 멀티 이동 평균 크로스오버 트렌드 추적 전략은 여러 이동 평균, 변동성 지표 및 트렌드 추적 원칙을 결합한 포괄적이고 유연한 거래 시스템입니다. 다차원 트렌드 분석과 엄격한 위험 통제를 통해 전략은 다양한 시장 환경에서 지속적인 추세를 파악할 잠재력을 가지고 있습니다. 그러나 사용자는 매개 변수 최적화 및 시장 적응성 문제에주의를 기울여야하며 전략 성과를 더욱 향상시키기 위해 더 고급 기술 지표 및 위험 관리 기술을 도입하는 것을 고려해야합니다. 전반적으로 이것은 더 많은 연구와 최적화에 좋은 기반을 제공하는 탄탄한 전략 프레임워크입니다.
/*backtest start: 2023-07-23 00:00:00 end: 2024-07-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD) // 用户输入参数 capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100 close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100 stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100 allow_long = input.bool(true, title="是否做多", group="Position") allow_short = input.bool(true, title="是否做空", group="Position") // 用户选择的移动平均线 short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify") mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify") long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify") bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify") enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify") // 波动率指标参数 volatility_k = input.int(60, title="波动率数值K线数" , group="volatility") volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility") // 定义不同类型的移动平均线函数 ma(source, length, type) => switch type "SMA" => ta.sma(source, length) "EMA" => ta.ema(source, length) "SMMA (RMA)" => ta.rma(source, length) "WMA" => ta.wma(source, length) "VWMA" => ta.vwma(source, length) // 定义每根均线的输入参数和颜色 length0 = input.int(16, minval=1, title="Length 0", group="MA 0") source0 = input.source(hl2, title="Source 0", group="MA 0") type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0") timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0") color0 = input.color(color.gray, title="Color 0", group="MA 0") show0 = input.bool(true, title="Show MA 0", group="MA 0") length1 = input.int(48, minval=1, title="Length 1", group="MA 1") source1 = input.source(hl2, title="Source 1", group="MA 1") type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1") timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1") color1 = input.color(color.aqua, title="Color 1", group="MA 1") show1 = input.bool(true, title="Show MA 1", group="MA 1") length2 = input.int(144, minval=1, title="Length 2", group="MA 2") source2 = input.source(hl2, title="Source 2", group="MA 2") type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2") timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2") color2 = input.color(color.orange, title="Color 2", group="MA 2") show2 = input.bool(true, title="Show MA 2", group="MA 2") length3 = input.int(432, minval=1, title="Length 3", group="MA 3") source3 = input.source(hl2, title="Source 3", group="MA 3") type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3") timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3") color3 = input.color(color.green, title="Color 3", group="MA 3") show3 = input.bool(true, title="Show MA 3", group="MA 3") length4 = input.int(91, minval=1, title="Length 4", group="MA 4") source4 = input.source(hl2, title="Source 4", group="MA 4") type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4") timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4") color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色 style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4") show4 = input.bool(false, title="Show MA 4", group="MA 4") length5 = input.int(182, minval=1, title="Length 5", group="MA 5") source5 = input.source(hl2, title="Source 5", group="MA 5") type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5") timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5") color5 = input.color(color.red, title="Color 5", group="MA 5") style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5") show5 = input.bool(true, title="Show MA 5", group="MA 5") // 计算每根均线的值 value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0)) value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1)) value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2)) value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3)) value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4)) value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5)) // 绘制每根均线 plot(show0 ? value0 : na, title="MA 0", color=color0) plot(show1 ? value1 : na, title="MA 1", color=color1) plot(show2 ? value2 : na, title="MA 2", color=color2) plot(show3 ? value3 : na, title="MA 3", color=color3) plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2) plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2) // 添加策略部分 // 选择均线值 get_ma_value(ma_name) => if (ma_name == "MA 0") value0 else if (ma_name == "MA 1") value1 else if (ma_name == "MA 2") value2 else if (ma_name == "MA 3") value3 else if (ma_name == "MA 4") value4 else value5 short_ma_value = get_ma_value(short_term_ma) mid_ma_value = get_ma_value(mid_term_ma) long_ma_value = get_ma_value(long_term_ma) bull_bear_ma_value = get_ma_value(bull_bear_ma) // 计算波动率 high_close = ta.highest(high, volatility_k) low_close = ta.lowest(low, volatility_k) volatility = 100 * (high_close - low_close) / low_close // 波动率条件背景色 volatilityCondition = (volatility > volatility_threshold) volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0 bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background") // 策略信号 long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value)) short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value)) var float stop_level_long = na var float stop_level_short = na // 执行策略 if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) if (long_condition and close > long_ma_value) // 判断是否立即触发止损 strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close) label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small) if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) if (short_condition and close < long_ma_value) // 判断是否立即触发止损 strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close) label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small) // 部分平仓逻辑 if (enable_bull_bear) // 当当前价格处在牛熊趋势均线之下时 if (close < bull_bear_ma_value) // 平所有多仓 if (strategy.position_size > 0) strategy.close("Long", comment="平所有多仓") label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small) // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空 if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition) if (strategy.position_size < 0) strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空") label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small) // 当当前价格处在牛熊趋势均线之上时 if (close > bull_bear_ma_value) // 平所有空仓 if (strategy.position_size < 0) strategy.close("Short", comment="平所有空仓") label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small) // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多 if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition) if (strategy.position_size > 0) strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多") label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small) else if (not enable_bull_bear and not (allow_long and allow_short)) // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空 if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition) if (strategy.position_size < 0) strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空") label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small) // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多 if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition) if (strategy.position_size > 0) strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多") label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small) // 止损处理 if (strategy.position_size > 0) stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user) strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user) else if (strategy.position_size < 0) stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user) strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)