モメント ABCD パターン 戦略

作者: リン・ハーンチャオチャン, 日付: 2023-09-24 13:08:28
タグ:

概要

この戦略は,価格ピークと底辺を特定するためにウィリアムズ・フラクタル指標を使用し,トレンド方向を決定するためにABCDパターンを組み合わせます.トレンドを確認した後,利益のための中期トレンドを追跡するためにポジションに入ります.

戦略の論理

  1. ウィリアムズ・フラクタル指標を使用して,価格ピークと底辺を特定します. 上昇または下落のABCDパターンを決定するために,異なるパターンが使用されます.

  2. ABCDパターン識別基準:

    • AB と CD の距離は類似しており,BC と CD の距離は一定の比例要求を満たしている (0.382-0.886 と 1.13-2.618 の間).

    • C点より低い点は上昇パターンで C点より高い点は下落パターンです

  3. 全体のトレンド方向を判断するために,どの方向のフラクタルが電流に近いかを判断するために,barssince関数を使用します.

  4. ABCDパターンを特定した後,ロング/ショートを入力し,中期トレンドに従うためにストップ・ロスを設定し,利益を取ります.

利点分析

  1. ウィリアムズ・フラクタル・インジケーターは ターニング・ポイントを より正確に識別するのに役立ちます

  2. ABCDパターンの基準は単純で信頼性があり 自動化が容易です

  3. バースシントで主要なトレンド方向を判断すると,偽ブレイクによる損失を回避できます.

  4. ストップ・ロストとエントリー後に 利益を取ったトレンドに従います

リスク分析

  1. ウィリアムズ・フラクタルは遅れて ターニングポイントを逃して 損失を起こす可能性があります

  2. 複数の重なる ABCD パターンは,中期チャートで誤った識別を引き起こす可能性があります.

  3. 間違った主要トレンド方向は 中期取引に閉じ込められるリスクを高めます

  4. ストップ・ロスは太りすぎると簡単に停止され ストップ・ロスは太りすぎると追跡が悪くなる.

可能な解決策:

  1. 他の指標をテストして ターニングポイントを より効果的に識別する

  2. ABCD パターンパラメータを最適化して 識別を厳格で信頼性のあるものにします

  3. 主要なトレンドの識別を改善し,誤った方向性バイアスを避ける.

  4. 最適なポイントを見つけるために 異なるストップ・ロス/テイク・プロフィート比をテストします

オプティマイゼーションの方向性

  1. 入力信号の正確性を向上させるためにMACD,KDJ,その他の指標をテストする.

  2. 異なる製品とタイムフレームに基づいてパラメータを最適化し,最適なストップ・ロスト/テイク・プロフィートレベルを見つけます.

  3. 変化する市場状況に応じて最適なパラメータの組み合わせを見つけるために,バーのバックバック期間を最適化します.

  4. 移動平均等を追加してシグナルをフィルタリングし安定性を向上させる.

  5. 機械学習アルゴリズムとより多くのデータを導入して パターン認識の精度を向上させる

概要

戦略の論理は全体的に明確で信頼性があり,ウィリアムス・フラクタルと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)

もっと