Chiến lược này sử dụng chỉ số Fractal Williams để xác định đỉnh và đáy giá và kết hợp các mô hình ABCD để xác định hướng xu hướng. Nó đi vào một vị trí sau khi xác nhận xu hướng để theo dõi xu hướng trung hạn cho lợi nhuận.
Sử dụng chỉ số Fractal Williams để xác định đỉnh và đáy giá. Các mô hình khác nhau được sử dụng để xác định mô hình ABCD tăng hoặc giảm.
Các tiêu chí xác định mẫu ABCD:
Khoảng cách giữa AB và CD là tương tự, và khoảng cách giữa BC và CD đáp ứng một số yêu cầu tỷ lệ nhất định (giữa 0,382-0,886 và 1,13-2,618).
Điểm D thấp hơn điểm C là một mô hình tăng. Điểm D cao hơn điểm C là một mô hình giảm.
Sử dụng hàm barssince để xác định hướng nào của Fractal gần với dòng để đánh giá hướng xu hướng tổng thể.
Nhập dài / ngắn sau khi xác định mô hình ABCD, và đặt dừng lỗ và lấy lợi nhuận để theo xu hướng trung hạn.
Chỉ số Fractal Williams giúp xác định các bước ngoặt chính xác hơn.
Các tiêu chí mô hình ABCD đơn giản và đáng tin cậy, dễ tự động hóa.
Đánh giá hướng xu hướng chính với barsinth tránh tổn thất từ các sự phá vỡ sai.
Tiếp theo xu hướng với dừng lỗ và lấy lợi nhuận sau khi nhập.
Williams Fractal có thể bị chậm lại và bỏ lỡ các điểm chuyển đổi gây ra tổn thất.
Nhiều mô hình ABCD chồng chéo có thể gây ra sự xác định sai trên biểu đồ trung hạn.
Hướng dẫn xu hướng chính sai làm tăng nguy cơ bị mắc kẹt trong các giao dịch trung hạn.
Dừng mất quá chặt có thể bị dừng ra dễ dàng. Dừng mất quá rộng có thể gây ra việc theo dõi kém.
Các giải pháp có thể:
Kiểm tra các chỉ số khác để giúp xác định các điểm chuyển hướng hiệu quả hơn.
Tối ưu hóa các tham số mẫu ABCD để làm cho nhận dạng nghiêm ngặt và đáng tin cậy hơn.
Cải thiện xác định xu hướng chính để tránh thiên vị hướng sai.
Kiểm tra các tỷ lệ dừng lỗ / lấy lợi nhuận khác nhau để tìm điểm tối ưu.
Kiểm tra MACD, KDJ và các chỉ số khác để cải thiện độ chính xác của tín hiệu đầu vào.
Tối ưu hóa các tham số dựa trên các sản phẩm và khung thời gian khác nhau để tìm mức dừng lỗ / lấy lợi nhuận tối ưu.
Tối ưu hóa thời gian xem lại thanh để tìm kết hợp tham số tốt nhất theo điều kiện thị trường thay đổi.
Thêm trung bình động v.v. để lọc tín hiệu và cải thiện sự ổn định.
Giới thiệu các thuật toán học máy và nhiều dữ liệu hơn để cải thiện độ chính xác nhận dạng mẫu.
Lý thuyết chiến lược là rõ ràng và đáng tin cậy nói chung, sử dụng mô hình Williams Fractal và ABCD để xác định hướng xu hướng trung hạn, kết hợp với lọc xu hướng, dừng lỗ và lấy lợi nhuận để theo xu hướng để kiếm lợi nhuận.
/*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)