Автоматический тренд, основанный на ключевой точке и ретракции Фибоначчи, следующий за стратегией

Автор:Чао Чжан, Дата: 2024-01-05 11:34:17
Тэги:

img

Обзор

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

Логика стратегии

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

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

  1. Ключевые точки определения уровня поддержки/сопротивления для улучшения точности сигнала
  2. Фибоначчи ретрассеи поймают поворотные моменты тренда, идентифицируя модели ABC
  3. Ясные правила прибыли и убытка позволяют избежать огромных потерь

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

  1. Ключевые точки и ретроцифровки Фибоначчи не могут гарантировать идеальную идентификацию каждой поворотной точки тренда.
  2. Точка C и точка А могут быть прорваны, что приводит к большим потерям.
  3. Параметры, такие как диапазоны соотношения ретрассемента Фибоначчи, нуждаются в дальнейшей оптимизации

Руководство по оптимизации

  1. Включить больше технических индикаторов для подтверждения ABC, улучшая точность сигнала
  2. Оптимизировать диапазоны коэффициента ретрекшемента Фибоначчи для большего количества рыночных условий
  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)


Больше