Chiến lược giao dịch pinbar nhận dạng mẫu

Tác giả:ChaoZhang, Ngày: 2023-09-18 14:14:51
Tags:

Tổng quan

Chiến lược này thực hiện giao dịch mô hình giá bằng cách xác định các mô hình nến. Nó tìm kiếm mô hình pinbar gần nhất và đi dài hoặc ngắn dựa trên tín hiệu. Các nhà giao dịch có thể đặt nhiều lần lấy lợi nhuận và dừng lỗ.

Chiến lược logic

Xác định nếu nến hiện tại đáp ứng các yêu cầu pinbar - cơ thể ở nửa dưới, đóng và mở gần thấp. tín hiệu dài là ngược lại - cơ thể ở nửa trên, đóng / mở gần cao. Tìm nến tín hiệu cuối cùng và tính chiều cao cơ thể của nó. Đặt lấy lợi nhuận N lần chiều cao và dừng lỗ M lần chiều cao (M < N).

Sau khi vào, bắt đầu theo dõi điểm dừng. tiếp tục di chuyển lấy lợi nhuận hướng tới lợi nhuận trong khi duy trì điểm dừng lỗ, cho đến khi một trong hai được nhấn.

Phân tích lợi thế

  • Các mô hình giá xác định các tín hiệu tần số thấp, tránh giao dịch quá mức
  • Tiêu chí rủi ro và phần thưởng
  • Trailing dừng khóa trong lợi nhuận nhiều hơn
  • Bộ lọc thoát hiểm giả tránh bẫy

Phân tích rủi ro

  • Độ chính xác nhận dạng mẫu không bao giờ là 100%
  • Rủi ro dừng lỗ nhỏ bị dừng bởi tiếng ồn
  • Lấy lợi nhuận cần điều chỉnh kịp thời khi tụt hậu

Các rủi ro có thể được giảm thiểu thông qua tối ưu hóa tham số, thêm các chỉ số v.v.

Hướng dẫn tối ưu hóa

  • Kiểm tra các thiết lập lấy lợi nhuận và dừng lỗ khác nhau
  • Thêm các chỉ báo để lọc tín hiệu sai
  • Tối ưu hóa logic nhận dạng mẫu
  • Kiểm tra độ bền trên các sản phẩm

Kết luận

Chiến lược này xác định cơ hội thông qua nhận dạng mẫu với kết quả kiểm tra hậu quả tốt. Các điểm dừng hợp lý kiểm soát rủi ro thương mại. Các tinh chỉnh thêm như tối ưu hóa tham số có thể làm cho nó trở thành một hệ thống đơn giản và thực tế.


/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// 
// Pinbar strategy script by samgozman (https://github.com/samgozman)
// 
// Detailed instruction how to use this script: https://github.com/samgozman/pinbar-strategy-tradingview
//
// If you liked the script and want to support me: https://paypal.me/sgozman
// 
// ++++++++++ Warning: The script is provided for educational purposes only. ++++++++++ //

strategy('Pinbar strategy', default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000)

profitMultiplier = input.float(2.0, "Profit multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from high")
lossMultiplier =  input.float(1.0, "Loss multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from low")

isTrailingStop = input.bool(true, "Use trailing stops?", group="Trading options", tooltip="Highly recommended!")
isCloseOnOppositSignal = input.bool(false, "Close trade if opposit signal occures?", group="Trading options", tooltip="Close long on short signal")
isLongEligible = input.bool(true, "Enter long trades?", group="Trading options")
isShortEligible = input.bool(true, "Enter short trades?", group="Trading options")

useDateFilter = input.bool(true, title="Begin Backtest at Start Date", group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2021"), title="Start Date", group="Backtest Time Period")

// Predefined time trading zone for back testing
inTradeWindow = true

// HELPER FUNCTIONS //

// calculate candle size for N bars back. Use 0 for current
calcCandle(int periods) =>
    math.abs(high[periods] - low[periods])

// if body is below 50% and close/open below 30%
isBearishPinbar(float candle) =>
    lower30 = low + candle * 0.30
    bottomHalf1 = close < hl2
    bottomHalf2 = open < hl2
    lowerRegion1 = close < lower30
    lowerRegion2 = open < lower30
    
    con1 = bottomHalf1 and bottomHalf2
    con2 = lowerRegion1 and lowerRegion2
    con3 = high > high[1]
    
    con1 and con2 and con3

// if body is above 50% and close/open above 30%  
isBullishPinbar(float candle) =>
    upper30 = high - candle * 0.30
    topHalf1 = close > hl2
    topHalf2 = open > hl2
    upperRegion1 = close > upper30
    upperRegion2 = open > upper30
    
    con1 = topHalf1 and topHalf2
    con2 = upperRegion1 and upperRegion2
    con3 = low < low[1]
    
    con1 and con2 and con3
    
barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na

// Calculate trading signals
currentCandle = calcCandle(0)
longSignal = isBullishPinbar(currentCandle) and inTradeWindow
shortSignal = isBearishPinbar(currentCandle) and inTradeWindow

// ENTER THE TRADE //
if longSignal and isLongEligible
    strategy.entry("buy", strategy.long, when = strategy.position_size == 0)

if shortSignal and isShortEligible 
    strategy.entry("sell", strategy.short, when = strategy.position_size == 0)

// CALCULATE STOPS //
barsSinceEntry = barsSinceLastEntry()
candleFromEntry = calcCandle(barsSinceEntry)
// long
long_take_limit = strategy.position_avg_price + (candleFromEntry*profitMultiplier)
long_target_percent_profit = long_take_limit / strategy.position_avg_price - 1
long_target_percent_loss = (long_target_percent_profit / profitMultiplier) * lossMultiplier
long_stop_limit = low[barsSinceEntry] * (1 - long_target_percent_loss)
//short
short_take_limit = strategy.position_avg_price - (candleFromEntry*profitMultiplier)
short_target_percent_profit = strategy.position_avg_price / short_take_limit - 1
short_target_percent_loss = (short_target_percent_profit / profitMultiplier) * lossMultiplier
short_stop_limit = high[barsSinceEntry] * (1 + short_target_percent_loss)

// EXIT THE TRADE //
if strategy.position_size > 0 or strategy.position_size < 0
    if isTrailingStop
        strategy.exit(id="exit", from_entry="buy", trail_price = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", trail_price = short_take_limit, stop=short_stop_limit)
    else
        strategy.exit(id="exit", from_entry="buy", limit = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", limit = short_take_limit, stop=short_stop_limit)
    if isCloseOnOppositSignal
        strategy.close("buy", when = shortSignal)
        strategy.close("sell", when = longSignal)

// PLOT SIGNALS //
plotshape(longSignal, style=shape.arrowup, color=color.new(color.green, 0), size=size.large, location=location.belowbar)
plotshape(shortSignal, style=shape.arrowdown, color=color.new(color.red, 0), size=size.large, location=location.abovebar)

Thêm nữa