この戦略は,前取引日の高値に基づいて動いて,トレンドフォローモードで動きます.昨日の高値が突破されたとき,一日に複数のブレイクがあったとしても,長引きます.
バックテストでlookaheadバイアスを避けるために LucF関数を使う.
新しい取引日を開いているかどうかを特定し,その日の最高・今日と最低・今日を記録します.
現在の高値を max_today と比較し,超えると max_today を更新します.
現在の低値とmin_todayを比較し,違反した場合にmin_todayを更新します.
先日の高値と低値を示します.
前日の高値の突破時にエントリーポイントを設定し,GAPを追加してエントリーを早めるか遅らせることができます.
ストップ・ロストパーセント sl を設定し,利益パーセント tp を取ります.
価格が前取引日の高値を突破するとロングする.
ストップ・ロスト価格と 利益価格を設定します
選択的に,起動レベルとオフセット距離で,ストップ損失を後押しします.
EMAクロスオーバーに基づいて選択的に取引を閉じる.
このシンプルなトレンドフォロー戦略には以下の利点があります
明確で直線的な信号生成 実行が簡単です
前日の高値から突破すると 傾向が確認され 挫折が減ります
GAP パラメータでは入力の感度が調整できます.
ストップ・ロスの明示的な操作で 全体のリスクは制御されます
トレイリングストップは,より多くの利益をロックするために使用できます.
EMAのクロスオーバーは 下落傾向に囚われないようにします
リスクはいくつかあります.
失敗した脱出は損失を引き起こす 合理的なストップ損失が必要です
市場動向が必要で 状況が変化する可能性が高い
誤った追跡停止は 早期に停止される可能性があります
EMA パラメータの選択が不十分である場合 敏感すぎたり遅滞したりします
GAP,ストップ・ロスト,トレーリング・ストップなど
戦略をさらに最適化する方法:
動的ストップ損失をATRまたはトレンドに基づいて使用する.
標準偏差を用いて有効なブレイクアウトのフィルターを追加する.
不安定な市場での偽のブレイクを避けるため 変動条件を追加します
EMAパラメータを最適化して より強い信号を
市場変動に合わせて 細かな調整をします
異なる計器でパラメータの強さをテストする.
ダイナミック位置サイズメカニズムを追加します
この戦略は,前日の高いブレイクアウトに基づいた典型的なトレンドフォローシステムとしてシンプルで実用的です.リスク管理は主にストップ損失に依存します.適切なパラメータ調節により,トレンド条件でうまく動作できます.しかし,適切なストップ損失とフィルタは,ウィップソーを避けるために必要です.この枠組みは,トレンドフォロー戦略の基盤としてさらに強化できます.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-07 00:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) // © TheSocialCryptoClub //@version=5 strategy("Yesterday's High", overlay=true, pyramiding = 1, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, slippage=1, backtest_fill_limits_assumption=1, use_bar_magnifier=true, commission_type=strategy.commission.percent, commission_value=0.075 ) // ----------------------------------------------------------------------------- // ROC Filter // ----------------------------------------------------------------------------- // f_security function by LucF for PineCoders available here: https://www.tradingview.com/script/cyPWY96u-How-to-avoid-repainting-when-using-security-PineCoders-FAQ/ f_security(_sym, _res, _src, _rep) => request.security(_sym, _res, _src[not _rep and barstate.isrealtime ? 1 : 0])[_rep or barstate.isrealtime ? 0 : 1] high_daily = f_security(syminfo.tickerid, "D", high, false) roc_enable = input.bool(false, "", group="ROC Filter from CloseD", inline="roc") roc_threshold = input.float(1, "Treshold", step=0.5, group="ROC Filter from CloseD", inline="roc") closed = f_security(syminfo.tickerid,"1D",close, false) roc_filter= roc_enable ? (close-closed)/closed*100 > roc_threshold : true // ----------------------------------------------------------------------------- // Trigger Point // ----------------------------------------------------------------------------- open_session = ta.change(time('D')) price_session = ta.valuewhen(open_session, open, 0) tf_session = timeframe.multiplier <= 60 bgcolor(open_session and tf_session ?color.new(color.blue,80):na, title = "Session") first_bar = 0 if open_session first_bar := bar_index var max_today = 0.0 var min_today = 0.0 var high_daily1 = 0.0 var low_daily1 = 0.0 var today_open = 0.0 if first_bar high_daily1 := max_today low_daily1 := min_today today_open := open max_today := high min_today := low if high >= max_today max_today := high if low < min_today min_today := low same_day = today_open == today_open[1] plot( timeframe.multiplier <= 240 and same_day ? high_daily1 : na, color= color.yellow , style=plot.style_linebr, linewidth=1, title='High line') plot( timeframe.multiplier <= 240 and same_day ? low_daily1 : na, color= #E8000D , style=plot.style_linebr, linewidth=1, title='Low line') // ----------------------------------------------------------------------------- // Strategy settings // ----------------------------------------------------------------------------- Gap = input.float(1,"Gap%", step=0.5, tooltip="Gap di entrata su entry_price -n anticipa entrata, con +n posticipa entrata", group = "Entry") Gap2 = (high_daily1 * Gap)/100 sl = input.float(3, "Stop-loss", step= 0.5, group = "Entry") tp = input.float(9, "Take-profit", step= 0.5, group = "Entry") stop_loss_price = strategy.position_avg_price * (1-sl/100) take_price = strategy.position_avg_price * (1+tp/100) sl_trl = input.float(2, "Trailing-stop", step = 0.5, tooltip = "Attiva trailing stop dopo che ha raggiunto...",group = "Trailing Stop Settings")//group = "Trailing Stop Settings") Atrl= input.float(1, "Offset Trailing", step=0.5,tooltip = "Distanza dal prezzo", group = "Trailing Stop Settings") stop_trl_price_cond = sl_trl * high/syminfo.mintick/100 stop_trl_price_offset_cond = Atrl * high/syminfo.mintick/100 stop_tick = sl * high/syminfo.mintick/100 profit_tick = tp * high/syminfo.mintick/100 mess_buy = "buy" mess_sell = "sell" // ----------------------------------------------------------------------------- // Entry - Exit - Close // ----------------------------------------------------------------------------- if close < high_daily1 and roc_filter strategy.entry("Entry", strategy.long, stop = high_daily1 + (Gap2), alert_message = mess_buy) ts_n = input.bool(true, "Trailing-stop", tooltip = "Attiva o disattiva trailing-stop", group = "Trailing Stop Settings") close_ema = input.bool(false, "Close EMA", tooltip = "Attiva o disattiva chiusura su EMA", group = "Trailing Stop Settings") len1 = input.int(10, "EMA length", step=1, group = "Trailing Stop Settings") ma1 = ta.ema(close, len1) plot(ma1, title='EMA', color=color.new(color.yellow, 0)) if ts_n == true strategy.exit("Trailing-Stop","Entry",loss= stop_tick, stop= stop_loss_price, limit= take_price, trail_points = stop_trl_price_cond, trail_offset = stop_trl_price_offset_cond, comment_loss="Stop-Loss!!",comment_profit ="CASH!!", comment_trailing = "TRL-Stop!!", alert_message = mess_sell) else strategy.exit("TP-SL", "Entry",loss= stop_tick, stop=stop_loss_price, limit= take_price, comment_loss= "Stop-loss!!!", comment_profit = "CASH!!", alert_message = mess_sell) if close_ema == true and ta.crossunder(close,ma1) strategy.close("Entry",comment = "Close" , alert_message = mess_sell)