Стратегия адаптивного EMA с нулевым отставанием

Автор:Чао Чжан, Дата: 2023-09-08 16:24:02
Тэги:

Скрипт, который вы предоставили, основан на стратегии Adaptive Zero Lag EMA (AZLEMA). Этот скрипт использует принципы исследования обработки сигналов Джона Элерса и метод, известный как Козиновое мгновенное измерение частоты (IFM), для определения доминирующего периода цикла, то есть продолжительности времени между двумя идентичными точками в последовательных циклах в ваших торговых данных.

Вот краткий обзор того, что делает торговый сценарий:

  1. Первоначально он устанавливает стратегию с использованием конфигурации входных данных по умолчанию, таких как период, адаптивный режим, лимит прибыли, порог, точки остановки потери и точки получения прибыли.

  2. Затем он устанавливает расчеты для адаптивного режима с использованием комбинации дифференциальных уравнений и метода Элерса (используется, когда установка Adaptive? установлена на true).

  3. Он рассчитывает среднее значение (EMA) выбранного источника данных за выбранный период.

  4. Он выполняет операцию петли, чтобы найти значения корреляции прибыли и ошибки (EC), которые минимизируют абсолютную ошибку.

  5. Используя эти значения, он вычисляет окончательное значение EC и графически показывает значение EC и EMA на графике.

  6. Он создает потенциальные условия покупки и продажи, основанные на перекрестном и перекрестном взаимодействии ЕС и 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)

Больше