パターン認識ハンギングネック取引戦略


作成日: 2023-09-18 14:14:51 最終変更日: 2023-09-18 14:14:51
コピー: 0 クリック数: 692
1
フォロー
1617
フォロワー

概要

この戦略は,K線形状を識別することで価格形状の取引を実現する.それは,最近出現した吊り線形状を探し,形状の信号に応じて多かれ少なかれ空いている.トレーダーは,ストップ・ストップ・ロスの倍数設定することができます.トレンド・トラッキング・ストップ・ロスは,より多くの利益をロックすることができます.

戦略原則

現在のK線が吊り下げラインの形状要求に適合するかどうかを識別する. 实体は下半段にあり,閉盘価格と開盘価格が低点に近づいている. 対照的に,多信号は,実体は上半段にあり,高点に近づいている. 最後の取引信号のK線を探し,そのK線実体の高さを計算する. 止まりをこの高さのN倍に設定し,止まりをこの高さのM倍に設定する (MはNより小さい).

入場後,トレンド追跡を開始し,ストップラインを徐々に利益方向に移動させ,ストップラインはストップまたはストップが触発されるまで変わらずに保持します.

優位分析

  • 価格の形状を認識する信号を利用し,頻繁に取引を避ける
  • ストップ・ストップ・ロスの倍数は,リスクとリターンの両方を考慮してカスタマイズできます.
  • トレンドフォローストップは,より多くの利益に繋がります.
  • 突破口を偽装して 罠にはならないように

リスク分析

  • 形状認識の精度は100%にも達しません
  • ストップ範囲が小さすぎると,価格の揺れによってストップされる可能性があります.
  • トレンド追跡には ストップラインを 動かす必要があります

パラメータの最適化や補助指標などの方法によってリスクを減らすことができます.

最適化の方向

  • 試行錯誤の設定をテストする
  • 偽信号をフィルターする他の指標と組み合わせる
  • 形状認識条件論理を最適化する
  • 異なる品種におけるテストパラメータの健壮性

要約する

この戦略は,形状認識を利用して取引機会を発見し,反測のパフォーマンスを良好にしています. ストップ・ストップ・ロスを合理的に設定し,単一取引のリスクを制御できます. 参数最適化などのさらなる改良により,簡単な実用的な取引システムになることができます.

ストラテジーソースコード
/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// 
// Pinbar strategy script by samgozman (https://github.com/samgozman)
// 
// Detailed instruction how to use this script: https://github.com/samgozman/pinbar-strategy-tradingview
//
// If you liked the script and want to support me: https://paypal.me/sgozman
// 
// ++++++++++ Warning: The script is provided for educational purposes only. ++++++++++ //

strategy('Pinbar strategy', default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000)

profitMultiplier = input.float(2.0, "Profit multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from high")
lossMultiplier =  input.float(1.0, "Loss multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from low")

isTrailingStop = input.bool(true, "Use trailing stops?", group="Trading options", tooltip="Highly recommended!")
isCloseOnOppositSignal = input.bool(false, "Close trade if opposit signal occures?", group="Trading options", tooltip="Close long on short signal")
isLongEligible = input.bool(true, "Enter long trades?", group="Trading options")
isShortEligible = input.bool(true, "Enter short trades?", group="Trading options")

useDateFilter = input.bool(true, title="Begin Backtest at Start Date", group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2021"), title="Start Date", group="Backtest Time Period")

// Predefined time trading zone for back testing
inTradeWindow = true

// HELPER FUNCTIONS //

// calculate candle size for N bars back. Use 0 for current
calcCandle(int periods) =>
    math.abs(high[periods] - low[periods])

// if body is below 50% and close/open below 30%
isBearishPinbar(float candle) =>
    lower30 = low + candle * 0.30
    bottomHalf1 = close < hl2
    bottomHalf2 = open < hl2
    lowerRegion1 = close < lower30
    lowerRegion2 = open < lower30
    
    con1 = bottomHalf1 and bottomHalf2
    con2 = lowerRegion1 and lowerRegion2
    con3 = high > high[1]
    
    con1 and con2 and con3

// if body is above 50% and close/open above 30%  
isBullishPinbar(float candle) =>
    upper30 = high - candle * 0.30
    topHalf1 = close > hl2
    topHalf2 = open > hl2
    upperRegion1 = close > upper30
    upperRegion2 = open > upper30
    
    con1 = topHalf1 and topHalf2
    con2 = upperRegion1 and upperRegion2
    con3 = low < low[1]
    
    con1 and con2 and con3
    
barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na

// Calculate trading signals
currentCandle = calcCandle(0)
longSignal = isBullishPinbar(currentCandle) and inTradeWindow
shortSignal = isBearishPinbar(currentCandle) and inTradeWindow

// ENTER THE TRADE //
if longSignal and isLongEligible
    strategy.entry("buy", strategy.long, when = strategy.position_size == 0)

if shortSignal and isShortEligible 
    strategy.entry("sell", strategy.short, when = strategy.position_size == 0)

// CALCULATE STOPS //
barsSinceEntry = barsSinceLastEntry()
candleFromEntry = calcCandle(barsSinceEntry)
// long
long_take_limit = strategy.position_avg_price + (candleFromEntry*profitMultiplier)
long_target_percent_profit = long_take_limit / strategy.position_avg_price - 1
long_target_percent_loss = (long_target_percent_profit / profitMultiplier) * lossMultiplier
long_stop_limit = low[barsSinceEntry] * (1 - long_target_percent_loss)
//short
short_take_limit = strategy.position_avg_price - (candleFromEntry*profitMultiplier)
short_target_percent_profit = strategy.position_avg_price / short_take_limit - 1
short_target_percent_loss = (short_target_percent_profit / profitMultiplier) * lossMultiplier
short_stop_limit = high[barsSinceEntry] * (1 + short_target_percent_loss)

// EXIT THE TRADE //
if strategy.position_size > 0 or strategy.position_size < 0
    if isTrailingStop
        strategy.exit(id="exit", from_entry="buy", trail_price = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", trail_price = short_take_limit, stop=short_stop_limit)
    else
        strategy.exit(id="exit", from_entry="buy", limit = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", limit = short_take_limit, stop=short_stop_limit)
    if isCloseOnOppositSignal
        strategy.close("buy", when = shortSignal)
        strategy.close("sell", when = longSignal)

// PLOT SIGNALS //
plotshape(longSignal, style=shape.arrowup, color=color.new(color.green, 0), size=size.large, location=location.belowbar)
plotshape(shortSignal, style=shape.arrowdown, color=color.new(color.red, 0), size=size.large, location=location.abovebar)