// This source code is subject to the terms of the Mozilla Public License 2.
0 at
https://mozilla.org/MPL/2.0/
// © Matb09
//@version=5
strategy('Opening Range & Daily and Weekly Pivots - Strategy - pineconnector - V2',
shorttitle='ORB + Pivots - MT5 - V2', overlay=true)
/////////////// Strategy Inputs
pine_id = input.string('', title="pineconnector License ID")
pine_pct = input.float(defval = 1, title = "Balance % risk at every trade (1 means
1%)")
close_end_day = input.bool(title="Close trade at the end of the day", defval=true,
group = "Strategy settings")
threshold = input.float(defval=2, title="% max ORB", group = "Strategy settings")
use_trailing = input.bool(defval=false, title="Use trailing SL", group = "Strategy
settings")
use_ema_filter = input.bool(defval=false, title="Use EMA as filter", group =
"Strategy settings")
// use_dailybias_filter = input.bool(defval=false, title="Use ICT Daily Bias as
filter", group = "Strategy settings")
plot_ema_filter = input.bool(defval=false, title="Plot EMA as filter", group =
"Strategy settings")
ema_length = input.int(defval=50, title="EMA filter length", group = "Strategy
settings")
rr = input.float(defval=3.0, title="R:R", group = "Strategy settings")
risk_pct = input.float(defval=1.0, title="Risk %", group = "Strategy settings") /
100
ny = input(title="Time Filter", defval="0900-1300", tooltip="After this time it
won't open even if there is a breakout.")
// Strategy Logic //
KZNY = time("D", ny)
kzny_session = na(KZNY) ? na : color.green
bgcolor(kzny_session, transp=80)
ema = ta.ema(close, ema_length)
plot(plot_ema_filter ? ema : na, color=color.yellow)
// Flat Market //
FMfilter = input.bool(defval=false, title='Enable Flat Market Filter?', group="Flat
Market filter")
invert_FMfilter = input.bool(defval=false, title='Inverse Flat Market Filter?',
group="Flat Market filter")
PlotFMfilter = input.bool(defval=false, title='Plot Flat Market Filter?',
group="Flat Market filter")
FMBBlength = 20
FMBBsrc = close
FMBBmult = 2 //input.float(2.0, minval=0.001, maxval=50, title="StdDev")
FMBBbasis = ta.sma(FMBBsrc, FMBBlength)
FMBBdev = FMBBmult * ta.stdev(FMBBsrc, FMBBlength)
FMBBThreshold_Width = input.float(0.8, minval=0, maxval=10, step=0.05, title="BB
Threshold Width %", tooltip='Wont enter trades if BB width less than this %',
group="Flat Market filter")
//BBThreshold_Width = FMBBThreshold_Width / 1000
//Bollinger Bands & Width calcul
FMBBupper = FMBBbasis + FMBBdev
FMBBlower = FMBBbasis - FMBBdev
//FMbbw = (FMBBupper-FMBBlower)/FMBBbasis
FMWperc = math.abs((FMBBupper-FMBBlower)/FMBBbasis) * 100
//Flat Zone color change
FMBBcolor = FMWperc > FMBBThreshold_Width ? color.lime : color.red
FMBackBBcolor = FMWperc > FMBBThreshold_Width ? color.rgb(33, 250, 243, 90) :
color.rgb(250, 5, 10, 90)
//Display Indicator
plot(PlotFMfilter ? FMBBbasis:na, title="Basis", color=#FF6D00)
BBp1 = plot(PlotFMfilter ?FMBBupper :na, "Upper", color=FMBBcolor)
BBp2 = plot(PlotFMfilter ?FMBBlower:na, "Lower", color=FMBBcolor)
fill(BBp1, BBp2, title = "Background", color=FMBackBBcolor)
//Alerts
AlertFlatflag = FMBBThreshold_Width > FMWperc ? true : false
AlertNotFlatflag = FMBBThreshold_Width > FMWperc ? false : true
//// End Flat Makert ////
/// Daily Bias ICT ///
// YesterdayClose = request.security(syminfo.tickerid, 'D', close[1],
lookahead=barmerge.lookahead_on)
// YesterdayHigh_2 = request.security(syminfo.tickerid, 'D', high[2],
lookahead=barmerge.lookahead_on)
// YesterdayLow_2 = request.security(syminfo.tickerid, 'D', low[2],
lookahead=barmerge.lookahead_on)
// YesterdayClose_2 = request.security(syminfo.tickerid, 'D', close[2],
lookahead=barmerge.lookahead_on)
// YesterdayOpen_2 = request.security(syminfo.tickerid, 'D', open[2],
lookahead=barmerge.lookahead_on)
// daily_bias_long = use_dailybias_filter ? ((YesterdayClose_2 < YesterdayOpen_2
and YesterdayClose > YesterdayLow_2) or (YesterdayClose_2 > YesterdayOpen_2 and
YesterdayClose > YesterdayHigh_2)) : true
// daily_bias_short = use_dailybias_filter ? ((YesterdayClose_2 < YesterdayOpen_2
and YesterdayClose < YesterdayLow_2) or (YesterdayClose_2 > YesterdayOpen_2 and
YesterdayClose < YesterdayHigh_2)) : true
/// End Daily Bias ICT ///
// OBR Logic //
sessionInput = input.session("0930-1000", title="ORB Timeframe", group="OBR
settings")
t = time(timeframe.period, sessionInput)
in_session = not na(t)
is_first = in_session and not in_session[1]
var float orb_high = 0.0
var float orb_low = 0.0
var bool ema_filter_long = na
var bool ema_filter_short = na
var bool flat_market = na
if is_first
orb_high := high
orb_low := low
ema_filter_long := use_ema_filter ? open > ema : true
ema_filter_short := use_ema_filter ? open < ema : true
flat_market := FMfilter ? (invert_FMfilter ? FMWperc > FMBBThreshold_Width :
FMWperc < FMBBThreshold_Width) : true
else
orb_high := orb_high[1]
orb_low := orb_low[1]
if high > orb_high and in_session
orb_high := high
if low < orb_low and in_session
orb_low := low
plot(orb_high, style=plot.style_circles, color = close > orb_high ? color.rgb(168,
255, 17) : color.blue, title = "ORB High", linewidth = 1)
plot(orb_low, style=plot.style_circles, color = close < orb_low ? color.rgb(199,
55, 125) : color.white, title = "ORB Low", linewidth = 1)
/////////////////////////////////////
///////////// ATR
atrPeriod = input.int(title='ATR Period', defval=14, minval=1, group = "ATR
Inputs")
srcAtr = input(title='Source Upper', defval=close, group = "ATR Inputs")
atrMultiplier = input.float(title='ATR Multiplier Upper', defval=2.2, group = "ATR
Inputs")
atr = ta.atr(atrPeriod)
atr_low = srcAtr - atr * atrMultiplier
atr_up = srcAtr + atr * atrMultiplier
var stop_value = 0.0
var tp_value = 0.0
var starting_balance = 100000.0
is_in_session = time(timeframe.period, ny + ":1234567")
// Define input checkboxes for each day of the week
var bool mon = input(true, title="Monday", group="Day Filters")
var bool tue = input(true, title="Tuesday", group="Day Filters")
var bool wed = input(true, title="Wednesday", group="Day Filters")
var bool thu = input(true, title="Thursday", group="Day Filters")
var bool fri = input(true, title="Friday", group="Day Filters")
in_days = (dayofweek == dayofweek.monday ? mon : false) or (dayofweek ==
dayofweek.tuesday ? tue : false) or (dayofweek == dayofweek.wednesday ? wed :
false) or (dayofweek == dayofweek.thursday ? thu : false) or (dayofweek ==
dayofweek.friday ? fri : false)
isNewDay = ta.change(dayofmonth)
max_orb = ((orb_high - orb_low) * 100) / close < threshold
BarsSinceLastclose() =>
bar_index - strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)
buy_sig = close > orb_high and strategy.position_size == 0 and is_in_session and
ema_filter_long and (ta.barssince(isNewDay) < BarsSinceLastclose() or
strategy.closedtrades == 0) and in_days and max_orb and flat_market
sell_sig = close < orb_low and strategy.position_size == 0 and is_in_session and
ema_filter_short and (ta.barssince(isNewDay) < BarsSinceLastclose() or
strategy.closedtrades == 0) and in_days and max_orb and flat_market
if buy_sig and atr_low
stop_value := atr_low
tp_value := close + ((close - stop_value) * rr)
position_size = ((starting_balance * risk_pct) / (close - stop_value)) / 1
strategy.entry("Long", strategy.long, qty=position_size)
strategy.exit("Long", stop = stop_value, limit = tp_value)
alert(str.tostring(pine_id)+ ',buy,' +syminfo.ticker+ ',sl='
+str.tostring(stop_value)+ ',tp=' +str.tostring(tp_value)+ ',risk=' +
str.tostring(pine_pct), alert.freq_once_per_bar_close)
if sell_sig and atr_up
stop_value := atr_up
tp_value := close - ((stop_value - close) * rr)
position_size = ((starting_balance * risk_pct) / (stop_value - close)) / 1
strategy.entry("Short", strategy.short, qty=position_size)
strategy.exit("Short", stop = stop_value, limit = tp_value)
alert(str.tostring(pine_id)+',sell,' +syminfo.ticker+ ',sl='
+str.tostring(stop_value)+ ',tp=' +str.tostring(tp_value)+
',risk='+str.tostring(pine_pct), alert.freq_once_per_bar_close)
is21h = time("D", "1430-1500")
if is21h and close_end_day
strategy.close_all()
alert(str.tostring(pine_id)+',closeall,' +syminfo.ticker,
alert.freq_once_per_bar_close)
if use_trailing
if strategy.position_size > 0 and atr_low > stop_value
stop_value := atr_low
strategy.exit("Long", stop = stop_value, limit = tp_value)
alert(str.tostring(pine_id)+',newsltplong,' +syminfo.ticker+ ',sl='
+str.tostring(stop_value), alert.freq_once_per_bar_close)
if strategy.position_size < 0 and atr_up < stop_value
stop_value := atr_up
strategy.exit("Short", stop = stop_value, limit = tp_value)
alert(str.tostring(pine_id)+',newsltpshort,' +syminfo.ticker+ ',sl='
+str.tostring(stop_value), alert.freq_once_per_bar_close)
plot(strategy.position_size != 0 ? strategy.position_avg_price : na, title="Entry",
color=color.white, style=plot.style_linebr)
plot(strategy.position_size != 0 ? stop_value : na, title="Stop", color=color.red,
style=plot.style_linebr)
plot(strategy.position_size != 0 ? tp_value : na, title="TP 1", color=color.green,
style=plot.style_linebr)
// stuff to keep useless //
// YesterdayHigh = request.security(syminfo.tickerid, 'D', high[1],
lookahead=barmerge.lookahead_on)
// YesterdayLow = request.security(syminfo.tickerid, 'D', low[1],
lookahead=barmerge.lookahead_on)
// LastWeekHigh = request.security(syminfo.tickerid, 'W', high[1],
lookahead=barmerge.lookahead_on)
// LastWeekLow = request.security(syminfo.tickerid, 'W', low[1],
lookahead=barmerge.lookahead_on)