Dual Indicators Combo Crazy Intraday Scalping Strategi

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

img

Gambaran umum

Strategi ini menggabungkan sinyal beli dan jual dari indikator TMO dan AMA LuxAlgo untuk menangkap awal tren selama konsolidasi yang terikat kisaran. Strategi ini pergi panjang atau pendek ketika kondisi sinyal TMO, ekstremitas AMA, dan peningkatan ukuran tubuh lilin terpenuhi. Stop loss ditetapkan pada swing tertinggi / terendah terbaru berdasarkan bar terbaru.

Logika Strategi

Indikator TMO mencerminkan momentum harga. Ini termasuk dalam jenis indikator osilator dan dapat menghasilkan sinyal perdagangan ketika terjadi divergensi. Indikator AMA adalah rata-rata bergerak yang dihaluskan. Ini menunjukkan rentang fluktuasi harga, menunjukkan kondisi overbought / oversold ketika harga mendekati band atas / bawah.

TMO dapat mendeteksi divergensi tren untuk menghasilkan sinyal perdagangan. AMA dapat mengidentifikasi zona pembalikan harga. Bersama dengan konfirmasi dari peningkatan ukuran tubuh lilin, mereka dapat meningkatkan akurasi menangkap awal tren. Jadi strategi akan pergi panjang / pendek ketika:

  1. TMO memberikan sinyal beli, yaitu divergensi bullish DAN AMA menunjukkan ekstremitas maksimumnya
  2. TMO memberikan sinyal jual. yaitu divergen bearish DAN AMA menunjukkan ekstrim min nya
  3. Juga membutuhkan tubuh 3 lilin terbaru untuk memperluas ukuran

Hal ini memecahkan masalah sinyal palsu dari indikator tunggal. Stop loss berdasarkan bar terbaru tertinggi tertinggi / terendah terendah dapat mengontrol risiko secara efektif.

Keuntungan

Keuntungan dari strategi ini meliputi:

  1. TMO dan AMA saling memvalidasi untuk mengurangi sinyal palsu dan meningkatkan akurasi.

  2. Kombinasi sinyal TMO, ekstremitas AMA dan peningkatan ukuran lilin memungkinkan strategi untuk secara efektif mengidentifikasi inisiasi tren, yang diupayakan oleh strategi scalping.

  3. Dengan menggunakan bar terbaru harga tertinggi/terendah sebagai stop loss, itu mengendalikan risiko setiap perdagangan sambil menghindari risiko keterlambatan dari perhitungan ulang indikator.

  4. Logika yang ringkas dan efektif. Dengan hanya dua indikator, strategi telah menerapkan sistem scalping lengkap dengan logika yang jelas dan sederhana. Hasil backtest juga terlihat menguntungkan.

Risiko

Risiko utama dari strategi:

  1. Risiko perdagangan masuk keluar yang sering. Sebagai strategi scalping yang menargetkan periode kepemilikan yang singkat, biaya perdagangan yang tinggi dapat mempengaruhi profitabilitasnya.

  2. Risiko stop loss yang agresif. Dengan menggunakan harga ekstrim baru-baru ini untuk stop loss, mungkin rentan terhadap kebisingan pasar dan meningkatkan kemungkinan pemicu stop loss.

  3. Risiko optimasi parameter yang sulit. Strategi melibatkan beberapa parameter. Menemukan kombinasi parameter yang optimal bisa menjadi tantangan.

Optimalisasi

Strategi ini dapat dioptimalkan lebih lanjut di bidang berikut:

  1. Tambahkan lebih banyak indikator filter seperti volume untuk menghilangkan sinyal palsu dan lebih meningkatkan kualitas sinyal.

  2. Uji modifikasi pada aturan stop loss untuk membuatnya kurang agresif, misalnya menambahkan bilah konfirmasi sebelum memicu stop loss.

  3. Melakukan optimasi parameter untuk menemukan kombinasi parameter terbaik untuk indikator, yang dapat membantu menyaring lebih banyak kebisingan dan meningkatkan tingkat kemenangan.

  4. Backtest dan perdagangan itu hidup di berbagai produk dan kerangka waktu untuk mengetahui kondisi pasar yang paling cocok untuk logika strategi ini.

Kesimpulan

Strategi ini menggabungkan sinyal perdagangan dari TMO dan AMA ke kulit kepala di pasar yang terikat rentang dengan menangkap pergerakan tren awal. Ini memiliki keuntungan akurasi sinyal yang tinggi, penangkapan tren awal dan pengendalian risiko yang efektif. Optimasi lebih lanjut pada parameter dan aturan strategi dapat menjadikannya strategi scalping intraday yang sangat praktis.


/*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 banyak