Chiến lược này là một hệ thống giao dịch dựa trên hành động giá và mức hỗ trợ / kháng cự năng động, thực hiện giao dịch gần mức giá chính khi các mô hình nến cụ thể xuất hiện. Hệ thống sử dụng phương pháp tính toán hỗ trợ / kháng cự năng động 16 giai đoạn, kết hợp với bốn mô hình nến đảo ngược cổ điển - Hammer, Shooting Star, Doji và Pin Bar để nắm bắt sự đảo ngược tiềm năng của thị trường. Chiến lược sử dụng tỷ lệ phần trăm cố định lấy lợi nhuận và mức dừng lỗ để quản lý rủi ro và sử dụng một tham số độ nhạy để kiểm soát độ nghiêm ngặt của tín hiệu nhập cảnh.
Lòng cốt lõi của chiến lược nằm trong việc tính toán năng động mức hỗ trợ và kháng cự để thiết lập ranh giới chuyển động giá. Khi giá tiếp cận các mức chính này, hệ thống tìm kiếm các mẫu nến cụ thể như là tín hiệu đảo ngược. Điều kiện nhập cảnh yêu cầu hình thành mô hình trong phạm vi 1,8% (sự nhạy cảm mặc định) của mức hỗ trợ / kháng cự. Hệ thống thực hiện quy tắc quản lý cổ phiếu 35% với 16% dừng lỗ và 9,5% lấy lợi nhuận, kiểm soát hiệu quả rủi ro ở khoảng 5,6% tổng vốn chủ sở hữu cho mỗi giao dịch. Chiến lược được thực hiện trong Script Pine với chức năng quản lý giao dịch và trực quan đầy đủ.
Chiến lược giao dịch dựa trên hành động giá này cung cấp cho các nhà giao dịch một cách tiếp cận giao dịch có hệ thống bằng cách kết hợp các mức hỗ trợ / kháng cự năng động với các mô hình đảo ngược cổ điển.
/*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)