Thực hiện chiến lược của gấu

Tác giả:ChaoZhang, Ngày: 2024-02-26 14:12:09
Tags:

img

Tổng quan

Chiến lược theo dõi gấu (FTB) là một chiến lược giao dịch ngoại hối được thiết kế để nắm bắt một mô hình lặp đi lặp lại trong hành động giá EUR/USD trong thời gian mở thị trường châu Âu. Chiến lược nhằm mục đích tận dụng lợi thế của những con bò bị mắc kẹt trong đồng euro bị buộc phải giải tỏa các vị trí dài của họ khi giá bắt đầu giảm. Cụ thể, nó theo dõi các ngọn nến đảo ngược sao bắn hoặc búa trên biểu đồ 1 giờ của EUR/USD. Một khi được phát hiện và xác nhận với các bộ lọc bổ sung như chỉ số RSI mua quá mức, nó sẽ xâm nhập mạnh vào các vị trí ngắn với một điểm dừng chặt chẽ trên nến đảo ngược và mục tiêu lợi nhuận dựa trên tỷ lệ rủi ro / phần thưởng hợp lý.

Chiến lược logic

Giả thuyết cốt lõi của chiến lược FTB dựa trên giả định rằng những con bò đồng euro và các thuật toán đẩy giá EUR/USD lên sẽ bị mắc kẹt khi xu hướng tăng dừng lại hoặc đảo ngược ngay sau khi thị trường châu Âu/London mở cửa.

Chiến lược này nhằm mục đích tận dụng lý thuyết giảm giá này bằng cách theo dõi các mẫu nến đảo ngược trong múi giờ châu Âu (ví dụ: 2am-7am).

Khi một ngọn nến như vậy hình thành, nó báo hiệu các giao dịch dài bị mắc kẹt đang đối mặt với thanh lý. Để tiếp tục đủ điều kiện tín hiệu, các bộ lọc bổ sung được kiểm tra:

  1. RSI trên mức mua quá 70
  2. Nến trước đã đóng
  3. Nến hiện tại làm mới gần đây cao nhất

Sau khi vượt qua tất cả các bộ lọc, chiến lược đi vào các vị trí ngắn trên nến đóng với một lỗ dừng đặt ngay trên mức cao và mục tiêu lợi nhuận được tính dựa trên tỷ lệ rủi ro / phần thưởng 1: 1 (có thể cấu hình).

Một chi tiết quan trọng là chiến lược chỉ giao dịch trong phiên giao dịch châu Âu.

Phân tích lợi thế

Là một chiến lược khôi phục trung bình ngắn hạn đơn giản, phương pháp FTB có một số điểm mạnh chính:

  1. Bắt được một mô hình hành vi có thể giao dịch với tỷ lệ thắng tốt
  2. Logic dễ hiểu và tối ưu hóa
  3. Tránh tiếng ồn ban ngày bằng cách giao dịch qua đêm
  4. Các quy tắc quản lý rủi ro được xác định rõ
  5. Kết nối liền mạch với giao dịch tự động

Nhìn chung, như một chiến lược đầu cơ đêm tần số thấp, sự ổn định và đáng tin cậy của FTB là khá hấp dẫn.

Phân tích rủi ro

Mặc dù chiến lược có những ưu điểm, như với bất kỳ hệ thống giao dịch nào, nhưng có những rủi ro bao gồm:

  1. Mức chênh lệch và khoảng cách rộng hơn qua đêm
  2. Sự đơn giản có thể dẫn đến tối ưu hóa quá mức
  3. Không chính xác mẫu trên một số thị trường
  4. Tính khả thi của dữ liệu lịch sử hạn chế
  5. Các hạn chế về kiểm tra ngược

Một số cách để giải quyết rủi ro:

  1. Điều chỉnh bộ đệm dừng lỗ
  2. Thêm bộ lọc và kết hợp các chiến lược
  3. Tối ưu hóa độ bền trong các điều kiện thị trường
  4. Sử dụng thời gian backtest dài hơn
  5. Kiểm tra tương lai rộng rãi trước khi giao dịch trực tiếp

Các con đường tối ưu hóa

Với bản chất cơ bản của chiến lược và rủi ro liên quan, một số lĩnh vực cần xem xét cải thiện:

  1. Nhiều khung thời gian xác nhận tín hiệu trên 5m hoặc 15m cho độ bền
  2. Học máy Mô hình tàu để màn hình tín hiệu
  3. Dừng động điều chỉnh dừng dựa trên biến động
  4. Đơn giản hóa rủi ro tối ưu hóa kích thước vị trí để tăng trưởng ổn định hơn

Kết luận

Chiến lược theo dõi gấu cung cấp một cách tiếp cận đơn giản để bán ngắn hạn bằng cách tận dụng các sự khôi phục được thúc đẩy bởi những con bò bị mắc kẹt trong đồng euro. Dễ hiểu và nâng cao, FTB phù hợp với việc vỏ đầu hàng qua đêm có hệ thống. Dĩ nhiên, rủi ro tồn tại trong tất cả các giao dịch, do đó điều chỉnh tham số và tối ưu hóa giúp đảm bảo sự liên quan trong bối cảnh thị trường thay đổi.


/*backtest
start: 2024-02-18 00:00:00
end: 2024-02-25 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ZenAndTheArtOfTrading / PineScriptMastery
// FTB Strategy (PineConnector Version)
// Last Updated: 21st July, 2021
// @version=4
strategy("[2021] FTB Strategy", shorttitle="FTB", overlay=true)

// Risk Settings
var g_risk      = "Risk Settings"
pips            = input(title="Stop Pips", type=input.float, defval=2.0, group=g_risk, tooltip="How many pips above high to put stop loss")
rr              = input(title="Risk:Reward", type=input.float, defval=1.0, group=g_risk, tooltip="This determines the risk:reward profile of the setup")
// Filters
var g_filter    = "Filter Settings"
timezone        = input(title="Timezone", type=input.session, defval="0200-0700", group=g_filter, tooltip="Which timezone to search for FTB signals in")
days            = input(title="Days To Trade", defval="13457", group=g_filter, tooltip="Which days to trade this strategy on (Monday & Friday disabled by default)")
useRsiFilter    = input(title="RSI OB/OS?", type=input.bool, defval=true, group=g_filter, tooltip="If true then the RSI must be considered overbought before a signal is valid")
useCloseFilter  = input(title="Previous Bar Must Be Bullish?", type=input.bool, defval=false, group=g_filter, tooltip="If true then the previous bar must have closed bullish")
useHighFilter   = input(title="High Filter", type=input.bool, defval=false, group=g_filter, tooltip="If true then the signal bar must be the highest bar over X bars")
highLookback    = input(title="High Lookback", type=input.integer, defval=10, group=g_filter, tooltip="This is for setting the High Filter lookback distance")
fib             = input(title="Candle Close %", defval=0.5, group=g_filter, tooltip="For identifying shooting star candles (0.5 = must close <= 50% mark of candle size)")
rsiLen          = input(title="RSI Length", type=input.integer, defval=3, group=g_filter, tooltip="RSI length")
rsiOB           = input(title="RSI OB", type=input.float, defval=70.0, group=g_filter, tooltip="RSI overbought threshold")
// PineConnector Settings
var g_pc        = "PineConnector Settings"
pc_id           = input(title="License ID", defval="YOUR_ID", type=input.string, group=g_pc, tooltip="This is your PineConnector license ID")
pc_risk         = input(title="Risk Per Trade", defval=1, step=0.5, type=input.float, group=g_pc, tooltip="This is how much to risk per trade (% of balance or lots)")
pc_prefix       = input(title="MetaTrader Prefix", defval="", type=input.string, group=g_pc, tooltip="This is your broker's MetaTrader symbol prefix")
pc_suffix       = input(title="MetaTrader Suffix", defval="", type=input.string, group=g_pc, tooltip="This is your broker's MetaTrader symbol suffix")
pc_spread       = input(title="Spread", defval=0.5, type=input.float, group=g_pc, tooltip="Enter your average spread for this pair (used for offsetting limit order)")
pc_limit        = input(title="Use Limit Order?", defval=true, type=input.bool, group=g_pc, tooltip="If true a limit order will be used, if false a market order will be used")

// Generate PineConnector alert string
var symbol = pc_prefix + syminfo.ticker + pc_suffix
var limit = pc_limit ? "limit" : ""
pc_entry_alert(direction, sl, tp) =>
    price = pc_limit ? "price=" + tostring(pc_spread) + "," : ""
    pc_id + "," + direction + limit + "," + symbol + "," + price + "sl=" + tostring(sl) + ",tp=" + tostring(tp) + ",risk=" + tostring(pc_risk)

// Get RSI filter
rsiValue = rsi(close, rsiLen)
rsiFilter = not useRsiFilter or rsiValue >= rsiOB

// Check high & close filter
highFilter = not useHighFilter or high == highest(high, highLookback)
closeFilter = not useCloseFilter or close[1] > open[1]

// InSession() determines if a price bar falls inside the specified session
inSession(sess) => na(time(timeframe.period, sess + ":" + days)) == false

// Calculate 50% mark of candle size
bearFib = (high - low) * fib + low

// Check filters
filters = inSession(timezone) and closeFilter and high > high[1] and rsiFilter and highFilter and open != close

// Detect valid shooting star pinbar pattern
var takenTradeAlready = false
star = true

// Calculate stops & targets
shortStopPrice = high + (syminfo.mintick * pips * 10)
shortStopDistance = shortStopPrice - close
shortTargetPrice = close - (shortStopDistance * rr)

// Save stops & targets for the current trade
var tradeStopPrice = 0.0
var tradeTargetPrice = 0.0

// If we detect a valid shooting star, save our stops & targets, enter short and generate alert
if star and barstate.isconfirmed
    tradeStopPrice := shortStopPrice
    tradeTargetPrice := shortTargetPrice
    takenTradeAlready := true
    alertString = pc_entry_alert("sell", tradeStopPrice, tradeTargetPrice)
    alert(alertString, alert.freq_once_per_bar_close)
    strategy.entry(id="Short", long=strategy.short, when=strategy.position_size == 0, comment=alertString)

// If we have exited the FTB session then reset our takenTradeAlready flag for the next session
if not inSession(timezone) and inSession(timezone)[1]
    takenTradeAlready := false
    
// If price has exceeded target then cancel limit order if it's still active
if pc_limit and low <= tradeTargetPrice and strategy.position_size == 0
    alert(pc_id + ",cancelshort," + symbol)
    tradeTargetPrice := na

// Draw stops & targets
plot(star ? tradeStopPrice : na, color=color.red, style=plot.style_linebr, title="SL")
plot(star ? shortTargetPrice : na, color=color.green, style=plot.style_linebr, title="TP")
// Draw short signals
plotshape(star ? 1 : na, style=shape.triangledown, color=color.red)
// Change background color to highlight detection zone
bgcolor(color=inSession(timezone) ? color.new(color.red,80) : na, title="Session")

// Exit trade whenever our stop or target is hit
strategy.exit(id="Short Exit", from_entry="Short", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size != 0)

Thêm nữa