
Chiến lược này sử dụng nguyên tắc phá vỡ biểu đồ thẳng, kết hợp với phán đoán xu hướng của đường trung bình di chuyển, để thực hiện giao dịch phá vỡ theo hướng xu hướng. Khi giá vượt qua ranh giới biểu đồ thẳng, nó tạo ra tín hiệu giao dịch. Đồng thời, bằng cách đánh giá mối quan hệ vị trí của đường trung bình di chuyển nhanh và chậm để xác định hướng xu hướng tổng thể, tránh tạo ra tín hiệu sai trong toàn bộ vòng quay.
Tính toán trung bình di chuyển nhanh ((20 chu kỳ) và trung bình di chuyển chậm ((50 chu kỳ))
Tính toán dựa trên đường K để biết có hình dọc tăng ((close>open) hay hình dọc giảm ((close
Xác định xem hình chữ nhật có phá giá cao nhất hoặc giá thấp nhất của đường K trước không. Nếu là hình chữ nhật tăng và phá giá cao nhất của đường K trước, sẽ tạo ra tín hiệu phá vỡ nhiều đầu; Nếu là hình chữ nhật giảm và phá giá thấp nhất của đường K trước, sẽ tạo ra tín hiệu phá vỡ không khí.
Đồng thời đánh giá xem liệu đường trung bình di chuyển nhanh có nằm trên đường trung bình di chuyển chậm hay không, nếu có, nó được đánh giá là xu hướng đa đầu; ngược lại, nó được đánh giá là xu hướng đầu trống.
Chỉ khi đường trung bình nhanh chậm được đánh giá là xu hướng đa đầu, tín hiệu phá vỡ đa đầu sẽ có hiệu lực; chỉ khi đường trung bình nhanh chậm được đánh giá là xu hướng vô đầu, tín hiệu phá vỡ vô đầu sẽ có hiệu lực. Điều này tránh phát sinh tín hiệu sai trong tổng hợp.
Khi tạo ra một tín hiệu đột phá đa đầu hiệu quả, mở nhiều thẻ theo tiêu chuẩn dừng và dừng nhất định; khi tạo ra một tín hiệu đột phá không đầu hiệu quả, mở thẻ trống theo tiêu chuẩn dừng và dừng nhất định.
Nếu đường trung bình di chuyển nhanh và đường trung bình di chuyển chậm bị phân chia, vị trí hiện tại sẽ được cân bằng.
Sử dụng ranh giới của đồ thị đường thẳng là cửa đột phá, đại diện cho tín hiệu đột phá mạnh mẽ hơn.
Đồng thời, xem xét xu hướng, tránh các tín hiệu sai trong tổng hợp, cải thiện độ chính xác.
Cân nhắc xu hướng và đột phá để chiến lược hoạt động tốt trong một tình huống xu hướng.
Các tham số được tối ưu hóa để thích ứng với các giống và thời gian khác nhau.
Nguy cơ phá vỡ thất bại. Giải pháp là chọn lỗ phá vỡ lớn hơn, đảm bảo năng lượng phá vỡ mạnh hơn.
Rủi ro của việc đánh giá xu hướng không chính xác. Giải pháp là điều chỉnh tham số đường trung bình, hoặc có thể thêm các chỉ số hỗ trợ khác để đánh giá xu hướng.
Rủi ro của việc thiết lập dừng quá nhỏ dẫn đến dừng quá thường xuyên. Giải pháp là điều chỉnh mức dừng theo các biến thể khác nhau của giống và chu kỳ thời gian.
Phương pháp giải quyết là thiết lập tỷ lệ lợi nhuận và lỗ hổng khác nhau theo các biến thể khác nhau và chu kỳ thời gian.
Nhìn chung, các tham số đường trung bình di chuyển, tham số lỗ hổng phá vỡ, tỷ lệ dừng và tỷ lệ lỗ hổng cần được thử nghiệm và tối ưu hóa theo các giống và chu kỳ thời gian khác nhau để tùy chỉnh các tham số chiến lược.
Có thể thử nghiệm các loại moving average khác nhau (như EMA, SMA, v.v.) để tìm các chỉ số đường trung bình phù hợp hơn.
Các chỉ số phán đoán phụ trợ khác, như Momentum, có thể được thêm vào để cải thiện tính chính xác của phán đoán xu hướng.
Các tham số có thể được tối ưu hóa động theo các phương pháp như học máy.
Có thể học thống kê về tỷ lệ đột phá thành công, điều chỉnh tham số đột phá.
Chiến lược này tích hợp các đặc điểm xu hướng và các đặc điểm phá vỡ, về mặt lý thuyết có thể lọc ra một lượng lớn các tín hiệu không hiệu quả. Điều quan trọng là phải chú ý đến việc kiểm tra và tối ưu hóa các tham số, làm cho chiến lược được tùy chỉnh cho các giống và chu kỳ thời gian khác nhau, để có hiệu quả tốt hơn trong giao dịch thực tế. Ngoài ra, các chỉ số hỗ trợ và kỹ thuật học máy cũng cung cấp hướng dẫn cho việc cải thiện chiến lược.
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//Backtested Time Frame: H1
//Default Settings: Are meant to run successfully on all currency pairs to reduce over-fitting.
//Risk Warning: This is a forex trading robot, backtest performance will not equal future performance, USE AT YOUR OWN RISK.
//Code Warning: Although every effort has been made for robustness, this code has not been vetted by independent 3rd parties.
strategy("Pin Bar Strategy 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=1.9,confirm=false)
trd_rewd = input(title="Risk : Reward (1 : x*SL, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=3.1,confirm=false)
sma_fast = input(title="Fast MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=20,confirm=false)
sma_slow = input(title="Slow MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false)
atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false)
use_slpe = input(title="Use MA Slope (Boolean)",type=input.bool,defval=true,confirm=false)
slp_long = input(title="Bull Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=1,confirm=false)
slp_shrt = input(title="Bear Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=-1,confirm=false)
emg_exit = input(title="Exit When MA Re-Cross (Boolean)",type=input.bool,defval=true,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
fastSMA = sma(close, sma_fast)
slowSMA = sma(close, sma_slow)
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
smaUpTrend = (fastSMA > slowSMA) and (fastSMA[1] > slowSMA[1]) and (fastSMA[2] > slowSMA[2]) and (fastSMA[3] > slowSMA[3]) and (fastSMA[4] > slowSMA[4])
smaDnTrend = (fastSMA < slowSMA) and (fastSMA[1] < slowSMA[1]) and (fastSMA[2] < slowSMA[2]) and (fastSMA[3] < slowSMA[3]) and (fastSMA[4] < slowSMA[4])
candleUpTrend = (close[5] > fastSMA[5]) and (open[5] > fastSMA[5]) and (close[6] > fastSMA[6]) and (open[6] > fastSMA[6]) and (close[7] > fastSMA[7]) and (open[7] > fastSMA[7]) and (close[8] > fastSMA[8]) and (open[8] > fastSMA[8]) and (close[9] > fastSMA[9]) and (open[9] > fastSMA[9]) and (close[10] > fastSMA[10]) and (open[10] > fastSMA[10])
candleDnTrend = (close[5] < fastSMA[5]) and (open[5] < fastSMA[5]) and (close[6] < fastSMA[6]) and (open[6] < fastSMA[6]) and (close[7] < fastSMA[7]) and (open[7] < fastSMA[7]) and (close[8] < fastSMA[8]) and (open[8] < fastSMA[8]) and (close[9] < fastSMA[9]) and (open[9] < fastSMA[9]) and (close[10] < fastSMA[10]) and (open[10] < fastSMA[10])
// Specify Piercing Conditions
bullPierce = ((low < fastSMA) and (open > fastSMA) and (close > fastSMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA))
bearPierce = ((high > fastSMA) and (open < fastSMA) and (close < fastSMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA))
// MA Slope Function
angle(_source) =>
rad2degree=180/3.14159265359
ang=rad2degree*atan((_source[0] - _source[1])/atr(atr_valu))
// Calculate MA Slope
fastSlope=angle(fastSMA)
slowSlope=angle(slowSMA)
slopingUp = fastSlope > slp_long
slopingDn = fastSlope < slp_shrt
// Specify Entry Conditions
longEntry = smaUpTrend and bullishPinBar and bullPierce
shortEntry = smaDnTrend and bearishPinBar and bearPierce
longEntryWithSlope = smaUpTrend and bullishPinBar and bullPierce and slopingUp
shortEntryWithSlope = smaDnTrend and bearishPinBar and bearPierce and slopingDn
// Specify Secondary Exit Conditions
longExit = crossunder(fastSMA, slowSMA)
shortExit = crossover(fastSMA, slowSMA)
// 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)
takeProfit = entryPrice + trd_rewd * (entryPrice - stopLoss)
strategy.entry("long", strategy.long, units, stop=entryPrice)
strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
// 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)
takeProfit = entryPrice - trd_rewd * (stopLoss - entryPrice)
strategy.entry("short", strategy.short, units, stop=entryPrice)
strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
// Execute Long Entry w/o Slope
if (longEntry and use_slpe == false)
enterlong()
// Execute Long Entry w/ Slope
if (longEntryWithSlope and use_slpe == true)
enterlong()
// Exit Long Due to Re-Cross
if(longExit and strategy.position_size > 0 and emg_exit)
strategy.order("exit long, re-cross", strategy.short, abs(strategy.position_size))
// Cancel the Long Entry
strategy.cancel("long", barssince(longEntry) > ent_canc)
// Execute Short Entry w/o Slope
if (shortEntry and use_slpe == false)
entershort()
// Execute Short Entry w/ Slope
if (shortEntryWithSlope and use_slpe == true)
entershort()
// Exit Short Due to Re-Cross
if(shortExit and strategy.position_size < 0 and emg_exit)
strategy.order("exit short, re-cross", strategy.long, abs(strategy.position_size))
// Cancel the Short Entry
strategy.cancel("short", barssince(shortEntry) > ent_canc)
// Plot Moving Averages to Chart
plot(fastSMA, color=color.red)
plot(slowSMA, color=color.blue)
// Plot Pin Bars to Chart
plotshape(bullishPinBar, style=shape.arrowup, location=location.abovebar, color=#FF0000, text='')
plotshape(bearishPinBar, style=shape.arrowdown, location=location.belowbar, color=#0000FF, text='')