지수 수정 분석 필터링 전략


생성 날짜: 2023-12-13 15:55:07 마지막으로 수정됨: 2023-12-13 15:55:07
복사: 0 클릭수: 637
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

지수 수정 분석 필터링 전략

개요

이 전략은 모형 연산과 지수 이동 평균의 조합을 사용하여 포지션 방향을 판단하기 위해 무작위성이 강한 트렌드 필터를 구현한다. 전략은 우선 가격이 설정된 숫자의 상수로 나뉘어 0이 될 경우 거래 신호가 나타난다. 이 신호는 지수 이동 평균의 아래에 있으면 공소하고, 지수 이동 평균의 위에 있으면 더 많은 것을 한다. 이 전략은 수학 연산의 무작위성과 기술 지표의 트렌드를 판단하여, 다른 주기 지표 사이의 교차 검증을 사용하여 가격에 영향을 미치는 일부 무작위적 상황을 효과적으로 필터링한다.

전략 원칙

  1. 가격 입력값 a를 종점값close로 설정하여 변경할 수 있으며, 분수 b값을 4로 설정하여 변경할 수 있다.
  2. a를 b의 잔수 modulo로 나누고, 잔수가 0인지 판단한다.
  3. 인덱스 이동 평균 길이를 MALen으로 설정하고, 70 회기를 기본으로, 가격의 중·장기 경향을 판단하는 지표로 사용한다.
  4. 잔수modulo가 0일 때 거래 신호evennumber을 생성하고, EMA와의 관계가 방향을 결정한다. 가격이 EMA선을 넘으면 구매 신호 BUY를 생성하고, 가격이 EMA선을 넘으면 판매 신호 SELL을 생성한다.
  5. 거래 엔트리들은 신호의 방향에 따라 상장하거나 상장한다. 전략은 거래 횟수를 제어하기 위해 역으로 포지션을 개설하는 것을 제한할 수 있다.
  6. 중지 조건은 3가지의 중지 방식에 따라 설정된다: 고정 중지, ATR 중지, 가격 변동 범위 중지. 중지 조건은 중지의 역전이다.
  7. 더 많은 수익을 고정하기 위해 이동 스톱을 사용하거나 사용하지 않는 것을 선택할 수 있습니다.

우위 분석

  1. 모형 운영의 무작위성은 가격 변동의 영향을 피하고, 이동 평균의 트렌드 판단과 결합하여 일부 무효 신호를 효과적으로 필터링 할 수 있습니다.
  2. 지수 이동 평균은 중·장기 경향 판단 지표로, 모형 연산의 단기 신호 조합으로 사용, 다층 검증을 구현, 거짓 신호를 피한다.
  3. 사용자 정의 가능한 매개 변수 설정은 매우 유연하며, 다른 시장에 따라 매개 변수를 조정하여 최적의 매개 변수 조합을 찾을 수 있다.
  4. 여러 가지 스톱로스 방식이 통합되어 위험을 통제할 수 있으며, 수익을 고정하기 위해 스톱스트로프 조건을 설정합니다.
  5. 직접 역으로 포지션을 열 수 있으며, 포지션 방향을 원활하게 전환 할 수 있습니다. 또한 거래 횟수를 줄이기 위해이 기능을 종료 할 수 있습니다.

위험 분석

  1. 변수 설정이 잘못되면 거래 신호가 너무 많이 발생하여 거래 빈도와 슬라이드 포인트 비용이 증가 할 수 있습니다.
  2. 지수 이동 평균은 유일한 추세를 판단하는 지표로, 가격 반전의 시간을 놓칠 수 있습니다.
  3. 고정된 손실 방식은 너무 기계적일 수 있으며 시장의 변동에 적응할 수 없습니다.
  4. 직접 역으로 포지션을 개시하면 포지션 조정 빈도가 증가하고 거래 비용과 위험이 증가합니다.

최적화 방향

  1. EMA 대신 다른 평균선 지표를 테스트하거나, EMA와 다른 평균선을 조합하여 수익률을 높일 수 있는지 확인하십시오.
  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)