Momentum ABCD Pattern Strategi

Penulis:ChaoZhang, Tanggal: 2023-09-24 13:08:28
Tag:

Gambaran umum

Strategi ini menggunakan indikator Fraktal Williams untuk mengidentifikasi puncak dan terendah harga dan menggabungkan pola ABCD untuk menentukan arah tren.

Logika Strategi

  1. Gunakan indikator fraktal Williams untuk mengidentifikasi puncak dan terowongan harga.

  2. Kriteria identifikasi pola ABCD:

    • Jarak antara AB dan CD serupa, dan jarak antara BC dan CD memenuhi persyaratan proporsional tertentu (antara 0,382-0,886 dan 1,13-2,618).

    • D titik di bawah titik C adalah pola bullish. D titik di atas titik C adalah pola bearish.

  3. Gunakan fungsi barssince untuk menentukan arah mana yang lebih dekat dengan fraktal saat ini untuk menilai arah tren keseluruhan.

  4. Masukkan long/short setelah mengidentifikasi pola ABCD, dan atur stop loss dan take profit untuk mengikuti tren jangka menengah.

Analisis Keuntungan

  1. Indikator fraktal Williams membantu mengidentifikasi titik balik dengan lebih akurat.

  2. Kriteria pola ABCD sederhana dan dapat diandalkan, mudah otomatis.

  3. Menghakimi arah tren utama dengan barsince menghindari kerugian dari false breakout.

  4. Mengikuti tren dengan stop loss dan mengambil keuntungan setelah masuk.

Analisis Risiko

  1. Williams Fractal mungkin tertinggal dan melewatkan titik balik menyebabkan kerugian.

  2. Beberapa pola ABCD yang tumpang tindih dapat menyebabkan kesalahan identifikasi pada grafik jangka menengah.

  3. Arah tren utama yang salah meningkatkan risiko terjebak dalam perdagangan jangka menengah.

  4. Stop loss yang terlalu ketat dapat dengan mudah dihentikan. Stop loss yang terlalu lebar dapat menyebabkan pelacakan yang buruk.

Solusi yang mungkin:

  1. Uji indikator lain untuk membantu mengidentifikasi titik balik dengan lebih efektif.

  2. Mengoptimalkan parameter pola ABCD untuk membuat identifikasi lebih ketat dan dapat diandalkan.

  3. Meningkatkan identifikasi tren utama untuk menghindari bias arah yang salah.

  4. Uji rasio stop loss/take profit yang berbeda untuk menemukan titik optimal.

Arahan Optimasi

  1. Uji MACD, KDJ dan indikator lainnya untuk meningkatkan akurasi sinyal masuk.

  2. Mengoptimalkan parameter berdasarkan produk dan kerangka waktu yang berbeda untuk menemukan tingkat stop loss/take profit yang optimal.

  3. Mengoptimalkan periode pencarian bar untuk menemukan kombinasi parameter terbaik sesuai dengan perubahan kondisi pasar.

  4. Tambahkan moving average dll untuk menyaring sinyal dan meningkatkan stabilitas.

  5. Memperkenalkan algoritma pembelajaran mesin dan lebih banyak data untuk meningkatkan akurasi pengenalan pola.

Ringkasan

Logika strategi yang jelas dan dapat diandalkan secara keseluruhan, menggunakan Williams Fractal dan ABCD pola untuk menentukan arah tren jangka menengah, menggabungkan dengan penyaringan tren, stop loss dan mengambil keuntungan untuk mengikuti tren untuk keuntungan.


/*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)

Lebih banyak