اس حکمت عملی کا بنیادی خیال یہ ہے کہ رجحان کی سمت کی نشاندہی کرنے اور رسک مینجمنٹ کے لئے فکسڈ اسٹاپ نقصان کو یکجا کرنے کے لئے بریک آؤٹ بینڈ کا استعمال کریں۔ حکمت عملی پہلے بریک آؤٹ بینڈ بنانے کے لئے ایک خاص مدت کے دوران سب سے زیادہ اور کم قیمتوں کا حساب لگاتی ہے۔ جب قیمت بریک آؤٹ بینڈ کو توڑتی ہے تو ، ایک تجارتی سگنل تیار ہوتا ہے۔ اس کے علاوہ ، حکمت عملی تاجروں کو فکسڈ اسٹاپ نقصان کی رقم مقرر کرنے کی اجازت دیتی ہے۔ ہر بار جب کوئی تجارت کی جاتی ہے تو ، نظام فکسڈ اسٹاپ نقصان کی رقم کی بنیاد پر پوزیشن کے سائز کا حساب لگائے گا ، تاکہ ہر نقصان طے ہوجائے۔
حکمت عملی چار اہم حصوں پر مشتمل ہے: پوزیشن مینجمنٹ، بریک آؤٹ بینڈ کی نشاندہی، سٹاپ نقصان کی ترتیب اور پوزیشن سائزنگ.
سب سے پہلے ، حکمت عملی چیک کرتی ہے کہ آیا کوئی کھلی پوزیشن ہے۔ اگر ایسا ہے تو ، کوئی نیا اشارہ پیدا نہیں ہوگا۔
دوسری بات ، حکمت عملی ایک وقفے بینڈ بنانے کے لئے ایک مدت کے دوران سب سے زیادہ اور سب سے کم قیمتوں کا حساب لگاتی ہے۔ جب قیمت بینڈ سے باہر نکلتی ہے تو ، ایک تجارتی سگنل تیار ہوتا ہے۔ خاص طور پر ، اگر قیمت اوپری بینڈ سے اوپر ٹوٹ جاتی ہے تو ، ایک لمبا سگنل تیار ہوتا ہے۔ اگر قیمت نچلی بینڈ سے نیچے ٹوٹ جاتی ہے تو ، ایک مختصر سگنل تیار ہوتا ہے۔
اس کے علاوہ ، جب ایک لمبا سگنل تیار ہوتا ہے تو ، حکمت عملی بریک آؤٹ بینڈ کا وسط نقطہ اسٹاپ نقصان کے طور پر طے کرتی ہے۔ مختصر سگنلز کے لئے بھی یہی بات ہے۔ اسٹاپ نقصان کی پیروی کرنے کے لئے ، حکمت عملی پوزیشن میں ہونے پر اسٹاپ نقصان کو بھی حقیقی وقت میں ایڈجسٹ کرتی ہے۔
آخر میں ، حکمت عملی ایک مقررہ اسٹاپ نقصان کی رقم طے کرنے کی اجازت دیتی ہے۔ جب ایک سگنل تیار ہوتا ہے تو ، حکمت عملی اسٹاپ نقصان سے موجودہ قیمت تک پپس کی تعداد کا حساب لگاتی ہے ، اور ٹِک سائز اور زر مبادلہ کی شرح جیسے عوامل کو یکجا کرتی ہے ، تاکہ رقم کے لحاظ سے اسٹاپ نقصان اور موجودہ قیمت کے مابین قیمت میں تبدیلی کا تعین کیا جاسکے۔ اس کے بعد پوزیشن کا سائز مقررہ اسٹاپ نقصان کی رقم کی بنیاد پر شمار کیا جاتا ہے۔
مندرجہ بالا حکمت عملی کے اہم اصول ہیں۔ بریک آؤٹ بینڈ کے ساتھ رجحان کی سمت کی نشاندہی کرنا اور فکسڈ اسٹاپ نقصان کے ساتھ خطرہ کو کنٹرول کرنا بنیادی تصورات ہیں۔
یہ بریک آؤٹ بینڈ فکسڈ سٹاپ نقصان کی حکمت عملی مندرجہ ذیل فوائد ہیں:
ایڈوانسڈ اسٹاپ نقصان کا تصور۔ حکمت عملی میں اسٹاپ نقصان کی فکسڈ فاصلہ کی بجائے فکسڈ اسٹاپ نقصان کی رقم کا استعمال کیا جاتا ہے۔ اس سے مختلف ٹک ویلیوز والی مصنوعات میں خطرہ طے کرنے سے قاصر ہونے کے مسئلے سے بچ جاتا ہے۔ رسک مینجمنٹ کے نقطہ نظر سے ، فکسڈ مانیٹری اسٹاپ نقصان زیادہ جدید ہے۔
منصفانہ پوزیشن سائزنگ۔ حکمت عملی فکسڈ اسٹاپ نقصان کی رقم کی بنیاد پر پوزیشن سائز کا ذہین انداز میں حساب کرسکتی ہے ، تاکہ ہر تجارت کے نقصان پر قابو پایا جاسکے ، اس طرح خطرہ کے خطرے کو معقول حد تک منظم کیا جاسکے۔
سادہ اور موثر بریکآؤٹ کی نشاندہی۔ بینڈ کے ساتھ بریکآؤٹ کی نشاندہی کرنا آسان اور براہ راست ہے ، اور اس سے رجحان کی سمت کو مؤثر طریقے سے نشاندہی کی جاسکتی ہے۔ ایک ہی قیمت کی سطح کے بریکآؤٹ کے مقابلے میں ، یہ بریکآؤٹ بینڈ کی نشاندہی رجحان سے دور مزید غلط اشاروں سے بچ سکتی ہے۔
ٹریلنگ اسٹاپ نقصان سے منافع میں اضافہ ہوتا ہے۔ ٹریلنگ اسٹاپ نقصان کے لئے حقیقی وقت میں اسٹاپ نقصان کو ایڈجسٹ کرنے کی حکمت عملی کی صلاحیت زیادہ منافع میں مقفل کرنے میں مدد کرتی ہے۔
وسیع اطلاق۔ یہ حکمت عملی کسی بھی مصنوعات پر لاگو ہوتی ہے۔ جب تک پیرامیٹرز کو صحیح طریقے سے ترتیب دیا جاتا ہے ، فکسڈ رقم اسٹاپ نقصان کے خطرے کو کنٹرول کیا جاسکتا ہے ، جس سے یہ حکمت عملی انتہائی ورسٹائل ہوجاتی ہے۔
صاف کوڈ کی ساخت۔ کوڈ کی ساخت واضح اور ماڈیولر ہے ، جس سے سمجھنے اور بہتر بنانے میں آسانی ہوتی ہے۔
فوائد کے باوجود، اس حکمت عملی کے لئے کچھ خطرات نوٹ کرنے کے لئے ہیں:
بریک آؤٹ پیٹرن کی کوالٹی کا تجربہ نہیں کیا گیا۔ حکمت عملی بریک آؤٹ پیٹرن کی کوالٹی کا فیصلہ نہیں کرتی ہے اور کچھ کم معیار کے سگنل پیدا کرسکتی ہے۔ سگنل کو فلٹر کرنے کے لئے دوسرے اشارے درکار ہیں۔
فکسڈ اسٹاپ نقصان بہت مکینیکل ہوسکتا ہے۔ مارکیٹ کی قیمتیں اکثر فرق ہوتی ہیں۔ فکسڈ اسٹاپ نقصان قوانین پر بہت زیادہ انحصار کرسکتا ہے اور ایڈجسٹمنٹ میں لچک کی کمی کا شکار ہوتا ہے۔
تجارت کی تعدد پر کوئی حد نہیں۔ حکمت عملی تجارت کی تعدد کو محدود نہیں کرتی ہے اور بہت کثرت سے تجارت کرسکتی ہے۔ تعدد کو محدود کرنے کے لئے دوسرے قواعد کی ضرورت ہے۔
فکسڈ اسٹاپ نقصان پیرامیٹر کی ترتیب پر منحصر ہے۔ مجموعی طور پر رسک کنٹرول کے لئے فکسڈ اسٹاپ نقصان کی رقم کا تعین انتہائی ضروری ہے اور اس میں سرمایہ کا سائز ، رسک کی خواہش وغیرہ پر غور کرنے کی ضرورت ہے۔
بریک آؤٹ کی سمت غلط سگنل دے سکتی ہے۔ قیمتوں میں اتار چڑھاؤ یا پل بیک کے دوران غلط بریک آؤٹ سگنل ہوسکتے ہیں۔ حکمت عملی کو بہتر بنانے کے لئے مزید شرائط کی ضرورت ہے۔
کوئی منافع لینے کا طریقہ کار نہیں۔ اس حکمت عملی میں فی الحال منافع میں فعال طور پر مقفل کرنے کی کوئی منافع لینے کی صلاحیت نہیں ہے۔ اس سے غیر اطمینان بخش منافع پیدا ہوسکتا ہے۔
ان خطرات سے نمٹنے کے لئے ، حکمت عملی کو بہتر بنانے کے کچھ طریقے شامل ہیں:
سگنل کی کوالٹی کو فلٹر کرنے کے لئے اشارے شامل کرنا، جیسے MACD، KD وغیرہ.
معیار کا اندازہ کرنے کے لئے توڑ طاقت کے اشارے شامل کرنا۔ مثال کے طور پر ، حجم میں تبدیلیوں کے ذریعہ طاقت کا فیصلہ کرنا۔
کھلی تجارت کی تعدد کی حدود شامل کرنا، مثال کے طور پر ایک تجارت فی دن.
مقررہ سٹاپ نقصان کی منطق کو بہتر بنانا، مثال کے طور پر ایک حد سے زیادہ فیصد پر مبنی سٹاپ نقصان.
دوسرے فلٹرز کا اضافہ، جیسے اتار چڑھاؤ، سٹاپ نقصان کو بڑھانا وغیرہ
منافع لینے کی حکمت عملیوں کو شامل کرنا، مثال کے طور پر مزاحمت کے قریب منافع حاصل کرنا۔
تجزیہ کی بنیاد پر، حکمت عملی کو مندرجہ ذیل پہلوؤں میں بہتر بنایا جا سکتا ہے:
متعدد تکنیکی اشارے کا استعمال کرتے ہوئے سگنل کے معیار کو بہتر بنانے کے لئے فلٹرز شامل کرنا اور رجحان کی کیفیت کا اندازہ لگانا۔ توڑنے کی طاقت کا بھی اندازہ لگانا۔
زیادہ لچک کے ل stop اسٹاپ نقصان کو بہتر بنانا۔ ایک خاص ریٹریکشن کے بعد فیصد پر مبنی ٹریلنگ اسٹاپ میں تبدیل ہوسکتا ہے۔ اتار چڑھاؤ کی بنیاد پر متحرک طور پر بھی بہتر بنا سکتا ہے۔
وقت کی مدت یا تعدد پر فلٹرز کا اضافہ کرکے زیادہ سے زیادہ تجارت سے بچنے کے لئے تجارت کی تعدد کو کنٹرول کرنا۔
ٹرینڈ انڈیکیٹرز کو شامل کرنا تاکہ ٹائمنگ کو بہتر بنایا جاسکے، مثلاً ٹرینڈ کی تصدیق کا انتظار کرنا۔
منافع حاصل کرنے کی حکمت عملیوں کو بہتر بنانا تاکہ منافع کا ہدف ، منافع کی روک تھام ، اتار چڑھاؤ کی روک تھام وغیرہ کے ذریعے منافع میں اضافہ کیا جاسکے۔
بیک ٹسٹ کی بنیاد پر رسک پیرامیٹرز کو بہتر بنانا، جیسے فکسڈ اسٹاپ کی رقم، بریک آؤٹ کی مدت وغیرہ۔
سگنل، فلٹر، رسک، منافع کے ماڈیولز کو مزید الگ کرکے بہتر توسیع کے لیے کوڈ کو ری فیکٹر کرنا۔
ثالثی کے مواقع کے ل more زیادہ مصنوعات کی جانچ کرنا۔ مختلف مصنوعات کے مجموعوں میں فائدہ کا اندازہ کریں۔
ان اصلاحاتی جہتوں کے ذریعے ، بریک آؤٹ اسٹاپ نقصان کی حکمت عملی زیادہ مضبوط اور منافع بخش ہوسکتی ہے۔ یہ مزید حکمت عملی کے مجموعوں میں توسیع کی بنیاد بھی رکھتا ہے۔
مجموعی طور پر ، حکمت عملی خطرے کے کنٹرول کے لئے رجحانات اور مقررہ رقم کے اسٹاپ کی نشاندہی کرنے کے لئے بریک آؤٹ بینڈ کا استعمال کرنا معقول ہے۔ تصورات رسک مینجمنٹ کے لئے ترقی پسند ہیں۔ پوزیشن سائزنگ منطق ہر تجارت میں نقصان کو کنٹرول کرنے کے لئے بھی موزوں ہے۔ لیکن حکمت عملی کو سگنل کے معیار ، اسٹاپ نقصان میں لچک ، منافع بخش وغیرہ کو بہتر بنانے کے لئے مختلف اصلاحات کے ذریعے بڑھا سکتا ہے۔ رجحان فلٹرز کو شامل کرکے ، منافع لینے کو بہتر بناتے ہوئے ، اور تجارت کی تعدد کو سختی سے کنٹرول کرتے ہوئے ، نمایاں بہتری حاصل کی جاسکتی ہے۔ آخر میں ، حکمت عملی خطرے کے انتظام اور پوزیشن سائزنگ تکنیکوں کو سیکھنے کے لئے ایک فریم ورک فراہم کرتی ہے ، جس سے زیادہ پیچیدہ ثالثی اور کثیر حکمت عملی کے نظام میں مزید تحقیق کی بنیاد رکھی جاسکتی ہے۔
/*backtest start: 2023-10-26 00:00:00 end: 2023-10-28 03:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ //@version=4 //@author=Takazudo strategy("Fixed price SL", overlay=true, default_qty_type=strategy.fixed, initial_capital=0, currency=currency.USD) var COLOR_TRANSPARENT = color.new(#000000, 100) var COLOR_ENTRY_BAND = color.new(#43A6F5, 30) //============================================================================ // config //============================================================================ // Money management _g1 = 'Money management' var config_riskPrice = input(100, minval=1, title="Risk price for each entry", group=_g1) var config_depositCurrency = input(title="Deposit currency", type=input.string, defval="USD", options=["USD"], group=_g1) // Entry strategy _g2 = 'Entry strategy' var config_entryBandBars = input(defval = 100, title = "Entry band bar count", minval=1, group=_g2) // Backtesting range _g3 = 'Backtesting range' fromYear = input(defval = 2018, title = "From Year", minval = 1970, group=_g3) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12, group=_g3) fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31, group=_g3) toYear = input(defval = 2020, title = "To Year", minval = 1970, group=_g3) toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12, group=_g3) toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31, group=_g3) //============================================================================ // exchange caliculations //============================================================================ // mico pip size caliculation // ex1: AUDCAD -> 0.0001 // ex2: USDJPY -> 0.01 f_calcMicroPipSize() => _base = syminfo.basecurrency _quote = syminfo.currency _result = 0.0001 if _quote == 'JPY' _result := _result * 100 if _base == 'BTC' _result := _result * 100 _result // convert price to pips f_convertPriceToPips(_price) => _microPipSize = f_calcMicroPipSize() _price / _microPipSize // caliculate exchange rate between deposit and quote currency f_calcDepositExchangeSymbolId() => _result = '' _deposit = config_depositCurrency _quote = syminfo.currency if (_deposit == 'USD') and (_quote == 'USD') _result := na if (_deposit == 'USD') and (_quote == 'AUD') _result := 'OANDA:AUDUSD' if (_deposit == 'EUR') and (_quote == 'USD') _result := 'OANDA:EURUSD' if (_deposit == 'USD') and (_quote == 'GBP') _result := 'OANDA:GBPUSD' if (_deposit == 'USD') and (_quote == 'NZD') _result := 'OANDA:NZDUSD' if (_deposit == 'USD') and (_quote == 'CAD') _result := 'OANDA:USDCAD' if (_deposit == 'USD') and (_quote == 'CHF') _result := 'OANDA:USDCHF' if (_deposit == 'USD') and (_quote == 'JPY') _result := 'OANDA:USDJPY' _result // Let's say we need CAD to USD exchange // However there's only "OANDA:USDCAD" symbol. // Then we need to invert the exhchange rate. // this function tells us whether we should invert the rate or not f_calcShouldInvert() => _result = false _deposit = config_depositCurrency _quote = syminfo.currency if (_deposit == 'USD') and (_quote == 'CAD') _result := true if (_deposit == 'USD') and (_quote == 'CHF') _result := true if (_deposit == 'USD') and (_quote == 'JPY') _result := true _result // caliculate how much quantity should I buy or sell f_calcQuantitiesForEntry(_depositExchangeRate, _slPips) => _microPipSize = f_calcMicroPipSize() _priceForEachPipAsDeposit = _microPipSize * _depositExchangeRate _losePriceOnSl = _priceForEachPipAsDeposit * _slPips floor(config_riskPrice / _losePriceOnSl) //============================================================================ // Quantity caliculation //============================================================================ depositExchangeSymbolId = f_calcDepositExchangeSymbolId() // caliculate deposit exchange rate rate = security(depositExchangeSymbolId, timeframe.period, hl2) shouldInvert = f_calcShouldInvert() depositExchangeRate = if config_depositCurrency == syminfo.currency // if USDUSD, no exchange of course 1 else // else, USDCAD to CADUSD invert if we need shouldInvert ? (1 / rate) : rate //============================================================================ // Range Edge caliculation //============================================================================ f_calcEntryBand_high() => _highest = max(open[3], close[3]) for i = 4 to (config_entryBandBars - 1) _highest := max(_highest, open[i], close[i]) _highest f_calcEntryBand_low() => _lowest = min(open[3], close[3]) for i = 4 to (config_entryBandBars - 1) _lowest := min(_lowest, open[i], close[i]) _lowest entryBand_high = f_calcEntryBand_high() entryBand_low = f_calcEntryBand_low() entryBand_height = entryBand_high - entryBand_low plot(entryBand_high, color=COLOR_ENTRY_BAND, linewidth=1) plot(entryBand_low, color=COLOR_ENTRY_BAND, linewidth=1) rangeBreakDetected_long = entryBand_high < close rangeBreakDetected_short = entryBand_low > close shouldMakeEntryLong = (strategy.position_size == 0) and rangeBreakDetected_long shouldMakeEntryShort = (strategy.position_size == 0) and rangeBreakDetected_short //============================================================================ // SL & Quantity //============================================================================ var sl_long = hl2 var sl_short = hl2 entryQty = 0 slPips = 0.0 // just show info bubble f_showEntryInfo(_isLong) => _str = 'SL pips: ' + tostring(slPips) + '\n' + 'Qty: ' + tostring(entryQty) _bandHeight = entryBand_high - entryBand_low _y = _isLong ? (entryBand_low + _bandHeight * 1/4) : (entryBand_high - _bandHeight * 1/4) _style = _isLong ? label.style_label_up : label.style_label_down label.new(bar_index, _y, _str, size=size.large, style=_style) if shouldMakeEntryLong sl_long := (entryBand_high + entryBand_low) / 2 slPips := f_convertPriceToPips(close - sl_long) entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips) if shouldMakeEntryShort sl_short := (entryBand_high + entryBand_low) / 2 slPips := f_convertPriceToPips(sl_short - close) entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips) // trailing SL if strategy.position_size > 0 sl_long := max(sl_long, entryBand_low) if strategy.position_size < 0 sl_short := min(sl_short, entryBand_high) //============================================================================ // backtest duration //============================================================================ // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) //============================================================================ // make entries //============================================================================ if (true) if shouldMakeEntryLong strategy.entry(id="Long", long=true, stop=close, qty=entryQty) f_showEntryInfo(true) if shouldMakeEntryShort strategy.entry(id="Short", long=false, stop=close, qty=entryQty) f_showEntryInfo(false) strategy.exit('Long-SL/TP', 'Long', stop=sl_long) strategy.exit('Short-SL/TP', 'Short', stop=sl_short) //============================================================================ // plot misc //============================================================================ sl = strategy.position_size > 0 ? sl_long : strategy.position_size < 0 ? sl_short : na plot(sl, color=color.red, style=plot.style_cross, linewidth=2, title="SL") value_bgcolor = rangeBreakDetected_long ? color.green : rangeBreakDetected_short ? color.red : COLOR_TRANSPARENT bgcolor(value_bgcolor, transp=95)