적응적 제로 Lag EMA 전략

저자:차오장, 날짜: 2023-09-08 16:24:02
태그:

당신이 제공 한 스크립트는 적응적 제로 Lag EMA (AZLEMA) 전략을 기반으로 합니다. 이 스크립트는 존 Ehlers의 신호 처리 연구의 원칙과 코시노 순간 주파수 측정 (IFM) 으로 알려진 방법을 사용하여 지배적인 주기 기간, 즉 거래 데이터의 연속 주기의 두 동일한 지점 사이의 시간을 결정합니다.

다음은 거래 스크립트의 기능에 대한 간략한 개요입니다:

  1. 초기에는 기간, 적응 모드, 이윤 제한, 임계, 스톱 로스 포인트 및 수익 포인트와 같은 기본 입력의 구성을 사용하여 전략을 설정합니다. 통화는 USD로 설정되며 초기 자본은 1000입니다.

  2. 그 다음 미분 방정식과 Ehlers 방법 (Adaptive? 설정이 true로 설정되면 사용) 을 사용하여 적응 모드에 대한 계산을 설정합니다.

  3. 선택된 기간 동안 선택된 데이터 소스의 평균 값 (EMA) 을 계산합니다.

  4. 절대 오류를 최소화하는 이득 및 오류 상관관계 (EC) 값을 찾기 위해 루프 작업을 수행합니다.

  5. 이 값들을 이용해서 최종 EC 값을 계산하고 EC와 EMA의 값을 차트에 표시합니다.

  6. 그것은 EC와 EMA의 크로스오버와 크로스온더에 기초한 잠재적 인 구매 및 판매 조건을 생성합니다.

  7. 그것은 이전에 결정된 구매 및 판매 조건에 따라 긴 및 짧은 포지션을 입력하고 종료하기위한 규칙을 설정합니다. 각 포지션에 대해 롯 크기를 계산하고 해당 조건 (구입/판매) 이 맞을 때 포지션을 입력합니다. 각 포지션에 대한 스톱 로스와 트레일링 취득을 설정합니다.

이 스크립트는 다양한 거래 스타일과 시장 조건에 적응하기 위해 여러 매개 변수를 변경할 수 있기 때문에 매우 포괄적이고 다재다능합니다. 항상처럼 라이브 거래에서 사용하기 전에 역사적 데이터를 사용하여 이 전략을 백테스트하는 것이 좋습니다.


/*backtest
start: 2023-08-08 00:00:00
end: 2023-09-07 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Adaptive Zero Lag EMA", shorttitle="AZLEMA", overlay = true, initial_capital=1000, currency="USD", commission_type=strategy.commission.cash_per_contract, commission_value=0.000005, slippage = 5, pyramiding=1, calc_on_every_tick=true)

src = input(title="Source",  defval=close)
Period = input(title="Period", defval = 20)
adaptive = input(title="Adaptive?", defval=true)
GainLimit = input(title="Gain Limit",  defval = 15)
Threshold = input(title="Threshold",  defval=0.03, step=0.01)
fixedSL = input(title="SL Points", defval=50)
fixedTP = input(title="TP Points", defval=10)
risk = input(title='Risk', defval=0.01, step=0.01)

PI = 3.14159265359
s2 = 0.0
s3 = 0.0
delta = 0.0
inst = 0.0
len = 0.0
v1 = 0.0
v2 = 0.0
v4 = 0.0

//IF adaptive is true, use the Cosine IFM strategy for determining the dominant
//cycle period
if(adaptive)
    v1 := src - src[7]
    s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
    s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
    if (s2 != 0)
        v2 := sqrt(s3/s2)
    if (s3 != 0)
        delta := 2*atan(v2)
    for i = 0 to 100
        v4 := v4 + delta[i]
        if (v4 > 2*PI and inst == 0.0)
            inst := i - 1
    if (inst == 0.0)
        inst := inst[1]
    len := 0.25*inst + 0.75*nz(len[1])
    Period := round(len)

LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0

alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])

for i = -GainLimit to GainLimit
    Gain := i/10
    EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
    Error := src - EC
    if(abs(Error)<LeastError)
        LeastError := abs(Error)
        BestGain := Gain

EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])

plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)

buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold

if buy
    strategy.entry("Enter Long", strategy.long)
else if sell
    strategy.entry("Enter Short", strategy.short)

더 많은