이 전략은 재화 채널 지표 (CCI) 지표에 기반하여 과잉 판매 조건에서 길게 가고 과잉 구매 조건에서 짧게하는 것을 목표로합니다. 또한 트렌드 방향으로만 거래하기 위해 기하급수적인 이동 평균 (EMA) 필터를 선택적으로 사용합니다. 이 전략은 또한 고정 비율 또는 평균 진정한 범위 (ATR) 기반의 스톱 손실과 수익을 제공합니다.
시장 동향을 결정하기 위해 CCI 지표를 사용
CCI는 현재 가격과 한 기간 동안의 평균 가격을 비교하여 동력을 측정합니다.
150 이상의 CCI는 과잉 매입, -100 이하의 CCI는 과잉 판매
선택적으로 EMA 필터를 사용하세요
가격이 EMA보다 높을 때만 길게, EMA보다 낮을 때만 짧게
트렌드 방향을 결정하기 위해 EMA를 사용하고, 트렌드 반대 거래를 피하십시오.
두 가지 종류의 스톱 손실 및 수익을 제공
입시 가격의 고정된 비율을 사용한다
ATR 기반 스톱 손실 및 수익을 취합니다: 스톱 손실을 위해 ATR 곱셈을 사용하여 위험 보상 비율을 기반으로 수익을 계산합니다.
입국 조건
CCI가 -100을 넘을 때 긴 경로
CCI가 150 이하로 떨어지면 단축
EMA가 활성화되면, 가격이 EMA의 오른쪽쪽에 있을 때만 입력합니다.
출입 조건
스톱 로스 또는 영업 취득이 발생했을 때 포지션을 닫습니다.
CCI가 과잉 매수/ 과잉 판매 지역으로 다시 진입할 때 폐쇄된 위치
음모
CCI가 너무 많이 팔렸거나 너무 많이 팔렸다는 것을 입력하기 위해 사용하십시오. CCI의 전형적인 사용
선택적 EMA는 트렌드에 따라 거래를 보장하고 반전을 피합니다.
유연성을 위해 두 가지 유형의 스톱 로스/프로프트 취득을 제공하십시오.
CCI 신호에 대한 폐쇄는 다시 반전 수익에 잠금됩니다.
그래프 하이라이트는 CCI 신호를 명확하게 보여줍니다.
단순하고 명확한 논리, 이해하기 쉽고 최적화
CCI는 지연효과가 있고, 반전을 놓칠 수도 있고, 잘못된 신호를 줄 수도 있습니다.
잘못된 EMA 매개 변수는 트렌드를 놓칠 수도 있고 전략이 비효율적일 수도 있습니다.
고정 비율 스톱 손실/이익 취득 시장 변화에 덜 적응
ATR 중지 손실/이익 취득 ATR 기간에 민감한, 최적화해야 합니다
더 큰 유출 위험, 포지션 크기를 조정해야 합니다
성능은 시장 조건에 따라 달라집니다, 매개 변수를 재평가합니다.
최적의 매개 변수 조합을 찾기 위해 CCI 기간을 평가합니다.
가장 좋은 트렌드 추정치를 위해 다른 EMA 기간을 테스트합니다.
최적의 리스크 보상 비율을 위해 스톱 로스/프로프트 취득을 조정합니다.
거짓 신호를 더 피하기 위해 볼륨과 같은 다른 필터를 추가
패턴 확인을 위해 트렌드 라인/차트 패턴과 결합
유출을 제어하기 위해 고정된 크기 같은 위치 크기 규칙을 추가
다른 시장 조건에서 역 테스트, 동적으로 조정
이 전략은 진입을 위해 고전적인 CCI 과잉 구매/ 과잉 판매 원칙을 활용한다. EMA 필터는 트렌드 거래를 제어한다. 유연성을 위해 두 가지 유형의 스톱 로스/트랙 노프트가 제공된다. 플롯링은 신호를 명확하게 강조한다. 단순하고 명확한 논리, 이해하기 쉽고 최적화된다. 파라미터 튜닝, 필터 추가, 위험 통제 등을 통해 추가 개선이 가능하다.
/*backtest start: 2023-09-24 00:00:00 end: 2023-10-24 00:00:00 period: 1h 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/ // © alifer123 //@version=5 // strategy("CCI+EMA Strategy with Percentage or ATR TP/SL [Alifer]", shorttitle = "CCI_EMA_%/ATR_TP/SL", overlay=false, // initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.045) length = input(14, "CCI Length") overbought = input.int(150, step = 10, title = "Overbought") oversold = input.int(-140, step = 10, title = "Oversold") src = hlc3 ma = ta.sma(src, length) cci = (src - ma) / (0.015 * ta.dev(src, length)) // EMA useEMA = input(true, "Use EMA", tooltip = "Only enters long when price is above the EMA, only enters short when price is below the EMA") emaLength = input(55, "EMA Length") var float ema = na if useEMA ema := ta.ema(src, emaLength) // Take Profit and Stop Loss Method tpSlMethod_percentage = input(true, "Percentage TP/SL", group="TP/SL Method") tpSlMethod_atr = input(false, "ATR TP/SL", group="TP/SL Method") // Percentage-based Take Profit and Stop Loss tp_percentage = input.float(10.0, title="Take Profit (%)", step=0.1, group="TP/SL Method") sl_percentage = input.float(10.0, title="Stop Loss (%)", step=0.1, group="TP/SL Method") // ATR-based Take Profit and Stop Loss atrLength = input(20, title="ATR Length", group="TP/SL Method") atrMultiplier = input(4, title="ATR SL Multiplier", group="TP/SL Method") riskRewardRatio = input(2, title="Risk Reward Ratio", group="TP/SL Method") // Calculate TP/SL levels based on the selected method, or leave them undefined if neither method is selected longTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 + tp_percentage / 100) : na longSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 - sl_percentage / 100) : na shortTP = tpSlMethod_percentage ? strategy.position_avg_price * (1 - tp_percentage / 100) : na shortSL = tpSlMethod_percentage ? strategy.position_avg_price * (1 + sl_percentage / 100) : na if tpSlMethod_atr longSL := strategy.position_avg_price - ta.atr(atrLength) * atrMultiplier longTP := ((strategy.position_avg_price - longSL) * riskRewardRatio) + strategy.position_avg_price shortSL := strategy.position_avg_price + ta.atr(atrLength) * atrMultiplier shortTP := ((strategy.position_avg_price - shortSL) * riskRewardRatio) - strategy.position_avg_price // Enter long position when CCI crosses below oversold level and price is above EMA longCondition = ta.crossover(cci, oversold) and (not useEMA or close > ema) if longCondition strategy.entry("Buy", strategy.long) // Enter short position when CCI crosses above overbought level and price is below EMA shortCondition = ta.crossunder(cci, overbought) and (not useEMA or close < ema) if shortCondition strategy.entry("Sell", strategy.short) // Close long positions with Take Profit or Stop Loss if strategy.position_size > 0 strategy.exit("Long Exit", "Buy", limit=longTP, stop=longSL) // Close short positions with Take Profit or Stop Loss if strategy.position_size < 0 strategy.exit("Short Exit", "Sell", limit=shortTP, stop=shortSL) // Close positions when CCI crosses back above oversold level in long positions or below overbought level in short positions if ta.crossover(cci, overbought) strategy.close("Buy") if ta.crossunder(cci, oversold) strategy.close("Sell") // Plotting color_c = cci > overbought ? color.red : (cci < oversold ? color.green : color.white) plot(cci, "CCI", color=color_c) hline(0, "Middle Band", color=color.new(#787B86, 50)) obband = hline(overbought, "OB Band", color=color.new(#78867a, 50)) osband = hline(oversold, "OS Band", color=color.new(#867878, 50)) fill(obband, osband, color=color.new(#787B86, 90))