昨日の高い突破傾向は 戦略に従っている

作者: リン・ハーンチャオチャン開催日:2023年10月8日 (火) 14:06:55
タグ:

概要

この戦略は,前取引日の高値に基づいて動いて,トレンドフォローモードで動きます.昨日の高値が突破されたとき,一日に複数のブレイクがあったとしても,長引きます.

戦略の論理

  1. バックテストでlookaheadバイアスを避けるために LucF関数を使う.

  2. 新しい取引日を開いているかどうかを特定し,その日の最高・今日と最低・今日を記録します.

  3. 現在の高値を max_today と比較し,超えると max_today を更新します.

  4. 現在の低値とmin_todayを比較し,違反した場合にmin_todayを更新します.

  5. 先日の高値と低値を示します.

  6. 前日の高値の突破時にエントリーポイントを設定し,GAPを追加してエントリーを早めるか遅らせることができます.

  7. ストップ・ロストパーセント sl を設定し,利益パーセント tp を取ります.

  8. 価格が前取引日の高値を突破するとロングする.

  9. ストップ・ロスト価格と 利益価格を設定します

  10. 選択的に,起動レベルとオフセット距離で,ストップ損失を後押しします.

  11. EMAクロスオーバーに基づいて選択的に取引を閉じる.

利点分析

このシンプルなトレンドフォロー戦略には以下の利点があります

  1. 明確で直線的な信号生成 実行が簡単です

  2. 前日の高値から突破すると 傾向が確認され 挫折が減ります

  3. GAP パラメータでは入力の感度が調整できます.

  4. ストップ・ロスの明示的な操作で 全体のリスクは制御されます

  5. トレイリングストップは,より多くの利益をロックするために使用できます.

  6. EMAのクロスオーバーは 下落傾向に囚われないようにします

リスク分析

リスクはいくつかあります.

  1. 失敗した脱出は損失を引き起こす 合理的なストップ損失が必要です

  2. 市場動向が必要で 状況が変化する可能性が高い

  3. 誤った追跡停止は 早期に停止される可能性があります

  4. EMA パラメータの選択が不十分である場合 敏感すぎたり遅滞したりします

  5. GAP,ストップ・ロスト,トレーリング・ストップなど

改善 の 機会

戦略をさらに最適化する方法:

  1. 動的ストップ損失をATRまたはトレンドに基づいて使用する.

  2. 標準偏差を用いて有効なブレイクアウトのフィルターを追加する.

  3. 不安定な市場での偽のブレイクを避けるため 変動条件を追加します

  4. EMAパラメータを最適化して より強い信号を

  5. 市場変動に合わせて 細かな調整をします

  6. 異なる計器でパラメータの強さをテストする.

  7. ダイナミック位置サイズメカニズムを追加します

結論

この戦略は,前日の高いブレイクアウトに基づいた典型的なトレンドフォローシステムとしてシンプルで実用的です.リスク管理は主にストップ損失に依存します.適切なパラメータ調節により,トレンド条件でうまく動作できます.しかし,適切なストップ損失とフィルタは,ウィップソーを避けるために必要です.この枠組みは,トレンドフォロー戦略の基盤としてさらに強化できます.


/*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)



もっと