EMA 평균값 회귀 거래 전략은 가격이 평균선에서 벗어나는 정도에 따라 시장을 개척하고 평상시 처리를 하는 거래 전략이다. EMA 평균선에서 현재 가격으로부터의 비율 차이점을 시장을 개척 신호로 사용하며, 추적 스톱 손실을 사용하여 위치를 관리한다.
이 전략은 EMA를 일평선 지표로 사용하며 현재 가격과 EMA의 비율의 차이를 계산한다. 가격이 EMA에서 충분히 멀리 있을 때 (임의 9%), 더 많은 거래를 개설한다; 가격이 EMA에 충분히 가까이 있을 때 (임의 1%), 평형된다. 개시 후, 상쇄 손실을 사용하여 수익을 잠금하고, 수익이 증가함에 따라 점차적으로 높은 손실 라인을 조정한다.
특히 전략은 다음과 같은 요소를 포함합니다.
평균 EMA를 계산합니다. 주기를 설정할 수 있습니다. 기본 200, 데이터 소스, 종료 가격, 계산 방법.
현재 가격과 EMA의 비율 차이를 계산합니다.
격차 비율에 따라 포지션을 개설한다. 더 많은 포지션을 개설하는 경우 9% (설정 가능), 빈 포지션을 개설하는 경우 9% (설정 가능).
계단 펴기를 지원한다. 계단의 계단 수와 각 계단 정도를 설정할 수 있다.
포스트 오픈 스톱 손실 추적. 시작 스톱 손실의 문턱을 설정할 수 있습니다 (전작의 수익 1%), 추적 범위를 설정할 수 있습니다 (전작의 1%).
격차 비율에 따라 평형. 다중 평형의 한계값은 1% (설정할 수 있다), 빈형은 동형이다.
미완성 거래 취소. 가격이 다시 EMA에 가까워지면 미완성 주문을 취소합니다.
정지 비율을 설정할 수 있습니다.
이 사이트는 이 사이트의 모든 정보를 공유하고 있습니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
유평선 회귀 개념을 활용하여 가격이 유평선에서 벗어날 때 거래를 개시하고 회귀할 때 평형화하여 트렌드 거래 이론에 부합합니다.
오픈, 중지, 평점의 매개 변수를 세밀하게 구성하여 다양한 시장 환경에 맞게 설정할 수 있습니다.
계단 개설은 대량으로 건설하여 단편 비용을 줄일 수 있습니다.
운영 중단 손실은 수익을 잠금하고 위험을 관리합니다.
최적화된 공간, 평선 매개 변수 또는 개설 평행 격차를 조정하여 다양한 시장을 조정할 수 있습니다.
주요 프로그래밍 언어인 파인 스크립트를 지원하며, 트레이딩뷰에서 직접 사용할 수 있다.
직관적인 그래프 표시를 통해 관찰 분석을 쉽게 할 수 있습니다.
이 전략은 다음과 같은 위험을 초래합니다:
재검토 데이터 적합성 위험. 매개 변수 최적화는 재검토 데이터의 과도한 적합성을 초래할 수 있으며 실제 효과는 의심된다.
유평선 부진 위험. 가격은 장기간에 걸쳐 유평선에서 크게 벗어날 수 있으며 되돌릴 수 없습니다.
유가증권 거래는 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우 유가증권 거래의 경우
거래가 빈번하고 거래비 부담이 크다.
이 경우, 더 긴 관찰 주기가 필요하며, 급기한 사건은 큰 영향을 미칩니다.
위험 관리에 대응:
더 많은 매개 변수를 조정하여 안정적인 매개 변수를 보장합니다.
합리적으로 구성된 평선 주기는 너무 짧거나 길지 않습니다.
부딪히는 것을 막기 위해 부딪히는 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막기 위해 부딪히는 것을 막는 것을 막는 것을 막는 것을 막는 것을 막는 것을 막는 것을 막는 것을 막는 것입니다.
적당히 상장 조건을 완화하고 거래 빈도를 줄입니다.
더 많은 지표와 결합하여 비상 상황에 대한 적응력을 높입니다.
이 전략은 다음과 같은 부분에서 최적화 될 수 있습니다.
거래량, 브린밴드, RSI 등 지표와 같은 필터링 조건을 추가하여 잘못된 신호를 줄입니다.
이중 EMA 시스템과 같은 복합평균선을 추가하여 흥행 거래의 확률을 높입니다.
자율적인 중지 손실,
자동 파라미터 최적화 기능을 추가하여 최적의 파라미터 조합을 자동으로 찾습니다.
기계 학습 예측을 증가시켜 가격의 평평선에서 벗어나는 확률을 판단하는 데 도움이 됩니다.
시간 간 거래를 고려하고, 야간 거래 또는 전 거래 정보를 활용하여 미리 배치하십시오.
롯데백화점의 롯데백화점의 롯데백화점의 롯데백화점의 롯데백화점의 롯데백화점의 롯데백화점
평균값 회귀 EMA 전략은 가격평등 회귀 특성에 기반한 트렌드 추적 전략이다. 그것은 트렌드 회귀를 판단하기 위해 평평선의 통계적 특성을 합리적으로 활용하고, 손해를 막기 위해 위험을 통제한다. 전통적인 평평선 거래 전략에 비해, 그것은 동적 손실을 막기 위해 더 많은 관심을 기울이고, 정지된 포스팅을 열지 않는다. 이 전략은 트렌드 추적 전략의 조합을 풍부하게 만들 수 있지만, 최적화 문제를 고찰하고, 거래 빈도를 제어해야 한다. 만약 계속적으로 중지 손실 메커니즘을 최적화하고, 포스팅 품질을 향상시키면, 실제로는 더 나은 효과를 얻을 수 있다.
/*backtest start: 2022-10-19 00:00:00 end: 2023-10-25 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/ // © jordanfray //@version=5 strategy(title="EMA Mean Reversion Strategy", overlay=true, max_bars_back=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.05, backtest_fill_limits_assumption=2) // Indenting Classs indent_1 = " " indent_2 = " " indent_3 = " " indent_4 = " " // Tooltips longEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a long postion will open." shortEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a short postion will open." closeEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, open postion will close." ladderInToolTip = "Enable this to use the laddering settings below." cancelEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, any unfilled entries will be canceled." // Group Titles group_one_title = "EMA Settings" group_two_title = "Entry Settings" // Colors blue = color.new(#00A5FF,0) lightBlue = color.new(#00A5FF,90) green = color.new(#2DBD85,0) gray_80 = color.new(#7F7F7F,80) gray_60 = color.new(#7F7F7F,60) gray_40 = color.new(#7F7F7F,40) white = color.new(#ffffff,0) red = color.new(#E02A4A,0) transparent = color.new(#000000,100) // Strategy Settings EMAtimeframe = input.timeframe(defval="", title="Timeframe", group=group_one_title) EMAlength = input.int(defval=200, minval=1, title="Length", group=group_one_title) EMAtype = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title="Type", group=group_one_title) EMAsource = input.source(defval=close, title="Source", group=group_one_title) openLongEntryAbove = input.float(defval=9, title="Long Position Entry Trigger", tooltip=longEntryToolTip, group=group_two_title) openEntryEntryAbove = input.float(defval=9, title="Short Position Entry Trigger", tooltip=shortEntryToolTip, group=group_two_title) closeEntryBelow = input.float(defval=1.0, title="Close Position Trigger", tooltip=closeEntryToolTip, group=group_two_title) cancelEntryBelow = input.float(defval=4, title="Cancel Unfilled Entries Trigger", tooltip=cancelEntryToolTip, group=group_two_title) enableLaddering = input.bool(defval=true, title="Ladder Into Positions", tooltip=ladderInToolTip, group=group_two_title) ladderRungs = input.int(defval=4, minval=2, maxval=4, step=1, title=indent_4+"Ladder Rungs", group=group_two_title) ladderStep = input.float(defval=.5, title=indent_4+"Ladder Step (%)", step=.1, group=group_two_title)/100 stop_loss_val = input.float(defval=4.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100 start_trailing_after = input.float(defval=1, title="Start Trailing After (%)", step=0.1, group=group_two_title)/100 trail_behind = input.float(defval=1, title="Trail Behind (%)", step=0.1, group=group_two_title)/100 // Calculate trailing stop values long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after) long_trail_behind_val = close - (strategy.position_avg_price * trail_behind) long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val) short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after) short_trail_behind_val = close + (strategy.position_avg_price * trail_behind) short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val) // Calulate EMA EMA = switch EMAtype "EMA" => ta.ema(EMAsource, EMAlength) "SMA" => ta.sma(EMAsource, EMAlength) "RMA" => ta.rma(EMAsource, EMAlength) "WMA" => ta.wma(EMAsource, EMAlength) => na EMA_ = EMAtimeframe == timeframe.period ? EMA : request.security(syminfo.ticker, EMAtimeframe, EMA[1], lookahead = barmerge.lookahead_on) plot(EMA_, title="EMA", linewidth=2, color=blue, editable=true) EMA_cloud_upper_band_val = EMA_ + (EMA_ * openLongEntryAbove/100) EMA_cloud_lower_band_val = EMA_ - (EMA_ * openLongEntryAbove/100) EMA_cloud_upper_band = plot(EMA_cloud_upper_band_val, title="EMA Cloud Upper Band", color=blue) EMA_cloud_lower_band = plot(EMA_cloud_lower_band_val, title="EMA Cloud Upper Band", color=blue) fill(EMA_cloud_upper_band, EMA_cloud_lower_band, editable=false, color=lightBlue) distance_from_EMA = ((close - EMA_)/close)*100 if distance_from_EMA < 0 distance_from_EMA := distance_from_EMA * -1 // Calulate Ladder Entries long_ladder_1_limit_price = close - (close * 1 * ladderStep) long_ladder_2_limit_price = close - (close * 2 * ladderStep) long_ladder_3_limit_price = close - (close * 3 * ladderStep) long_ladder_4_limit_price = close - (close * 4 * ladderStep) short_ladder_1_limit_price = close + (close * 1 * ladderStep) short_ladder_2_limit_price = close + (close * 2 * ladderStep) short_ladder_3_limit_price = close + (close * 3 * ladderStep) short_ladder_4_limit_price = close + (close * 4 * ladderStep) var position_qty = strategy.equity/close if enableLaddering position_qty := (strategy.equity/close) / ladderRungs else position_qty := strategy.equity/close plot(position_qty, color=white) //plot(strategy.equity, color=green) // Entry Conditions currently_in_a_postion = strategy.position_size != 0 currently_in_a_long_postion = strategy.position_size > 0 currently_in_a_short_postion = strategy.position_size < 0 average_price = strategy.position_avg_price bars_since_entry = currently_in_a_postion ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) + 1 : 5 long_run_up = ta.highest(high, bar_index == 0 ? 5000: bars_since_entry) long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent) start_trailing_long_entry = currently_in_a_long_postion and long_run_up > long_start_trailing_val long_trailing_stop = start_trailing_long_entry ? long_run_up - (long_run_up * trail_behind) : long_stop_loss long_trailing_stop_line = plot(long_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? green : red : transparent) short_run_up = ta.lowest(low, bar_index == 0 ? 5000: bars_since_entry) short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent) start_trailing_short_entry = currently_in_a_short_postion and short_run_up < short_start_trailing_val short_trailing_stop = start_trailing_short_entry ? short_run_up + (short_run_up * trail_behind) : short_stop_loss short_trailing_stop_line = plot(short_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? green : red : transparent) long_conditions_met = distance_from_EMA > openLongEntryAbove and close < EMA_ and not currently_in_a_postion short_conditions_met = distance_from_EMA > openEntryEntryAbove and close > EMA_ and not currently_in_a_postion close_long_entries = distance_from_EMA <= closeEntryBelow or close <= long_trailing_stop close_short_entries = distance_from_EMA <= closeEntryBelow or close >= short_trailing_stop cancel_entries = distance_from_EMA <= cancelEntryBelow plotshape(long_conditions_met ? close : na, style=shape.diamond, title="Long Conditions Met" ) plotshape(short_conditions_met ? close : na, style=shape.diamond, title="Short Conditions Met" ) plot(average_price,style=plot.style_stepline, editable=false, color=currently_in_a_postion ? blue : transparent) // Long Entry if enableLaddering if ladderRungs == 2 strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met) else if ladderRungs == 3 strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met) else if ladderRungs == 4 strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met) strategy.entry(id="Long Ladder 4", direction=strategy.long, qty=position_qty, limit=long_ladder_4_limit_price, when=long_conditions_met) strategy.exit(id="Close Long Ladder 1", from_entry="Long Ladder 1", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.exit(id="Close Long Ladder 2", from_entry="Long Ladder 2", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.exit(id="Close Long Ladder 3", from_entry="Long Ladder 3", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.exit(id="Close Long Ladder 4", from_entry="Long Ladder 4", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries) strategy.cancel(id="Long Ladder 1", when=cancel_entries) strategy.cancel(id="Long Ladder 2", when=cancel_entries) strategy.cancel(id="Long Ladder 3", when=cancel_entries) strategy.cancel(id="Long Ladder 4", when=cancel_entries) else strategy.entry(id="Long", direction=strategy.long, qty=100, when=long_conditions_met) strategy.exit(id="Close Long", from_entry="Long", stop=long_stop_loss, limit=EMA_, when=close_long_entries) strategy.cancel(id="Long", when=cancel_entries) // Short Entry if enableLaddering if ladderRungs == 2 strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met) else if ladderRungs == 3 strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met) else if ladderRungs == 4 strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met) strategy.entry(id="Short Ladder 4", direction=strategy.short, qty=position_qty, limit=short_ladder_4_limit_price, when=short_conditions_met) strategy.exit(id="Close Short Ladder 1", from_entry="Short Ladder 1", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.exit(id="Close Short Ladder 2", from_entry="Short Ladder 2", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.exit(id="Close Short Ladder 3", from_entry="Short Ladder 3", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.exit(id="Close Short Ladder 4", from_entry="Short Ladder 4", stop=short_trailing_stop, limit=EMA_, when=close_short_entries) strategy.cancel(id="Short Ladder 1", when=cancel_entries) strategy.cancel(id="Short Ladder 2", when=cancel_entries) strategy.cancel(id="Short Ladder 3", when=cancel_entries) strategy.cancel(id="Short Ladder 4", when=cancel_entries) else strategy.entry(id="Short", direction=strategy.short, when=short_conditions_met) strategy.exit(id="Close Short", from_entry="Short", limit=EMA_, when=close_short_entries) strategy.cancel(id="Short", when=cancel_entries)