Strategi kemasukan dan trend berganda


Tarikh penciptaan: 2024-01-30 15:11:48 Akhirnya diubah suai: 2024-01-30 15:11:48
Salin: 1 Bilangan klik: 705
1
fokus pada
1617
Pengikut

Strategi kemasukan dan trend berganda

Gambaran keseluruhan

Strategi binari dan trend adalah strategi perdagangan kuantitatif yang menggunakan bentuk binari dan purata bergerak untuk menilai trend. Strategi ini menggabungkan bentuk binari untuk memberikan isyarat perdagangan yang lebih tinggi, sambil menggunakan purata bergerak untuk menilai trend pasaran dan melakukan lebih banyak shorting ke arah trend.

Prinsip Strategi

  1. Hull Moving Average dikira sebagai penunjuk trend.
  2. Apabila terdapat bentuk terhad kedua, ia dianggap sebagai isyarat dagangan yang lebih tinggi kebarangkalian. Bentuk terhad adalah harga tertinggi dari dua baris K terdahulu, dan harga terendah adalah bentuk yang disertakan oleh baris K ketiga.
  3. Jika harga penutupan berada di atas purata bergerak dan membentuk isian berganda, maka letaklah pesanan berhenti membeli berhampiran dengan titik tinggi dalam bentuk isian; jika harga penutupan berada di bawah purata bergerak dan membentuk isian kosong, maka letaklah pesanan berhenti menjual berhampiran dengan titik rendah dalam bentuk isian.
  4. Apabila Stop Billets dicetuskan untuk diperdagangkan, atur Stop Billets dan Stop Billets mengikut peratusan Stop Loss dan Stop Loss yang telah ditetapkan.

Analisis kelebihan

  1. Bentuk terhad memberikan isyarat pembalikan dengan kebarangkalian yang lebih tinggi. Kemunculan bentuk terhad ganda mungkin menandakan pembalikan harga dalam jangka pendek.
  2. Ia juga boleh digunakan bersama-sama dengan purata bergerak untuk meningkatkan kebarangkalian keuntungan.
  3. Menggunakan penangguhan simpanan tunggal berhampiran titik penembusan semasa trend untuk mendapatkan masa masuk yang lebih baik.

Analisis risiko

  1. Dalam keadaan gegaran, isyarat perdagangan yang disediakan oleh bentuk tersirat mungkin sering mengalami kerugian.
  2. Rata-rata bergerak sebagai penunjuk untuk menilai trend juga boleh memberi isyarat yang salah, menyebabkan kerugian perdagangan yang berlawanan.
  3. Penetapan titik henti terlalu kecil dan boleh mencetuskan titik henti apabila harga sedikit turun.

Arah pengoptimuman

  1. Rata-rata bergerak untuk parameter yang berbeza boleh diuji sebagai penunjuk untuk menilai trend.
  2. Ia boleh disertakan dengan indikator lain untuk menyaring pergerakan yang tidak menentu dan mengelakkan perdagangan buta apabila tiada trend yang jelas.
  3. Kombinasi parameter yang lebih baik boleh diperoleh melalui analisis data besar, seperti kitaran purata bergerak, penggandaan hentian, nisbah hentian dan sebagainya.
  4. Syarat penapisan masa dan jenis dagangan boleh ditambah untuk menyesuaikan diri dengan tempoh masa yang berbeza dan ciri-ciri yang berbeza.

ringkaskan

Strategi dua dalaman dan trend menggunakan bentuk dua dalaman untuk memberikan isyarat perdagangan dengan kebarangkalian yang lebih tinggi, sambil membantu rata-rata bergerak menentukan arah trend besar, melakukan lebih banyak shorting di arah trend, adalah strategi jenis terobosan yang lebih stabil. Dengan pengoptimuman parameter dan pengoptimuman peraturan, anda boleh menjadikan strategi ini lebih sesuai dengan pasaran dan memperoleh keuntungan yang lebih tinggi.

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