Double Inside Bar & Trend Strategi

Penulis:ChaoZhang, Tarikh: 2024-01-30 15:11:48
Tag:

img

Double Inside Bar & Trend Strategi

Ringkasan

Strategi Double Inside Bar & Trend adalah strategi perdagangan kuantitatif yang menggunakan corak bar dalaman berganda yang digabungkan dengan purata bergerak untuk menentukan trend.

Logika Strategi

  1. Gunakan Hull Moving Average (HMA) sebagai penunjuk untuk penilaian trend.
  2. Apabila corak bar dalam berganda berlaku, ia dianggap sebagai isyarat perdagangan kebarangkalian tinggi.
  3. Jika harga penutupan berada di atas MA dan bar dalam bentuk bullish, letakkan pesanan berhenti beli di sekitar paras tertinggi bar dalam.
  4. Setelah perintah berhenti diaktifkan, tetapkan stop loss dan ambil keuntungan berdasarkan peratusan stop loss yang telah ditentukan dan mengambil nisbah keuntungan.

Analisis Kelebihan

  1. Bar dalaman memberikan isyarat pembalikan kebarangkalian tinggi. Kejadian bar dalaman berganda mungkin menunjukkan pembalikan harga jangka pendek.
  2. Digunakan dengan purata bergerak untuk mengikuti arah trend utama, ia meningkatkan kebarangkalian keuntungan.
  3. Menggunakan perintah berhenti di sekitar titik terobosan dalam trend menikmati peluang kemasukan yang baik.

Analisis Risiko

  1. Dalam pasaran yang berbeza, isyarat dagangan dari dalam bar sering boleh membawa kepada kerugian.
  2. Purata bergerak sebagai penunjuk trend juga boleh memberikan isyarat palsu, mengakibatkan kerugian daripada perdagangan kontra-trend.
  3. Jika stop loss ditetapkan terlalu ketat, ia mungkin dicetuskan oleh slip harga yang kecil.

Arahan pengoptimuman

  1. Uji parameter purata bergerak yang berbeza sebagai penunjuk penilaian trend.
  2. Gabungkan penunjuk lain untuk menapis pasaran yang berbeza, mengelakkan perdagangan buta tanpa trend yang jelas.
  3. Mendapatkan kombinasi parameter yang lebih optimum melalui analisis data besar, seperti tempoh purata bergerak, pengganda stop loss, nisbah mengambil keuntungan dll.
  4. Tambah penapis pada sesi dagangan dan produk untuk menyesuaikan diri dengan jangka masa dan ciri produk yang berbeza.

Ringkasan

Strategi Double Inside Bar & Trend menggunakan isyarat perdagangan kebarangkalian tinggi dari bar dalaman berganda, dibantu oleh purata bergerak untuk menentukan arah trend utama untuk pergi panjang atau pendek, menjadikannya strategi breakout yang agak stabil. Melalui pengoptimuman parameter dan pengoptimuman logik, kemampuan beradaptasi dan keuntungan strategi ini dapat ditingkatkan.


/*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")


Lebih lanjut