
この戦略は,短期および長期の2つのホール移動平均を使用して取引信号を生成し,フィルターします.短期のホール移動平均は信号を生成するために使用され,長期のホール移動平均はフィルター信号に使用され,短期のホール平均と長期のホール平均が同方向に変化するときにのみ取引信号が生成されます.
この戦略は,ATR指標を同時に使用して,ストップ・ロズとストップ・ロズを設定する.各ポジション開設時に,ATRの値に基づいて,現在のポジションのストップ・ロズとストップ・ロズを動的に設定する.
短期ホールの移動平均は,価格の短期的な傾向と転換点を捉えるために使用される.短期ホールの移動平均の方向が変化したとき,価格の短期的な傾向が変化したことを示す.
長期のホール移動平均は,価格の全体的な動きを判断するために使用される.例えば,長期のホール移動平均の方向が上昇しているときは,価格が全体的な上昇傾向にあることを示す.
短期ホールの移動平均が転向し,その転向の方向が長期ホールの移動平均の総動向方向と一致するときにのみ,取引信号が生じます.つまり,価格の短期トレンドが転向すると同時に,総動向も同じ方向に変化するときにのみ,この短期信号を取引します.これは,短期市場のノイズによる誤信号を効果的にフィルターします.
ポジションを開設した後は,ATR指標の大きさに応じてストップ・ロースとストップ・ロースを設定する.ATR指標は市場の変動程度とリスクレベルを反映する.ストップ・ロースの位置は価格の低点の下に置かれ,ストップ・ロースの位置は価格の高点上に置かれ,いずれもATR値に掛かっており,市場の変動程度に応じてストップ・ロースの範囲を調整する.
この戦略は,短期信号と長期のフィルタを組み合わせて,価格の中期トレンドを効果的に識別し,ターニングポイントを間に合うように捕捉します.単一の移動平均などの指標と比較して,市場の騒音に騙される可能性を減らすことができます.
ダイナミックな調整ストップ・ストップ位置は,市場の変動程度に応じて合理的なストップ・ストップを設定し,利益を保証しながら過度に激進することを避け,損失のリスクを減らすことができます.
ホール移動平均の優位性を利用して,価格動向をより柔軟かつ正確に判断することができ,通常の移動平均に比べてより強力な追跡性能を持っています.
この戦略は,短期および長期の2つのホール移動平均の交差を信号として依存し,もし2つの移動平均の間に偽交差が生じれば,誤った入場を引き起こす可能性がある.この場合,長期短期市場の構造に基づいてこの信号をフィルターするかどうかを決定する必要がある.
震動的行情では,価格がより小さな取引範囲で揺れ回りすることがあり,これは信号誤差率を高め,無意味な取引の可能性を高めます.この場合,取引信号フィルタリング条件を拡大することによって無意味な取引を避けることができます.
ストップ・ストップの設定はATR指数に依存し,ATR指数が反映した市場の変動が不正確であれば,ストップ・ストップの位置も無効になります.この場合,他の波動率指数と組み合わせてATR値を修正することを考慮することができます.
フィルタリング効果を高めるために,RSIなどの超買い超売り指標などの他の短期指標と組み合わせて,信号判断を補助することを考慮することができます.
長期・短期ホール移動平均の間のフィルタリング論理的関係を追加または最適化することができ,フィルタリングルールをより厳格にし,誤信号を回避する.
異なるパラメータ設定が戦略の安定性と収益性に影響を研究することができる.例えば,移動平均パラメータ,ATRパラメータなどの異なる組み合わせは,異なる取引パフォーマンスを生み出す.
この戦略は,短期ホール移動平均の信号捕捉,長期ホール移動平均の信号フィルタリングとATR指標のストップ・ストップの設定の方法を統合して,より完全な中期トレンド追跡戦略体系を形成している.この戦略は,中期価格の転換点を効果的に発見し,短期市場のノイズによる干渉を回避し,トレンド取引システムの構築の重要な選択ツールである.パラメータの最適化と補助条件の追加により,この戦略は,信号判断の正確性をさらに強化し,より良いパフォーマンスを得ることができる.
/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0)
// Parameters for Hull Moving Averages
src = input(close, title="Source")
signal_period = input(50, title="Period of signal HMA")
filter_period = input(200, title="Period of filter HMA")
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
// Set allowed trading directions
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
// stop loss and take profit
sl_factor = input(2,title="Stop Loss Factor")
tp_factor = input(3,title="Take Profit Factor")
atr_period = input(14, title="ATR Period (SL/TP)")
// Testing Start dates
testStartYear = input(2010, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
// -----------------------------------------------------------------------------
// Global variables
// -----------------------------------------------------------------------------
var float tp = na
var float sl = na
var float position = na
// -----------------------------------------------------------------------------
// Functions
// -----------------------------------------------------------------------------
testWindow() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
// -----------------------------------------------------------------------------
// The engine
// -----------------------------------------------------------------------------
hma_signal = hma(src, signal_period)
hma_filter = hma(src, filter_period)
// Used to determine exits and stop losses
atr_e = atr(atr_period)
// if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0
trend = hma_filter > hma_filter[1] ? 1 : hma_filter < hma_filter[1] ? -1 : 0
signal = hma_signal > hma_signal[1] ? 1 : hma_signal < hma_signal[1] ? -1 : 0
// -----------------------------------------------------------------------------
// signals
// -----------------------------------------------------------------------------
if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow()
sl := close - sl_factor*atr_e
tp := close + tp_factor*atr_e
strategy.entry("HMA_LNG", strategy.long)
strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow()
sl := close + sl_factor*atr_e
tp := close - tp_factor*atr_e
strategy.entry("HMA_SHRT", strategy.short)
strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
if strategy.position_size != 0
sl := sl[1]
tp := tp[1]
// -----------------------------------------------------------------------------
// PLOT
// -----------------------------------------------------------------------------
hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red)
hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red)
plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1)
plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)