EMA 필터 전략과 함께 모듈 로직

저자:차오장, 날짜: 2023-12-13 15:55:07
태그:

img

전반적인 설명

이 전략은 모듈 수학적 연산과 기하급수적 이동 평균을 결합하여 포지션 방향을 결정하기 위해 강력한 무작위성 필터를 만듭니다. 먼저 가격의 나머지를 정해진 숫자로 나누어서 계산하고 나머지 값이 0이라면 거래 신호가 생성됩니다. 이 신호가 EMA 라인 아래에 있다면, 짧게 가십시오. 이 전략은 수학적 연산의 무작위성과 기술 지표의 판단 트렌드를 통합하여, 다른 주기의 지표들 간의 교차 검증을 사용하여 시장 소음을 효과적으로 필터링합니다.

전략 논리

  1. 가격 입력값 a를 닫을 수 있도록 설정하고, 분배수를 b를 4로 설정하고, 변경할 수 있습니다.
  2. a를 b로 나누는 나머지의 모듈을 계산하고, 모듈이 0인지 결정합니다.
  3. 중간에서 장기적인 경향을 측정하는 메트릭으로 EMA (MALen) 의 길이를 70 기간으로 기본 설정합니다.
  4. 모듈이 0과 같을 때 트레이딩 신호의 짝수가 생성된다. EMA 관계와 결합하면 방향을 결정한다. 가격이 EMA를 넘으면 BUY 신호가 생성된다. 가격이 EMA를 넘으면 SELL 신호가 생성된다.
  5. 트레이딩 엔트리는 신호 방향에 따라 길거나 짧게 열립니다. 전략은 트레이드 수를 제어하기 위해 역 오픈 포지션을 제한 할 수 있습니다.
  6. 스톱 손실 조건은 3 가지 옵션에 따라 설정됩니다: 고정 스톱 손실, ATR 스톱 손실, 가격 스윙 스톱 손실. 수익 조건은 스톱 손실의 역입니다.
  7. 트레일링 스톱은 더 많은 수익을 올리기 위해 활성화 될 수 있습니다. 기본적으로 비활성화됩니다.

이점 분석

  1. 모두로 수학의 무작위성은 가격 변동의 영향을 피하고, 이동 평균의 트렌드 판단과 결합하여 유효하지 않은 신호를 효과적으로 필터링할 수 있습니다.
  2. 중장기 트렌드를 측정하는 EMA와 단기 모두로 신호는 다층 검증을 실현하고 잘못된 신호를 피합니다.
  3. 매우 유연하고 사용자 정의 가능한 매개 변수, 최적의 매개 변수 조합을 찾기 위해 다른 시장에 맞게 조정할 수 있습니다.
  4. 여러 스톱 로스 방법을 통합하여 위험을 제어합니다. 수익을 차단하기 위해 수익 조건도 설정합니다.
  5. 방향의 원활한 전환을 위해 직선 역 개설을 지원합니다. 또한 거래 수를 줄이기 위해 비활성화 할 수 있습니다.

위험 분석

  1. 부적절한 매개 변수 설정은 너무 많은 거래 신호를 생성하여 거래 빈도와 미끄러짐 비용을 증가시킬 수 있습니다.
  2. EMA가 유일한 트렌드 판단 메트릭으로 인해 가격 반전 순간이 빠질 수 있습니다.
  3. 고정 스톱 로스 방법은 너무 기계적일 수 있고 시장 변동에 적응할 수 없습니다.
  4. 직접적인 리버스 오픈은 위치 조정의 빈도를 증가시켜 비용과 위험을 증가시킵니다.

최적화 방향

  1. EMA 대신 다른 이동 평균을 테스트하거나 EMA를 다른 MAs와 결합하여 수익률률을 향상시킬 수 있는지 확인하십시오.
  2. 더 안정적인 필터를 만들기 위해 볼링거 밴드, 촛불 패턴 등과 같은 다른 전략과 모듈 필터를 결합해보십시오.
  3. 시장 변동성 수준에 기초한 적응적 스톱 손실 방법을 연구하여 스톱 거리를 조정합니다.
  4. 직접 리버스 오픈의 빈도를 제한하기 위해 거래 수 또는 이익/손실 기준에 제한을 설정합니다.

결론

이 전략은 다양한 시장 환경에 맞게 유연한 매개 변수 조정을 통해 모듈 오퍼레이션의 무작위성과 이동 평균의 트렌드 판단을 효과적으로 결합하여 신뢰할 수있는 거래 신호를 제공합니다. 또한 리스크를 제어하고 수익을 확보하기 위해 수익을 취하고 후속 중지하는 다양한 스톱 메커니즘을 통합합니다. 전반적인 논리는 명확하고 이해하기 쉽고 수정 할 수 있습니다. 추가 테스트 및 최적화에 가치가있는 엄청난 실용적 잠재력을 가지고 있습니다.


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-12 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/
// © tweakerID

// To understand this strategy first we need to look into the Modulo (%) operator. The modulo returns the remainder numerator 
// of a division's quotient (the result). If we do 5 / 3, we get 1 and 2/3 as a result, where the remainder is 2 (two thirds, in this case). This can be
// used for many things, for example to determine when a number divides evenly into another number. If we divide 3/3, our result is 1,
// with no remainder numerator, hence our modulo result is 0. In this strategy, we compare a given number (divisor, user defined) with the
// the closing price of every candle (dividend, modifiable from the inputs panel) to determine if the result between their division is an even number. 
// If the answer is true, we have an entry signal. If this signal occurs below the EMA (length is defined by the user) we go short and
// viceversa for longs. This logic can be reversed. In this case, the modulo works as a random-like filter for a moving average strategy
// that usually struggles when the market is ranging.

//@version=4

//@version=4
strategy("Modulo Logic + EMA Strat", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

a=input(close, title="Dividend")
b=input(4, title="Divisor")
usemod=input(true, title="Use Modulo Logic")
MALen=input(70, title="EMA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=3, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(4, step=.1, title="ATR Multiple")
i_TPRRR = input(1, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(false, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop

float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

modulo=a%b
evennumber=modulo==0
MA=ema(close, MALen)
plot(MA)

BUY=usemod ? evennumber and close > MA : close > MA
SELL=usemod ? evennumber and close < MA : close < MA

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)
 




더 많은