اس حکمت عملی کا بنیادی خیال یہ ہے کہ اعلی ٹائم فریموں میں چلتی اوسط کی خرابیوں کا پتہ لگاکر رجحان کی پیروی کی جائے۔ جب قیمت زیادہ ٹائم فریم پر چلتی اوسط سے اوپر یا نیچے ٹوٹ جاتی ہے تو ، یہ ایک نئے رجحان کے ممکنہ آغاز کی نشاندہی کرتی ہے ، جس سے تاجروں کو اس کے مطابق پوزیشن لینے کی اجازت ملتی ہے۔
یہ حکمت عملی پائن اسکرپٹ میں تیار کی گئی ہے اور اس میں مندرجہ ذیل اہم اجزاء شامل ہیں:
ان پٹ
ان پٹ پیرامیٹرز کی مدت کو چلتی اوسط مدت کے طور پر، ڈیفالٹ 200؛ اور بار ٹائم فریم کے طور پر، ڈیفالٹ ڈی (روزانہ بار) کے طور پر مقرر کرتا ہے.
چلتی اوسط
ta.ema فنکشن کا استعمال کرتے ہوئے ایکسپونینشل چلتی اوسط (EMA) کا حساب لگاتا ہے۔
بریک آؤٹ کا پتہ لگانا
ta.crossover اور ta.crossunder افعال کا استعمال کرتے ہوئے توڑ اور خرابی کی نشاندہی کرتا ہے.
سگنل پلاٹنگ
جب بھاگتے ہیں تو سلاخوں پر اوپر اور نیچے تیر لگاتا ہے۔
تجارتی داخلے اور باہر نکلنے
بریک آؤٹ سگنلز پر تجارت میں داخل ہوتا ہے اور جب قیمت 2x سٹاپ نقصان کی دوری تک پہنچ جاتی ہے تو باہر نکل جاتا ہے۔
یہ حکمت عملی بنیادی طور پر اعلی ٹائم فریموں میں حرکت پذیر اوسط کی رجحان کی پیروی کرنے کی صلاحیت کا فائدہ اٹھاتی ہے۔ یہ رجحان کی تجارت کے لئے سادہ بریک آؤٹ منطق کو نافذ کرتی ہے ، جس سے یہ روایتی بریک آؤٹ حکمت عملی بن جاتی ہے۔
اس حکمت عملی کے اہم فوائد میں شامل ہیں:
سادہ منطق، سمجھنے اور مہارت حاصل کرنے میں آسان.
صرف ایک اشارے پر منحصر ہے، کم سے کم پیرامیٹر کی ترتیب کے ساتھ.
بریک آؤٹ سگنل رجحان کے مطابق ہوتے ہیں، حد سے زیادہ تجارت سے گریز کرتے ہیں۔
زیادہ لمبے ٹائم فریم بڑے رجحانات کو واضح طور پر شور کے بغیر دکھاتے ہیں۔
لچکدار ٹائم فریم کے مجموعے مختلف مصنوعات کو پورا کرتے ہیں.
آسانی سے مصنوعات کے درمیان توسیع پذیر، بیک وقت drawdowns سے بچنے.
ممکنہ خطرات یہ ہیں:
بریکآؤٹ سگنل غلط سگنل ثابت ہو سکتے ہیں، جو مارکیٹ شور کو مؤثر طریقے سے فلٹر کرنے کے قابل نہیں ہیں۔
قلیل مدتی مواقع سے فائدہ اٹھانے سے قاصر
بڑے پیمانے پر نقصانات اگر اہم رجحان کی سمت غلط ہے
چلتی اوسط اور ٹریڈنگ ٹائم فریم کے درمیان ٹائم فریم کی عدم مطابقت سے زیادہ ٹریڈنگ یا کھوئے ہوئے منافع کا سبب بن سکتا ہے۔
ریئل ٹائم اسٹاپ نقصان کی کمی کے نتیجے میں بڑے نقصانات ہوسکتے ہیں۔
ممکنہ حلوں میں رجحانات کی پیروی کرنے والے اشارے کے ساتھ مل کر، فلٹرز کو شامل کرنا، ہولڈنگ کی مدت کو کم کرنا، متحرک سٹاپ نقصان وغیرہ کو لاگو کرنا شامل ہے.
اسٹریٹیجی کو مندرجہ ذیل پہلوؤں میں بہتر بنایا جاسکتا ہے:
بریک آؤٹ کی وشوسنییتا بڑھانے کے لئے 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)