資源の読み込みに... 荷物...

高低戦略が破綻した

作者: リン・ハーンチャオチャン, 日付: 2023-12-22 12:59:43
タグ:

img

概要

ブロークン・ハイ/ロー戦略は,前回のキャンドルスティックの高値や低値を超えた価格ブレイクを追跡するトレンドフォロー戦略である.トレンド方向を決定するために移動平均値を使用し,ストップ・ロストまたはトラッキング・ストップ・ロストで利益をロックするブレイクポイントに入力する.

戦略の論理

この戦略によって決定される 入国・退出の主要な条件は次のとおりです.

  1. ろうそくが緑色か赤色であるかどうかを識別する それはアップキャンドルかダウンキャンドルかどうかを判断するために
  2. 現在のろうそくが前のろうそくの高または低を壊すかどうかをチェック
  3. トレンド方向を定義するために,高速移動平均値と遅い移動平均値を使用する
  4. 前回のダウンキャンドルの低値を下回るときにショート
  5. 出口条件は,ストップ・ロストまたはトレーリング・ストップによって引き起こす.また,逆転キャンドルが表示された場合,直ちに出口することもできる.

この戦略は,偽のブレイクを避けるため,信号の信頼性を確保するために,第2回反転キャンドルに基づくフィルターも使用しています.

利点分析

  • 明確な戦略の方向性,簡単に理解できる 突破作戦
  • 2つの移動平均を組み合わせることで正しい傾向判断を保証する
  • トレイリングストップは,より多くの利益をロックするのに役立ちます
  • 逆向きのキャンドルフィルターは高さを追いかけて低さを殺すのを避けるのに役立ちます

リスク分析

  • 失敗した脱出は,超短期的な取引から損失を引き起こす可能性があります.
  • 範囲限定市場での誤ったブレイクのリスクが大きい
  • 二重移動平均値が遅れて判断に誤りが生じる

リスク管理対策:

  1. 特定の株の高リスクを避けるために,インデックスや主要なベンチマークを選択する
  2. 判断の精度を向上させるために移動平均パラメータを最適化
  3. ストップ・ロスの範囲を合理的に拡大し,単一の取引損失を制御する

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

この戦略は,次の側面で最適化できます.

  1. 移動平均パラメータの異なる組み合わせを試験する
  2. 組み合わせ判断のための他の技術指標を含む試験
  3. 入力レベルとストップ損失レベルを最適化する
  4. 高品質の底辺を選択するために定量的なフィルタリングルールを追加
  5. 適応性パラメータ最適化のための機械学習アルゴリズムを組み込む

概要

Broken High/Low戦略は全体的に成熟したトレンドフォロー戦略である.補助判断のための移動平均の助けにより,一定のレベルのトレンドを捉えることができます.ストップ・ロストとトレーリング・ストップメカニズムも利益をロックするのに役立ちます.継続的なテストと最適化によって,この戦略のパラメータとパフォーマンスはより顕著になります.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Broken High/Low Strategy", overlay=true, initial_capital = 5000, default_qty_value = 25, pyramiding = 10, default_qty_type= strategy.percent_of_equity)

useEMAForStop = input.bool(false, 'Use trail stop EMA', group = 'Exit strategy')
trailStopMALength = input(8, 'Trail stop EMA length', group = 'Exit strategy')

fastMALength = input(5 , 'Fast MA length', group = 'Trend strength')
fastEMAEnabled = input.bool(false, 'Fast EMA enabled (default is SMA)', group = 'Trend strength')

slowMALength = input(10, 'Slow MA length', group = 'Trend strength')
slowEMAEnabled = input.bool(false, 'Slow EMA enabled (default is SMA)', group = 'Trend strength')

ignoreSlowMA = input.bool(false, 'Use fast MA for trend ignoring slow MA', group = 'Trend strength')

useOpposingBarAsExit = input.bool(false, 'Using opposing bar as exit', group = 'Exit strategy')
secondEntryEnabled = input.bool(false, 'Second bar that eliminates opposing bar for entry', group = 'Trend strength')

longsEnabled = input.bool(true, 'Enable longs', group = 'Trade settings')
shortsEnabled = input.bool(true, 'Enable shorts', group = 'Trade settings')

fastMA = fastEMAEnabled ? ta.ema(close, fastMALength) : ta.sma(close, fastMALength)
slowMA = slowEMAEnabled ? ta.ema(close, slowMALength) : ta.sma(close, slowMALength)

FromMonth=input.int(defval=1,title="FromMonth",minval=1,maxval=12, group = 'Time filters')
FromDay=input.int(defval=1,title="FromDay",minval=1,maxval=31, group = 'Time filters')
FromYear=input.int(defval=1990,title="FromYear",minval=1900, group = 'Time filters')
ToMonth=input.int(defval=1,title="ToMonth",minval=1,maxval=12, group = 'Time filters')
ToDay=input.int(defval=1,title="ToDay",minval=1,maxval=31, group = 'Time filters')
ToYear=input.int(defval=9999,title="ToYear",minval=2017, group = 'Time filters')
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>time>=start and time<=finish?true:false
afterStartDate = time >= start and time<=finish?true:false
closeTradesEOD = input.bool(false, 'Close trades end of day', group = 'Time filters')

trailStopMA = ta.ema(close, trailStopMALength)

isGreenCandle = close > open
isRedCandle = close < open
isBrokenHigh = close > open[1]
isPriorCandleRed = close[1] < open[1]
isPriorPriorCandleRed = close[2] < open[2]
isPriorPriorCandleGreen = close[2] > open[2]
isPriorCandleGreen = close[1] > open[1]
isBrokenLow = close < open[1]

isPriorRedCandleBroken = isGreenCandle and isPriorCandleRed and isBrokenHigh
isPriorGreenCandleBroken = isRedCandle and isPriorCandleGreen and isBrokenLow

isPriorPriorRedCandleBroken = secondEntryEnabled and not isPriorRedCandleBroken and isGreenCandle and isPriorPriorCandleRed ? close > open[2] : false
isPriorPriorGreenCandleBroken = secondEntryEnabled and not isPriorGreenCandleBroken and isRedCandle and isPriorPriorCandleGreen ? close < open[2] : false

longOpenCondition = (isPriorRedCandleBroken or isPriorPriorRedCandleBroken) and afterStartDate and (ignoreSlowMA ? close > fastMA : fastMA > slowMA) and longsEnabled
longCloseCondition = useOpposingBarAsExit ? isRedCandle : ta.crossunder(close, fastMA)
longCloseCondition := useEMAForStop ? ta.crossunder(close, trailStopMA) : longCloseCondition

shortOpenCondition = (isPriorGreenCandleBroken or isPriorPriorGreenCandleBroken) and afterStartDate and (ignoreSlowMA ? close < fastMA : fastMA < slowMA) and shortsEnabled
shortCloseCondition = useOpposingBarAsExit ? isGreenCandle : ta.crossover(close, fastMA)
shortCloseCondition := useEMAForStop ? ta.crossover(close, trailStopMA) : shortCloseCondition

if (longOpenCondition)
    strategy.entry("Long Entry", strategy.long)

if (longCloseCondition)
    strategy.close('Long Entry', 'Long Exit')

if (shortOpenCondition)
    strategy.entry("Short Entry", strategy.long)

if (shortCloseCondition)
    strategy.close('Short Entry', 'Short Exit')

if (closeTradesEOD and hour >= 14 and minute >= 30)
    strategy.close_all("EOD")

plot(useEMAForStop ? trailStopMA : na, linewidth = 2, color = color.red)
plot(fastMA)
plot(ignoreSlowMA ? na : slowMA, linewidth = 4)

もっと