سمندری نظریہ گرڈ ٹریڈنگ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-10-13 17:07:39
ٹیگز:

جائزہ

یہ حکمت عملی ایک پیش سیٹ قیمت کی حد کے اندر خرید و فروخت کے آرڈر دینے کے لئے سمندر کے نظریہ میں گرڈ ٹریڈنگ کے طریقہ کار کا استعمال کرتی ہے۔ اس حکمت عملی میں گرڈ کی قیمت کی حد کا خودکار حساب کتاب اور گرڈ لائنوں کی یکساں تقسیم شامل ہے ، جو خطرات کو موثر انداز میں سنبھالنے میں مدد کرتی ہے۔

حکمت عملی منطق

حکمت عملی سب سے پہلے صارف کی پسند یا ڈیفالٹ کی ترتیبات کی بنیاد پر قیمت گرڈ کی اوپری اور نچلی حدود کا حساب لگاتی ہے۔ حساب کتاب کے دو طریقے ہیں: بیک ٹسٹنگ کی مدت میں سب سے زیادہ اور کم قیمتیں حاصل کرنا ، یا کسی وقت کے فریم پر حرکت پذیر اوسط کا حساب لگانا۔ پھر گرڈ لائنوں کو صارف کے ذریعہ مقرر کردہ گرڈ کی تعداد کے مطابق یکساں طور پر تقسیم کیا جاتا ہے۔

ٹریڈنگ سگنل قیمت اور گرڈ لائنوں کے مابین تعلقات کی بنیاد پر تیار کیے جاتے ہیں۔ جب قیمت گرڈ لائن سے نیچے ہوتی ہے تو ، مقررہ مقدار کے ساتھ گرڈ لائن کی قیمت پر ایک لمبی پوزیشن کھولی جاتی ہے۔ جب قیمت گرڈ لائن سے اوپر جاتی ہے تو ، پوزیشن نیچے گرڈ لائن پر بند ہوجاتی ہے۔ چونکہ گرڈ کے اندر قیمت میں اتار چڑھاؤ ہوتا ہے ، لہذا منافع حاصل کرنے کے لئے پوزیشنیں اسی کے مطابق بدل جاتی ہیں۔

خاص طور پر ، حکمت عملی میں گرڈ لائن پرائس آرری اور بول آرری کو برقرار رکھا جاتا ہے جس سے یہ ظاہر ہوتا ہے کہ آیا ہر لائن پر آرڈر دیئے گئے ہیں۔ جب قیمت کسی لائن سے نیچے ہوتی ہے جس میں کوئی آرڈر نہیں ہوتا ہے تو ، لائن پر لانگ پوزیشن کھولی جاتی ہے۔ جب قیمت ایک لائن سے اوپر ہوتی ہے جبکہ نیچے کی لائن پر آرڈر موجود ہوتے ہیں تو ، پوزیشنیں نچلی لائن پر بند ہوجاتی ہیں۔ گرڈ ٹریڈنگ اس طرح نافذ کی جاتی ہے۔

فوائد

  1. گرڈ رینج کا حساب خود بخود کیا جاتا ہے ، دستی ترتیب کی دشواری سے بچنے کے لئے۔ حساب کتاب کے مختلف اختیارات دستیاب ہیں۔

  2. گرڈ لائنیں مساوی طور پر تقسیم کی جاتی ہیں تاکہ گھنے گرڈ کی وجہ سے اوور ٹریڈنگ سے بچا جاسکے۔ گرڈ کی تعداد کو ایڈجسٹ کیا جاسکتا ہے۔

  3. گرڈ ٹریڈنگ کا طریقہ مؤثر طریقے سے خطرات کو کنٹرول کرتا ہے۔ جب تک گرڈ کے اندر قیمت میں اتار چڑھاؤ ہوتا ہے تب تک منافع حاصل کیا جاسکتا ہے۔

  4. قیمت کی سمت کا کوئی مفروضہ نہیں، رینج سے منسلک مارکیٹ کے لئے موزوں ہے.

  5. مختلف تجارتی آلات کے لئے کمیشن اور پوزیشن سائز کی ترتیبات کو اپنی مرضی کے مطابق کیا جاسکتا ہے۔

  6. گرڈ لائنوں کا تصور تجارت کی صورتحال کو سمجھنے میں مدد ملتی ہے.

خطرات

  1. قیمتوں میں خرابی کا خطرہ۔ گرڈ کی اوپری یا نچلی حدود کو توڑنے سے بڑے نقصانات ہوسکتے ہیں۔

  2. زیادہ سے زیادہ گرڈ اسپیس کے خطرات۔ بہت لچکدار گرڈ آسانی سے منافع نہیں حاصل کرسکتے ہیں جبکہ بہت تنگ لاگت میں اضافہ ہوتا ہے۔ توازن کی ضرورت ہے۔

  3. طویل عرصے تک ہولڈنگ کے خطرات۔ طویل عرصے تک ہولڈنگ منافع کو مشکل بناتی ہے لیکن اخراجات میں اضافہ کرتی ہے۔

  4. پیرامیٹر کی غلط ترتیب کے خطرات۔ بیک ٹسٹنگ کی مدت یا حرکت پذیر اوسط مدت اگر غلط طریقے سے مقرر کی جائے تو گرڈ رینج کے حساب کو متاثر کرسکتی ہے۔

  5. نظاماتی مارکیٹ کے خطرات۔ طویل مدتی رجحاناتی منڈیوں کے بجائے رینج سے منسلک مارکیٹوں کے لئے زیادہ موزوں ہے۔

بہتری

  1. گرڈ پیرامیٹرز کو بہتر بنائیں۔ گرڈ کی تعداد ، نظرثانی کی مدت وغیرہ کو بہتر بنانے کے لئے مارکیٹ کے حالات ، اخراجات وغیرہ پر جامع طور پر غور کریں۔

  2. متحرک گرڈ رینج ایڈجسٹمنٹ متعارف کروائیں۔ جب مارکیٹ میں اہم تبدیلی واقع ہوتی ہے تو گرڈ رینج کو ایڈجسٹ کریں۔

  3. اسٹاپ نقصان کے طریقہ کار کو شامل کریں۔ نقصانات کو محدود کرنے کے لئے مناسب اسٹاپ نقصان کی لائنیں مرتب کریں۔ متحرک طور پر ایڈجسٹ کیا جاسکتا ہے۔

  4. غیر مناسب تجارت سے بچنے کے لئے دوسرے اشارے جیسے بولنگر بینڈ ، رجحان اشارے وغیرہ کا استعمال کرتے ہوئے فلٹر شامل کریں۔

  5. سرمایہ کے استعمال کی کارکردگی کو بہتر بنائیں۔ مستحکم ادوار کے دوران تجارت کو کم کرنے کے لئے اتار چڑھاؤ کا تجزیہ متعارف کروائیں۔

نتیجہ

یہ حکمت عملی گرڈ ٹریڈنگ کے اصولوں کا فائدہ اٹھاتے ہوئے رسک کنٹرول ایبل رینج ٹریڈنگ کا احساس کرتی ہے۔ خودکار گرڈ حساب کتاب اور یکساں تقسیم پیرامیٹر ٹوننگ کے ذریعے مختلف مارکیٹوں کے مطابق فوائد پیش کرتی ہے۔ خطرات محدود اور کام کرنا آسان ہے۔ تاہم ، حدود موجود ہیں اور ترقی پذیر مارکیٹوں کے مطابق ڈھالنے کے لئے مسلسل بہتری کی ضرورت ہے۔ مجموعی طور پر ، حکمت عملی گرڈ ٹریڈنگ کو نافذ کرنے کے لئے ایک معیاری اور پیرامیٹر نقطہ نظر فراہم کرتی ہے۔


/*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)



مزید