
Chiến lược này là một hệ thống giao dịch dựa trên hành vi giá và các mức kháng cự hỗ trợ động, giao dịch bằng cách xác định các hình dạng giá quan trọng ở gần các mức hỗ trợ và kháng cự. Hệ thống sử dụng phương pháp tính toán kháng cự hỗ trợ động 16 chu kỳ, kết hợp bốn hình dạng quay ngược cổ điển - đường nón, đường sao chổi, hình chữ thập và kim để nắm bắt cơ hội đảo ngược tiềm năng của thị trường. Chiến lược sử dụng tỷ lệ dừng lỗ cố định để quản lý rủi ro và sử dụng các tham số nhạy cảm để kiểm soát mức độ nghiêm ngặt của tín hiệu nhập cảnh.
Cốt lõi của chiến lược là hình thành một ranh giới trên và dưới của hoạt động giá bằng cách tính toán động các mức hỗ trợ và kháng cự. Khi giá gần các mức quan trọng này, hệ thống sẽ tìm kiếm các hình dạng biểu đồ cụ thể như một tín hiệu đảo ngược. Điều kiện nhập cảnh yêu cầu giá phải nằm trong phạm vi 1.8% của mức kháng cự hỗ trợ.
Chiến lược giao dịch dựa trên hành vi giá này cung cấp cho các nhà giao dịch một phương pháp giao dịch có hệ thống bằng cách kết hợp mức kháng cự hỗ trợ động và hình thức đảo ngược cổ điển. Ưu điểm của chiến lược là rõ ràng về logic, có thể kiểm soát rủi ro, nhưng vẫn cần tối ưu hóa liên tục dựa trên hiệu quả giao dịch thực tế.
/*backtest
start: 2024-11-26 00:00:00
end: 2024-12-03 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © felipemiransan
//@version=5
strategy("Price Action Strategy", overlay=true)
// Settings
length = input.int(16, title="Support and Resistance Length")
sensitivity = input.float(0.018, title="Sensitivity")
// Stop Loss and Take Profit
stop_loss_pct = input.float(16, title="Stop Loss percentage", minval=0.1) / 100
take_profit_pct = input.float(9.5, title="Take Profit percentage", minval=0.1) / 100
// Function to identify a Hammer
isHammer() =>
body = close - open
price_range = high - low
lower_shadow = open - low
upper_shadow = high - close
body > 0 and lower_shadow > body * 2 and upper_shadow < body * 0.5 and price_range > 0
// Function to identify a Shooting Star
isShootingStar() =>
body = open - close
price_range = high - low
lower_shadow = close - low
upper_shadow = high - open
body > 0 and upper_shadow > body * 2 and lower_shadow < body * 0.5 and price_range > 0
// Function to identify a Doji
isDoji() =>
body = close - open
price_range = high - low
math.abs(body) < (price_range * 0.1) // Doji has a small body
// Function to identify a Pin Bar
isPinBar() =>
body = close - open
price_range = high - low
lower_shadow = open - low
upper_shadow = high - close
(upper_shadow > body * 2 and lower_shadow < body * 0.5) or (lower_shadow > body * 2 and upper_shadow < body * 0.5)
// Support and resistance levels
support = ta.lowest(low, length)
resistance = ta.highest(high, length)
// Entry criteria
long_condition = (isHammer() or isDoji() or isPinBar()) and close <= support * (1 + sensitivity)
short_condition = (isShootingStar() or isDoji() or isPinBar()) and close >= resistance * (1 - sensitivity)
// Function to calculate stop loss and take profit (long)
calculate_levels(position_size, avg_price, stop_loss_pct, take_profit_pct) =>
stop_loss_level = avg_price * (1 - stop_loss_pct)
take_profit_level = avg_price * (1 + take_profit_pct)
[stop_loss_level, take_profit_level]
// Function to calculate stop loss and take profit (short)
calculate_levels_short(position_size, avg_price, stop_loss_pct, take_profit_pct) =>
stop_loss_level = avg_price * (1 + stop_loss_pct)
take_profit_level = avg_price * (1 - take_profit_pct)
[stop_loss_level, take_profit_level]
// Buy entry order with label
if (long_condition and strategy.opentrades == 0)
strategy.entry("Buy", strategy.long)
pattern = isHammer() ? "Hammer" : isDoji() ? "Doji" : isPinBar() ? "Pin Bar" : ""
label.new(x=bar_index, y=low, text=pattern, color=color.green, textcolor=color.black, size=size.small)
// Sell entry order with label
if (short_condition and strategy.opentrades == 0)
strategy.entry("Sell", strategy.short)
pattern = isShootingStar() ? "Shooting Star" : isDoji() ? "Doji" : isPinBar() ? "Pin Bar" : ""
label.new(x=bar_index, y=high, text=pattern, color=color.red, textcolor=color.black, size=size.small)
// Stop Loss and Take Profit management for open positions
if (strategy.opentrades > 0)
if (strategy.position_size > 0) // Long position
avg_price_long = strategy.position_avg_price // Average price of long position
[long_stop_level, long_take_profit_level] = calculate_levels(strategy.position_size, avg_price_long, stop_loss_pct, take_profit_pct)
strategy.exit("Exit Long", from_entry="Buy", stop=long_stop_level, limit=long_take_profit_level)
if (strategy.position_size < 0) // Short position
avg_price_short = strategy.position_avg_price // Average price of short position
[short_stop_level, short_take_profit_level] = calculate_levels_short(strategy.position_size, avg_price_short, stop_loss_pct, take_profit_pct)
strategy.exit("Exit Short", from_entry="Sell", stop=short_stop_level, limit=short_take_profit_level)
// Visualization of Support and Resistance Levels
plot(support, title="Support", color=color.green, linewidth=2)
plot(resistance, title="Resistance", color=color.red, linewidth=2)