
この策略は,私が以前行った別の突破型トレンドトラッカー策略の変形である. 別の策略では,移動平均を取引のフィルターとして使用できます (つまり,価格が移動平均より低い場合は,それは多くをしません).
したがって,この策略は,より高い時間枠のトレンドを見ることを可能にします (つまり,より高い高点とより低い低点がありますか? もしそうなら,これは上昇傾向です). あなたは,トレンドの方向にのみポジションをします. あなたは,フィルターとして,最大2つのトレンドを選択することができます.
この戦略は他の戦略と比べると,一般的にはあまり上手く行っていないことがわかったが,実際は取引を挑み出すように見える.
この戦略の核心的な論理は,より高い時間枠を突破するサポートとレジスタンス値を使用してトレンドを識別し,トレンドの方向に従って取引することです.
具体的には,以下のステップで実現します.
現在の時間枠 (例えば1時間線) のサポートとレジスタンス値を計算する.これは,特定の周期内の最高価格と最低価格を見つけることによって実現する.
1つまたは複数のより高い時間枠 (例えば4時間線と日線) のサポートとレジスタンス位置を計算する.これは現在の時間枠と同じ論理を用いて実現する.
これらのサポートとレジスタンス値をグラフに描く水平線.価格がこれらのレベルを突破すると,より高い時間枠のトレンドが変わります.
価格がこれらのキーレベルを突破するかどうかによってトレンドの方向を判断する.価格が上位点を突破した場合は,上昇傾向とみなされる.上位点を破った場合は,下降傾向とみなされる.
フィルタリング条件として,1つまたは複数の上位時間枠のトレンドを選択することを許可します.つまり,現在の時間枠のトレンド方向が上位時間枠のトレンド方向と一致する場合にのみ取引を考慮します.
トレンドフィルター条件を満たし,現在の価格が重要なレベルを突破すると,購入または販売が行われます. ストップダメージレベルは,以前の重要なサポートまたはレジスタンスレベルに設定されます.
価格が進むにつれて,新しい高点または低点が形成されると,利益とトレンドを追跡するために,ストップを新しい低点に移動します.
ストップが引き出され,または重要なサポート/レジスタンスが突破されたときに,平仓を退出する.
この多時間枠のトレンド分析によって,戦略は勝利の確率を高めるために,より強いトレンドの方向のみで取引しようとします. 同時に,重要なレベルは明確な入場と停止信号を提供します.
複数の時間枠を使ってトレンドを判断することで,強いトレンドの方向をより正確に識別し,市場騒音に惑わされないようにする.
主なトレンドの方向のみで操作することで,勝利率を大幅に高めることができる.テスト結果によると,この戦略は,単純な移動平均フィルターと比較して,より高い勝利率とより良い利益リスク比率を示している.
サポートとレジスタンス位置は,入場と停止のレベルを明確に提供します.特定の入場点の選択を複雑にする必要はありません.
トレンドが進むにつれ,ストップ・ロスを調整することで,最大限の利益が確保できます.
戦略の論理はシンプルで明快で,理解し,調整しやすい.
長い線段に依存するトレンド判断は,トレンドが逆転する時に容易く套用される.トレンド判断の時間周期を適切に短縮するか,他の指標を用いて補助判断すべきである.
根本的な側面の影響は考慮されず,重大事件の発生時に株価が異動する可能性があります.ATMイベントや決算日などのフィルター条件を添加することができます.
ポジションスケールコントロールは設定されていません.口座の資金規模,変動率などの要因に基づいてポジションのサイズを設定できます.
回測時間は限られている.回測期間を拡大し,異なる市場環境における安定性をテストする.
取引コストの影響は考慮されません. 實盤では,特定の取引コストに応じて戦略パラメータを調整する必要があります.
長線取引のみを考慮する.他の戦略と組み合わせて,短線取引シグナルを開発し,多周期性利を実現する.
フィルター条件を追加します:
基本データ 例えば 収益報告やニュース イベントなど
取引量やATRの停止など
オプティマイゼーションパラメータ:
サポート/レジスタンスビット計算サイクルを調整する
トレンド判断を調整する時間枠
戦略の範囲を拡大する:
ショートラインの取引戦略を開発する
売り上げを考慮する
多種利
リスク管理の改善:
波動率と資金規模によるポジションの最適化サイズ
移動ストップ,固定ストップなどの最適化ストップ戦略
リスク報酬制度の導入
実行ロジックを最適化します.
試合開始のタイミング変更
ポジションの入場を検討する
ストップ・ローズ・モバイル戦略の最適化
この戦略は,多時間枠のトレンドを分析することによって,より堅牢な突破システムを設計している.単純移動平均などの指標のフィルタリングと比較して,勝率と利益リスク比率が高く示されている.しかし,リスク管理機構の不完全さ,基本的要因を考慮しないなど,最適化可能な側面もある.さらに最適化すれば,非常に実用的なトレンド追跡戦略になる可能性がある.全体的に,この戦略は合理的に設計されており,多時間枠分析によって判断の正確性を向上させ,さらなる研究と応用に値する.
/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-26 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Revision: 1
// Author: @millerrh
// Strategy: Enter long when recent swing high breaks out, using recent swing low as stop level. Move stops up as higher lows print to act
// as trailing stops. Ride trend as long as it is there and the higher lows aren't breached.
// The difference between this one and the previous Breakout Trend Follower is that this one uses higher timeframe higher highs/higher lows as a filter instead
// of an arbitrary Moving Average. I wanted to test out whether waiting for longer term actual trend changes produced better stats than just the moving average.
// Conditions/Variables
// 1. Manually configure which dates to back test
// 2. Can add a filter to only take setups that are above (or below for shorts) user-defined larger timeframe trends (helps avoid trading counter trend)
// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study()
strategy("Breakout Trend Follower V2", overlay=true, initial_capital=10000, currency='USD',
default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy()
//study("Breakout Trend Follower V2", overlay=true)
// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time, group = "Backtest Range")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time, group = "Backtest Range")
// == USER INPUTS ==
tableLocation = input(defval="Top", options=["Top", "Bottom"], title = "Info Table Location", group = "Display",
tooltip = "Place information table on the top of the pane or the bottom of the pane.")
lookback = input(defval = 3, title = "Pivot Lookback Period", group = "Pivot Points",
tooltip = "Looks for pivot points within this number of bars both left and right.")
showPivotPoints = input(title = "Show Historical Pivot Points?", type = input.bool, defval = false, group = "Pivot Points",
tooltip = "Toggle this on to see the historical pivot points that were used. Change the Lookback Period to adjust the frequency of these points.
The pivot points are only shown for the current chart timeframe - to see the Daily pivot pionts, use the Daily timeframe, etc.")
trendFilter = input(defval="1st Timeframe", options=["1st Timeframe", "Both Timeframes", "None"], title = "Use HTF Trend for Filtering?", group = "Higher Timeframe Levels",
tooltip = "Signals will be ignored when price is not aligned with the higher timeframe trend(s). The intent is to keep you out of bear periods and only buying when
price is showing strength and you are trading with the trend.")
twoSet = input(defval="D", title="1st High Timeframe", type=input.resolution, group = "Higher Timeframe Levels",
tooltip = "Allows you to set two different time frames for looking at the trend.")
threeSet = input(defval="W", title="2nd High Timeframe", type=input.resolution, group = "Higher Timeframe Levels")
showMTFLevels = input(title = "Show Multiple Timeframe S/R Levels?", type = input.bool, defval = true, group = "Higher Timeframe Levels",
tooltip = "Displays the pivot highs and lows of higher timeframes to use as support/resistance levels. When these levels break, the trend
will change on these higher timeframes.")
currentColorS = input(color.new(color.orange,50), title = "Current Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
currentColorR = input(color.new(color.blue,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
oneColorS = input(color.new(color.yellow,50), title = "1st High Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
oneColorR = input(color.new(color.yellow,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
twoColorS = input(color.new(color.white,50), title = "2nd High Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
twoColorR = input(color.new(color.white,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
// == DEFINE FUNCTIONS FOR USE IN MULTIPLE TIMEFRAMES (USING A TUPLE TO AVOID SO MANY SECURITY CALLS) ==
f_getHTF() =>
ph = pivothigh(high, lookback, lookback)
pl = pivotlow(low, lookback, lookback)
highLevel = valuewhen(ph, high[lookback], 0)
lowLevel = valuewhen(pl, low[lookback], 0)
barsSinceHigh = barssince(ph) + lookback
barsSinceLow = barssince(pl) + lookback
timeSinceHigh = time[barsSinceHigh]
timeSinceLow = time[barsSinceLow]
[ph, pl, highLevel, lowLevel, barsSinceHigh, barsSinceLow, timeSinceHigh, timeSinceLow]
[ph_01, pl_01, hL_01, lL_01, bsSH_01, bsSL_01, tSH_01, tSL_01] = security(syminfo.tickerid, "", f_getHTF())
[ph_02, pl_02, hL_02, lL_02, bsSH_02, bsSL_02, tSH_02, tSL_02] = security(syminfo.tickerid, twoSet, f_getHTF())
[ph_03, pl_03, hL_03, lL_03, bsSH_03, bsSL_03, tSH_03, tSL_03] = security(syminfo.tickerid, threeSet, f_getHTF())
// Plot historical pivot points for debugging and configuring the lookback period.
plot(showPivotPoints ? ph_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
plot(showPivotPoints ? pl_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
// == PLOT SUPPORT/RESISTANCE LINES ON THE HIGHER TIMEFRAMES ==
// Use a function to define the lines
f_line(x1, y1, y2, _color) =>
var line id = na
// line.delete(id)
// id := line.new(x1, y1, time, y2, xloc.bar_time, extend.right, _color)
// 1st Timeframe
highLine1 = showMTFLevels ? f_line(tSH_01, hL_01, hL_01, currentColorR) : na
lowLine1 = showMTFLevels ? f_line(tSL_01, lL_01, lL_01, currentColorS) : na
// 2nd Timeframe
highLine2 = showMTFLevels ? f_line(tSH_02, hL_02, hL_02, oneColorR) : na
lowLine2 = showMTFLevels ? f_line(tSL_02, lL_02, lL_02, oneColorS) : na
// 3rd Timeframe
highLine3 = showMTFLevels ? f_line(tSH_03, hL_03, hL_03, twoColorR) : na
lowLine3 = showMTFLevels ? f_line(tSL_03, lL_03, lL_03, twoColorS) : na
// == TREND CALCULATIONS (USING A TUPLE TO CONSOLIDATE REPETATIVE CODE AND GENERATE MULTIPE VARIABLES WITH ONE FUNCTION ==
f_signal(highLevel, lowLevel) =>
uptrendSignal = high > highLevel
downtrendSignal = low < lowLevel
inUptrend = bool(na)
inDowntrend = bool(na)
inUptrend := uptrendSignal[1] ? true : downtrendSignal[1] ? false : inUptrend[1]
inDowntrend := not inUptrend
[uptrendSignal, downtrendSignal, inUptrend, inDowntrend]
[uptrendSignal1, downtrendSignal1, inUptrend1, inDowntrend1] = f_signal(hL_01, lL_01) // 1st Timeframe
[uptrendSignal2, downtrendSignal2, inUptrend2, inDowntrend2] = f_signal(hL_02, lL_02) // 2nd Timeframe
[uptrendSignal3, downtrendSignal3, inUptrend3, inDowntrend3] = f_signal(hL_03, lL_03) // 3rd Timeframe
// == TREND TABLE PLOTTING ==
tablePos = tableLocation == "Top" ? position.top_right : position.bottom_right
var table trendTable = table.new(tablePos, 3, 1, border_width = 3)
upColor = color.rgb(38, 166, 154)
downColor = color.rgb(240, 83, 80)
f_fillCell(_column, _row, _cellText, _c_color) =>
table.cell(trendTable, _column, _row, _cellText, bgcolor = color.new(_c_color, 70), text_color = _c_color, width = 6)
if barstate.islast or barstate.islastconfirmedhistory
f_fillCell(0, 0, inUptrend1 ? "▲" : "▼", inUptrend1 ? upColor : downColor)
f_fillCell(1, 0, inUptrend2 ? "▲ " + twoSet : "▼ " + twoSet, inUptrend2 ? upColor : downColor)
f_fillCell(2, 0, inUptrend3 ? "▲ " + threeSet : "▼ " + threeSet, inUptrend3 ? upColor : downColor)
// Conditions for entry and exit
buyConditions = true
buySignal = high > hL_01 and buyConditions // Code to act like a stop-buy for the Study
sellSignal = low < lL_01 // Code to act like a stop-loss for the Study
// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = hL_01, when = buyConditions)
// strategy.entry("Long", strategy.long, stop = buyLevel2, when = time > Start and time < Finish and high > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop=lL_01)