Xu hướng đột phá cao ngày hôm qua theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-10-08 14:06:55
Tags:

Tổng quan

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.

Chiến lược logic

  1. Sử dụng hàm LucF để tránh thiên vị lookahead trong backtesting.

  2. Xác định nếu đó là một ngày giao dịch mới mở.

  3. 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á.

  4. 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.

  5. Chụp các mức cao và thấp trong ngày giao dịch trước.

  6. Đặ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.

  7. Đặt tỷ lệ stop loss sl và lấy tỷ lệ lợi nhuận tp.

  8. Đi dài khi giá phá vỡ mức cao ngày giao dịch trước.

  9. Đặt giá dừng lỗ và lấy giá lợi nhuận.

  10. 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.

  11. Tùy chọn đóng giao dịch dựa trên giao dịch chéo EMA.

Phân tích lợi thế

Chiến lược đơn giản theo xu hướng này có những lợi thế sau:

  1. Sản xuất tín hiệu rõ ràng và đơn giản, dễ thực hiện.

  2. 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.

  3. Các thông số GAP cho phép điều chỉnh độ nhạy đầu vào.

  4. Rủi ro tổng thể được kiểm soát bằng cách dừng lỗ rõ ràng.

  5. Việc dừng lại có thể được sử dụng để khóa thêm lợi nhuận.

  6. EMA crossover tránh bị mắc kẹt trong xu hướng giảm.

Phân tích rủi ro

Có một số rủi ro cần lưu ý:

  1. Thất bại trong việc phá vỡ có thể gây ra tổn thất.

  2. Nó đòi hỏi thị trường có xu hướng, có thể có những điều kiện khác nhau.

  3. Việc dừng lại không đúng cách có thể bị dừng lại sớm.

  4. Lựa chọn tham số EMA kém có thể làm cho nó quá nhạy hoặc chậm.

  5. Nhiều biến cần điều chỉnh như GAP, dừng lỗ, dừng kéo dài vv

Cơ hội cải thiện

Một số cách để tối ưu hóa thêm chiến lược:

  1. Sử dụng stop loss động dựa trên ATR hoặc xu hướng.

  2. Thêm bộ lọc cho sự đột phá hợp lệ sử dụng độ lệch chuẩn.

  3. Thêm điều kiện biến động để tránh phá vỡ sai trong thị trường hỗn loạn.

  4. Tối ưu hóa tham số EMA cho tín hiệu mạnh hơn.

  5. Điều chỉnh các thông số dừng lại để phù hợp với biến động thị trường.

  6. Kiểm tra độ bền tham số trên các thiết bị khác nhau.

  7. Thêm cơ chế định kích thước vị trí động.

Kết luận

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)



Thêm nữa