Estrategia EMA adaptativa con retraso cero

El autor:¿ Qué pasa?, Fecha: 2023-09-08 16:24:02
Las etiquetas:

El guión que ha proporcionado se basa en la estrategia Adaptive Zero Lag EMA (AZLEMA). Este guión utiliza los principios de la investigación de procesamiento de señales de John Ehlers y un método conocido como Cosine Instantaneous Frequency Measurement (IFM) para determinar el período de ciclo dominante, es decir, la duración del tiempo entre dos puntos idénticos en ciclos sucesivos en sus datos comerciales.

He aquí una breve descripción de lo que hace el guión de negociación:

  1. Inicialmente, establece la estrategia utilizando una configuración de entradas predeterminadas como período, modo adaptativo, límite de ganancia, umbral, puntos de stop loss y puntos de take profit.

  2. Luego establece cálculos para el modo adaptativo utilizando una combinación de ecuaciones diferenciales y el método Ehlers (utilizado cuando el ajuste Adaptive? está configurado como verdadero).

  3. Calcula el valor medio (EMA) de la fuente de datos seleccionada durante el período seleccionado.

  4. Realiza una operación de bucle para encontrar los valores de correlación de ganancia y error (EC) que minimizan el error absoluto.

  5. Utilizando estos valores, se calcula el valor final de la EC y se traza el valor de la EC y de la EMA en el gráfico.

  6. Crea condiciones de compra y venta potenciales basadas en el cruce y el cruce de EC y EMA por encima de un cierto umbral definido.

  7. Establece reglas para entrar y salir de posiciones largas y cortas basadas en las condiciones de compra y venta determinadas anteriormente. Para cada posición, calcula el tamaño del lote y entra en una posición cuando la condición respectiva (compra/venta) es cierta. Establece un stop loss y un trailing take profit para cada posición.

Este script parece bastante completo y versátil, ya que le permite cambiar múltiples parámetros para adaptarse a diferentes estilos de negociación y condiciones del mercado.


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

Más.