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.
Penggunaan Indeks Williams Fractal untuk mengenal pasti harga tinggi dan rendah, berdasarkan bentuk yang berbeza untuk menilai apakah ABCD bullish atau ABCD bearish.
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.
Dengan menggunakan fungsi barssince untuk menentukan arah fraktal yang paling dekat dengan arah semasa, untuk menentukan arah trend keseluruhan semasa.
Masukkan over/under apabila mengenal pasti ABCD, dan tetapkan stop loss dan stop loss, dan ikuti trend garis pendek.
Dengan menggunakan penghakiman tambahan dari Williams Fractal, titik-titik perubahan dapat dikenal pasti dengan lebih tepat.
Kriteria penilaian bentuk ABCD mudah dipercayai dan mudah diprogramkan.
Dengan menggunakan fungsi barssince untuk menentukan arah trend besar, ia dapat mengurangkan kerugian yang disebabkan oleh perobosan palsu.
Dengan menetapkan stop loss, anda boleh menjejaki trend garis pendek untuk mendapatkan keuntungan.
Williams Fractal berada di belakang, mungkin kehilangan titik perubahan dan menyebabkan kerugian.
Terdapat beberapa bentuk ABCD yang bertindih pada garis tengah yang boleh menyebabkan kesilapan pengiktirafan.
Apabila penilaian trend besar tidak tepat, perdagangan garis pendek dan tengah mudah terjebak.
Tetapan Damage Stop terlalu kecil dan mudah terkena, dan tetapan terlalu besar dan tidak berkesan.
Kaedah penyesuaian:
Anda boleh cuba menggunakan penunjuk lain untuk membantu anda menilai, mencari cara yang lebih berkesan untuk mengenal pasti titik-titik perubahan.
Optimumkan parameter bentuk ABCD untuk membuat penghakiman lebih ketat.
Mengoptimumkan kaedah untuk menilai trend besar dan mengelakkan kesalahan dalam menilai trend besar.
Uji pelbagai peratusan penghentian kerugian untuk mencari titik penghentian kerugian terbaik.
Anda boleh cuba menggunakan MACD, KDJ dan lain-lain untuk membantu menilai trend dan mencari masa kemasukan yang lebih tepat.
Parameter boleh dioptimumkan mengikut kitaran yang berbeza untuk pelbagai jenis untuk mencari titik henti rugi yang paling sesuai untuk kitaran jenis tersebut.
Anda boleh mengoptimumkan kitaran keseluruhan berdasarkan perubahan pasaran untuk mencari kombinasi parameter yang optimum.
Ia boleh digabungkan dengan penapis isyarat kemasukan seperti garis rata untuk meningkatkan kestabilan strategi.
Algoritma pembelajaran mesin boleh diperkenalkan untuk menggunakan lebih banyak model latihan data untuk meningkatkan ketepatan pengenalan.
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.
/*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)