이 전략은 이동 평균에 기반하고, 자동으로 매개 변수를 조정할 수 있으며, 높은 시간 프레임에서 파동적인 시장에 적합합니다. 가격이 이동 평균선을 통과 할 때 최적의 매개 변수 조합을 자동으로 찾고 거래 신호를 생성 할 수 있습니다.
이 전략은 적응 이동 평균을 거래 신호로 사용합니다. 먼저 지정된 기간 (시작) 의 간단한 이동 평균 (CMA) 을 계산합니다. 그 다음 기간 주위에서 CMA 매개 변수를 테스트하여 촛불 몸과 빗으로 가장 적은 접촉을 가진 조합을 판단합니다. 마지막으로 신호 라인으로 가장 적은 접촉을 가진 CMA를 사용합니다.
구체적으로, 전략은 CMA를 기간 더하기 1 (CMA_P1) 및 마이너스 1 (CMA_M1) 로 테스트하고, 몸과 윗부분에 따라 터치 수를 계산합니다. CMA가 CMA_P1과 CMA_M1보다 터치가 적은 경우 현재 기간을 유지하십시오. CMA_P1이 터치가 적은 경우 기간을 1으로 증가하십시오. CMA_M1이 터치가 적은 경우 기간을 1으로 줄여보세요. 이것은 신호 라인으로 비교적 부드러운 CMA를 찾습니다.
가격이 CMA를 상향으로 돌파하면 구매 신호가 생성됩니다. 가격이 CMA를 상향으로 돌파하면 판매 신호가 생성됩니다.
이 적응적인 이동 평균 전략은 다음과 같은 장점을 가지고 있습니다.
자동으로 최적의 매개 변수를 찾습니다. 이동 평균 기간을 수동으로 선택 할 필요가 없습니다. 전략은 다른 기간을 테스트하고 최적을 찾을 것입니다.
거짓 신호를 줄이십시오. 고정 기간 MA와 비교하면 적응성 MA는 더 많은 소음을 필터링하고 많은 거짓 신호를 줄일 수 있습니다.
시장 변화에 적응하십시오. 시장이 범위에서 트렌드로 전환하면 MA 기간은 신호를 생성하기 위해 자동으로 증가합니다. 시장이 트렌드로 전환하면 범위로 전환되면 MA 기간은 자동으로 감소합니다. 따라서 전략은 시장 변화에 동적으로 적응 할 수 있습니다.
이 적응적인 방법은 수동 매개 변수 최적화 없이 전체 거래 시스템을 단순화 할 수 있습니다.
좋은 확장성. 개념은 적응 볼링거 밴드, 적응 KD 등과 같은 다른 지표에 적용 될 수 있습니다.
이 전략에는 몇 가지 위험 요소가 있습니다.
콜 옵션 위험. 시장이 콜 옵션 패턴을 가지고있을 때 촛불 몸은 MA 라인을 깨지 못할 수 있으며 잘못된 신호가 발생할 수 있습니다. 이러한 위험을 줄이기 위해 필터 조건을 추가해야합니다.
실패 브레이크업 위험. MA 브레이크업은 항상 계속되지 않으며 일부 실패 브레이크업이 발생할 수 있습니다. 높은 성공률을 보장하기 위해 브레이크업 검증이 필요합니다.
트렌드 반전 위험. 트렌드 진입 후 트렌드 반전은 적시에 전환되어야합니다. 그렇지 않으면 손실이 발생할 수 있습니다. 손실을 제어하기 위해 스톱 로스를 설정해야합니다.
매개 변수 최적화 위험. 적응 조정 매개 변수는 로컬 최적화로 넘어갈 수 있으며, 이로 인해 불필요한 MAs가 발생할 수 있습니다. 이 문제를 피하기 위해 모델 평가 방법을 도입해야합니다.
과도한 매개 변수 조정은 과도한 조정으로 인해 모델 일반화 능력을 잃을 수 있습니다. 다양한 시장 환경에서 장기 검증이 필요합니다. 백테스트 결과에 의존하는 것이 아닙니다.
이 적응형 MA 전략을 개선하기 위한 몇 가지 방향:
거짓 브레이크오웃을 필터링하기 위해 연속 브레이크오웃을 통해 트렌드 브레이크오웃 검증을 추가합니다.
스톱 로스 전략을 강화하고, 가격이 MA의 다른 쪽으로 돌아 갈 때 스톱 로스를 강화합니다.
호출 옵션이 표시될 때 잘못된 신호를 피하기 위해 옵션 필터를 추가합니다.
패러미터 튜닝을 제한하고 오버 피팅을 방지하기 위해 IC, LIC, SIC 등의 평가 메트릭을 도입하십시오.
적응적인 골든 크로스 전략, 적응적인 볼링거 밴드 등과 같은 다른 지표로 확장하십시오.
가중된 MA, 기하급수적인 MA 등을 사용하여 MA를 최적화하여 더 부드러운 MA를 얻습니다.
이 전략은 최적의 매개 변수를 찾기 위해 MA 기간을 적응적으로 조정하여 거래 신호를 생성합니다. 고정 매개 변수와 비교하면 많은 잘못된 신호를 줄이고 시장 변화에 적응 할 수 있습니다. 그러나 우리는 잠재적 인 위험을 경계하고 안정적인 수익을 위해 라이브 거래에서 적용하기 전에 검증 및 워크 포워드 최적화를 수행해야합니다.
[/trans]
/*backtest start: 2022-11-10 00:00:00 end: 2023-11-16 00:00:00 period: 1d basePeriod: 1h 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/ // © fondDealer96636 //@version=5 strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000) // input start = 20 lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.") smoothing = input(3, "Smoothing") source = input(close, "Source") startYear = input(2020, "Start year") resp = 1 in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0) // global var ix = -1 var mal = array.new_int(0) // functions avg(source, len) => sum = 0.0 for i = 0 to len-1 sum += source[i] sum/len bull = close > open wick_touch(x) => bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close)) body_touch(x) => bull ? (open < x and x < close) : (close < x and x < open) touches(t) => touches = 0 for i = 0 to lookback-1 touches += t[i] ? 1 : 0 touches // local ix := ix+1 prev_mal = ix >= 1 ? array.get(mal, ix-1) : start cma = avg(source, prev_mal) cma_p1 = avg(source, prev_mal+1) cma_m1 = avg(source, prev_mal-1) d = touches(wick_touch(cma)) d_p1 = touches(wick_touch(cma_p1)) d_m1 = touches(wick_touch(cma_m1)) d_b = touches(body_touch(cma)) d_p1_b = touches(body_touch(cma_p1)) d_m1_b = touches(body_touch(cma_m1)) any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0 no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0 wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na)) up = cma > cma[1] down = cma < cma[1] against_trend = (up and close < cma) or (down and close > cma) new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized) next_mal = na(new_mal) ? prev_mal : new_mal array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal)) // graph scma = ta.ema(cma, smoothing) uptrend = scma > scma[1] downtrend = scma < scma[1] plot(scma, "Automatic MA", color=uptrend ? color.green : color.red) uptrending = close > scma and uptrend downtrending = close < scma and downtrend defy = not uptrending and not downtrending defy_cross = defy and body_touch(scma) barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white))) // strategy change_to_uptrend = uptrending and downtrend[1] change_to_downtrend = downtrending and uptrend[1] long = in_date_range and change_to_uptrend short = in_date_range and change_to_downtrend if long strategy.entry("Long", strategy.long) if short strategy.entry("Short", strategy.short)