Code: Select all
//@version=5
strategy("Institutional M1 Scalper PRO", shorttitle="M1 Stoch PRO", overlay=true, calc_on_every_tick=false, initial_capital=10000, commission_type=strategy.commission.cash_per_order, commission_value=3)
// =========================================================================
// 1. INPUT PARAMETERS & GROUPS
// =========================================================================
grp_stoch = "--- 1. Stochastic Engine ---"
k_len = input.int(5, title="%K Period", group=grp_stoch)
d_len = input.int(3, title="%D Period", group=grp_stoch)
smooth = input.int(3, title="Slowing", group=grp_stoch)
ob = input.float(80, title="Overbought Level", group=grp_stoch)
os = input.float(20, title="Oversold Level", group=grp_stoch)
grp_trend = "--- 2. Market Filters ---"
ema_len = input.int(50, title="Trend Filter (EMA)", group=grp_trend)
atr_len = input.int(14, title="ATR Period", group=grp_trend)
atr_min = input.float(1.5, title="Min Volatility (Pips)", group=grp_trend, tooltip="Minimum ATR required to trade. Filters out flat/dead markets.")
grp_session = "--- 3. Institutional Kill Zones ---"
use_sess = input.bool(true, title="Use Session Times?", group=grp_session)
sess_rng = input.session("0800-1130", title="Trading Session (EST)", group=grp_session, tooltip="Default: NY Morning Session. M1 strategies require high liquidity.")
sess_tz = input.string("America/New_York", title="Time Zone", group=grp_session)
grp_risk = "--- 4. Risk & Trade Management ---"
risk_pct = input.float(1.0, title="Risk Per Trade (%)", group=grp_risk, step=0.1, tooltip="Auto-sizes lots so you only lose this % of equity on a Stop Loss.")
sl_pips = input.float(4.0, title="Stop Loss (Pips)", group=grp_risk)
use_trail = input.bool(true, title="Use Trailing Stop?", group=grp_risk)
tp_pips = input.float(10.0, title="Take Profit (Pips) [If Trail is False]", group=grp_risk)
trail_act = input.float(3.0, title="Trail Activation (Pips)", group=grp_risk, tooltip="How many pips in profit before Trailing Stop engages.")
trail_off = input.float(1.5, title="Trail Offset (Pips)", group=grp_risk, tooltip="Distance to trail behind price once activated.")
// Normalize pip values for Forex vs Crypto/Indices
is_forex = syminfo.type == "forex"
pip_mult = is_forex ? syminfo.mintick * 10 : syminfo.mintick
// =========================================================================
// 2. INDICATORS & LOGIC
// =========================================================================
// Session Filter
in_session = use_sess ? not na(time(timeframe.period, sess_rng, sess_tz)) : true
bgcolor(in_session ? color.new(color.blue, 95) : na, title="Session Background")
// Trend & Volatility
ema_val = ta.ema(close, ema_len)
atr_val = ta.atr(atr_len) / pip_mult
is_volatile = atr_val >= atr_min
plot(ema_val, color=color.new(color.white, 0), title="Institutional EMA", linewidth=2)
// Stochastic Math
raw_k = ta.stoch(close, high, low, k_len)
k_line = ta.sma(raw_k, smooth)
d_line = ta.sma(k_line, d_len)
// Conditions
is_uptrend = close > ema_val
is_downtrend = close < ema_val
was_os = k_line[1] < os and d_line[1] < os
was_ob = k_line[1] > ob and d_line[1] > ob
bull_cross = ta.crossover(k_line, d_line)
bear_cross = ta.crossunder(k_line, d_line)
// =========================================================================
// 3. DYNAMIC POSITION SIZING
// =========================================================================
// Formula: Risk Amount = Equity * (Risk%)
// Qty = Risk Amount / (SL Ticks * Point Value)
risk_amt = strategy.equity * (risk_pct / 100)
sl_ticks = sl_pips * (is_forex ? 10 : 1)
trade_qty = risk_amt / (sl_ticks * syminfo.mintick * syminfo.pointvalue)
// =========================================================================
// 4. EXECUTION
// =========================================================================
buy_cond = in_session and is_volatile and is_uptrend and was_os and bull_cross
sell_cond = in_session and is_volatile and is_downtrend and was_ob and bear_cross
if buy_cond and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty=trade_qty)
if sell_cond and strategy.position_size == 0
strategy.entry("Short", strategy.short, qty=trade_qty)
// Advanced Trade Management
sl_val = sl_pips * (is_forex ? 10 : 1)
tp_val = tp_pips * (is_forex ? 10 : 1)
trail_act_val = trail_act * (is_forex ? 10 : 1)
trail_off_val = trail_off * (is_forex ? 10 : 1)
if strategy.position_size > 0
if use_trail
strategy.exit("Trail Exit", "Long", stop=strategy.position_avg_price - (sl_val * syminfo.mintick), trail_points=trail_act_val, trail_offset=trail_off_val)
else
strategy.exit("TP/SL Exit", "Long", stop=strategy.position_avg_price - (sl_val * syminfo.mintick), limit=strategy.position_avg_price + (tp_val * syminfo.mintick))
if strategy.position_size < 0
if use_trail
strategy.exit("Trail Exit", "Short", stop=strategy.position_avg_price + (sl_val * syminfo.mintick), trail_points=trail_act_val, trail_offset=trail_off_val)
else
strategy.exit("TP/SL Exit", "Short", stop=strategy.position_avg_price + (sl_val * syminfo.mintick), limit=strategy.position_avg_price - (tp_val * syminfo.mintick))
// =========================================================================
// 5. HUD DASHBOARD
// =========================================================================
var table hud = table.new(position.top_right, 2, 4, border_width=1, border_color=color.gray, frame_width=1, frame_color=color.gray)
if barstate.islast
table.cell(hud, 0, 0, "SYSTEM STATUS", bgcolor=color.new(color.black, 30), text_color=color.white)
table.cell(hud, 1, 0, "VALUE", bgcolor=color.new(color.black, 30), text_color=color.white)
table.cell(hud, 0, 1, "Session Active", bgcolor=color.new(color.black, 80), text_color=color.white)
table.cell(hud, 1, 1, in_session ? "YES" : "NO", bgcolor=in_session ? color.new(color.green, 70) : color.new(color.red, 70), text_color=color.white)
table.cell(hud, 0, 2, "Trend Bias", bgcolor=color.new(color.black, 80), text_color=color.white)
table.cell(hud, 1, 2, is_uptrend ? "LONG" : is_downtrend ? "SHORT" : "FLAT", bgcolor=is_uptrend ? color.new(color.green, 70) : color.new(color.red, 70), text_color=color.white)
table.cell(hud, 0, 3, "Volatility (ATR)", bgcolor=color.new(color.black, 80), text_color=color.white)
table.cell(hud, 1, 3, is_volatile ? "HIGH" : "LOW", bgcolor=is_volatile ? color.new(color.green, 70) : color.new(color.red, 70), text_color=color.white)