
اس حکمت عملی کا بنیادی خیال یہ ہے کہ اعلی درجے کی اوسط لائنوں کے ذریعے ٹرینڈ ٹریڈنگ کا فائدہ اٹھایا جائے۔ اعلی درجے کی ٹائم فریم کے اندر ، جب قیمتیں اوسط لائنوں کو توڑتی ہیں یا توڑتی ہیں تو ، اس رجحان کا آغاز معلوم کیا جاسکتا ہے ، اور اس وقت مناسب سمت کا انتخاب کیا جاسکتا ہے۔
اس حکمت عملی کو پائن اسکرپٹ زبان کے ذریعے تیار کیا گیا ہے اور اس میں مندرجہ ذیل اہم حصے ہیں:
اوسط لکیری دورانیہ پیرامیٹر کی وضاحت کی گئی ہے ، ڈیفالٹ 200 ہے۔ K لکیری ٹائم فریم پیرامیٹر کی وضاحت کی گئی ہے ، ڈیفالٹ ڈیلی لائن “D” ہے۔
ta.ema فنکشن کا استعمال کرتے ہوئے ایکسپونینشل مووینگ ایوریج میڈین لائن کا حساب لگائیں۔
ٹی.کراس اوور اور ٹی.کراس انڈر فنکشنز کا استعمال کرتے ہوئے یہ فیصلہ کریں کہ آیا قیمت اوسط لائن کو توڑتی ہے یا اس سے نیچے ہے۔
جب ایک بریک ہوتا ہے تو ، K لائن پر اوپر یا نیچے تیر کھینچیں۔
ایک بریک کے وقت پوزیشن کھولنے کا انتخاب کریں اور ڈبل اسٹاپ نقصان فاصلے تک پہنچنے کے بعد پوزیشن کو صاف کریں۔
یہ حکمت عملی بنیادی طور پر اعلی درجے کی اوسط لائن کی رجحانات کا تعین کرنے کی صلاحیت پر انحصار کرتی ہے ، جس میں سادہ توڑنے والے آپریشنز کے ذریعہ رجحانات کا سراغ لگانا ہوتا ہے ، جو روایتی توڑنے والی حکمت عملیوں میں سے ایک ہے۔
اس حکمت عملی کے درج ذیل فوائد ہیں:
تصورات سادہ ہیں، آسانی سے سمجھنے اور سنبھالنے میں آسان۔
صرف ایک اوسط اشارے پر انحصار کرتے ہوئے ، پیرامیٹرز کو ایڈجسٹ کرنا آسان ہے۔
اس کے علاوہ ، یہ بھی کہا گیا ہے کہ اس میں بہت سے اختیارات ہیں جو آپ کو تجارت کرنے کی اجازت دیتے ہیں۔
اعلی درجے کی سائیکل واضح طور پر بڑے رجحانات کو ظاہر کرتی ہے اور مختصر مدت کے اتار چڑھاو سے متاثر نہیں ہوتی ہے۔
مختلف وقت کے دورانیے کے مجموعے کو مختلف پرجاتیوں کے مطابق ترتیب دیا جاسکتا ہے۔
اس کے علاوہ، یہ ایک ہی وقت میں جیل میں رکھنے کے لئے مشکل ہے، کیونکہ یہ آسانی سے ایک سے زیادہ پرجاتیوں کو ٹریک کر سکتا ہے.
اس حکمت عملی کے کچھ خطرات بھی ہیں:
بریک سگنل میں غلط بریک ہوسکتی ہے ، جس سے مارکیٹ میں ہلچل کو مؤثر طریقے سے فلٹر نہیں کیا جاسکتا ہے۔
مختصر لائن کے مواقع سے فائدہ اٹھانے میں ناکامی۔
اس کے علاوہ، یہ بھی کہا گیا ہے کہ اس طرح کے فیصلے کے نتیجے میں نقصانات بہت زیادہ ہوسکتے ہیں.
جب اوسط لکیری سائیکل اور ٹریڈنگ سائیکل کا ملاپ نہیں ہوتا ہے تو ، زیادہ تجارت یا نقصان ہوتا ہے۔
اس کے نتیجے میں ، آپ کو فوری طور پر نقصان کی روک تھام کی ضرورت نہیں ہے ، اور آپ کو زیادہ سے زیادہ نقصان کا سامنا کرنا پڑتا ہے۔
خطرے سے نمٹنے کے حل میں شامل ہیں: رجحان اشارے کے ساتھ مل کر ، فلٹرنگ کے حالات میں اضافہ ، پوزیشن کی مدت کو مناسب طریقے سے کم کرنا ، اسٹاپ نقصان کی پوزیشن کو متحرک طور پر ایڈجسٹ کرنا وغیرہ۔
اس حکمت عملی کو مندرجہ ذیل پہلوؤں سے بہتر بنانے پر غور کیا جا سکتا ہے:
ٹرینڈ اشارے کا ایک مجموعہ شامل کریں ، جیسے MACD ، KD ، وغیرہ ، جس سے بریک کی وشوسنییتا میں اضافہ ہوتا ہے۔
ٹرانزیکشن حجم یا برلن لائن چینل جیسے فلٹرنگ شرائط میں اضافہ ، جعلی توڑ سے بچنے کے لئے۔
پیرامیٹرز کے دورانیہ کی مماثلت کو بہتر بنائیں تاکہ پوزیشن رکھنے کا دورانیہ رجحان کے دورانیے سے زیادہ مماثل ہو۔
ریئل ٹائم اسٹاپ نقصان کی حکمت عملی میں اضافہ ، اسٹاپ نقصان کو ٹریک کرکے انفرادی نقصان کو کنٹرول کریں۔
مشین لرننگ ٹکنالوجی کے ساتھ متحرک اصلاحات پر غور کریں تاکہ پیرامیٹرز کو حاصل کیا جاسکے۔
مجموعی طور پر استحکام کو بہتر بنانے کے لئے مختلف اثاثوں کی تعیناتی کے پورٹ فولیو کی کوشش کریں۔
یہ حکمت عملی مجموعی طور پر سادہ عملی ہے ، سادہ برابری توڑنے کے ذریعے رجحان کی پیروی کے لئے ، یہ سیکھنا آسان ہے ، اور یہ مقدار کی تجارت میں داخلہ کی حکمت عملی میں سے ایک ہے۔ تاہم ، اس میں کچھ مسائل بھی ہیں ، جس میں اس حکمت عملی کو زیادہ مستحکم اور موثر بنانے کے لئے مجموعی اشارے ، اصلاح کے پیرامیٹرز ، متحرک اسٹاپ نقصانات وغیرہ کے ذریعہ بہتری کی ضرورت ہے۔ بہت زیادہ اصلاح کی گنجائش اور توسیع پذیری ہے۔
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// @version=5
// Open-Range-Breakout strategy
// No license. Free and Open Source.
strategy('Strategy: ORB', shorttitle="ORB", overlay=true , currency=currency.NONE, initial_capital=100000)
// Inputs
period = input.int(defval=15, title="TimeRange", tooltip="The range in minutes (default: 15m)")
sessionInput = input(defval="0915-0930", title="Time Range", group="ORB settings", tooltip='What is the timeperiod (default 9:15AM to 9:30AM, exchange timezone')
hide = input.bool(defval = false, title="Hide ORB Range", group="ORB setting", tooltip = 'Hide the ORB range drawing')
// SL Related
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="StopLoss settings")
// Further Filtering
ignoreMementumVolume = input.bool(defval=false, title="Ignore Momentum & Volume", tooltip="Ignore Momentum & Volume to find out trades", group="Strengh Settings")
rsiLen = input.int(defval=14, title="Momentum Period", group="Strengh Settings", tooltip = 'To determine the momentum, RSI period is set default to 100')
rsiBullish = input.int(defval=50, step=1, title="Bullish Momentum", group="Strengh Settings", tooltip = 'Bullish Momentum, default set to RSI as 50')
rsiBearish = input.int(defval=50, step=1, title="Bearish Momentum", group="Strengh Settings", tooltip = 'Bearish Momentum, default set to RSI as 50')
volAvg = input.int(defval=20, step=1, title="Volume Average Period", group="Strengh Settings", tooltip = 'To calculate average volume, how many historical bars are considered. Default: 20.')
volThreshold = input.float(defval=1, step=0.1, title="Volume Strengh", group="Strengh Settings", tooltip = 'Multiplier: How big the current bar volume compared to average of last 20')
trendPeriod = input.int(defval=200, step=1, title="Trend Period", group="Trend Settings", tooltip = 'To calculate trend, what period is considered. Default: 200.')
hideTrend = input.bool(defval = false, title="Hide the trend line", group="Trend Settings", tooltip = 'Hide the trend')
hidePDHCL = input.bool(defval = false, title="Hide the PDHCL (prev day High Close Low range)", tooltip = 'Hide the Previous Day High, Close, Low lines')
hideTable = input.bool(defval = false, title="Hide the Summary Table", tooltip = 'Hide the summary table.')
// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")
// Util method
is_newbar(res) =>
timeframe.change(time(res)) != 0
// print table
printTable(txt) =>
var table t = table.new(position.bottom_right, 1, 1)
table.cell(t, 0, 0, txt, text_halign = text.align_left, bgcolor = color.lime)
// globals
t = time(timeframe.period, sessionInput + ":1234567") // everyday
in_session = not na(t)
is_first = in_session and not in_session[1]
is_end_session = in_session[1] and not in_session
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false
var float orb_high = na
var float orb_low = na
if is_first
orb_high := high
orb_low := low
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(hide ? na : orb_high, style=plot.style_line, color=orb_high[1] != orb_high ? na : color.green, title="ORB High", linewidth=2)
plot(hide ? na : orb_low, style=plot.style_line, color=orb_low[1] != orb_low ? na : color.red, title="ORB Low", linewidth=2)
// PDHCL (Previous Day High Close Low)
[dh,dl,dc] = request.security(syminfo.ticker, "D", [high[1],low[1], close[1]], lookahead=barmerge.lookahead_on)
plot(hidePDHCL ? na : dh, title="Prev High", color=color.red, linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : dl, title="Prev Low", color=color.green, linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : dc, title="Prev Close", color=color.black, linewidth=2, trackprice=true, show_last = 1)
plot(hidePDHCL ? na : ta.vwap(close), title="Prev VWAP", color=color.fuchsia, linewidth=2, trackprice=true, show_last = 1)
var l1 = label.new(bar_index, hidePDHCL ? na : dh, 'PDH', style=label.style_label_right)
// Previous Day WWAP
// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)
// Momentum: rsi
rsi = ta.rsi(close, rsiLen)
// trend: EMA200
ema = ta.ema(close, trendPeriod)
plot(hideTrend ? na : ema, "EMA Trend", color=close > ema ? color.green : color.red, linewidth = 1)
// Volume-Weighed Moving Average calculation
vwmaAvg = ta.vwma(close, volAvg)
vwma_latest = volume
// plotshape((barstate.isconfirmed and (vwma_latest > (vwmaAvg * volThreshold))), title='VolumeData', text='', location=location.abovebar, style=shape.diamond, color=color.gray, textcolor=color.gray, size=size.tiny)
// Trade signals
longCond = barstate.isconfirmed and (ta.crossover(close, orb_high) or ta.crossover(close, dh)) and green(open, close) and (ignoreMementumVolume ? true : rsi > rsiBullish and (vwma_latest > (vwmaAvg * volThreshold)))
shortCond = barstate.isconfirmed and (ta.crossunder(close, orb_low) or ta.crossunder(close, dl)) and red(open, close) and (ignoreMementumVolume ? true : rsi < rsiBearish and (vwma_latest > (vwmaAvg * volThreshold)))
plotshape(longCond, title='Breakout', text='BO', location=location.belowbar, style=shape.triangleup, color=color.green, textcolor=color.green)
plotshape(shortCond, title='Breakout', text='BD', location=location.abovebar, style=shape.triangledown, color=color.red, textcolor=color.red)
// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
// Entry
var float sl = na
var float target = na
if (longCond)
strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
sl := longStop
target := close + ((close - longStop) * rrRatio)
alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
if (shortCond)
strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
sl := shortStop
target := close - ((shortStop - close) * rrRatio)
alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
// Exit: target or SL
if ((close >= target) or (close <= sl))
strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
if ((close <= target) or (close >= sl))
strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
// Close all open position at the end if Day
strategy.close_all(comment = "Close all entries at end of day.")
// Plotting table
if (not hideTable and is_end_session)
message = syminfo.ticker + " :\n\nORB Upper: " + str.tostring(math.round(orb_high)) + "\nORB Lower: " + str.tostring(math.round(orb_low)) + "\nPDH: " + str.tostring(math.round(dh)) + "\nPDC: " + str.tostring(math.round(dc)) + "\nPDL: " + str.tostring(math.round(dl)) + "\nVWAP: " + str.tostring(math.round(ta.vwap(close)))
printTable(message)
alert(message, alert.freq_once_per_bar_close)