Стратегия импульсного паттерна ABCD


Дата создания: 2023-09-24 13:08:28 Последнее изменение: 2023-09-24 13:08:28
Копировать: 1 Количество просмотров: 736
1
Подписаться
1617
Подписчики

Обзор

Эта стратегия использует показатель Williams Fractal для определения высоких и низких цен, а также в сочетании с ABCD-формами определяет направление тенденции, вступая после подтверждения тенденции для получения прибыли от коротких линий.

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

  1. Используя индикатор Williams Fractal, можно определить высокие и низкие цены, а также определить, является ли ABCD в бычьем рынке или в медвежьем рынке.

  2. Критерии определения формы ABCD:

    • Расстояние между AB и CD близко, расстояние между BC и CD соответствует определенным требованиям пропорций (от 0.382-0.886 до 1.13-2.618).

    • D ниже C - это бычий рынок, D выше C - медвежий рынок.

  3. Фракталы в последнем направлении от текущего направления определяются с помощью функции barssince, чтобы определить направление общего тренда.

  4. При распознавании ABCD формы вход в лизинг/лизинг, а также установка стопов и остановок, отслеживание коротких линий тренда.

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

  1. Использование показателя Williams Fractal помогает более точно определить переломный момент.

  2. Критерии ABCD просты, надежны и легко программируемы.

  3. В сочетании с функцией barssince, которая определяет направление тенденции, можно эффективно уменьшить потери от ложных прорывов.

  4. После установки стоп-стоп можно отслеживать короткие тренды и получать прибыль.

Анализ стратегических рисков

  1. Williams Fractal задерживается, может пропустить поворотную точку и вызвать убытки.

  2. На центральной короткой линии имеются несколько перекрывающихся форм ABCD, что может привести к ошибке в идентификации.

  3. Если вы не знаете, как правильно оценить большую тенденцию, вы можете попасть в ловушку.

  4. Слишком маленькая настройка сдерживания ущерба может быть легко ударена, а слишком большая - плохо отслеживается.

Методы оптимизации:

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

  2. Оптимизация параметров формы ABCD для более строгого и надежного суждения.

  3. Оптимизация методов определения тенденций, предотвращение ошибочного определения тенденций.

  4. Тестирование различных остановочных показателей для определения оптимальной остановочной точки.

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

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

  2. Параметры могут быть оптимизированы для различных циклов разных сортов, чтобы найти наиболее подходящий для этого цикла стоп-стоп.

  3. Можно оптимизировать весь цикл в зависимости от изменения рынка, чтобы найти оптимальную комбинацию параметров.

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

  5. Можно внедрить алгоритмы машинного обучения, используя больше моделей обучения данных для повышения точности распознавания.

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

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

Исходный код стратегии
/*backtest
start: 2023-09-16 00:00:00
end: 2023-09-23 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4
// @author=Daveatt - BEST

// ABCD Pattern Strat

StrategyName        = "BEST ABCD Pattern Strategy"
ShortStrategyName   = "BEST ABCD Pattern Strategy" 

// strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true, 
//  pyramiding=2, default_qty_value=100, precision=7, currency=currency.USD,
//  commission_value=0.2,commission_type=strategy.commission.percent, initial_capital=1000000,
//  default_qty_type=strategy.fixed)

filterBW = input(false, title="filter Bill Williams Fractals?")

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////// UTILITIES ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

//  ||-----------------------------------------------------------------------------------------------------||
//  ||---   Fractal Recognition Functions:  ---------------------------------------------------------------||
isRegularFractal(mode, _high, _low) =>
    ret = mode == 1 ? _high[4] < _high[3] and _high[3] < _high[2] and _high[2] > _high[1] and _high[1] > _high[0] :
     mode == -1 ? _low[4] > _low[3] and _low[3] > _low[2] and _low[2] < _low[1] and _low[1] < _low[0] : false

isBWFractal(mode, _high, _low) =>
    ret = mode == 1 ? _high[4] < _high[2] and _high[3] <= _high[2] and _high[2] >= _high[1] and _high[2] > _high[0] :
     mode == -1 ? _low[4] > _low[2] and _low[3] >= _low[2] and _low[2] <= _low[1] and _low[2] < _low[0] : false

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
////////////////////////////// ABCD PATTERN ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

f_abcd()=>

    _r = timeframe.period
    _g = barmerge.gaps_off
    _l = barmerge.lookahead_on

    _high = high
    _low = low

    filteredtopf = filterBW ? isRegularFractal(1, _high, _low) : isBWFractal(1, _high, _low)
    filteredbotf = filterBW ? isRegularFractal(-1, _high, _low) : isBWFractal(-1, _high, _low)

    //  ||---   ZigZag:
    istop = filteredtopf
    isbot = filteredbotf
    topcount = barssince(istop)
    botcount = barssince(isbot)

    zigzag = (istop and topcount[1] > botcount[1] ? _high[2] :
     isbot and topcount[1] < botcount[1] ? _low[2] : na)

    x = valuewhen(zigzag, zigzag, 4) 
    a = valuewhen(zigzag, zigzag, 3) 
    b = valuewhen(zigzag, zigzag, 2) 
    c = valuewhen(zigzag, zigzag, 1) 
    d = valuewhen(zigzag, zigzag, 0)

    xab = (abs(b-a)/abs(x-a))
    xad = (abs(a-d)/abs(x-a))
    abc = (abs(b-c)/abs(a-b))
    bcd = (abs(c-d)/abs(b-c))

    // ABCD Part
    _abc = abc >= 0.382 and abc <= 0.886
    _bcd = bcd >= 1.13 and bcd <= 2.618
    
    _bull_abcd = _abc and _bcd and d < c 
    _bear_abcd = _abc and _bcd and d > c

    _bull   = _bull_abcd and not _bull_abcd[1]
    _bear   = _bear_abcd and not _bear_abcd[1]

    [_bull, _bear, zigzag]

lapos_x = timenow + round(change(time)*12)

[isLong, isShort, zigzag]  = f_abcd()

plot(zigzag, title= 'ZigZag', color=color.black, offset=-2)
plotshape(isLong, style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), size=size.normal, text="ABCD", textcolor=color.white)
plotshape(isShort, style=shape.labeldown, location=location.abovebar, color=color.new(color.maroon, 0), size=size.normal, text="ABCD", textcolor=color.white)


long_entry_price    = valuewhen(isLong, close, 0)
short_entry_price   = valuewhen(isShort, close, 0)

sinceNUP = barssince(isLong)
sinceNDN = barssince(isShort)

buy_trend   = sinceNDN > sinceNUP
sell_trend  = sinceNDN < sinceNUP


//////////////////////////
//* Profit Component *//
//////////////////////////

//////////////////////////// MinTick ///////////////////////////
fx_pips_value = syminfo.type == "forex" ? syminfo.mintick*10 : 1

input_tp_pips = input(100, "Backtest Profit Goal (in USD)",minval=0)*fx_pips_value
input_sl_pips = input(20, "Backtest STOP Goal (in USD)",minval=0)*fx_pips_value

tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips
sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips

plot_tp = buy_trend and high[1] <= tp ? tp : sell_trend and low[1] <= tp ? tp : na
plot_sl = buy_trend and low[1] >= sl ? sl : sell_trend and high[1] >= sl ? sl : na

plot(plot_tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue)
plot(plot_sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red)

longClose   = isShort
shortClose  = isLong


strategy.entry("Long", 1, when=isLong)
// strategy.close("Long", when=longClose )
strategy.exit("XL","Long", limit=tp,  when=buy_trend, stop=sl)


strategy.entry("Short", 0,  when=isShort)
// strategy.close("Short", when=shortClose )
strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)