
Chiến lược đảo ngược đường ngắn xuyên là một chiến lược giao dịch xu hướng dựa trên hình dạng đường ngắn. Nó sử dụng hình dạng đường ngắn làm tín hiệu, kết hợp với đường trung bình di chuyển để đánh giá hướng xu hướng, để đạt được tỷ lệ thắng cao. Đồng thời, nó sử dụng cơ chế dừng lỗ theo dõi độc đáo, có thể đạt được tỷ lệ lợi nhuận cực cao.
Chiến lược này tạo ra tín hiệu khi đáp ứng hai điều kiện sau:
Các tín hiệu kết hợp như vậy có thể lọc ra phần lớn tiếng ồn, do đó cải thiện độ chính xác nhập cảnh.
Chiến lược này sử dụng các đường trung bình di chuyển của ba chu kỳ khác nhau để đánh giá xu hướng. Cụ thể, đường nhanh, đường trung và đường chậm được định nghĩa là xu hướng khi được sắp xếp đồng chiều, nếu không được định nghĩa là tròn.
Khi nhập cảnh nhiều đầu, yêu cầu đường nhanh > đường trung > đường chậm; khi nhập cảnh không đầu, yêu cầu đường nhanh < đường trung < đường chậm.
Chiến lược này sử dụng một cơ chế theo dõi dừng chân độc đáo. Sau khi mở vị trí, điểm dừng chân tối ưu sẽ được theo dõi dựa trên số điểm và độ lệch mà người dùng đặt. Điều này có thể khóa tối đa lợi nhuận và kiểm soát rủi ro.
Tín hiệu xuyên qua đường ngắn cho phép chiến lược chỉ mở vị trí khi có cơ hội có xác suất cao, tránh giao dịch quá nhiều tiếng ồn. Đồng thời kết hợp với phán đoán xu hướng, có thể lọc hầu hết các hoạt động theo hướng phi chính thống. Điều này đảm bảo độ chính xác cao của chiến lược.
Cơ chế theo dõi dừng lỗ độc đáo là điểm nổi bật của chiến lược này. Nó có thể kiểm soát chính xác mỗi điểm dừng lỗ trong một phạm vi nhỏ, đảm bảo tỷ lệ thắng cao và khả năng lợi nhuận cực kỳ mạnh mẽ.
Kết quả mô phỏng cho thấy, sau khi sử dụng cơ chế này, các cặp tiền tệ đa dạng đạt được lợi nhuận tổng cộng trên 1000%, lợi nhuận tối đa lần lượt vượt quá 100 lần, và lợi nhuận tăng lên mức cao chưa từng thấy trước đây.
Với kết quả thử nghiệm gần như là một chiếc cốc thiêng liêng, điều này có thể là kết quả của việc mô phỏng quá mức thị trường. Cơ chế dừng lỗ đĩa cứng có thể không hoạt động chính xác như thử nghiệm và sẽ phải đối mặt với sự rút lui nhất định.
Ngoài ra, chỉ trong vòng thử nghiệm hai năm, sự thay đổi cấu trúc thị trường cũng có thể ảnh hưởng đến hiệu suất của đĩa cứng.
Theo dõi dừng lỗ quá nhạy cảm có thể gây ra quá nhiều kích hoạt dừng lỗ. Ngoài ra, các sự kiện bất ngờ của thị trường cũng có thể dẫn đến không có hiệu lực dừng lỗ. Đây là những rủi ro cần phải sử dụng theo dõi dừng lỗ.
Theo dõi điểm dừng là chìa khóa cho toàn bộ chiến lược bùng nổ lợi nhuận. Để làm cho nó nhạy cảm và đáng tin cậy, bạn có thể thử nới lỏng điểm dừng theo dõi một cách thích hợp, làm cho nó ít nhạy cảm hơn.
Mở rộng cửa sổ thời gian thử nghiệm cũng có thể kiểm tra tính ổn định của tham số.
Chu kỳ trung bình di chuyển hiện tại không phải là sự kết hợp tham số tối ưu. Bạn có thể tìm ra tham số tốt hơn để có hiệu quả tốt hơn thông qua kiểm tra tối ưu hóa.
Ví dụ, tăng khoảng cách chu kỳ giữa đường nhanh và đường trung, hoặc điều chỉnh cách giao nhau của ba đường.
Chiến lược đảo ngược đường ngắn xuyên thủng đã đạt được các chỉ số thử nghiệm tương tự đáng kinh ngạc thông qua lối vào hiệu quả cao và trạm dừng siêu mạnh. Tuy nhiên, chúng ta cũng phải tỉnh táo để nhận ra rủi ro quá phù hợp trong đó và chuẩn bị kiểm soát rủi ro.
Với sự điều chỉnh hoặc tối ưu hóa các tham số, chiến lược này có thể tạo ra lợi nhuận đáng kể trong thị trường thực và trở thành một hệ thống xu hướng mạnh mẽ. Khái niệm duy nhất của nó về theo dõi dừng lỗ cũng cung cấp cho chúng tôi những hiểu biết quý giá, có khả năng tạo ra nhiều chiến lược sáng tạo hơn.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//Time Frame: H1
strategy("Pin Bar Magic v1", overlay=true)
// User Input
usr_risk = input(title="Equity Risk (%)",type=input.integer,minval=1,maxval=100,step=1,defval=3,confirm=false)
atr_mult = input(title="Stop Loss (x*ATR, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=0.5,confirm=false)
slPoints = input(title="Stop Loss Trail Points (Pips)",type=input.integer,minval=1,maxval=1000,step=1,defval=1,confirm=false)
slOffset = input(title="Stop Loss Trail Offset (Pips)",type=input.integer,minval=1,maxval=1000,step=1,defval=1,confirm=false)
sma_slow = input(title="Slow SMA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false)
ema_medm = input(title="Medm EMA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=18,confirm=false)
ema_fast = input(title="Fast EMA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=6,confirm=false)
atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false)
ent_canc = input(title="Cancel Entry After X Bars (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=3,confirm=false)
// Create Indicators
slowSMA = sma(close, sma_slow)
medmEMA = ema(close, ema_medm)
fastEMA = ema(close, ema_fast)
bullishPinBar = ((close > open) and ((open - low) > 0.66 * (high - low))) or ((close < open) and ((close - low) > 0.66 * (high - low)))
bearishPinBar = ((close > open) and ((high - close) > 0.66 * (high - low))) or ((close < open) and ((high - open) > 0.66 * (high - low)))
atr = atr(atr_valu)
// Specify Trend Conditions
fanUpTrend = (fastEMA > medmEMA) and (medmEMA > slowSMA)
fanDnTrend = (fastEMA < medmEMA) and (medmEMA < slowSMA)
// Specify Piercing Conditions
bullPierce = ((low < fastEMA) and (open > fastEMA) and (close > fastEMA)) or ((low < medmEMA) and (open > medmEMA) and (close > medmEMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA))
bearPierce = ((high > fastEMA) and (open < fastEMA) and (close < fastEMA)) or ((high > medmEMA) and (open < medmEMA) and (close < medmEMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA))
// Specify Entry Conditions
longEntry = fanUpTrend and bullishPinBar and bullPierce
shortEntry = fanDnTrend and bearishPinBar and bearPierce
// Long Entry Function
enterlong() =>
risk = usr_risk * 0.01 * strategy.equity
stopLoss = low[1] - atr[1] * atr_mult
entryPrice = high[1]
units = risk / (entryPrice - stopLoss)
strategy.entry("long", strategy.long, units, stop=entryPrice)
strategy.exit("exit long", from_entry="long", trail_points=slPoints, trail_offset=slOffset)
// Short Entry Function
entershort() =>
risk = usr_risk * 0.01 * strategy.equity
stopLoss = high[1] + atr[1] * atr_mult
entryPrice = low[1]
units = risk / (stopLoss - entryPrice)
strategy.entry("short", strategy.short, units, stop=entryPrice)
strategy.exit("exit short", from_entry="short", trail_points=slPoints, trail_offset=slOffset)
// Execute Long Entry
if (longEntry)
enterlong()
// Execute Short Entry
if (shortEntry)
entershort()
// Cancel the Entry if Bar Time is Exceeded
strategy.cancel("long", barssince(longEntry) > ent_canc)
strategy.cancel("short", barssince(shortEntry) > ent_canc)
// Force Close During Certain Conditions
strategy.close_all(when = hour==16 and dayofweek==dayofweek.friday, comment = "exit all, market-closed")
strategy.close_all(when = crossunder(fastEMA, medmEMA), comment = "exit long, re-cross")
strategy.close_all(when = crossover(fastEMA, medmEMA), comment = "exit short, re-cross")
// Plot Moving Averages to Chart
plot(fastEMA, color=color.red)
plot(medmEMA, color=color.blue)
plot(slowSMA, color=color.green)
// Plot Pin Bars to Chart
plotshape(bullishPinBar, text='Bull PB', style=shape.labeldown, location=location.abovebar, color=color.green, textcolor=color.white, transp=0)
plotshape(bearishPinBar, text='Bear PB', style=shape.labelup, location=location.belowbar, color=color.red, textcolor=color.white, transp=0)
// Plot Days of Week
plotshape(hour==0 and dayofweek==dayofweek.monday, text='Monday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0)
plotshape(hour==0 and dayofweek==dayofweek.tuesday, text='Tuesday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0)
plotshape(hour==0 and dayofweek==dayofweek.wednesday, text='Wednesday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0)
plotshape(hour==0 and dayofweek==dayofweek.thursday, text='Thursday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0)
plotshape(hour==0 and dayofweek==dayofweek.friday, text='Friday', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0)
plotshape(hour==16 and dayofweek==dayofweek.friday, text='Market Closed', style=shape.labeldown, location=location.abovebar, color=color.black, textcolor=color.white, transp=0)