یہ حکمت عملی ایک پیش سیٹ قیمت کی حد کے اندر خرید و فروخت کے آرڈر دینے کے لئے سمندر کے نظریہ میں گرڈ ٹریڈنگ کے طریقہ کار کا استعمال کرتی ہے۔ اس حکمت عملی میں گرڈ کی قیمت کی حد کا خودکار حساب کتاب اور گرڈ لائنوں کی یکساں تقسیم شامل ہے ، جو خطرات کو موثر انداز میں سنبھالنے میں مدد کرتی ہے۔
حکمت عملی سب سے پہلے صارف کی پسند یا ڈیفالٹ کی ترتیبات کی بنیاد پر قیمت گرڈ کی اوپری اور نچلی حدود کا حساب لگاتی ہے۔ حساب کتاب کے دو طریقے ہیں: بیک ٹسٹنگ کی مدت میں سب سے زیادہ اور کم قیمتیں حاصل کرنا ، یا کسی وقت کے فریم پر حرکت پذیر اوسط کا حساب لگانا۔ پھر گرڈ لائنوں کو صارف کے ذریعہ مقرر کردہ گرڈ کی تعداد کے مطابق یکساں طور پر تقسیم کیا جاتا ہے۔
ٹریڈنگ سگنل قیمت اور گرڈ لائنوں کے مابین تعلقات کی بنیاد پر تیار کیے جاتے ہیں۔ جب قیمت گرڈ لائن سے نیچے ہوتی ہے تو ، مقررہ مقدار کے ساتھ گرڈ لائن کی قیمت پر ایک لمبی پوزیشن کھولی جاتی ہے۔ جب قیمت گرڈ لائن سے اوپر جاتی ہے تو ، پوزیشن نیچے گرڈ لائن پر بند ہوجاتی ہے۔ چونکہ گرڈ کے اندر قیمت میں اتار چڑھاؤ ہوتا ہے ، لہذا منافع حاصل کرنے کے لئے پوزیشنیں اسی کے مطابق بدل جاتی ہیں۔
خاص طور پر ، حکمت عملی میں گرڈ لائن پرائس آرری اور بول آرری کو برقرار رکھا جاتا ہے جس سے یہ ظاہر ہوتا ہے کہ آیا ہر لائن پر آرڈر دیئے گئے ہیں۔ جب قیمت کسی لائن سے نیچے ہوتی ہے جس میں کوئی آرڈر نہیں ہوتا ہے تو ، لائن پر لانگ پوزیشن کھولی جاتی ہے۔ جب قیمت ایک لائن سے اوپر ہوتی ہے جبکہ نیچے کی لائن پر آرڈر موجود ہوتے ہیں تو ، پوزیشنیں نچلی لائن پر بند ہوجاتی ہیں۔ گرڈ ٹریڈنگ اس طرح نافذ کی جاتی ہے۔
گرڈ رینج کا حساب خود بخود کیا جاتا ہے ، دستی ترتیب کی دشواری سے بچنے کے لئے۔ حساب کتاب کے مختلف اختیارات دستیاب ہیں۔
گرڈ لائنیں مساوی طور پر تقسیم کی جاتی ہیں تاکہ گھنے گرڈ کی وجہ سے اوور ٹریڈنگ سے بچا جاسکے۔ گرڈ کی تعداد کو ایڈجسٹ کیا جاسکتا ہے۔
گرڈ ٹریڈنگ کا طریقہ مؤثر طریقے سے خطرات کو کنٹرول کرتا ہے۔ جب تک گرڈ کے اندر قیمت میں اتار چڑھاؤ ہوتا ہے تب تک منافع حاصل کیا جاسکتا ہے۔
قیمت کی سمت کا کوئی مفروضہ نہیں، رینج سے منسلک مارکیٹ کے لئے موزوں ہے.
مختلف تجارتی آلات کے لئے کمیشن اور پوزیشن سائز کی ترتیبات کو اپنی مرضی کے مطابق کیا جاسکتا ہے۔
گرڈ لائنوں کا تصور تجارت کی صورتحال کو سمجھنے میں مدد ملتی ہے.
قیمتوں میں خرابی کا خطرہ۔ گرڈ کی اوپری یا نچلی حدود کو توڑنے سے بڑے نقصانات ہوسکتے ہیں۔
زیادہ سے زیادہ گرڈ اسپیس کے خطرات۔ بہت لچکدار گرڈ آسانی سے منافع نہیں حاصل کرسکتے ہیں جبکہ بہت تنگ لاگت میں اضافہ ہوتا ہے۔ توازن کی ضرورت ہے۔
طویل عرصے تک ہولڈنگ کے خطرات۔ طویل عرصے تک ہولڈنگ منافع کو مشکل بناتی ہے لیکن اخراجات میں اضافہ کرتی ہے۔
پیرامیٹر کی غلط ترتیب کے خطرات۔ بیک ٹسٹنگ کی مدت یا حرکت پذیر اوسط مدت اگر غلط طریقے سے مقرر کی جائے تو گرڈ رینج کے حساب کو متاثر کرسکتی ہے۔
نظاماتی مارکیٹ کے خطرات۔ طویل مدتی رجحاناتی منڈیوں کے بجائے رینج سے منسلک مارکیٹوں کے لئے زیادہ موزوں ہے۔
گرڈ پیرامیٹرز کو بہتر بنائیں۔ گرڈ کی تعداد ، نظرثانی کی مدت وغیرہ کو بہتر بنانے کے لئے مارکیٹ کے حالات ، اخراجات وغیرہ پر جامع طور پر غور کریں۔
متحرک گرڈ رینج ایڈجسٹمنٹ متعارف کروائیں۔ جب مارکیٹ میں اہم تبدیلی واقع ہوتی ہے تو گرڈ رینج کو ایڈجسٹ کریں۔
اسٹاپ نقصان کے طریقہ کار کو شامل کریں۔ نقصانات کو محدود کرنے کے لئے مناسب اسٹاپ نقصان کی لائنیں مرتب کریں۔ متحرک طور پر ایڈجسٹ کیا جاسکتا ہے۔
غیر مناسب تجارت سے بچنے کے لئے دوسرے اشارے جیسے بولنگر بینڈ ، رجحان اشارے وغیرہ کا استعمال کرتے ہوئے فلٹر شامل کریں۔
سرمایہ کے استعمال کی کارکردگی کو بہتر بنائیں۔ مستحکم ادوار کے دوران تجارت کو کم کرنے کے لئے اتار چڑھاؤ کا تجزیہ متعارف کروائیں۔
یہ حکمت عملی گرڈ ٹریڈنگ کے اصولوں کا فائدہ اٹھاتے ہوئے رسک کنٹرول ایبل رینج ٹریڈنگ کا احساس کرتی ہے۔ خودکار گرڈ حساب کتاب اور یکساں تقسیم پیرامیٹر ٹوننگ کے ذریعے مختلف مارکیٹوں کے مطابق فوائد پیش کرتی ہے۔ خطرات محدود اور کام کرنا آسان ہے۔ تاہم ، حدود موجود ہیں اور ترقی پذیر مارکیٹوں کے مطابق ڈھالنے کے لئے مسلسل بہتری کی ضرورت ہے۔ مجموعی طور پر ، حکمت عملی گرڈ ٹریڈنگ کو نافذ کرنے کے لئے ایک معیاری اور پیرامیٹر نقطہ نظر فراہم کرتی ہے۔
/*backtest start: 2023-09-12 00:00:00 end: 2023-10-12 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1) i_autoBounds = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool) // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention i_boundSrc = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"]) // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma i_boundDev = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1) // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative. i_upperBound = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float) // for manual grid bounds only. The upperbound price of your grid i_lowerBound = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float) // for manual grid bounds only. The lowerbound price of your grid. i_gridQty = input(group="Grid Lines", title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer) // how many grid lines are in your grid strategy.initial_capital = 50000 f_getGridBounds(_bs, _bl, _bd, _up) => if _bs == "Hi & Low" _up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl) * (1 - _bd) else avg = sma(close, _bl) _up ? avg * (1 + _bd) : avg * (1 - _bd) f_buildGrid(_lb, _gw, _gq) => gridArr = array.new_float(0) for i=0 to _gq-1 array.push(gridArr, _lb+(_gw*i)) gridArr f_getNearGridLines(_gridArr, _price) => arr = array.new_int(3) for i = 0 to array.size(_gridArr)-1 if array.get(_gridArr, i) > _price array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1) array.set(arr, 1, i == 0 ? i : i-1) break arr var upperBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound // upperbound of our grid var lowerBound = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid var gridWidth = (upperBound - lowerBound)/(i_gridQty-1) // space between lines in our grid var gridLineArr = f_buildGrid(lowerBound, gridWidth, i_gridQty) // an array of prices that correspond to our grid lines var orderArr = array.new_bool(i_gridQty, false) // a boolean array that indicates if there is an open order corresponding to each grid line var closeLineArr = f_getNearGridLines(gridLineArr, close) // for plotting purposes - an array of 2 indices that correspond to grid lines near price var nearTopGridLine = array.get(closeLineArr, 0) // for plotting purposes - the index (in our grid line array) of the closest grid line above current price var nearBotGridLine = array.get(closeLineArr, 1) // for plotting purposes - the index (in our grid line array) of the closest grid line below current price for i = 0 to (array.size(gridLineArr) - 1) if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1) buyId = i array.set(orderArr, buyId, true) strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId)) if close > array.get(gridLineArr, i) and i != 0 if array.get(orderArr, i-1) sellId = i-1 array.set(orderArr, sellId, false) strategy.close(id=tostring(sellId), comment="#"+tostring(sellId)) if i_autoBounds upperBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) lowerBound := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) gridWidth := (upperBound - lowerBound)/(i_gridQty-1) gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty) closeLineArr := f_getNearGridLines(gridLineArr, close) nearTopGridLine := array.get(closeLineArr, 0) nearBotGridLine := array.get(closeLineArr, 1)