Strategi Pola ABCD Momentum


Tanggal Pembuatan: 2023-09-24 13:08:28 Akhirnya memodifikasi: 2023-09-24 13:08:28
menyalin: 1 Jumlah klik: 736
1
fokus pada
1617
Pengikut

Ringkasan

Strategi ini menggunakan indikator Williams Fractal untuk mengidentifikasi titik tinggi dan rendah harga, dan digabungkan dengan ABCD untuk menentukan arah tren, masuk setelah tren dikonfirmasi, untuk melacak tren garis pendek dan mendapatkan keuntungan.

Prinsip Strategi

  1. Menggunakan indikator Williams Fractal untuk mengidentifikasi harga tinggi dan rendah, berdasarkan bentuk yang berbeda, penilaian adalah bentuk ABCD pasar bullish atau ABCD pasar bearish.

  2. Kriteria penilaian bentuk ABCD:

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

    • D di bawah C adalah bull market, D di atas C adalah bear market.

  3. Dengan fungsi barssince, menentukan arah dari satu arah sebelumnya dengan jarak fractal yang paling dekat dengan arah saat ini, untuk menentukan arah tren saat ini secara keseluruhan.

  4. Masukkan over/under saat mengidentifikasi bentuk ABCD, dan atur stop loss dan stop loss, untuk melacak tren garis pendek.

Analisis Keunggulan Strategi

  1. Dengan menggunakan penilaian tambahan dari indikator Williams Fractal, titik-titik perubahan dapat diidentifikasi dengan lebih akurat.

  2. Kriteria penilaian bentuk ABCD sederhana, dapat diandalkan, dan mudah diprogram.

  3. Fungsi barssince yang digunakan untuk menentukan arah tren besar, dapat secara efektif mengurangi kerugian yang disebabkan oleh false breaks.

  4. Setelah Anda mengatur stop loss, Anda dapat melacak tren garis pendek untuk mendapatkan keuntungan.

Analisis Risiko Strategi

  1. Williams Fractal terlambat, mungkin kehilangan titik balik dan menyebabkan kerugian.

  2. Ada beberapa bentuk ABCD yang tumpang tindih pada garis tengah, yang dapat menyebabkan kesalahan identifikasi.

  3. Jika penilaian tren besar tidak akurat, maka perdagangan garis pendek dapat terjebak dalam kurungan.

  4. Jika setelan stop loss terlalu kecil, maka akan mudah terjatuh, dan jika setelan stop loss terlalu besar, maka tidak akan efektif untuk melacak.

Metode optimasi yang sesuai:

  1. Selain itu, ada beberapa indikator lain yang dapat digunakan untuk mencari cara yang lebih efektif untuk mengidentifikasi titik balik.

  2. Optimalkan parameter dari bentuk ABCD, sehingga penilaian lebih ketat dan lebih dapat diandalkan.

  3. Mengoptimalkan metode penilaian tren besar, mencegah kesalahan penilaian tren besar.

  4. Uji berbagai rasio stop loss untuk menemukan stop loss yang optimal.

Arah optimasi strategi

  1. Anda dapat mencoba menggunakan MACD, KDJ, dan indikator lain untuk membantu menilai tren, mencari waktu masuk yang lebih akurat.

  2. Parameter dapat dioptimalkan untuk siklus yang berbeda dari varietas yang berbeda, untuk menemukan stop loss yang paling cocok untuk siklus varietas tersebut.

  3. Anda dapat mengoptimalkan seluruh siklus berdasarkan perubahan pasar untuk mencari kombinasi parameter terbaik.

  4. Anda dapat menggabungkan indikator seperti garis rata untuk memfilter sinyal masuk, meningkatkan stabilitas strategi.

  5. Algoritma pembelajaran mesin dapat diperkenalkan untuk memanfaatkan lebih banyak model pelatihan data untuk meningkatkan akurasi identifikasi.

Meringkaskan

Strategi ini memiliki konsep yang jelas dan dapat diandalkan, menggunakan arah tren garis pendek dalam penilaian pola Williams Fractal dan ABCD, kemudian menggabungkan filter tren dan pengaturan stop loss untuk melacak tren. Ada banyak ruang untuk pengoptimalan strategi, yang dapat ditingkatkan dari sinyal masuk, pengoptimalan parameter, dan penghakiman tren, sehingga strategi lebih cocok untuk berbagai lingkungan pasar. Secara keseluruhan, strategi ini memiliki kepraktisan yang kuat sebagai model strategi kombinasi discretionary + quant.

Kode Sumber Strategi
/*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)