
رشتہ دار ٹرانزیکشن فیصد حرکیات ٹریڈنگ حکمت عملی ایک جامع تجارتی نظام ہے جو ٹرانزیکشن حرکیات کے تجزیہ ، قیمت کے رویے کے فلٹرنگ ، بریکٹ کا پتہ لگانے اور متحرک اسٹاپ / اسٹاپ منطق کو یکجا کرتا ہے۔ اس حکمت عملی کا بنیادی حصہ یہ ہے کہ اس وقت کی شناخت کی جائے جب ٹرانزیکشن میں توسیع یا سکڑنے کا وقت طے کرنے کے لئے رشتہ دار ٹرانزیکشن کا ولیمز٪ R جیسے اشارے ((RVPR) کا حساب لگایا جائے ، جو دوہری مساوی فلٹر ((فاسٹ اور سست حرکت پذیر اوسط) کے ساتھ مل کر ہے۔ اس حکمت عملی کو مزید ترتیب دینے کے قابل قیمت کے رویے کے فلٹر کے ذریعہ عین مطابق حالات میں داخل کیا جاتا ہے ، جس میں مختلف قسم کے فکسڈ گرافک پر مبنی فیصلہ کیا جاتا ہے۔ یہ حکمت عملی خاص طور پر ان تاجروں کو تلاش کرنے کے لئے موزوں ہے جن کے پاس رشتہ دار ٹرانزیکشن میں اضافے اور فکسڈ رویے کے ردوبدل یا تسلسل کی بنیاد پر سیٹ اپ کی بنیاد پر انتہائی موزوں کے ساتھ ملنے والی کثیر
اس حکمت عملی کا بنیادی اصول یہ ہے کہ ٹرانزیکشن حجم کے اعداد و شمار کو فیصد کی حد میں تبدیل کیا جائے ، اور موجودہ ٹرانزیکشن حجم اور اس کے تاریخی دائرہ کار کے مابین تعلقات کا تجزیہ کرنے کے لئے ولیمز٪ R جیسے حساب کتاب کا استعمال کیا جائے۔ اس حکمت عملی میں ٹریڈنگ سگنل پیدا کرنے کے لئے درج ذیل کلیدی اجزاء استعمال کیے جاتے ہیں:
رشتہ دار ٹرانزیکشن٪ R اوسیلیٹر: موجودہ ٹرانزیکشن کو تاریخی ٹرانزیکشن کی اعلی ترین اور کم سے کم سطح کے ساتھ موازنہ کرتا ہے ، اور اس کی رشتہ دار پوزیشن کا حساب لگاتا ہے۔ یہ اشارے قیمت کے شعبے میں ولیمز٪ R کی طرح ہے ، لیکن ٹرانزیکشن کے اعداد و شمار پر لاگو ہوتا ہے۔
دوہری منتقل اوسط فلٹرنگ: حکمت عملی دو ٹرانزیکشن منتقل اوسط ((فاسٹ اور سست) کا استعمال کرتی ہے ، جس میں متعدد ہموار الگورتھم (SMA ، EMA ، JMA ، T3 ، سپر ہموار وغیرہ) کا انتخاب کیا جاسکتا ہے۔ جب ٹرانزیکشن تیزی سے اوسط سے زیادہ ہے ، اور تیز اوسط سست اوسط سے زیادہ ہے تو ، اس سے ظاہر ہوتا ہے کہ ٹرانزیکشن کا رجحان اوپر کی طرف ہے ، اس کے نتیجے میں ایک سے زیادہ سگنل ہوسکتا ہے۔
قیمت کے رویے کا فلٹر: مختلف فلٹرنگ گراف کی شکلوں کے مطابق ٹریڈنگ سگنل کو مزید فلٹر کریں:
فلٹرز کو توڑنا: منتخب طور پر 5 ٹانگوں کی اونچائی / کم کے قریب تجارت کو خارج کردیں ، تاکہ واپسی کے مقابلے میں خطرے سے کم تجارت سے بچا جاسکے۔
نقصان اور روکنے کا نظام: اے ٹی آر ((اوسط حقیقی طول موج) پر مبنی متحرک نقصان / روکنے کا طریقہ کار ، جو نقصان اور روکنے کے فاصلے کو ایڈجسٹ کرنے کے لئے ضرب سے ترتیب دیا جاسکتا ہے۔
باہر نکلنے کا وقت: مقررہ تعداد میں لاٹھیوں کے بعد تجارت سے باہر نکلنے کا انتخاب کریں۔
کثیر سر والے داخلے کی شرائط میں شامل ہیں: تیزی سے چلنے والی اوسط سے زیادہ تجارت ، تیزی سے چلنے والی اوسط سست رفتار اوسط سے زیادہ ہے ، رشتہ دار تجارت٪ R حد سے زیادہ ہے ، قیمت کثیر سر والے سمت کے فلٹر کے ذریعے ہے ، اور اختیاری طور پر حالیہ توڑنے والی اونچائی سے کم ہے۔ خالی سر والے داخلے کی شرائط اس کے برعکس ہیں ، اور مقررہ باہر نکلنے کی شرائط کے تحت وقت کی خاموشی کو متحرک کرتی ہیں۔
کثیر جہتی تجزیہ: یہ حکمت عملی حجم ، قیمت کے عمل اور متحرک اسٹاپ / اسٹاپ کو جوڑتی ہے ، جس سے مارکیٹ کے تجزیہ کا ایک جامع فریم ورک فراہم ہوتا ہے۔
اونچائی حسب ضرورت: حکمت عملی میں متعدد پیرامیٹرز دستیاب ہیں جن کو ایڈجسٹ کیا جاسکتا ہے ، بشمول تجارت کی سمت کنٹرول ، قیمت کے مختلف طرز عمل کو فلٹر کرنے کے طریقوں ، ٹرانزیکشن کی مقدار اور متحرک اوسط کی قسم کا انتخاب وغیرہ ، تاجر کو اپنے انداز اور مارکیٹ کی ترجیحات کے مطابق اپنی مرضی کے مطابق کرنے کی اجازت دیتا ہے۔
انٹیلجنٹ انٹری فلٹرنگ: حجم کی حرکیات اور قیمتوں کے طرز عمل کے ماڈل کو جوڑ کر ، حکمت عملی کم معیار کے تجارتی سگنل سے بچنے کے لئے اعلی امکانات کے تجارتی مواقع کی نشاندہی کرنے کے قابل ہے۔
لچکدار باہر نکلنے کا طریقہ کار: حکمت عملی وقت اور قیمت پر مبنی باہر نکلنے کے اختیارات پیش کرتی ہے ، بشمول فکسڈ بار نمبر باہر نکلنا اور اے ٹی آر پر مبنی متحرک اسٹاپ / اسٹاپ ، جس سے خطرے کا انتظام زیادہ لچکدار اور موثر ہوتا ہے۔
مارکیٹ کے مختلف حالات کے مطابق ڈھالنا: قیمتوں کے مختلف طرز عمل کے ذریعے (سادہ ، فلٹر ، متحرک ، اندرونی) ، حکمت عملی مارکیٹ کے مختلف حالات کے مطابق ڈھال سکتی ہے ، بشمول رجحان اور ڈویژنل مارکیٹ۔
اعلی درجے کی تکنیکی اشارے کی انضمام: حکمت عملی نے متعدد اعلی درجے کی حرکت پذیری اوسط کی اقسام کو مربوط کیا ہے ، جیسے جے ایم اے (جوریک منتقل اوسط) ، ٹی 3 اور سپر ہموار ، جو شور کو کم کرنے اور حقیقی رجحانات کو پکڑنے میں عمدہ کارکردگی کا مظاہرہ کرتے ہیں۔
پیرامیٹرز کو بہتر بنانے کا خطرہ: چونکہ حکمت عملی میں متعدد ایڈجسٹ پیرامیٹرز شامل ہیں ، لہذا ضرورت سے زیادہ بہتر ہونے کا خطرہ ہے ، جس کی وجہ سے تاریخی فالو اپ کی عمدہ کارکردگی ہوسکتی ہے ، لیکن اس کی اصل کارکردگی خراب ہے۔ اس کا حل یہ ہے کہ آگے کی جانچ اور روبوبلٹی تجزیہ کا استعمال کیا جائے ، اس بات کو یقینی بنایا جائے کہ پیرامیٹرز مختلف مارکیٹ کے حالات میں مستحکم رہیں۔
جعلی توڑنے کا خطرہ: ٹرانزیکشن میں اضافے کے ساتھ ہمیشہ پائیدار قیمتوں کی نقل و حرکت کے ساتھ ضروری نہیں ہے ، حکمت عملی جعلی توڑنے میں غلط سگنل پیدا کرسکتی ہے۔ اس خطرے کو کم کرنے کے لئے اضافی تصدیق کے اشارے یا تاخیر سے داخلہ شامل کیا جاسکتا ہے۔
مارکیٹ کے ماحول پر انحصار: یہ حکمت عملی مختلف مارکیٹ کے ماحول میں (جیسے اعلی اتار چڑھاؤ بمقابلہ کم اتار چڑھاؤ) میں متضاد کارکردگی کا مظاہرہ کرسکتی ہے۔ اس حکمت عملی کو عملی جامہ پہنانے سے پہلے مختلف مارکیٹ کے حالات میں کارکردگی کا تجربہ کرنے کی سفارش کی جاتی ہے۔
اسٹاپ نقصان کا خطرہ: اے ٹی آر بیسڈ اسٹاپ کا استعمال اچانک بڑھتی ہوئی اتار چڑھاؤ کے دوران کیا جاسکتا ہے۔ اتار چڑھاؤ کی ایڈجسٹمنٹ کا استعمال کرتے ہوئے اسٹاپ نقصان کی ضرب کو مدنظر رکھنا یا اسٹاپ نقصان کو اہم سپورٹ / مزاحمت کی سطح پر رکھنا زیادہ موثر ہوسکتا ہے۔
وقت سے باہر نکلنے کی عدم لچک: فکسڈ بار نمبر سے باہر نکلنے سے منافع بخش تجارت بہت جلد بند ہوسکتی ہے یا نقصان دہ تجارت بہت دیر سے بند ہوسکتی ہے۔ رجحان یا متحرک اشارے کے ساتھ مل کر باہر نکلنے کے وقت کو متحرک طور پر ایڈجسٹ کرنے پر غور کیا جاسکتا ہے۔
حساب کتاب کی پیچیدگی: حکمت عملی میں متعدد پیچیدہ منتقل اوسط الگورتھم اور شرائط کا مجموعہ استعمال کیا جاتا ہے ، جس سے حساب کتاب کا بوجھ بڑھ سکتا ہے اور اس کے نتیجے میں عملدرآمد میں تاخیر ہوتی ہے۔ ریئل ٹائم ٹریڈنگ میں ، کچھ حساب کتاب سے متعلق اشارے کو آسان بنانے کی ضرورت پڑسکتی ہے۔
متحرک حد بندی ایڈجسٹمنٹ: موجودہ حکمت عملی کا استعمال کرتے ہوئے طے شدہ رشتہ دار ٹرانزیکشن حجم٪ R حد بندی ((27)) ، آپ کو خود کار طریقے سے ایڈجسٹمنٹ کی حد بندی کو پورا کرنے کے لئے غور کر سکتے ہیں، حالیہ ٹرانزیکشن حجم کے اتار چڑھاؤ کے مطابق خود کار طریقے سے ایڈجسٹمنٹ. یہ حکمت عملی کو مختلف مارکیٹ کے حالات اور موسمی تبدیلیوں کو بہتر بنانے میں مدد ملے گی.
کثیر ٹائم فریم کی تصدیق: اعلی ٹائم فریم کی تصدیق کے اشارے متعارف کرانے سے ، صرف بڑے رجحان کی سمت میں تجارت کرنے سے حکمت عملی کی جیت کی شرح اور خطرے سے متعلق منافع کی شرح میں اضافہ ہوتا ہے۔ مثال کے طور پر ، گھڑی کی لائن پر کثیر سر سگنل صرف اس وقت عمل میں لایا جاتا ہے جب دن کی لائن اوپر کی طرف بڑھتی ہو۔
ٹرانسمیشن کی کیفیت کا تجزیہ: ٹرانسمیشن کی تقسیم کے اشارے یا ٹرانسمیشن کی تقسیم کے تجزیے کو ٹرانسمیشن کی معیار کا اندازہ لگانے کے لئے شامل کیا جاسکتا ہے ، نہ کہ صرف مقدار کے علاوہ ، رشتہ دار ٹرانسمیشن کے علاوہ۔ یہ ٹرانسمیشن کی تصدیق اور ممکنہ طور پر ختم ہونے والے سگنل کے درمیان صحت مند رجحانات کو فرق کرنے میں مدد کرتا ہے۔
اسمارٹ اسٹاپ / اسٹاپ: موجودہ اے ٹی آر کی بنیاد پر اسٹاپ / اسٹاپ کو بہتر بنایا جاسکتا ہے تاکہ اس سے زیادہ ذہین نظام ہوسکے ، مثال کے طور پر اہم سپورٹ / مزاحمت کی پوزیشن پر مبنی اسٹاپ ، یا اتار چڑھاؤ کی ایڈجسٹمنٹ کا استعمال کرتے ہوئے ، کم اتار چڑھاؤ کے دوران اسٹاپ کو سخت کریں ، اور زیادہ اتار چڑھاؤ کے دوران اسٹاپ کو نرم کریں۔
مارکیٹ ڈھانچے کو مربوط کریں: قیمت کی ساخت کا تجزیہ (جیسے سپورٹ / مزاحمت ، رجحان لائن ، قیمت چینل) کو حکمت عملی میں شامل کرنے سے داخلے کے مقامات اور باہر نکلنے کے مقامات کی کیفیت کو بہتر بنایا جاسکتا ہے۔
خطرے کے انتظام میں اضافہ: موجودہ مارکیٹ میں اتار چڑھاو اور حالیہ حکمت عملی کی کارکردگی کی بنیاد پر پوزیشن کے سائز کو متحرک طور پر ایڈجسٹ کرنا ، اعلی جیت کی شرح والے ماحول میں پوزیشن میں اضافہ اور غیر یقینی صورتحال میں پوزیشن میں کمی۔
مشین لرننگ انٹیگریشن: حکمت عملی کے پیرامیٹرز کو متحرک طور پر بہتر بنانے کے لئے مشین لرننگ الگورتھم کا استعمال کریں یا پیش گوئی کریں کہ موجودہ مارکیٹ کے حالات میں کون سا قیمت کا رویہ فلٹر سب سے زیادہ موثر ہے ، جس سے حکمت عملی کی کارکردگی کو مزید بہتر بنایا جاسکے۔
ٹرانزیکشن کی شرح کے تناسب سے متحرک ٹریڈنگ حکمت عملی ایک جامع اور لچکدار تجارتی نظام ہے جو ٹرانزیکشن تجزیہ ، متعدد قیمتوں کے طرز عمل کے فلٹرز اور متحرک رسک مینجمنٹ ٹکنالوجی کو یکجا کرکے تاجروں کو مارکیٹ کے ممکنہ مواقع کی نشاندہی کرنے کا ایک طاقتور ذریعہ فراہم کرتا ہے۔ اس حکمت عملی کا بنیادی فائدہ اس کی موافقت اور تخصیص پذیری میں ہے ، جس سے تاجر کو ذاتی ترجیحات اور مارکیٹ کے حالات کے مطابق موافقت کی اجازت ملتی ہے۔
یہ حکمت عملی خاص طور پر ان تاجروں کے لئے موزوں ہے جو حجم کی تصدیق پر مبنی الٹ یا رجحان کی توسیع کے اشارے تلاش کرتے ہیں۔ ولیمز٪ R طرز کے متعلقہ حجم اشارے کا استعمال کرتے ہوئے ، حکمت عملی حجم میں اضافے کی نشاندہی کرنے کے قابل ہے ، جو عام طور پر مارکیٹ کے جذبات میں اہم تبدیلیوں یا رجحان کی تیز رفتار کی نمائندگی کرتی ہے۔ اس کے علاوہ ، قیمت کے متعدد طرز عمل فلٹرنگ کے اختیارات تاجر کو اپنے خطرے کی ترجیحات اور تجارتی طرز کے مطابق زیادہ قدامت پسند یا زیادہ جارحانہ داخلے کے حالات کا انتخاب کرنے کی اجازت دیتے ہیں۔
اگرچہ یہ حکمت عملی بہت سارے فوائد پیش کرتی ہے ، تاجر کو ممکنہ حد سے زیادہ اصلاح کے خطرات اور مارکیٹ کے ماحول پر انحصار سے آگاہ ہونا چاہئے۔ اس حکمت عملی کی استحکام اور طویل مدتی منافع بخش صلاحیت کو مزید بڑھانے کے لئے ، تاجر کو مسلسل جانچ اور ایڈجسٹمنٹ کے ذریعہ ، تجویز کردہ اصلاح کی سمت کے ساتھ مل کر استعمال کیا جاسکتا ہے۔ آخر کار ، تمام تجارتی حکمت عملیوں کی طرح ، کامیابی کی کلید اس کے اصولوں کو گہرائی سے سمجھنے ، خطرات کو دانشمندی سے سنبھالنے اور مارکیٹ کے مختلف حالات میں اس کی کارکردگی کا مستقل اندازہ لگانے میں ہے۔
/*backtest
start: 2024-07-04 00:00:00
end: 2025-07-02 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GabrielAmadeusLau
//@version=6
strategy("Relative Volume Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// === Input: Trade Direction === //
tradeDirection = input.string("Long Only", title="Trade Direction", options=["Long Only", "Short Only", "Both"], group="Strategy Settings")
dirBarModeL = input.string("Simple", title="Long Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
dirBarModeS = input.string("Inside", title="Short Directional Bar Mode", options=["Simple", "Filtered", "Aggressive", "Inside", "Filtered & Aggressive", "Filtered & Aggressive & Inside", "Without"], group="Strategy Settings")
useBreakout = input.bool(true, "Use Breakout Filter", group="Strategy Settings")
useSLTP = input.bool(false, "Use Stop Loss & Take Profit", group="Strategy Settings")
atrSLMult = input.float(1, "ATR SL Multiplier", step = 0.05, group="Strategy Settings")
atrTPMult = input.float(1.75, "ATR TP Multiplier", step = 0.05, group="Strategy Settings")
// === Input: MA Function Selector === //
// — T3 Moving Average Function —
// src = input source (e.g. rsi1, close, etc.)
// length = smoothing length (period)
// a = T3 alpha (commonly between 0.7 and 0.9)
t3(src, length, a) =>
e1 = ta.ema(src, length)
e2 = ta.ema(e1, length)
e3 = ta.ema(e2, length)
e4 = ta.ema(e3, length)
e5 = ta.ema(e4, length)
e6 = ta.ema(e5, length)
c1 = -a * a * a
c2 = 3 * a * a + 3 * a * a * a
c3 = -6 * a * a - 3 * a - 3 * a * a * a
c4 = 1 + 3 * a + a * a * a + 3 * a * a
c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
// == Jurik MA == //
jma(float src, int length, float power, float phase) =>
phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
alpha = math.pow(beta, power)
JMA = 0.0
e0 = 0.0
e0 := (1 - alpha) * src + alpha * nz(e0[1])
e1 = 0.0
e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(JMA[1])) * math.pow(1 - alpha, 2) + math.pow(alpha, 2) * nz(e2[1])
JMA := e2 + nz(JMA[1])
//===== 2 Pole Super Smoother Filter =====//
superSmoother(float Series, float Period) =>
var float ALPHA = math.pi * math.sqrt(2.0) / Period
var float BETA = math.exp(-ALPHA )
var float COEF2 = -math.pow(BETA, 2)
var float COEF1 = math.cos( ALPHA ) * 2.0 * BETA
var float COEF0 = 1.0 - COEF1 - COEF2
float sma2 = math.avg(Series, nz(Series[1], Series))
float smooth = na, smooth := COEF0 * sma2 +
COEF1 * nz(smooth[1]) +
COEF2 * nz(smooth[2])
// === MA Selector === //
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :
type == "EMA" ? ta.ema(source, length) :
type == "SMMA (RMA)"? ta.rma(source, length) :
type == "WMA" ? ta.wma(source, length) :
type == "VWMA" ? ta.vwma(source, length) :
type == "HMA" ? ta.hma(source, length) :
type == "ALMA" ? ta.alma(source, length, 0.85, 6) :
type == "LSMA" ? ta.linreg(source, length, 0) :
type == "Optimal MA"? math.avg(ta.alma(source, length, 0.85, 6), ta.rma(source, length), ta.sma(source, length)) :
type == "JMA" ? jma(source, length, 2, 50) :
type == "Super Smoother" ? superSmoother(source, length) :
type == "T3" ? t3(source, length, 0.7) :
na
// === Input Parameters === //
rvolRLength = input.int(112, title="Relative Volume %R Length", minval=1, group="Relative Volume", tooltip="%R used for scaling from 0 to 100, I prefer 73 or 112.")
rvolmaTypeInput = input.string("Optimal MA" , "Type", options = ["None", "SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA", "HMA", "ALMA", "LSMA", "Optimal MA", "JMA", "Super Smoother", "T3"], group = "Relative Volume")
rvolFastLength = input.int(7, title="Relative Volume Fast MA", minval=1, group="Relative Volume")
rvolSlowLength = input.int(161, title="Relative Volume Slow MA", minval=1, group="Relative Volume")
exitBars = input.int(18, title="Bars Until Exit", group="Strategy Settings", tooltip="Exit trade after N bars")
rvolThreshold = input.int(27, "Minimum Relative Volume %R Threshold", group="Relative Volume")
// === Williams %R for Volume === //
wpr(src, length) =>
max_ = ta.highest(src, length)
min_ = ta.lowest(src, length)
(100 * (src - max_) / (max_ - min_)) * -1
// === Volume MAs === //
rvol = wpr(volume, rvolRLength)
rvolFast = ma(volume, rvolFastLength, rvolmaTypeInput)
rvolSlow = ma(volume, rvolSlowLength, rvolmaTypeInput)
// === Price Action Filters === //
up = close > open
upRange = low > low[1] and close > high[1]
upRange_Aggr = close > close[1] and close > open[1]
insideDayUp = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4] and close[4] < close[5] //and not (close > close[1])
down = close < open
downRange = high < high[1] and close < low[1]
downRange_Aggr= close < close[1] and close < open[1]
insideDayDown = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4] and close[4] > close[5] //and not (close < close[1])
breakoutHigh = ta.highest(high, 5)
breakoutLow = ta.lowest(low, 5)
// === Mode-Based Filter Logic === //
longBarOK =
dirBarModeL == "Simple" ? up :
dirBarModeL == "Filtered" ? upRange :
dirBarModeL == "Aggressive"? upRange_Aggr :
dirBarModeL == "Inside"? insideDayUp :
dirBarModeL == "Filtered & Aggressive" ? upRange or upRange_Aggr :
dirBarModeL == "Filtered & Aggressive & Inside" ? upRange or upRange_Aggr or insideDayUp :
dirBarModeL == "Without" ? true : false
shortBarOK =
dirBarModeS == "Simple" ? down :
dirBarModeS == "Filtered" ? downRange :
dirBarModeS == "Aggressive"? downRange_Aggr :
dirBarModeS == "Inside"? insideDayDown :
dirBarModeS == "Filtered & Aggressive"? downRange or downRange_Aggr or insideDayDown :
dirBarModeS == "Filtered & Aggressive & Inside"? upRange_Aggr or insideDayDown :
dirBarModeS == "Without" ? true : false
// === Entry & Exit Logic === //
longCondition = volume > rvolFast and rvolFast > rvolSlow and longBarOK and rvol > rvolThreshold and (not useBreakout or close < breakoutHigh)
shortCondition = volume < rvolFast and rvolFast < rvolSlow and shortBarOK and rvol < (100 - rvolThreshold) and (not useBreakout or close > breakoutLow)
exitLongCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Long"
exitShortCondition = strategy.opentrades > 0 and strategy.opentrades.entry_bar_index(0) + exitBars <= bar_index and strategy.opentrades.entry_id(0) == "Short"
atr = ta.atr(math.round(math.avg(rvolFastLength, rvolSlowLength)))
longSL = useSLTP ? close - atrSLMult * atr : na
longTP = useSLTP ? close + atrTPMult * atr : na
shortSL = useSLTP ? close + atrSLMult * atr : na
shortTP = useSLTP ? close - atrTPMult * atr : na
// === Strategy Execution === //
if (tradeDirection == "Long Only" or tradeDirection == "Both")
if (longCondition)
strategy.entry("Long", strategy.long, stop=longSL, limit=longTP)
if (tradeDirection == "Short Only" or tradeDirection == "Both")
if (shortCondition)
strategy.entry("Short", strategy.short, stop=shortSL, limit=shortTP)
if (exitLongCondition)
strategy.close("Long")
if (exitShortCondition)
strategy.close("Short")
// === Plotting === //
plot(rvol, title="Relative Volume %R", color=color.orange, style = plot.style_columns, format = format.price)
plot(rvolFast, title="Fast Volume MA", color=color.green, format = format.volume)
plot(rvolSlow, title="Slow Volume MA", color=color.red, format = format.volume)