یہ پائین اسکرپٹ پر مبنی ایک لمبی مختصر موافقت پذیر متحرک گرڈ ٹریڈنگ حکمت عملی ہے۔ اس حکمت عملی کا بنیادی خیال حالیہ قیمتوں کی اونچائیوں اور اونچائیوں یا ایک سادہ چلتی اوسط کی بنیاد پر خود بخود گرڈ کی اوپری اور نچلی حدود کا حساب لگانا ہے ، اور پھر اس رینج کو یکساں طور پر متعدد گرڈ لائنوں میں تقسیم کرنا ہے۔ جب قیمت ایک خاص گرڈ لائن تک پہنچ جاتی ہے تو ، یہ اس سطح پر ایک لمبی پوزیشن کھولے گی یا پوزیشن بند کردے گی۔ اس طرح ، حکمت عملی قیمت کے پھیلاؤ کو پکڑنے کے لئے کسی رینج مارکیٹ میں مسلسل پوزیشنیں کھول اور بند کرسکتی ہے۔ اسی وقت ، گرڈ کی حدود کو متحرک طور پر ایڈجسٹ کرکے ، یہ مختلف مارکیٹ کے رجحانات کے مطابق بھی ڈھال سکتی ہے۔
گرڈ کی حدود کا حساب لگائیں۔ صارف کے انتخاب کی بنیاد پر ، حدود کو حالیہ N موم بتیوں کے سب سے زیادہ اور سب سے کم نکات سے شمار کیا جاسکتا ہے ، جس میں ایک فیصد کی حد کو بڑھانے یا تنگ کرنے کا اختیار ہے۔ یا وہ حالیہ N موم بتیوں کی بندش کی قیمتوں کے سادہ چلنے والے اوسط پر مبنی ہوسکتے ہیں ، جس میں اوپر اور نیچے انحراف کے تناسب کو ترتیب دینے کا اختیار ہے۔
گرڈ لائن صف تیار کریں۔ گرڈ لائنوں کی مقررہ تعداد کے مطابق ، گرڈ لائن کی قیمتوں کی صف تیار کرنے کے لئے گرڈ رینج کو یکساں طور پر تقسیم کریں۔
انٹری / ایڈ پوزیشن۔ گرڈ لائنوں کو نیچے سے اوپر تک عبور کریں۔ اگر موجودہ اختتامی قیمت گرڈ لائن کی قیمت سے کم ہے اور اس گرڈ لائن پر کوئی پوزیشن نہیں ہے تو ، اس سطح پر ایک طویل پوزیشن کھولیں۔ اس طرح ، جب قیمت اعلی گرڈ لائنوں تک پہنچ جاتی ہے تو ، یہ پوزیشنوں کو شامل کرتی رہے گی۔
آؤٹ / کم پوزیشن۔ گرڈ لائنوں کو اوپر سے نیچے تک عبور کریں۔ اگر موجودہ اختتامی قیمت گرڈ لائن کی قیمت سے زیادہ ہے اور نیچے گرڈ لائن پر پوزیشن ہے تو ، پھر نچلی گرڈ لائن پر لانگ پوزیشن بند کریں۔ اس طرح ، جب قیمت پیچھے گرتی ہے تو ، یہ پوزیشنوں کو کم کرتی رہے گی۔
متحرک ایڈجسٹمنٹ: اگر متحرک گرڈ فنکشن کو منتخب کیا جاتا ہے تو ، ہر موم بتی پر گرڈ کی اوپری اور نچلی حدود اور گرڈ لائن صف کا دوبارہ حساب لگایا جائے گا ، تاکہ گرڈ مارکیٹ میں ہونے والی تبدیلیوں کے مطابق مستقل طور پر موافقت کرسکے۔
مضبوط موافقت۔ گرڈ ٹریڈنگ کی حکمت عملی رینج باؤنڈ اور ٹرینڈنگ مارکیٹوں دونوں کو اپنانے کی صلاحیت رکھتی ہے۔ رینج باؤنڈ مارکیٹ میں ، گرڈ حکمت عملی قیمت پھیلاؤ حاصل کرنے کے لئے مسلسل پوزیشنیں کھول اور بند کرسکتی ہے۔ ٹرینڈنگ مارکیٹ میں ، چونکہ گرڈ قیمت کی نقل و حرکت کی پیروی کرتا ہے ، لہذا یہ ٹرینڈ فوائد حاصل کرنے کے لئے ایک خاص پوزیشن بھی برقرار رکھ سکتا ہے۔
قابو پانے والا خطرہ۔ ہر افتتاحی پوزیشن کا سائز گرڈ کی مقررہ تعداد سے طے ہوتا ہے ، لہذا واحد رسک ایکسپوزر چھوٹا اور قابو پانے والا ہوتا ہے۔ اسی وقت ، چونکہ اوپر کی گرڈ لائنوں تک پہنچنے سے منافع کے ل positions پوزیشنیں بند ہوجائیں گی ، اس سے ممکنہ نقصانات کو بھی ایک خاص حد تک محفوظ کیا جاتا ہے۔
آٹومیشن کی اعلی ڈگری۔ یہ حکمت عملی بنیادی طور پر دستی مداخلت کے بغیر مکمل طور پر خود کار طریقے سے چل سکتی ہے ، جو ان سرمایہ کاروں کے لئے موزوں ہے جنہیں طویل مدتی مستحکم واپسی کی ضرورت ہے۔
لچکدار پیرامیٹرز۔ صارفین حکمت عملی کی کارکردگی کو بہتر بنانے کے لئے مارکیٹ کی خصوصیات کے مطابق گرڈ لائنوں کی تعداد ، متحرک گرڈ پیرامیٹرز وغیرہ کو لچکدار طریقے سے ترتیب دے سکتے ہیں۔
بلیک سوان کا خطرہ۔ انتہائی مارکیٹ کریش کی صورت میں ، اگر قیمت براہ راست سب سے کم گرڈ لائن سے نیچے گر جاتی ہے تو ، حکمت عملی مکمل پوزیشنوں میں ہوگی اور اس کو بڑے پیمانے پر کھینچنے کا سامنا کرنا پڑے گا۔ اس خطرے کو کم کرنے کے لئے ، نقصان کی حد تک پہنچنے کے بعد تمام پوزیشنوں کو بند کرنے کے لئے اسٹاپ نقصان کی شرط طے کی جاسکتی ہے۔
غیر مناسب گرڈ پیرامیٹر کی ترتیب۔ اگر گرڈ کثافت بہت زیادہ ہے تو ، ہر کھلے اور بند ہونے کا پھیلاؤ بہت کم ہوگا ، اور لین دین کے اخراجات زیادہ تر فوائد کو ختم کرسکتے ہیں۔ اگر گرڈ کی چوڑائی بہت بڑی ہے تو ، ایک بار کھولنے کا تناسب زیادہ ہے اور رسک کی نمائش بڑی ہے۔ مناسب گرڈ پیرامیٹرز کا انتخاب کرنے کے لئے بنیادی اثاثہ کی خصوصیات کا محتاط اندازہ لگانے کی ضرورت ہے۔
بیس رسک۔ یہ حکمت عملی موجودہ قیمت کی بنیاد پر افتتاحی اور اختتامی شرائط طے کرتی ہے۔ فیوچر جیسے بازاروں میں ، اگر معاہدے کی قیمت بنیادی قیمت سے بہت مختلف ہے تو ، اصل افتتاحی اور اختتامی قیمتیں توقعات سے نمایاں طور پر انحراف کرسکتی ہیں۔
رجحان فلٹر شامل کریں۔ گرڈ کی حکمت عملی یکطرفہ رجحان سازی کی منڈیوں میں اچھی کارکردگی کا مظاہرہ نہیں کرتی ہے۔ رجحان کے اشارے کو فلٹر کے طور پر شامل کیا جاسکتا ہے ، جیسے صرف گرڈ کو فعال کرنا جب ADX ایک حد سے کم ہو ، اور گرڈ کو بند کرنا جب رجحان واضح ہو ، صرف یکطرفہ پوزیشنیں رکھیں۔
سگنل کی اصلاح۔ گرڈ کی بنیاد پر دیگر سگنلوں کو اوور لیپ کیا جاسکتا ہے ، جیسے گرڈ + حرکت پذیر اوسط ، یعنی ، افتتاحی اور بندش بنیادی طور پر گرڈ کے ذریعہ طے کی جاتی ہے ، لیکن صرف اس وقت پوزیشنیں کھولیں جب قیمت ایک خاص حرکت پذیر اوسط کو عبور کرتی ہے ، بصورت دیگر پوزیشنیں نہ کھولیں۔ اس سے کثرت سے افتتاحی اور بندش کی لاگت کم ہوسکتی ہے۔
پوزیشن مینجمنٹ۔ فی الحال ، حکمت عملی میں ہر گرڈ کی پوزیشن طے شدہ ہے۔ جب قیمت مارکیٹ کی اوسط قیمت سے دور ہوتی ہے تو ہر گرڈ کی پوزیشن کو مناسب طریقے سے کم کرنے اور سرمایہ کے استعمال کی کارکردگی کو بہتر بنانے کے لئے مارکیٹ کی اوسط قیمت کے قریب ہونے پر پوزیشن بڑھانے کے لئے مقرر کیا جاسکتا ہے۔
انکولی گرڈ کثافت۔ قیمت کی اتار چڑھاؤ کے مطابق گرڈ کثافت کو متحرک طور پر ایڈجسٹ کریں۔ جب اتار چڑھاؤ زیادہ ہوتا ہے تو ، گرڈ کی تعداد کو مناسب طریقے سے بڑھایا جاسکتا ہے۔ جب اتار چڑھاؤ کم ہوتا ہے تو ، گرڈ کی تعداد کو کم کیا جاسکتا ہے۔ اس سے گرڈ کی چوڑائی کو بہتر بنایا جاسکتا ہے اور دارالحکومت کے استعمال کو بہتر بنایا جاسکتا ہے۔
انکولی متحرک گرڈ کے ذریعہ ، یہ حکمت عملی اکثر رینج بائنڈ مارکیٹوں میں قیمتوں میں پھیلاؤ حاصل کرنے کے لئے پوزیشنیں کھول اور بند کرسکتی ہے ، اور رجحانات میں اضافے کے ل trends رجحانات کی مارکیٹوں میں نمائش کی سمت کو بھی برقرار رکھ سکتی ہے۔ یہ ایک درمیانی سے طویل مدتی مقداری حکمت عملی ہے جس میں مضبوط موافقت ہے۔ گرڈ ٹرگرنگ منطق اور پوزیشن مینجمنٹ کو معقول حد تک ترتیب دے کر ، مستحکم منافع حاصل کیا جاسکتا ہے۔ تاہم ، انتہائی مارکیٹ کے حالات اور قیمت کے فرق کے خطرات پر توجہ دینا ضروری ہے ، جس پر قابو پانے کے لئے مناسب اسٹاپ نقصان کی شرائط کا تعین کرنا ضروری ہے۔ اس کے علاوہ ، پیرامیٹر کی ترتیب اور رسک مینجمنٹ میں اصلاح کی مزید گنجائش ہے۔ رجحان فلٹرنگ ، سپر پوزیشننگ ، سگنل مینجمنٹ ، انکولی گرڈ کثافت اور دیگر وسائل متعارف کرانے سے حکمت عملی کی استحکام اور منافع کو بہتر بنایا جاسکتا ہے۔ خلاصہ یہ کہ ، گرڈ کی بنیادی منطق کی بنیاد پر ، اس حکمت عملی میں ایک انکولی میکانزم شامل ہے ،
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © jcloyd //@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 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 strategy.initial_capital = 50000 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)