Strategi inklusi ganda dan tren


Tanggal Pembuatan: 2024-01-30 15:11:48 Akhirnya memodifikasi: 2024-01-30 15:11:48
menyalin: 1 Jumlah klik: 705
1
fokus pada
1617
Pengikut

Strategi inklusi ganda dan tren

Ringkasan

Strategi biner dan tren adalah strategi perdagangan kuantitatif yang menggunakan bentuk biner dan rata-rata bergerak untuk menilai tren. Strategi ini menggabungkan bentuk biner untuk memberikan sinyal perdagangan probabilitas yang lebih tinggi, sementara menggunakan rata-rata bergerak untuk menilai tren pasar dan melakukan lebih banyak shorting di arah tren.

Prinsip Strategi

  1. Hull Moving Average dihitung sebagai indikator untuk menilai tren.
  2. Ketika muncul bentuk tercakup kedua, menganggap ini sebagai sinyal perdagangan probabilitas yang lebih tinggi. Bentuk tercakup adalah harga tertinggi dari dua garis K pertama, harga terendah adalah bentuk yang tercakup oleh garis K ketiga.
  3. Jika harga penutupan berada di atas rata-rata bergerak dan membentuk banyak head, maka tempatkan stop order untuk membeli di dekat titik tinggi dalam bentuk terikat; Jika harga penutupan berada di bawah rata-rata bergerak dan membentuk head kosong, maka tempatkan stop order untuk menjual di dekat titik rendah dalam bentuk terikat.
  4. Setelah stop order dipicu, atur stop loss dan stop order sesuai dengan stop loss dan stop ratio yang telah ditentukan.

Analisis Keunggulan

  1. Formulir terlampir memberikan sinyal reversal dengan probabilitas yang lebih tinggi. Munculnya bentuk terlampir ganda dapat mengindikasikan reversal harga dalam jangka pendek.
  2. Ini digunakan dalam kombinasi dengan Moving Average untuk meningkatkan probabilitas keuntungan.
  3. Mengadopsi posisi yang lebih baik untuk mendapatkan waktu masuk, dengan berhenti di dekat titik terobosan selama tren.

Analisis risiko

  1. Dalam situasi yang bergolak, sinyal perdagangan yang diberikan oleh bentuk tertanam mungkin sering terjadi kerugian.
  2. Rata-rata bergerak sebagai indikator untuk menilai tren juga dapat mengirimkan sinyal yang salah, yang menyebabkan kerugian perdagangan berlawanan.
  3. Stop loss yang diatur terlalu kecil dapat dipicu oleh penurunan harga yang kecil.

Arah optimasi

  1. Moving averages dari berbagai parameter dapat diuji sebagai indikator untuk menilai tren.
  2. Anda dapat memfilter pergerakan dengan indikator lain untuk menghindari perdagangan buta tanpa tren yang jelas.
  3. Kombinasi parameter yang lebih baik dapat diperoleh melalui analisis data besar, seperti siklus moving average, stop loss multiplier, stop loss ratio, dan sebagainya.
  4. Anda dapat menambahkan waktu perdagangan dan filter varietas untuk menyesuaikan dengan periode waktu yang berbeda dan karakteristik varietas yang berbeda.

Meringkaskan

Strategi biner dan tren menggunakan bentuk biner untuk memberikan sinyal perdagangan dengan probabilitas yang lebih tinggi, sekaligus membantu moving average menentukan arah tren besar, melakukan lebih banyak shorting di arah tren, merupakan strategi jenis terobosan yang lebih stabil. Dengan optimasi parameter dan optimasi aturan, strategi ini dapat membuat lebih baik adaptasi terhadap pasar dan mendapatkan tingkat keuntungan yang lebih tinggi.

Kode 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")