この戦略は,価格ピークと底辺を特定するためにウィリアムズ・フラクタル指標を使用し,トレンド方向を決定するためにABCDパターンを組み合わせます.トレンドを確認した後,利益のための中期トレンドを追跡するためにポジションに入ります.
ウィリアムズ・フラクタル指標を使用して,価格ピークと底辺を特定します. 上昇または下落のABCDパターンを決定するために,異なるパターンが使用されます.
ABCDパターン識別基準:
AB と CD の距離は類似しており,BC と CD の距離は一定の比例要求を満たしている (0.382-0.886 と 1.13-2.618 の間).
C点より低い点は上昇パターンで C点より高い点は下落パターンです
全体のトレンド方向を判断するために,どの方向
ABCDパターンを特定した後,ロング/ショートを入力し,中期トレンドに従うためにストップ・ロスを設定し,利益を取ります.
ウィリアムズ・フラクタル・インジケーターは ターニング・ポイントを より正確に識別するのに役立ちます
ABCDパターンの基準は単純で信頼性があり 自動化が容易です
バースシントで主要なトレンド方向を判断すると,偽ブレイクによる損失を回避できます.
ストップ・ロストとエントリー後に 利益を取ったトレンドに従います
ウィリアムズ・フラクタルは遅れて ターニングポイントを逃して 損失を起こす可能性があります
複数の重なる ABCD パターンは,中期チャートで誤った識別を引き起こす可能性があります.
間違った主要トレンド方向は 中期取引に閉じ込められるリスクを高めます
ストップ・ロスは太りすぎると簡単に停止され ストップ・ロスは太りすぎると追跡が悪くなる.
可能な解決策:
他の指標をテストして ターニングポイントを より効果的に識別する
ABCD パターンパラメータを最適化して 識別を厳格で信頼性のあるものにします
主要なトレンドの識別を改善し,誤った方向性バイアスを避ける.
最適なポイントを見つけるために 異なるストップ・ロス/テイク・プロフィート比をテストします
入力信号の正確性を向上させるためにMACD,KDJ,その他の指標をテストする.
異なる製品とタイムフレームに基づいてパラメータを最適化し,最適なストップ・ロスト/テイク・プロフィートレベルを見つけます.
変化する市場状況に応じて最適なパラメータの組み合わせを見つけるために,バーのバックバック期間を最適化します.
移動平均等を追加してシグナルをフィルタリングし安定性を向上させる.
機械学習アルゴリズムとより多くのデータを導入して パターン認識の精度を向上させる
戦略の論理は全体的に明確で信頼性があり,ウィリアムス・フラクタルとABCDパターンを用い,中期トレンド方向を決定し,トレンドフィルタリング,ストップ・ロスト,利益を引き取り,トレンドを利益のためにフォローする.参入信号,パラメータチューニング,トレンド識別など,さまざまな市場状況に適応できるようにする分野で最適化する余地がまだ多い.裁量+量子コンボモデルとして,強力な実用的な価値があります.
/*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)