Chiến lược bao gồm kép và xu hướng


Ngày tạo: 2024-01-30 15:11:48 sửa đổi lần cuối: 2024-01-30 15:11:48
sao chép: 1 Số nhấp chuột: 705
1
tập trung vào
1617
Người theo dõi

Chiến lược bao gồm kép và xu hướng

Tổng quan

Chiến lược nhị phân và xu hướng là một chiến lược giao dịch định lượng sử dụng hình thức nhị phân và đường trung bình di chuyển để xác định xu hướng. Chiến lược này kết hợp hình thức nhị phân để cung cấp tín hiệu giao dịch có xác suất cao hơn, đồng thời sử dụng đường trung bình di chuyển để xác định xu hướng thị trường và làm nhiều lỗ hổng theo hướng xu hướng.

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

  1. Tính toán trung bình di chuyển của Hull để đánh giá xu hướng.
  2. Khi hình thức hàm chứa thứ hai xuất hiện, hãy coi đây là một tín hiệu giao dịch có xác suất cao hơn. Hình thức hàm chứa là giá cao nhất của hai dòng K đầu tiên, giá thấp nhất được chứa bởi dòng K thứ ba.
  3. Nếu giá đóng cửa ở trên đường trung bình di chuyển và tạo ra nhiều đầu bên trong, hãy đặt lệnh dừng mua gần điểm cao hình dạng bên trong; Nếu giá đóng cửa ở dưới đường trung bình di chuyển và tạo ra đầu trống bên trong, hãy đặt lệnh dừng bán gần điểm thấp hình dạng bên trong.
  4. Một khi lệnh dừng được kích hoạt giao dịch, hãy đặt lệnh dừng và dừng theo tỷ lệ dừng và dừng trước.

Phân tích lợi thế

  1. Hình thức bao gồm cung cấp một tín hiệu đảo ngược có xác suất cao hơn. Sự xuất hiện của hình thức bao gồm đôi có thể cho thấy sự đảo ngược giá trong thời gian ngắn.
  2. Nó được sử dụng kết hợp với đường trung bình di chuyển, có thể hoạt động theo hướng xu hướng lớn, tăng khả năng kiếm lợi nhuận.
  3. Việc sử dụng các kho đơn dừng gần điểm đột phá trong xu hướng có thể tạo ra thời gian nhập cảnh tốt hơn.

Phân tích rủi ro

  1. Trong một tình huống chấn động, tín hiệu giao dịch được cung cấp bởi các hình thức bên trong có thể thường xuyên gây tổn thất.
  2. Đường trung bình di chuyển cũng có thể phát tín hiệu sai để đánh giá xu hướng, dẫn đến thua lỗ khi giao dịch ngược.
  3. Các điểm dừng lỗ được thiết lập quá nhỏ và có thể bị kích hoạt bởi các điểm dừng lỗ nhỏ.

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

  1. Moving Average có thể được thử nghiệm với các tham số khác nhau như là một chỉ số để đánh giá xu hướng.
  2. Các chỉ số khác có thể được kết hợp để lọc các biến động, tránh giao dịch mù khi không có xu hướng rõ ràng.
  3. Có thể có được các kết hợp tham số tốt hơn thông qua phân tích dữ liệu lớn, chẳng hạn như chu kỳ trung bình di chuyển, nhân số dừng, tỷ lệ dừng và nhiều hơn nữa.
  4. Các điều kiện lọc thời gian giao dịch và giống có thể được thêm vào để phù hợp với các khoảng thời gian khác nhau và các đặc điểm của các giống khác nhau.

Tóm tắt

Chiến lược hai nội dung và xu hướng sử dụng hình thức hai nội dung cung cấp tín hiệu giao dịch có xác suất cao hơn, đồng thời hỗ trợ moving average để xác định hướng của xu hướng lớn, làm nhiều lỗ hổng theo hướng xu hướng, là một loại chiến lược đột phá ổn định hơn. Bằng cách tối ưu hóa tham số và tối ưu hóa quy tắc, bạn có thể làm cho chiến lược này thích ứng tốt hơn với thị trường và có tỷ lệ lợi nhuận cao hơn.

Mã nguồn chiến lược
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
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/
// © Kaspricci

//@version=5
strategy(
     title = "Double Inside Bar & Trend Strategy - Kaspricci", 
     shorttitle = "Double Inside Bar & Trend", 
     overlay=true, 
     initial_capital = 100000, 
     currency = currency.USD, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, 
     calc_on_every_tick = true, 
     close_entries_rule = "ANY")

// ================================================ Entry Inputs ======================================================================
headlineEntry   = "Entry Seettings"

maSource        = input.source(defval = close,             group = headlineEntry, title = "MA Source")
maType          = input.string(defval = "HMA",             group = headlineEntry, title = "MA Type", options = ["EMA", "HMA", "SMA", "SWMA", "VWMA", "WMA"])
maLength        = input.int(   defval = 45,    minval = 1, group = headlineEntry, title = "HMA Length")

float ma = switch maType 
    "EMA"  => ta.ema(maSource,  maLength)
    "HMA"  => ta.hma(maSource,  maLength)
    "SMA"  => ta.sma(maSource,  maLength)
    "SWMA" => ta.swma(maSource)
    "VWMA" => ta.vwma(maSource, maLength)
    "WMA"  => ta.wma(maSource,  maLength)

plot(ma, "Trend MA", color.purple)

// ================================================ Trade Inputs ======================================================================
headlineTrade   = "Trade Seettings"

stopLossType    = input.string(defval = "ATR",                         group = headlineTrade,                 title = "Stop Loss Type",            options = ["ATR", "FIX"])
atrLength       = input.int(   defval = 50,   minval = 1,              group = headlineTrade, inline = "ATR", title = "   ATR: Length                 ")
atrFactor       = input.float( defval =  2.5, minval = 0, step = 0.05, group = headlineTrade, inline = "ATR", title = "Factor       ",             tooltip = "multiplier for ATR value")
takeProfitRatio = input.float( defval =  2.0, minval = 0, step = 0.05, group = headlineTrade,                 title = "            TP Ration",     tooltip = "Multiplier for Take Profit calculation")
fixStopLoss     = input.float( defval = 10.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "   FIX: Stop Loss             ") * 10 // need this in ticks
fixTakeProfit   = input.float( defval = 20.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "Take Profit",               tooltip = "in pips") * 10 // need this in ticks
useRiskMagmt    = input.bool(  defval = true,                          group = headlineTrade, inline = "RM",  title = "")
riskPercent     = input.float( defval = 1.0,  minval = 0., step = 0.5, group = headlineTrade, inline = "RM",  title = "Risk in %                ", tooltip = "This will overwrite quantity from startegy settings and calculate the trade size based on stop loss and risk percent") / 100

// ================================================ Filter Inputs =====================================================================
headlineFilter  = "Filter Setings"

// date filter
filterDates     = input.bool(defval = false,                                 group = headlineFilter, title = "Filter trades by dates")
startDateTime   = input(defval = timestamp("2022-01-01T00:00:00+0000"), group = headlineFilter, title = "       Start Date & Time")
endDateTime     = input(defval = timestamp("2099-12-31T23:59:00+0000"), group = headlineFilter, title = "       End Date & Time  ")

dateFilter      = not filterDates or (time >= startDateTime and time <= endDateTime)

// session filter
filterSession   = input.bool(title = "Filter trades by session", defval = false, group = headlineFilter)
session         = input(title = "       Session", defval = "0045-2245", group = headlineFilter)

sessionFilter   = not filterSession or time(timeframe.period, session, timezone = "CET")

// ================================================ Trade Entries and Exits =====================================================================

// calculate stop loss
stopLoss        = switch stopLossType
    "ATR" => nz(math.round(ta.atr(atrLength) * atrFactor / syminfo.mintick, 0), 0)
    "FIX" => fixStopLoss

// calculate take profit
takeProfit      = switch stopLossType
    "ATR" => math.round(stopLoss * takeProfitRatio, 0)
    "FIX" => fixTakeProfit


doubleInsideBar = high[2] > high[1] and high[2] > high[0] and low[2] < low[1] and low[2] < low[0]

// highlight mother candel and inside bar candles
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -1)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -2)

var float buyStopPrice  = na
var float sellStopPrice = na

if (strategy.opentrades == 0 and doubleInsideBar and barstate.isconfirmed)
    buyStopPrice  := high[0] // high of recent candle (second inside bar)
    sellStopPrice := low[0] // low of recent candle (second inside bar)

    tradeID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)

    quantity = useRiskMagmt ? math.round(strategy.equity * riskPercent / stopLoss, 2) / syminfo.mintick : na

    commentTemplate = "{0} QTY: {1,number,#.##} SL: {2} TP: {3}"

    if (close > ma)
        longComment = str.format(commentTemplate, tradeID + "L", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "L", strategy.long, qty = quantity, stop = buyStopPrice, comment = longComment)
        strategy.exit(tradeID + "SL", tradeID + "L", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

    if (close < ma)
        shortComment = str.format(commentTemplate, tradeID + "S", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "S", strategy.short, qty = quantity, stop = sellStopPrice, comment = shortComment)
        strategy.exit(tradeID + "SL", tradeID + "S", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

// as soon as the first pending order has been entered the remaing pending order shall be cancelled 
if strategy.opentrades > 0
    currentTradeID = str.tostring(strategy.closedtrades + strategy.opentrades)
    strategy.cancel(currentTradeID + "S")
    strategy.cancel(currentTradeID + "L")