Автоматизированная стратегия следования за трендом, основанная на точках разворота и уровнях коррекции Фибоначчи


Дата создания: 2024-01-05 11:34:17 Последнее изменение: 2024-01-05 11:34:17
Копировать: 0 Количество просмотров: 687
1
Подписаться
1621
Подписчики

Автоматизированная стратегия следования за трендом, основанная на точках разворота и уровнях коррекции Фибоначчи

Обзор

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

Стратегический принцип

  1. Вычисление высоких и низких точек на оси акций
  2. Оценить, упала ли цена с предыдущего максимума или поднялась с предыдущего минимума
  3. Расчет коэффициента фибоначевой регрессии между текущей и предыдущей волной
  4. Если соотношение отступления в верхней и нижней полосах находится в надлежащем диапазоне, то можно определить, что ABC-полоса может быть сформирована.
  5. После подтверждения ABC полосы, настройка стоп-лоста на точку C при плюсе, остановка колеблется в 1,5 раза; настройка стоп-лоста на точку A при минусе, остановка колеблется в 1,5 раза

Анализ преимуществ

  1. Использование опорных точек для определения ключевых областей сопротивления для повышения точности сигнала
  2. Применение Fibonacci Retracement для распознавания ABC-форматов и автоматического захвата точек перехода тренда
  3. Стоп-стоп является четким и разумным, чтобы избежать больших потерь

Анализ рисков

  1. Нельзя гарантировать точную оценку переменных точек в каждом случае, и это может привести к ошибкам.
  2. Стоп-стоп в точках C и A могут быть нарушены, что приведет к увеличению убытков.
  3. Необходимо оптимизировать параметры, такие как диапазон Fibonacci retracement ratio

Направление оптимизации

  1. Повышение точности сигнала в сочетании с дополнительными техническими показателями, помогающими определить форму ABC
  2. Сфера, в которой можно оптимизировать коэффициент Fibonacci для большего количества рыночных условий
  3. Модели, которые могут быть обучены определению формы ABC с использованием методов машинного обучения

Подвести итог

Стратегия основана на определении ключевых областей сопротивления и поддержки в центральных точках, а также использует коэффициент отступления Фибоначчи, чтобы автоматически идентифицировать форму ABC и давать сигналы о торговле на короткие и длинные позиции в точке поворота диапазона. Логика стратегии ясна и проста, установка стоп-стоп разумна, позволяет эффективно контролировать риск. Однако существует определенный риск ошибочного суждения, который требует дальнейшей оптимизации и улучшения, чтобы адаптироваться к более широким рыночным условиям.

Исходный код стратегии
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-19 23:59:59
period: 1m
basePeriod: 1m
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/
// © kerok3g

//@version=5
strategy("ABCD Strategy", shorttitle="ABCDS", overlay=true, commission_value=0.04)
calcdev(fprice, lprice, fbars, lbars) =>
    rise = lprice - fprice
    run = lbars - fbars
    avg = rise/run
    ((bar_index - lbars) * avg) + lprice

len = input(5)

ph = ta.pivothigh(len, len)
pl = ta.pivotlow(len, len)

var bool ishigh = false
ishigh := ishigh[1]

var float currph = 0.0
var int currphb = 0
currph := nz(currph)
currphb := nz(currphb)

var float oldph = 0.0
var int oldphb = 0
oldph := nz(oldph)
oldphb := nz(oldphb)

var float currpl = 0.0
var int currplb = 0
currpl := nz(currpl)
currplb := nz(currplb)

var float oldpl = 0.0
var int oldplb = 0
oldpl := nz(oldpl)
oldplb := nz(oldplb)

if (not na(ph))
    ishigh := true
    oldph := currph
    oldphb := currphb
    currph := ph
    currphb := bar_index[len]
else
    if (not na(pl))
        ishigh := false
        oldpl := currpl
        oldplb := currplb
        currpl := pl
        currplb := bar_index[len]

endHighPoint = calcdev(oldph, currph, oldphb, currphb)
endLowPoint = calcdev(oldpl, currpl, oldplb, currplb)

plotshape(ph, style=shape.triangledown, color=color.red, location=location.abovebar, offset=-len)
plotshape(pl, style=shape.triangleup, color=color.green, location=location.belowbar, offset=-len)

// var line lnhigher = na
// var line lnlower = na
// lnhigher := line.new(oldphb, oldph, bar_index, endHighPoint)
// lnlower := line.new(oldplb, oldpl, bar_index, endLowPoint)
// line.delete(lnhigher[1])
// line.delete(lnlower[1])

formlong = oldphb < oldplb and oldpl < currphb and currphb < currplb
longratio1 = (currph - oldpl) / (oldph - oldpl)
longratio2 = (currph - currpl) / (currph - oldpl)

formshort = oldplb < oldphb and oldphb < currplb and currplb < currphb
shortratio1 = (oldph - currpl) / (oldph - oldpl)
shortratio2 = (currph - currpl) / (oldph - currpl)

// prevent multiple entry for one pattern
var int signalid = 0
signalid := nz(signalid[1])

longCond = formlong and 
           longratio1 < 0.7 and 
           longratio1 > 0.5 and 
           longratio2 > 1.1 and 
           longratio2 < 1.35 and 
           close < oldph and 
           close > currpl and 
           signalid != oldplb
if (longCond)
    signalid := oldplb
    longsl = currpl - ta.tr
    longtp = ((close - longsl) * 1.5) + close
    strategy.entry("Long", strategy.long)
    strategy.exit("Exit Long", "Long", limit=math.min(longtp, oldph), stop=longsl)

shortCond = formshort and 
             shortratio1 < 0.7 and 
             shortratio1 > 0.5 and 
             shortratio2 > 1.1 and 
             shortratio2 < 1.35 and 
             close > oldpl and 
             close < currph and 
             signalid != oldphb

if (shortCond)
    signalid := oldphb
    shortsl = currph + ta.tr
    shorttp = close - ((shortsl - close) * 1.5)
    strategy.entry("Short", strategy.short)
    strategy.exit("Exit Short", "Short", limit=math.max(shorttp, oldpl), stop=shortsl)