Strategi Scalping Intraday Gila Kombo Indikator Dual

Penulis:ChaoZhang, Tarikh: 2023-12-01 14:47:57
Tag:

img

Ringkasan

Strategi ini menggabungkan isyarat beli dan jual dari penunjuk TMO dan AMA LuxAlgo untuk menangkap permulaan trend semasa penyatuan terikat julat. Ia pergi lama atau pendek apabila syarat isyarat TMO, hujung AMA, dan peningkatan saiz badan lilin dipenuhi. Stop loss ditetapkan pada swing tertinggi / rendah terkini berdasarkan bar baru-baru ini.

Logika Strategi

Indikator TMO mencerminkan momentum harga. Ia tergolong dalam jenis penunjuk osilator dan boleh menghasilkan isyarat perdagangan apabila perbezaan berlaku. Indikator AMA adalah purata bergerak yang halus. Ia menunjukkan pelbagai turun naik harga, menunjukkan keadaan overbought / oversold apabila harga mendekati band atas / bawah.

Logik utama di sebalik strategi ini adalah: TMO boleh mengesan perbezaan trend untuk menjana isyarat perdagangan. AMA boleh mengenal pasti zon pembalikan harga. Bersama dengan pengesahan dari meningkatkan saiz badan lilin, mereka dapat meningkatkan ketepatan menangkap permulaan trend. Jadi strategi akan pergi lama / pendek apabila:

  1. TMO memberi isyarat beli, iaitu divergen bullish DAN AMA menunjukkan ekstrim maksimumnya
  2. TMO memberi isyarat jual. iaitu divergen bearish DAN AMA menunjukkan ekstrim min
  3. Juga memerlukan badan lilin 3 terbaru untuk berkembang dalam saiz

Ini menyelesaikan masalah isyarat palsu penunjuk tunggal. Stop loss berdasarkan bar baru-baru ini tertinggi tertinggi / terendah terendah boleh mengawal risiko dengan berkesan.

Kelebihan

Kelebihan strategi ini termasuk:

  1. Kombo penunjuk meningkatkan ketepatan isyarat. TMO dan AMA saling mengesahkan untuk mengurangkan isyarat palsu dan meningkatkan ketepatan.

  2. Pelbagai keadaan menangkap permulaan trend. Kombinasi isyarat TMO, ekstremiti AMA dan peningkatan saiz lilin membolehkan strategi untuk mengenal pasti permulaan trend dengan berkesan, yang diikuti oleh strategi scalping.

  3. Dengan menggunakan bar terbaru harga tertinggi/terendah sebagai stop loss, ia mengawal risiko setiap perdagangan sambil mengelakkan risiko kelewatan dari pengiraan semula penunjuk.

  4. Logik yang ringkas dan berkesan. Dengan hanya dua penunjuk, strategi telah melaksanakan sistem scalping yang lengkap dengan logika yang jelas dan mudah. Hasil backtest juga kelihatan menguntungkan.

Risiko

Risiko utama strategi:

  1. Risiko perdagangan masuk-keluar yang kerap. Sebagai strategi scalping yang mensasarkan tempoh pemegang yang pendek, kos perdagangan yang tinggi boleh menjejaskan keuntungan.

  2. Risiko stop loss yang agresif. Dengan menggunakan harga melampau baru-baru ini untuk stop loss, ia mungkin terdedah kepada bunyi bising pasaran dan meningkatkan peluang pencetus stop loss.

  3. Risiko pengoptimuman parameter yang sukar. Strategi melibatkan pelbagai parameter. Mencari kombinasi parameter yang optimum boleh menjadi mencabar.

Pengoptimuman

Strategi ini boleh dioptimumkan lagi dalam bidang berikut:

  1. Tambah lebih banyak penunjuk penapis seperti kelantangan untuk menghilangkan isyarat palsu dan meningkatkan kualiti isyarat.

  2. Uji perubahan pada peraturan stop loss untuk menjadikannya kurang agresif, contohnya menambah bar pengesahan sebelum mencetuskan stop loss.

  3. Melakukan pengoptimuman parameter untuk mencari kombinasi parameter terbaik untuk penunjuk, yang boleh membantu menapis lebih banyak bunyi bising dan meningkatkan kadar kemenangan.

  4. Backtest dan perdagangan ia hidup merentasi produk yang berbeza dan jangka masa untuk mengetahui keadaan pasaran yang paling sesuai untuk logik strategi ini.

Kesimpulan

Strategi ini menggabungkan isyarat dagangan dari TMO dan AMA ke kulit kepala di pasaran yang terikat julat dengan menangkap pergerakan trend awal. Ia mempunyai kelebihan ketepatan isyarat yang tinggi, tangkapan trend awal dan kawalan risiko yang berkesan. Pengoptimuman lanjut pada parameter dan peraturan strategi dapat menjadikannya strategi scalping intraday yang sangat praktikal.


/*backtest
start: 2023-11-23 00:00:00
end: 2023-11-30 00:00:00
period: 10m
basePeriod: 1m
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("TradeIQ - Crazy Scalping Trading Strategy [Kaspricci]", overlay=true, initial_capital = 1000, currency = currency.USD)

headlineTMO = "TMO Settings"

tmoLength   = input.int(7, "TMO Length", minval = 1, group = headlineTMO)
tmoSource   = input.source(close, "TMO Source", group = headlineTMO)

// calculate values
osc         = ta.mom(ta.sma(ta.sma(tmoSource, tmoLength), tmoLength), tmoLength)

// determine color of historgram
oscColor    = osc > osc[1] and osc > 0 ? #00c42b : osc < osc[1] and osc > 0 ? #4ee567 : osc < osc[1] and osc < 0 ? #ff441f : osc > osc[1] and osc < 0 ? #c03920 : na

// plot histogram
//plot(osc, "OSC", oscColor, linewidth = 3, style = plot.style_histogram)

// conditon to find highs and lows
up          = ta.highest(tmoSource, tmoLength)
dn          = ta.lowest(tmoSource, tmoLength)

// define conditions to be used for finding divergence
phosc = ta.crossunder(ta.change(osc), 0)
plosc = ta.crossover (ta.change(osc), 0)

// test for divergence
bear = osc > 0 and phosc and ta.valuewhen(phosc,osc,0) < ta.valuewhen(phosc,osc,1) and ta.valuewhen(phosc,up,0) > ta.valuewhen(phosc,up,1) ? 1 : 0
bull = osc < 0 and plosc and ta.valuewhen(plosc,osc,0) > ta.valuewhen(plosc,osc,1) and ta.valuewhen(plosc,dn,0) < ta.valuewhen(plosc,dn,1) ? 1 : 0

// -------------------------------------------------------------------------------------------------------------

headlineAMA = "AMA Settings"

amaSource   = input.source(defval = close, title = "AMA Source", group = headlineAMA)
amaLength   = input.int(defval = 50, title = "AMA Length", minval = 2, group = headlineAMA)


amaMulti    = input.float(defval = 2.0, title = "Factor", minval = 1)

amaShowCd   = input(defval = true , title = "As Smoothed Candles")
amaShowEx   = input(defval = true,   title = "Show Alternating Extremities")

amaAlpha    = input.float(1.0, "Lag",       minval=0, step=.1, tooltip='Control the lag of the moving average (higher = more lag)', group= 'AMA Kernel Parameters')
amaBeta     = input.float(0.5, "Overshoot", minval=0, step=.1, tooltip='Control the overshoot amplitude of the moving average (higher = overshoots with an higher amplitude)', group='AMA Kernel Parameters')

// -------------------------------------------------------------------------------------------------------------

headlineSL = "Stop Loss Settings"

slLength    = input.int(defval = 10, title = "SL Period", minval = 1, group = headlineSL, tooltip = "Number of bars for swing high / low")

// -------------------------------------------------------------------------------------------------------------

var b       = array.new_float(0)
var float x = na

if barstate.isfirst
    for i = 0 to amaLength - 1
        x := i / (amaLength - 1)
        w = math.sin(2 * 3.14159 * math.pow(x, amaAlpha)) * (1 - math.pow(x, amaBeta))
        array.push(b, w)

// local function to filter the source
filter(series float x) =>
    sum = 0.

    for i = 0 to amaLength - 1
        sum := sum + x[i] * array.get(b,i)
    
    sum / array.sum(b)

// apply filter function on source series

srcFiltered = filter(amaSource)

deviation   = ta.sma(math.abs(amaSource - srcFiltered), amaLength) * amaMulti

upper       = srcFiltered + deviation
lower       = srcFiltered - deviation

//----
crossHigh   = ta.cross(high, upper)
crossLow    = ta.cross(low, lower)

var os      = 0
os          := crossHigh ? 1 : crossLow ? 0 : os[1]

ext         = os * upper + (1 - os) * lower

//----
os_css = ta.rsi(srcFiltered, amaLength) / 100

extColor    = os == 1 ? #30FF85 : #ff1100

plot(srcFiltered, "MA", amaShowCd ? na : color.black, 2, editable = false)
plot(amaShowEx ? ext : na, "Extremities", ta.change(os) ? na : extColor, 2, editable=false)

// handle smoothed candles
var float h = na
var float l = na
var float c = na
var float body = na

if amaShowCd
    h := filter(high)
    l := filter(low)
    c := filter(amaSource)
    body := math.abs(math.avg(c[1], c[2]) - c)

ohlc_os = ta.rsi(c, amaLength) / 100

plotcandle(math.avg(c[1], c[2]), h, l, c, "Smooth Candles", #434651, bordercolor = na, editable = false, display = amaShowCd ? display.all : display.none)

// -------------------------------------------------------------------------------------------------------------

plotshape(bull ? ext : na, "Bullish Circle", shape.circle,    location.absolute, color = #00c42b, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Circle", shape.circle,    location.absolute, color = #ff441f, size=size.tiny)
plotshape(bull ? ext : na, "Bullish Label",  shape.labeldown, location.absolute, color = #00c42b, text="Buy", textcolor=color.white, size=size.tiny)
plotshape(bear ? ext : na, "Bearish Label",  shape.labelup,   location.absolute, color = #ff441f, text="Sell", textcolor=color.white, size=size.tiny)

// -------------------------------------------------------------------------------------------------------------

candleSizeIncreasing = body[2] < body[1] and body[1] < body[0]

longEntryCond   = os == 1 and bull
shortEntryCond  = os == 0 and bear

longEntry       = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(longEntryCond)  < ta.barssince(os == 0) and ta.barssince(longEntryCond) < ta.barssince(bear)
shortEntry      = strategy.opentrades == 0 and candleSizeIncreasing and not candleSizeIncreasing[1] and ta.barssince(shortEntryCond) < ta.barssince(os == 1) and ta.barssince(shortEntryCond) < ta.barssince(bull)

longExit        = strategy.opentrades > 0 and strategy.position_size > 0 and (bear or os == 0)
shortExit       = strategy.opentrades > 0 and strategy.position_size < 0 and (bull or os == 1)

recentSwingHigh = ta.highest(high, slLength) // highest high of last candles
recentSwingLow  = ta.lowest(low,   slLength) // lowest low of recent candles

bgcolor(longEntry  ? color.rgb(76, 175, 79, 90) : na)
bgcolor(shortEntry ? color.rgb(255, 82, 82, 90) : na)

slLong          = (close - recentSwingLow) / syminfo.mintick  // stop loss in ticks
slShort         = (recentSwingHigh - close) / syminfo.mintick // stop loss in ticks

newOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades + 1)
curOrderID         = str.tostring(strategy.closedtrades + strategy.opentrades)

alertMessageForEntry = "Trade {0} - New {1} Entry at price: {2} with stop loss at: {3}"

if (longEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Long", close, recentSwingLow)
    
    strategy.entry(newOrderID, strategy.long, alert_message = alertMessage)
    strategy.exit("Stop Loss Long", newOrderID, loss = slLong, alert_message = "Stop Loss for Trade " + newOrderID)

if(longExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

if (shortEntry)
    alertMessage = str.format(alertMessageForEntry, newOrderID, "Short", close, recentSwingLow)

    strategy.entry(newOrderID, strategy.short, alert_message = alertMessage)
    strategy.exit("Stop Loss Short", newOrderID, loss = slShort, alert_message = "Stop Loss for Trade " + newOrderID)

if(shortExit)
    strategy.close(curOrderID, alert_message = "Close Trade " + curOrderID)

Lebih lanjut