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


Ngày tạo: 2023-09-18 14:14:51 sửa đổi lần cuối: 2023-09-18 14:14:51
sao chép: 0 Số nhấp chuột: 692
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này thực hiện giao dịch hình dạng giá bằng cách xác định hình dạng K. Nó sẽ tìm kiếm hình dạng đường treo xuất hiện gần đây, làm nhiều hoặc làm ít tùy thuộc vào tín hiệu hình dạng. Nhà giao dịch có thể đặt nhân số dừng lỗ.

Nguyên tắc chiến lược

Xác định xem dòng K hiện tại có phù hợp với yêu cầu hình dạng của dòng treo hay không: thực thể nằm ở nửa cuối, giá đóng cửa và giá mở cửa gần mức thấp. Ngược lại, thực hiện nhiều tín hiệu, thực thể ở nửa đầu, đóng cửa gần mức cao.

Bắt đầu theo dõi xu hướng sau khi vào, di chuyển đường dừng dần dần về hướng lợi nhuận, và đường dừng giữ nguyên cho đến khi dừng hoặc dừng lỗ được kích hoạt.

Phân tích lợi thế

  • Sử dụng tín hiệu nhận dạng hình dạng giá để tránh giao dịch thường xuyên
  • Stop Loss Multiplier có thể được tùy chỉnh để cân bằng giữa rủi ro và lợi nhuận
  • Xu hướng theo dõi dừng lỗ khóa lợi nhuận nhiều hơn
  • Có thể giả mạo đột nhập để tránh bị mắc kẹt

Phân tích rủi ro

  • Tính chính xác nhận dạng hình dạng không đạt 100%
  • Phạm vi dừng quá nhỏ có thể bị phá vỡ bởi biến động giá
  • Theo dõi xu hướng cần phải di chuyển dây dừng kịp thời

Có thể giảm nguy cơ bằng các phương pháp như tối ưu hóa tham số, chỉ số hỗ trợ.

Hướng tối ưu hóa

  • Kiểm tra các thiết lập Stop Loss khác nhau
  • Kết hợp các chỉ số khác để lọc các tín hiệu giả
  • Tối ưu hóa hình thức nhận dạng điều kiện logic
  • Các tham số kiểm tra sức khỏe trong các giống khác nhau

Tóm tắt

Chiến lược này sử dụng nhận dạng hình thức để phát hiện cơ hội giao dịch, phản hồi hoạt động tốt. Cài đặt dừng và mất mát hợp lý, có thể kiểm soát rủi ro giao dịch đơn lẻ. Có thể được hoàn thiện hơn nữa bằng cách tối ưu hóa tham số, có thể trở thành hệ thống giao dịch thực tế đơn giản.

Mã nguồn chiến lược
/*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)