
この戦略は,指数多空因子に基づいて逆転取引をとり,同時に目標獲得の利点を設定している.多空因子の中核は,取引量に基づく拡張形態の広義サポート/レジスタンスであり,高い取引量と波動のある指標に適用される.戦略の利点は,大きな中期短期トレンド逆転の機会を捉えることができ,迅速に利益を得ることにある.しかし,被套のリスクもある.
取引量に基づく広義のサポート/レジスタンスの多空因子識別
K線形を用いてクラシックなサポート/レジスタンスを識別し,より大きな取引量で偽のブレイクをフィルターする
一般的なサポート/レジスタンス形式は,クラシック形式よりも優れた包容性を持っています.
突破幅の支柱は多因子信号,突破幅の抵抗は空因子信号
逆転取引
変数信号が発せられた後,逆操作を行う.
ポジションの逆減または逆開設
収益を上げることを目標に
ATRによるストップ設定
1R/2R/3Rなどの複数の目標を設定するメリット
利益の目標が異なる後,減量
サポート・レジスタンス突破は,強いトレンド反転信号を意味し,一定の信頼性があり,短期間の大幅な反転を捉えることができます.
ストップ・ロスと複数の利回り目標を設定することで,迅速な利回りを実現し,個々の株の撤回を制限する.
この戦略は取引量指数に依存し,十分な機関資金の流入がトレンドをサポートする必要があり,また,利益を得るためには一定の波動空間が必要である.
状況が不安定であるとき,ストップ・ロズ・エグゼットと逆入場の操作は,頻繁な被套を引き起こす可能性がある.
一般的な支柱抵抗は絶対的に信頼できないので,失敗テストの逆転の確率がある.
戦略は単なる逆転であり,トレンドの追跡を考慮しないことで,大きな方向性のある機会を逃してしまう可能性があります.
風力制御について
逆転取引の要素条件を適当に緩和し,突破ごとに逆転する必要はありません.
価格偏差などの他の指標のフィルターと組み合わせることができます.
ストップ・ローズ戦略を最適化して ストップ・ローズの可能性を減らす
一般的な支柱抵抗のパラメータを最適化し,より信頼性の高い因子を識別する
利潤目標のレベルが追加され,非固定利潤目標も採用できます.
ATRパラメータの調整またはisticsのストップを使用して,不必要な激烈なストップによる取引コストを削減する
平均線などのトレンド判断を導入し,トレンドと深刻な対立を避ける;他の補助因子も導入できます.
この戦略の核心は,反転取引を利用して短期間の大きな変動を捕捉することである.戦略の構想は単純で直接であり,パラメータ調整によって良い実績が得られる.しかし,反転戦略はより激進的で,一定の撤回と被套のリスクがあり,止損と利益の戦略をさらに最適化し,トレンド判断を適切に組み合わせて,不必要な損失を減らす必要がある.
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji
//@version=5
strategy("Fractal Strat [KL] ", overlay=true, pyramiding=1, initial_capital=1000000000)
var string ENUM_LONG = "Long"
var string GROUP_ENTRY = "Entry"
var string GROUP_TSL = "Stop loss"
var string GROUP_TREND = "Trend prediction"
var string GROUP_ORDER = "Order size and Profit taking"
// backtest_timeframe_start = input.time(defval=timestamp("01 Apr 2000 13:30 +0000"), title="Backtest Start Time")
within_timeframe = true
// TSL: calculate the stop loss price. {
_multiple = input(2.0, title="ATR Multiplier for trailing stop loss", group=GROUP_TSL)
ATR_TSL = ta.atr(input(14, title="Length of ATR for trailing stop loss", group=GROUP_TSL, tooltip="Initial risk amount = atr(this length) x multiplier")) * _multiple
TSL_source = low
TSL_line_color = color.green
TSL_transp = 100
var stop_loss_price = float(0)
var float initial_entry_p = float(0)
var float risk_amt = float(0)
var float initial_order_size = float(0)
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_TSL
else if strategy.position_size > 0
stop_loss_price := math.max(stop_loss_price, TSL_source - ATR_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// } end of "TSL" block
// Order size and profit taking {
pcnt_alloc = input.int(5, title="Allocation (%) of portfolio into this security", tooltip="Size of positions is based on this % of undrawn capital. This is fixed throughout the backtest period.", minval=0, maxval=100, group=GROUP_ORDER) / 100
// Taking profits at user defined target levels relative to risked amount (i.e 1R, 2R, 3R)
var bool tp_mode = input(true, title="Take profit and different levels", group=GROUP_ORDER)
var float FIRST_LVL_PROFIT = input.float(1, title="First level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking first level profit at 1R means taking profits at $11", group=GROUP_ORDER)
var float SECOND_LVL_PROFIT = input.float(2, title="Second level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking second level profit at 2R means taking profits at $12", group=GROUP_ORDER)
var float THIRD_LVL_PROFIT = input.float(3, title="Third level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking third level profit at 3R means taking profits at $13", group=GROUP_ORDER)
// }
// Fractals {
// Modified from synapticEx's implementation: https://www.tradingview.com/script/cDCNneRP-Fractal-Support-Resistance-Fixed-Volume-2/
rel_vol_len = 6 // Relative volume is used; the middle candle has to have volume above the average (say sma over prior 6 bars)
rel_vol = ta.sma(volume, rel_vol_len)
_up = high[3]>high[4] and high[4]>high[5] and high[2]<high[3] and high[1]<high[2] and volume[3]>rel_vol[3]
_down = low[3]<low[4] and low[4]<low[5] and low[2]>low[3] and low[1]>low[2] and volume[3]>rel_vol[3]
fractal_resistance = high[3], fractal_support = low[3] // initialize
fractal_resistance := _up ? high[3] : fractal_resistance[1]
fractal_support := _down ? low[3] : fractal_support[1]
plot(fractal_resistance, "fractal_resistance", color=color.new(color.red,50), linewidth=2, style=plot.style_cross, offset =-3, join=false)
plot(fractal_support, "fractal_support", color=color.new(color.lime,50), linewidth=2, style=plot.style_cross, offset=-3, join=false)
// }
// ATR diversion test {
// Hypothesis testing (2-tailed):
//
// Null hypothesis (H0) and Alternative hypothesis (Ha):
// H0 : atr_fast equals atr_slow
// Ha : atr_fast not equals to atr_slow; implies atr_fast is either too low or too high
len_fast = input(5,title="Length of ATR (fast) for diversion test", group=GROUP_ENTRY)
atr_fast = ta.atr(len_fast)
atr_slow = ta.atr(input(50,title="Length of ATR (slow) for diversion test", group=GROUP_ENTRY, tooltip="This needs to be larger than Fast"))
// Calculate test statistic (test_stat)
std_error = ta.stdev(ta.tr, len_fast) / math.pow(len_fast, 0.5)
test_stat = (atr_fast - atr_slow) / std_error
// Compare test_stat against critical value defined by user in settings
//critical_value = input.float(1.645,title="Critical value", tooltip="Strategy uses 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- this critical value, then H0 will be rejected.", group=GROUP_ENTRY)
conf_interval = input.string(title="Confidence Interval", defval="95%", options=["90%","95%","99%"], tooltip="Critical values of 1.645, 1.96, 2.58, for CI=90%/95%/99%, respectively; Under 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- critical value, then H0 will be rejected.")
critical_value = conf_interval == "90%" ? 1.645 : conf_interval == "95%" ? 1.96 : 2.58
reject_H0_lefttail = test_stat < -critical_value
reject_H0_righttail = test_stat > critical_value
// } end of "ATR diversion test" block
// Entry Signals
entry_signal_long = close >= fractal_support and reject_H0_lefttail
// MAIN {
// Update the stop limit if strategy holds a position.
if strategy.position_size > 0
strategy.exit(ENUM_LONG, comment="SL", stop=stop_loss_price)
// Entry
if within_timeframe and entry_signal_long and strategy.position_size == 0
initial_entry_p := close
risk_amt := ATR_TSL
initial_order_size := math.floor(pcnt_alloc * strategy.equity / close)
strategy.entry(ENUM_LONG, strategy.long, qty=initial_order_size)
var int TP_taken_count = 0
if tp_mode and close > strategy.position_avg_price
if close >= initial_entry_p + THIRD_LVL_PROFIT * risk_amt and TP_taken_count == 2
strategy.close(ENUM_LONG, comment="TP Lvl3", qty=math.floor(initial_order_size / 3))
TP_taken_count := TP_taken_count + 1
else if close >= initial_entry_p + SECOND_LVL_PROFIT * risk_amt and TP_taken_count == 1
strategy.close(ENUM_LONG, comment="TP Lvl2", qty=math.floor(initial_order_size / 3))
TP_taken_count := TP_taken_count + 1
else if close >= initial_entry_p + FIRST_LVL_PROFIT * risk_amt and TP_taken_count == 0
strategy.close(ENUM_LONG, comment="TP Lvl1", qty=math.floor(initial_order_size / 3))
TP_taken_count := TP_taken_count + 1
// Alerts
_atr = ta.atr(14)
alert_helper(msg) =>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + str.tostring(close, "#.##") + "; atr=" + str.tostring(_atr, "#.##") + ")"
alert(str.tostring(prefix) + str.tostring(msg) + str.tostring(suffix), alert.freq_once_per_bar)
if strategy.position_size > 0 and ta.change(strategy.position_size)
if strategy.position_size > strategy.position_size[1]
alert_helper("BUY")
else if strategy.position_size < strategy.position_size[1]
alert_helper("SELL")
// Clean up - set the variables back to default values once no longer in use
if ta.change(strategy.position_size) and strategy.position_size == 0
TP_taken_count := 0
initial_entry_p := float(0)
risk_amt := float(0)
initial_order_size := float(0)
stop_loss_price := float(0)
// } end of MAIN block