Chiến lược này hoạt động dựa trên mức cao của ngày giao dịch trước, hoạt động theo chế độ xu hướng. Nó sẽ kéo dài khi mức cao của ngày hôm qua bị phá vỡ, ngay cả khi có nhiều lần phá vỡ trong một ngày.
Sử dụng hàm LucF để tránh thiên vị lookahead trong backtesting.
Xác định nếu đó là một ngày giao dịch mới mở.
So sánh mức cao hiện tại với max_today, cập nhật max_today nếu vượt quá.
So sánh mức thấp hiện tại với min_today, cập nhật min_today nếu vi phạm.
Chụp các mức cao và thấp trong ngày giao dịch trước.
Đặt điểm nhập vào khi phá vỡ mức cao ngày trước, GAP có thể được thêm vào để tăng hoặc trì hoãn nhập.
Đặt tỷ lệ stop loss sl và lấy tỷ lệ lợi nhuận tp.
Đi dài khi giá phá vỡ mức cao ngày giao dịch trước.
Đặt giá dừng lỗ và lấy giá lợi nhuận.
Tùy chọn cho phép dừng mất mát, với mức kích hoạt và khoảng cách dịch chuyển.
Tùy chọn đóng giao dịch dựa trên giao dịch chéo EMA.
Chiến lược đơn giản theo xu hướng này có những lợi thế sau:
Sản xuất tín hiệu rõ ràng và đơn giản, dễ thực hiện.
Việc phá vỡ mức cao của ngày trước cho thấy sự xác nhận xu hướng, giảm bớt những cú đánh.
Các thông số GAP cho phép điều chỉnh độ nhạy đầu vào.
Rủi ro tổng thể được kiểm soát bằng cách dừng lỗ rõ ràng.
Việc dừng lại có thể được sử dụng để khóa thêm lợi nhuận.
EMA crossover tránh bị mắc kẹt trong xu hướng giảm.
Có một số rủi ro cần lưu ý:
Thất bại trong việc phá vỡ có thể gây ra tổn thất.
Nó đòi hỏi thị trường có xu hướng, có thể có những điều kiện khác nhau.
Việc dừng lại không đúng cách có thể bị dừng lại sớm.
Lựa chọn tham số EMA kém có thể làm cho nó quá nhạy hoặc chậm.
Nhiều biến cần điều chỉnh như GAP, dừng lỗ, dừng kéo dài vv
Một số cách để tối ưu hóa thêm chiến lược:
Sử dụng stop loss động dựa trên ATR hoặc xu hướng.
Thêm bộ lọc cho sự đột phá hợp lệ sử dụng độ lệch chuẩn.
Thêm điều kiện biến động để tránh phá vỡ sai trong thị trường hỗn loạn.
Tối ưu hóa tham số EMA cho tín hiệu mạnh hơn.
Điều chỉnh các thông số dừng lại để phù hợp với biến động thị trường.
Kiểm tra độ bền tham số trên các thiết bị khác nhau.
Thêm cơ chế định kích thước vị trí động.
Chiến lược này rất đơn giản và thực tế như một hệ thống theo xu hướng điển hình dựa trên sự đột phá cao của ngày trước. Quản lý rủi ro phụ thuộc chủ yếu vào việc dừng lỗ. Với điều chỉnh tham số thích hợp, nó có thể hoạt động tốt trong điều kiện xu hướng. Nhưng cần phải dừng lỗ và bộ lọc thích hợp để tránh whipsaws. Khung có thể được nâng cao hơn nữa làm cơ sở cho các chiến lược theo xu hướng.
/*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)