
Strategi perdagangan berskala tinggi berkinerja tinggi yang dirancang untuk perdagangan garis pendek berfrekuensi tinggi (Scalping). Strategi ini dikembangkan berdasarkan Pine Script 5, menggabungkan berbagai indikator teknis dan fitur penyaringan waktu untuk mengidentifikasi sinyal penembusan pasar dan melakukan perdagangan cepat. Prinsip inti adalah dengan beberapa indikator seperti EMA, SMA, RSI, dan lain-lain, dengan deteksi terobosan harga dan manajemen risiko dinamis ATR, untuk menangkap peluang garis pendek dalam periode perdagangan tertentu.
Logika inti dari strategi ini didasarkan pada sistem terobosan harga yang dikonfirmasi oleh beberapa kondisi, dengan mekanisme implementasi sebagai berikut:
Komposisi indikator teknis:
Logika deteksi terobosan:
Konfirmasi multi-syarat:
Sistem penyaringan waktu:
Manajemen risiko dinamis:
Desain Optimasi Kinerja:
Strategi ini memiliki keuntungan yang signifikan sebagai berikut:
Kecepatan tinggi: Dengan calc_on_every_tick=true setting, dapat bereaksi langsung terhadap setiap perubahan harga, sangat cocok untuk lingkungan perdagangan frekuensi tinggi.
Mekanisme multiple confirmationKombinasi sinyal perdagangan yang diverifikasi oleh berbagai indikator seperti EMA, SMA, dan RSI secara signifikan mengurangi risiko terobosan palsu. Sistem konfirmasi ini memastikan bahwa posisi hanya akan dibuka jika beberapa kondisi terpenuhi secara bersamaan, meningkatkan kualitas perdagangan.
Fleksibilitas waktu filterDengan empat periode perdagangan yang dapat disesuaikan, memungkinkan pedagang untuk fokus pada periode pasar yang sangat likuid dan berfluktuasi tinggi, menghindari periode pasar yang kurang aktif dan tidak stabil.
Manajemen risiko dinamisTujuan stop loss dan profit yang dinamis berdasarkan ATR, memungkinkan strategi untuk secara otomatis menyesuaikan parameter risiko sesuai dengan volatilitas pasar, sesuai dengan kondisi pasar yang berbeda.
Dukungan otomatisasi lengkap: Mengintegrasikan dengan MT5 melalui PineConnector, memungkinkan transaksi yang sepenuhnya otomatis, mengurangi intervensi manusia dan dampak emosional. Kode berisi sistem peringatan lengkap, mendukung mode eksekusi cepat.
Pengoptimalan penggunaan sumber daya: Mengurangi konsumsi sumber daya komputasi secara efektif dengan memprediksi hasil konstanta dan indikator cache, untuk memastikan operasi yang efisien dalam lingkungan perdagangan real-time.
Membantu pengambilan keputusan secara visualStrategi ini memiliki panel tampilan indikator kinerja dan penanda posisi yang terintegrasi, memberikan status transaksi dan visualisasi sinyal yang intuitif, dan membantu pemantauan dan pengambilan keputusan secara manual.
Meskipun ada banyak keuntungan dari strategi ini, risiko dan tantangan yang dihadapi adalah sebagai berikut:
Perdagangan frekuensi tinggi berisikoDalam lingkungan perdagangan frekuensi tinggi, slippage, delay, dan biaya transaksi dapat secara signifikan mempengaruhi hasil transaksi yang sebenarnya. Meskipun ada mode eksekusi cepat dalam kode, namun dalam lingkungan perdagangan nyata mungkin masih dibatasi oleh kecepatan eksekusi platform perdagangan dan broker.
Menembus jebakan palsuMeskipun menggunakan mekanisme multiple confirmation, dalam pasar yang sangat berfluktuasi, sinyal false breakout masih dapat dipicu, yang menyebabkan kerugian perdagangan yang tidak perlu. Risiko ini lebih menonjol, terutama ketika parameter tidak diatur dengan benar atau kondisi pasar berubah secara drastis.
Risiko over-optimisasiStrategi melibatkan beberapa parameter (seperti EMA, SMA, RSI, dan lain-lain) dan ada risiko over-optimasi (kurva-fitting) yang dapat menyebabkan strategi tidak berkinerja baik di real time.
Keterbatasan penyaringan waktuMeskipun penyaringan waktu dapat menghindari waktu perdagangan yang tidak efisien, peluang perdagangan yang menguntungkan dapat dilewatkan di luar waktu tertentu, terutama ketika terjadi peristiwa pasar besar atau siaran pers.
Keterbatasan kontrol risiko dasar ATRDalam kondisi pasar yang ekstrim, stop loss dan profit target berdasarkan ATR mungkin tidak cukup untuk menghadapi fluktuasi besar yang tiba-tiba, yang menyebabkan stop loss tidak efektif atau berakhirnya keuntungan prematur.
Pengurangan risiko:
Berdasarkan analisis kode, berikut ini adalah arah-arah di mana strategi ini dapat dioptimalkan lebih lanjut:
Parameter dinamis beradaptasi:
Klasifikasi kondisi pasar:
Meningkatkan Sistem Filtrasi:
Optimalisasi strategi stop loss:
Evaluasi kualitas sinyal:
Menghapus kontrol:
Mengoptimalkan efisiensi komputasi:
Optimalisasi ini tidak hanya meningkatkan kinerja dan stabilitas strategi, tetapi juga meningkatkan kemampuan mereka untuk beradaptasi dengan kondisi pasar yang berbeda dan menghasilkan keuntungan jangka panjang yang lebih berkelanjutan.
Strategi perdagangan berskala tinggi dinamis berskala tinggi adalah sistem perdagangan berskala tinggi yang komprehensif yang dirancang untuk pedagang garis pendek. Strategi ini membangun kerangka perdagangan yang lengkap dengan menggabungkan beberapa indikator teknis, identifikasi harga yang terobosan, penyaringan waktu, dan manajemen risiko dinamis.
Fitur-fitur teknis utama dari strategi ini meliputi EMA cross-judging trend, SMA sebagai filter harga, RSI menghindari overbought overbought zone trading, dan ATR dynamic risk management. Integrasi dari sistem penyaringan waktu dan PineConnector menambah kepraktisan dan fleksibilitas strategi.
Meskipun strategi ini menghadapi tantangan seperti risiko yang khas dari perdagangan frekuensi tinggi dan jebakan false breakout, risiko ini dapat dikontrol secara efektif dengan manajemen risiko yang masuk akal dan optimasi parameter. Arah optimasi di masa depan meliputi penyesuaian parameter, klasifikasi status pasar, peningkatan sistem filter dan strategi stop loss cerdas, dan lain-lain.
Strategi ini menawarkan solusi perdagangan kuantitatif yang berteknologi canggih dan logis yang ketat bagi para pedagang yang mencari keuntungan dari perdagangan short line, yang sangat cocok untuk pengguna yang tertarik pada perdagangan cepat dan ingin meningkatkan efisiensi perdagangan melalui teknologi otomatisasi.
/*backtest
start: 2024-08-04 00:00:00
end: 2025-08-02 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
//@version=5
strategy("Scalper TURBO", overlay=true, initial_capital=1000,
default_qty_type=strategy.percent_of_equity, default_qty_value=50,
calc_on_every_tick=true, process_orders_on_close=false)
// ==================== PERFORMANCE OPTIMIZATIONS ====================
// Pre-calculate constants to avoid repeated calculations
const int MINUTES_PER_HOUR = 60
// ==================== INPUT PARAMETERS ====================
// Technical Parameters
emaFastLen = input.int(34, "EMA Rápida", minval=1)
emaSlowLen = input.int(63, "EMA Lenta", minval=1)
smaLen = input.int(34, "SMA Filtro", minval=1)
rsiLen = input.int(14, "Periodo RSI", minval=1)
rsiOverbought = input.int(70, "RSI Sobrecompra", minval=1, maxval=100)
rsiOversold = input.int(30, "RSI Sobreventa", minval=1, maxval=100)
breakoutPeriod = input.int(1, "Periodos para Breakout", minval=1)
atrLen = input.int(14, "Periodo ATR", minval=1)
atrMultSL = input.float(3, "Multiplicador ATR Stop-Loss", step=0.1)
atrMultTrail = input.float(3, "Multiplicador ATR Trailing Stop", step=0.1)
// ==================== TIME FILTER SETTINGS ====================
var g_timefilters = "Time Filters"
// Time Filter Arrays for faster processing
useTimeFilter = array.new_bool(4)
startHour = array.new_int(4)
startMin = array.new_int(4)
endHour = array.new_int(4)
endMin = array.new_int(4)
// Time Filter 1
array.set(useTimeFilter, 0, input.bool(false, "Enable Time Filter 1", group=g_timefilters))
array.set(startHour, 0, input.int(9, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1start"))
array.set(startMin, 0, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1start"))
array.set(endHour, 0, input.int(11, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1end"))
array.set(endMin, 0, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1end"))
// Time Filter 2
array.set(useTimeFilter, 1, input.bool(false, "Enable Time Filter 2", group=g_timefilters))
array.set(startHour, 1, input.int(13, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2start"))
array.set(startMin, 1, input.int(30, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2start"))
array.set(endHour, 1, input.int(15, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2end"))
array.set(endMin, 1, input.int(0, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2end"))
// Time Filter 3
array.set(useTimeFilter, 2, input.bool(false, "Enable Time Filter 3", group=g_timefilters))
array.set(startHour, 2, input.int(16, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3start"))
array.set(startMin, 2, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3start"))
array.set(endHour, 2, input.int(18, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3end"))
array.set(endMin, 2, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3end"))
// Time Filter 4
array.set(useTimeFilter, 3, input.bool(false, "Enable Time Filter 4", group=g_timefilters))
array.set(startHour, 3, input.int(20, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4start"))
array.set(startMin, 3, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4start"))
array.set(endHour, 3, input.int(22, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4end"))
array.set(endMin, 3, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4end"))
// ==================== PINECONNECTOR SETTINGS ====================
var g_connector = "PineConnector Settings"
pcID = input.string(" ", "Pine Connector ID", group=g_connector)
symbolName = input.string("XAUUSD", "Symbol Name", tooltip="Symbol exactly as it appears in your MT5", group=g_connector)
lotSize = input.float(0.01, "Lot Size", step=0.01, group=g_connector)
enableRealTrading = input.bool(true, "Enable Real Trading", group=g_connector)
useFastExecution = input.bool(true, "Use Fast Execution Mode", group=g_connector)
showLabels = input.bool(true, "Show Info Labels", group=g_connector)
// Risk Management
useStopLoss = input.bool(true, "Use Stop Loss", group=g_connector)
useTakeProfit = input.bool(true, "Use Take Profit", group=g_connector)
useTrailingStop = input.bool(false, "Use Trailing Stop", group=g_connector)
stopLossATRMult = input.float(3, "Stop Loss ATR Multiple", step=0.1, group=g_connector)
takeProfitATRMult = input.float(3, "Take Profit ATR Multiple", step=0.1, group=g_connector)
trailingStopATRMult = input.float(3, "Trailing Stop ATR Multiple", step=0.1, group=g_connector)
// ==================== OPTIMIZED TIME FILTER FUNCTION ====================
// Cache current time components
currentHour = hour(time)
currentMin = minute(time)
currentTimeMinutes = currentHour * MINUTES_PER_HOUR + currentMin
// Optimized time check function
isTimeAllowed() =>
anyEnabled = false
timeOK = false
for i = 0 to 3
if array.get(useTimeFilter, i)
anyEnabled := true
startTimeMin = array.get(startHour, i) * MINUTES_PER_HOUR + array.get(startMin, i)
endTimeMin = array.get(endHour, i) * MINUTES_PER_HOUR + array.get(endMin, i)
inRange = startTimeMin <= endTimeMin ?
(currentTimeMinutes >= startTimeMin and currentTimeMinutes <= endTimeMin) :
(currentTimeMinutes >= startTimeMin or currentTimeMinutes <= endTimeMin)
if inRange
timeOK := true
break
not anyEnabled or timeOK
// ==================== CACHED INDICATOR CALCULATIONS ====================
// Calculate indicators only once per bar
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
sma34 = ta.sma(close, smaLen)
rsi = ta.rsi(close, rsiLen)
atr = ta.atr(atrLen)
// Support/Resistance with caching
var float resistenciaReciente = na
var float soporteReciente = na
if barstate.isconfirmed
resistenciaReciente := ta.highest(high, breakoutPeriod)[1]
soporteReciente := ta.lowest(low, breakoutPeriod)[1]
// ==================== SIGNAL CONDITIONS ====================
// Pre-calculate all conditions
tendenciaAlcista = emaFast > emaSlow
tendenciaBajista = emaFast < emaSlow
rsiNotOverbought = rsi < rsiOverbought
rsiNotOversold = rsi > rsiOversold
priceAboveSMA = close > sma34
priceBelowSMA = close < sma34
timeAllowed = isTimeAllowed()
// Breakout conditions
breakoutUp = close > resistenciaReciente
breakoutDown = close < soporteReciente
// Final entry conditions - simplified logic
longSignal = breakoutUp and tendenciaAlcista and rsiNotOverbought and priceAboveSMA and timeAllowed
shortSignal = breakoutDown and tendenciaBajista and rsiNotOversold and priceBelowSMA and timeAllowed
// ==================== POSITION MANAGEMENT ====================
// Efficient position tracking
var int currentPosition = 0 // 1 = long, -1 = short, 0 = flat
var bool positionChanged = false
var string pendingAlert = ""
// Detect position changes
newLong = longSignal and currentPosition <= 0
newShort = shortSignal and currentPosition >= 0
// ==================== OPTIMIZED ALERT SYSTEM ====================
// Pre-build alert components for faster execution
stopPips = useStopLoss ? str.tostring(math.round(atr * stopLossATRMult * 100)) : ""
tpPips = useTakeProfit ? str.tostring(math.round(atr * takeProfitATRMult * 100)) : ""
trailPips = useTrailingStop ? str.tostring(math.round(atr * trailingStopATRMult * 100)) : ""
// Build risk management string once
riskParams = useStopLoss ? ",sl=" + stopPips : ""
riskParams += useTakeProfit ? ",tp=" + tpPips : ""
riskParams += useTrailingStop ? ",trailingstop=" + trailPips : ""
// ==================== FAST EXECUTION MODE ====================
if enableRealTrading
// LONG ENTRY
if newLong
// Close short first if needed
if currentPosition < 0
alert(pcID + ",closeshort," + symbolName, alert.freq_once_per_bar)
// Enter long
strategy.entry("Long", strategy.long)
longAlert = pcID + ",buy," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
alert(longAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
currentPosition := 1
// SHORT ENTRY
else if newShort
// Close long first if needed
if currentPosition > 0
alert(pcID + ",closelong," + symbolName, alert.freq_once_per_bar)
// Enter short
strategy.entry("Short", strategy.short)
shortAlert = pcID + ",sell," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
alert(shortAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
currentPosition := -1
else
// Backtest mode
if newLong
strategy.entry("Long", strategy.long)
currentPosition := 1
else if newShort
strategy.entry("Short", strategy.short)
currentPosition := -1
// ==================== STOP LOSS MANAGEMENT ====================
// Calculate stops only when in position
if currentPosition != 0
if currentPosition > 0
stopLong = strategy.position_avg_price - atr * atrMultSL
strategy.exit("Exit Long", "Long", stop=stopLong, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)
else
stopShort = strategy.position_avg_price + atr * atrMultSL
strategy.exit("Exit Short", "Short", stop=stopShort, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)
// Detect exits
if strategy.position_size == 0 and currentPosition != 0
if enableRealTrading
exitAlert = currentPosition > 0 ? pcID + ",closelong," + symbolName : pcID + ",closeshort," + symbolName
alert(exitAlert, alert.freq_once_per_bar)
currentPosition := 0