Strategi Corak Momentum ABCD


Tarikh penciptaan: 2023-09-24 13:08:28 Akhirnya diubah suai: 2023-09-24 13:08:28
Salin: 1 Bilangan klik: 736
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini menggunakan indikator Williams Fractal untuk mengenal pasti harga tinggi dan rendah, dan digabungkan dengan ABCD untuk menentukan arah trend, masuk selepas trend disahkan, untuk menjejaki trend garis pendek untuk mendapatkan keuntungan.

Prinsip Strategi

  1. Penggunaan Indeks Williams Fractal untuk mengenal pasti harga tinggi dan rendah, berdasarkan bentuk yang berbeza untuk menilai apakah ABCD bullish atau ABCD bearish.

  2. Kriteria untuk menilai bentuk ABCD:

    • Jarak antara AB dan CD hampir sama, jarak antara BC dan CD memenuhi keperluan perkadaran tertentu (antara 0.382-0.886 dan 1.13-2.618).

    • D yang lebih rendah daripada C adalah bentuk pasaran lembu, D yang lebih tinggi daripada C adalah bentuk pasaran beruang.

  3. Dengan menggunakan fungsi barssince untuk menentukan arah fraktal yang paling dekat dengan arah semasa, untuk menentukan arah trend keseluruhan semasa.

  4. Masukkan over/under apabila mengenal pasti ABCD, dan tetapkan stop loss dan stop loss, dan ikuti trend garis pendek.

Analisis kelebihan strategi

  1. Dengan menggunakan penghakiman tambahan dari Williams Fractal, titik-titik perubahan dapat dikenal pasti dengan lebih tepat.

  2. Kriteria penilaian bentuk ABCD mudah dipercayai dan mudah diprogramkan.

  3. Dengan menggunakan fungsi barssince untuk menentukan arah trend besar, ia dapat mengurangkan kerugian yang disebabkan oleh perobosan palsu.

  4. Dengan menetapkan stop loss, anda boleh menjejaki trend garis pendek untuk mendapatkan keuntungan.

Analisis risiko strategi

  1. Williams Fractal berada di belakang, mungkin kehilangan titik perubahan dan menyebabkan kerugian.

  2. Terdapat beberapa bentuk ABCD yang bertindih pada garis tengah yang boleh menyebabkan kesilapan pengiktirafan.

  3. Apabila penilaian trend besar tidak tepat, perdagangan garis pendek dan tengah mudah terjebak.

  4. Tetapan Damage Stop terlalu kecil dan mudah terkena, dan tetapan terlalu besar dan tidak berkesan.

Kaedah penyesuaian:

  1. Anda boleh cuba menggunakan penunjuk lain untuk membantu anda menilai, mencari cara yang lebih berkesan untuk mengenal pasti titik-titik perubahan.

  2. Optimumkan parameter bentuk ABCD untuk membuat penghakiman lebih ketat.

  3. Mengoptimumkan kaedah untuk menilai trend besar dan mengelakkan kesalahan dalam menilai trend besar.

  4. Uji pelbagai peratusan penghentian kerugian untuk mencari titik penghentian kerugian terbaik.

Arah pengoptimuman strategi

  1. Anda boleh cuba menggunakan MACD, KDJ dan lain-lain untuk membantu menilai trend dan mencari masa kemasukan yang lebih tepat.

  2. Parameter boleh dioptimumkan mengikut kitaran yang berbeza untuk pelbagai jenis untuk mencari titik henti rugi yang paling sesuai untuk kitaran jenis tersebut.

  3. Anda boleh mengoptimumkan kitaran keseluruhan berdasarkan perubahan pasaran untuk mencari kombinasi parameter yang optimum.

  4. Ia boleh digabungkan dengan penapis isyarat kemasukan seperti garis rata untuk meningkatkan kestabilan strategi.

  5. Algoritma pembelajaran mesin boleh diperkenalkan untuk menggunakan lebih banyak model latihan data untuk meningkatkan ketepatan pengenalan.

ringkaskan

Strategi ini mempunyai pemikiran yang jelas dan boleh dipercayai, menggunakan arah trend garis pendek dalam penghakiman bentuk Williams Fractal dan ABCD, dan kemudian menggabungkan penapis trend dan penyetelan stop loss untuk menjejaki trend. Terdapat ruang yang luas untuk pengoptimuman strategi, yang dapat diperbaiki dari segi isyarat masuk, pengoptimuman parameter, penghakiman trend, dan sebagainya, agar strategi lebih sesuai dengan keadaan pasaran yang berbeza. Secara keseluruhan, strategi ini mempunyai kegunaan yang kuat sebagai model strategi gabungan discretionary + kuant.

Kod 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)