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