Adaptive Nullverzögerung EMA-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-09-08 16:24:02
Tags:

Das von Ihnen bereitgestellte Skript basiert auf der Adaptive Zero Lag EMA (AZLEMA) -Strategie. Dieses Skript verwendet die Prinzipien der John Ehlers' Signalverarbeitung und eine Methode namens Cosine Instantaneous Frequency Measurement (IFM) zur Bestimmung der dominierenden Zyklusperiode, d.h. der Zeitdauer zwischen zwei identischen Punkten in aufeinanderfolgenden Zyklen in Ihren Handelsdaten.

Hier ist ein kurzer Überblick über die Funktionen des Handelsscripts:

  1. Zunächst setzt es die Strategie mit einer Konfiguration von Standardinputs wie Periode, Adaptivmodus, Gewinnlimit, Schwelle, Stop-Loss-Punkte und Take-Profit-Punkte ein.

  2. Es stellt dann Berechnungen für den adaptiven Modus mit einer Kombination von Differentialgleichungen und Ehlers-Methode (verwendet, wenn die Adaptive?-Einstellung auf wahr eingestellt ist) ein.

  3. Es berechnet den durchschnittlichen Wert (EMA) der ausgewählten Datenquelle für den ausgewählten Zeitraum.

  4. Es führt eine Schleifenoperation durch, um die Werte der Korrelation zwischen Gewinn und Fehler (Gain and Error Correlation, EC) zu finden, die den absoluten Fehler minimieren.

  5. Anhand dieser Werte berechnet er den endgültigen EG-Wert und zeichnet den Wert von EC und EMA auf dem Diagramm.

  6. Es schafft potenzielle Kauf- und Verkaufsbedingungen, die auf der Verknüpfung von EG und EMA über einem bestimmten Schwellenwert beruhen.

  7. Es legt Regeln für den Ein- und Ausstieg aus Long- und Short-Positionen auf der Grundlage der zuvor festgelegten Kauf- und Verkaufsbedingungen fest. Für jede Position berechnet es die Losgröße und tritt eine Position ein, wenn die jeweilige Bedingung (Kauf/Verkauf) wahr ist. Es setzt für jede Position einen Stop-Loss und einen Trailing-Take-Profit.

Dieses Skript erscheint ziemlich umfassend und vielseitig, da es Ihnen erlaubt, mehrere Parameter zu ändern, um sich an verschiedene Handelsstile und Marktbedingungen anzupassen.


/*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)

Mehr