
اس حکمت عملی کا بنیادی خیال یہ ہے کہ ٹرینڈ کی سمت کی نشاندہی کرنے کے لئے بریک بینڈ کا استعمال کیا جائے ، جس میں فکسڈ اسٹاپ نقصان کے ساتھ مل کر رسک مینجمنٹ ہو۔ حکمت عملی پہلے ایک خاص دورانیے میں اعلی ترین اور کم ترین قیمتوں کا حساب لگاتی ہے ، جس سے بریک بینڈ تشکیل دیا جاتا ہے۔ جب قیمت بریک بینڈ کو توڑتی ہے تو اس سے ایک تجارتی سگنل پیدا ہوتا ہے۔ اس کے علاوہ ، حکمت عملی تاجروں کو ایک مقررہ اسٹاپ نقصان کی رقم مقرر کرنے کی اجازت دیتی ہے۔ ہر تجارت پر ، سسٹم فکسڈ اسٹاپ نقصان کی بنیاد پر تجارت کی تعداد کا حساب کتاب کرتا ہے ، جس سے ہر ایک مقررہ نقصان ہوتا ہے۔
اس حکمت عملی میں بنیادی طور پر چار حصوں پر مشتمل ہے: پوزیشن مینجمنٹ ، بریکنگ بینڈ کی شناخت ، اسٹاپ نقصان کی ترتیب اور مقدار کی گنتی۔
سب سے پہلے ، حکمت عملی یہ طے کرتی ہے کہ آیا اس وقت کوئی پوزیشن موجود ہے۔ اگر پوزیشن پہلے سے موجود ہے تو ، کوئی نیا سگنل پیدا نہیں ہوتا ہے۔
دوسرا ، حکمت عملی ایک خاص دورانیے میں سب سے زیادہ قیمت اور کم قیمت کا حساب لگاتی ہے ، جس سے ایک بریک بینڈ تشکیل دیا جاتا ہے۔ جب قیمت بریک بینڈ کے اندر سے باہر کی طرف بڑھتی ہے تو ، اس سے ایک تجارتی سگنل پیدا ہوتا ہے۔ خاص طور پر ، اگر قیمت بریک بینڈ کو ٹریک کرتی ہے تو ، ایک کثیر سگنل پیدا ہوتا ہے۔ اگر قیمت بریک بینڈ کو ٹریک کرتی ہے تو ، ایک خالی سگنل پیدا ہوتا ہے۔
مزید برآں ، جب ایک سے زیادہ سگنل پیدا ہوتے ہیں تو ، حکمت عملی توڑنے والے بینڈ کے وسط کو اسٹاپ نقصان کی حیثیت سے طے کرتی ہے۔ جب کوئی کالعدم سگنل پیدا ہوتا ہے تو ، اسٹاپ نقصان کی حیثیت بھی طے کی جاتی ہے۔ اسٹاپ نقصان کا سراغ لگانے کے ل the ، حکمت عملی پوزیشن کے دوران حقیقی وقت میں اسٹاپ نقصان کو بھی ایڈجسٹ کرتی ہے۔
آخر میں ، حکمت عملی ایک مقررہ رکاوٹ کی رقم طے کرنے کی اجازت دیتی ہے۔ جب سگنل پیدا ہوتا ہے تو ، حکمت عملی رکاوٹ کے مقام سے موجودہ قیمت کے نقطہ فاصلے کا حساب لگاتی ہے ، اور پھر قیمتوں کی قیمتوں میں تبدیلی کی نمائندگی کرنے والی رقم کا حساب لگانے کے لئے کوٹیشن یونٹ ، زر مبادلہ کی شرح اور دیگر عوامل کو جوڑتی ہے۔ اس کے بعد تجارت کی تعداد کا حساب لگایا جاتا ہے ، جس کی بنیاد پر مقررہ رکاوٹ ہے۔
یہ حکمت عملی کا بنیادی اصول ہے۔ اس حکمت عملی کا بنیادی خیال یہ ہے کہ رجحان کی سمت کو پہچاننے کے لئے بینڈ کو توڑنا اور فکسڈ اسٹاپ نقصان کا استعمال کرکے خطرے پر قابو پانا ہے۔
اس طرح کی بریکنگ بینڈ فکسڈ اسٹاپ حکمت عملی کے درج ذیل فوائد ہیں:
اسٹریٹجی میں فکسڈ اسٹاپ نقصان کی رقم کو فکسڈ اسٹاپ نقصان کے فاصلے کے بجائے استعمال کیا جاتا ہے۔ اس سے مختلف اقسام کے مابین پوائنٹ ویلیو کے مختلف ہونے کی وجہ سے غیر فکسڈ رسک کی پریشانی سے بچا جاتا ہے۔ رسک مینجمنٹ کے نقطہ نظر سے ، فکسڈ رقم کا نقصان زیادہ اعلی درجے کا ہے۔
حکمت عملیوں کو فکسڈ سٹاپ نقصان کی رقم پر مبنی تجارت کی تعداد کا حساب لگانے کے قابل بناتا ہے ، جس سے ہر ایک نقصان کو قابو میں رکھا جاسکتا ہے ، اس طرح خطرے کے سوراخ پر مناسب کنٹرول ہوتا ہے۔
توڑنے کی شناخت آسان اور موثر ہے۔ توڑنے والی بینڈ کی شناخت آسان اور براہ راست ہے ، جو رجحان کی سمت کو مؤثر طریقے سے پہچان سکتی ہے۔ اس طرح کی توڑنے والی بینڈ کی شناخت صرف ایک قیمت کی سطح کو توڑنے کے مقابلے میں ، زیادہ تر غلط سگنل کو روکتی ہے جو رجحان کی سمت سے الگ ہوجاتا ہے۔
ٹریکنگ سٹاپ منافع میں اضافہ کرتی ہے۔ حکمت عملی کو روکنے کی پوزیشن کو ریئل ٹائم میں ایڈجسٹ کرنے کی اجازت دیتی ہے ، جس سے زیادہ منافع کو روکنے میں مدد ملتی ہے۔
وسیع پیمانے پر اطلاق۔ حکمت عملی کسی بھی قسم کے لئے موزوں ہے ، صرف اس صورت میں جب پیرامیٹرز کو صحیح طریقے سے ترتیب دیا جائے تو ، فکسڈ رقم کے نقصان کو روکنے کے لئے خطرہ کنٹرول کیا جاسکتا ہے ، اور اس طرح بہت وسیع پیمانے پر اطلاق ہوتا ہے۔
کوڈ کی ساخت واضح ہے۔ حکمت عملی کوڈ کی ساخت معقول طور پر واضح ہے ، ہر فنکشنل ماڈیول کو اچھی طرح سے سمجھا گیا ہے ، آسانی سے سمجھنے اور اس کے بعد کی اصلاح کے لئے۔
اس حکمت عملی کے فوائد کے باوجود ، کچھ خطرات ہیں جن کے بارے میں آگاہ رہنا ضروری ہے:
اسٹریٹجی میں اسٹریٹجک معیار کا اندازہ نہیں لگایا جاسکتا ہے ، جس سے کچھ کم معیار کے سگنل پیدا ہوسکتے ہیں۔ اس کو دوسرے اشارے کے ساتھ مل کر فلٹر کرنے کی ضرورت ہے۔
فکسڈ اسٹاپس بہت زیادہ میکانیک ہوسکتے ہیں۔ مارکیٹ کی قیمتوں میں اکثر ہوائی اڈے کی خصوصیات ہوتی ہیں ، اور فکسڈ اسٹاپس قواعد پر بہت زیادہ انحصار کرسکتے ہیں ، جس میں لچکدار ایڈجسٹمنٹ نہیں ہوسکتی ہے۔
تجارت کی فریکوئنسی کو محدود نہیں کیا جاسکتا ہے۔ حکمت عملی تجارت کی فریکوئنسی کو محدود نہیں کرسکتی ہے ، اس سے زیادہ بار بار کھیلنے کا خطرہ ہے۔ فریکوئنسی کو محدود کرنے کے لئے دوسرے قواعد کے ساتھ مل کر کام کرنے کی ضرورت ہے۔
فکسڈ اسٹاپ نقصان انحصار پیرامیٹرز کی ترتیب۔ فکسڈ اسٹاپ نقصان کی رقم کی ترتیب مجموعی طور پر نالی کنٹرول سے متعلق ہے ، جس میں فنڈز کی مقدار ، خطرے کی ترجیحات اور بہت سے دوسرے پہلوؤں کے مطابق مناسب ترتیب کی ضرورت ہے۔
جب قیمت میں ہلچل یا ریورس ہوتی ہے تو ، غلط بریک سگنل پیدا ہوسکتے ہیں۔ متعدد شرائط کے ساتھ مل کر اصلاح کی ضرورت ہے۔
اسٹریٹجی میں فی الحال کوئی اسٹاپ میکانیزم نہیں ہے ، لہذا منافع کو فعال طور پر طے نہیں کیا جاسکتا ہے۔ اس کی وجہ سے منافع خراب ہوسکتا ہے۔
ہم مندرجہ بالا خطرات کے لئے مندرجہ ذیل طریقوں سے بہتر بن سکتے ہیں:
شکل کا فیصلہ کرنے کے لئے اشارے شامل کریں ، سگنل کے معیار کو فلٹر کریں۔ جیسے MACD ، KD وغیرہ
توڑنے کی طاقت کے اشارے کے ساتھ مل کر توڑنے کے معیار کی تشخیص کریں۔ مثال کے طور پر ، حجم میں تبدیلی کے ذریعہ توڑنے کی طاقت کا اندازہ لگائیں۔
پوزیشن کھولنے کی فریکوئینسی کی حد میں اضافہ۔ مثال کے طور پر صرف ایک بار فی دن تجارت یا اسی طرح کے قواعد۔
فکسڈ اسٹاپ سیٹنگ منطق کو بہتر بنائیں۔ مثال کے طور پر ، کسی خاص حد کے مطابق فی صد اسٹاپ میں تبدیل کریں۔
دوسرے فلٹرنگ شرائط شامل کریں۔ جیسے کہ بڑھتی ہوئی روک تھام ، قیمت میں اتار چڑھاؤ کی شرح ، وغیرہ۔
روک تھام کی حکمت عملی شامل کریں۔ مثال کے طور پر جب مزاحمت کی جگہ قریب ہو تو روک تھام۔
مندرجہ بالا تجزیہ کے مطابق ، اس حکمت عملی کو مندرجہ ذیل پہلوؤں سے بہتر بنایا جاسکتا ہے:
فلٹرنگ کی شرائط میں اضافہ ، سگنل کی کیفیت کو بہتر بنائیں۔ متعدد تکنیکی اشارے شامل کیے جاسکتے ہیں ، رجحان کی کیفیت کا فیصلہ کریں ، اور غیر مطلوبہ بریک سگنل سے بچیں۔ آپ بریک کی طاقت کا بھی فیصلہ کرسکتے ہیں۔
زیادہ لچکدار بنانے کے لئے اسٹاپ اسٹریٹجی کو بہتر بنائیں۔ آپ کو ایک مخصوص فاصلے کے بعد تناسب اسٹاپ میں تبدیل کیا جاسکتا ہے۔ آپ کو اتار چڑھاؤ کی شرح کے مطابق اصل وقت میں اسٹاپ اسٹریٹج کو بھی بہتر بنایا جاسکتا ہے۔
ٹرانزیکشن کی فریکوئنسی کو کنٹرول کریں اور زیادہ سے زیادہ تجارت سے بچیں. آپ ٹرانزیکشن کی فریکوئنسی کو کم کرنے کے لئے وقت کی مدت یا تعداد کے لئے فلٹرنگ کی شرائط مقرر کرسکتے ہیں.
رجحانات کے فیصلے کے اشارے کے ساتھ مل کر ، میدان میں داخلے کے وقت کا انتخاب کریں۔ مثال کے طور پر ، رجحانات کی تصدیق کے بعد دوبارہ داخل ہونے کے لئے اصلاح کریں۔
اسٹاپ اسٹاپ کی حکمت عملی کو بہتر بنانا ، منافع کو بہتر بنانا۔ آپ ہدف منافع ، متحرک اسٹاپ ، اتار چڑھاؤ کی روک تھام وغیرہ کا تعین کرسکتے ہیں۔
آپٹمائزڈ رسک پیرامیٹرز سیٹ کریں۔ آپ کو بہتر پیرامیٹرز کا مجموعہ ترتیب دے سکتے ہیں ، جیسے فکسڈ اسٹاپ نقصان کی رقم ، توڑنے کا دورانیہ وغیرہ۔
کوڈ ڈھانچے کو بہتر بنانا ، توسیع پذیری کو بڑھانا۔ سگنل جنریشن ، فلٹرنگ ، ونڈ کنٹرول ، گارنٹی اور دیگر ماڈیولز کو مزید سمجھنے کے لئے۔
مزید اقسام کے اربیٹری اسپیس کی جانچ پڑتال کریں۔ مختلف اقسام کے مجموعے کے اربیٹری کے فوائد کا اندازہ لگائیں۔
مندرجہ بالا کثیر جہتی اصلاحات کے ذریعہ ، اس توڑنے والے نقصان کو روکنے کی حکمت عملی کی استحکام اور منافع بخش صلاحیت کو مزید بڑھایا جاسکتا ہے۔
اس حکمت عملی کا مجموعی نظریہ معقول ہے ، جس میں بریک بینڈ کے رجحانات کی نشاندہی کی گئی ہے ، اور فکسڈ رقم کے نقصان کا استعمال کرتے ہوئے خطرے پر قابو پالیا گیا ہے۔ یہ خطرے کے انتظام میں ترقی پسند ہے۔ تجارت کی تعداد کا حساب لگانے کا نظریہ بھی زیادہ معقول ہے ، اور ہر ایک نقصان پر قابو پالیا جاسکتا ہے۔ لیکن حکمت عملی کو سگنل کے معیار ، نقصان کی حکمت عملی کی لچک اور منافع کی برابری کو بہتر بنانے کے لئے متعدد پہلوؤں سے بہتر بنایا جاسکتا ہے۔ اگر رجحان کے فیصلے کے اشارے کو فلٹر کرنے ، روکنے کے طریقوں کو بہتر بنانے اور تجارت کی فریکوئنسی پر سختی سے قابو پانے کے ساتھ مل کر ، اس حکمت عملی کی تاثیر میں بہتری کی گنجائش ہے۔ مجموعی طور پر ، یہ حکمت عملی سیکھنے کے لئے دستیاب خطرے کے انتظام اور مقدار کے حساب کتاب کے طریقوں کا ایک مجموعہ فراہم کرتی ہے ، جس سے منافع اور کثیر حکمت عملی کے مجموعے کی مزید تحقیق کے لئے بنیاد بنائی جاتی ہے۔
/*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)