
متحرک توڑنے کی حکمت عملی ایک رجحان کی حکمت عملی ہے جو مارکیٹ کی حرکیات کو ٹریک کرتی ہے۔ یہ متعدد اشارے کے ساتھ مل کر فیصلہ کرتا ہے کہ آیا مارکیٹ اس وقت بڑھتی ہوئی یا گرتی ہوئی رجحان میں ہے ، اور جب وہ اہم مزاحمت کی سطح کو توڑتا ہے تو زیادہ پوزیشن بناتا ہے ، اور جب وہ اہم حمایت کی سطح کو توڑتا ہے تو پوزیشن خالی کرتا ہے۔
یہ حکمت عملی بنیادی طور پر مارکیٹ کے رجحانات اور اہم قیمتوں کی سطح کا فیصلہ کرنے کے لئے متعدد لمبی مدت کے ڈونچین چینلز کا حساب لگاتی ہے۔ خاص طور پر ، اس نے ایک بلند رجحان کا فیصلہ کیا جب قیمت نے طویل دورانیے کو توڑ دیا جیسے کہ 40 دن کا ڈونچین چینل اور اس کی بنیاد پر سال کے دوران نئی اونچائی ، منتقل اوسط کی سمت کی ترتیب وغیرہ جیسے فلٹرنگ شرائط کے ساتھ مل کر متعدد سگنل جاری کیے۔ اور جب قیمت طویل عرصے سے ڈونچین چینل کے نیچے کی طرف گرتی ہے تو ، نیچے کی طرف رجحان کا فیصلہ کرنے کے لئے ، سال کے دوران نئی کم اور دیگر فلٹرنگ شرائط کے ساتھ مل کر خالی سگنل جاری کیا گیا۔
پوزیشن سے باہر نکلنے کے معاملے میں ، یہ حکمت عملی دو اختیارات پیش کرتی ہے: فکسڈ منسوخی لائن اور ٹریکنگ اسٹاپ۔ فکسڈ منسوخی لائن اسٹاپ کو 20 دن کے ڈونچیئن چینل جیسے مختصر دورانیے پر مبنی بناتی ہے۔ ٹریکنگ اسٹاپ روزانہ اے ٹی آر کی قیمت پر مبنی فلوٹنگ اسٹاپ۔ دونوں اسٹاپ کے طریقے خطرے کو اچھی طرح سے کنٹرول کرتے ہیں۔
اس حکمت عملی میں رجحان کا فیصلہ اور توڑنے کا آپریشن شامل ہے ، جو مارکیٹ میں مختصر لائنوں کے سمت کے مواقع کو مؤثر طریقے سے پکڑ سکتا ہے۔ یہ ایک ہی اشارے کے مقابلے میں متعدد فلٹرنگ شرائط کا جامع استعمال کرتا ہے ، جس سے کچھ جھوٹے توڑ کو فلٹر کیا جاسکتا ہے اور اس طرح داخل ہونے والے سگنل کی معیار کو بہتر بنایا جاسکتا ہے۔ اس کے علاوہ ، نقصان کی روک تھام کی حکمت عملی کا اطلاق اس کی برداشت کو بھی مضبوط بناتا ہے ، یہاں تک کہ اگر حالات میں مختصر مدت کی واپسی ہوتی ہے تو بھی نقصان کو مؤثر طریقے سے کنٹرول کیا جاسکتا ہے۔
اس حکمت عملی کا بنیادی خطرہ یہ ہے کہ مارکیٹ میں شدید اتار چڑھاؤ آسکتا ہے ، جس کی وجہ سے اسٹاپ نقصان کی پوزیشن سے باہر نکلنے کا سبب بنتا ہے۔ اس وقت اگر مارکیٹ میں تیزی سے الٹ پڑتا ہے تو ، موقع سے محروم ہوسکتا ہے۔ اس کے علاوہ ، متعدد فلٹرنگ شرائط کا استعمال بھی مواقع کو فلٹر کرتا ہے ، حکمت عملی کی پوزیشن کی تعدد کو کم کرتا ہے۔
خطرے کو کم کرنے کے لئے ، ATR کی قیمت کو مناسب طریقے سے ایڈجسٹ کیا جاسکتا ہے یا ڈونچیئن ریل کے فاصلے میں توسیع کی جاسکتی ہے ، جس سے اسٹاپ نقصان کو مارنے کا امکان کم ہوجاتا ہے۔ آپ فلٹرنگ کے کچھ حالات کو بھی کم یا منسوخ کرسکتے ہیں ، جس سے رسائی کی تعدد میں اضافہ ہوتا ہے ، لیکن خطرہ بھی بڑھ جاتا ہے۔
اس حکمت عملی کو مندرجہ ذیل پہلوؤں سے بہتر بنایا جاسکتا ہے:
مختلف پیرامیٹرز کی جانچ پڑتال کے ذریعے ، آپ کو خطرہ اور فوائد کے مابین توازن پیدا کرنے کے لئے بہترین پیرامیٹرز کا مجموعہ مل سکتا ہے۔
اس حکمت عملی میں رجحان کی سمت کا فیصلہ کرنے کے لئے متعدد اشارے کا استعمال کیا جاتا ہے ، اور اہم نکات پر توڑنے پر ٹریڈنگ سگنل جاری کیا جاتا ہے۔ اس کا اسٹاپ نقصان کا طریقہ کار اس حکمت عملی کو بھی خطرے پر قابو پانے کی مضبوط صلاحیت فراہم کرتا ہے۔ پیرامیٹرز کی بہتر ترتیب کے ذریعہ ، اس حکمت عملی سے مستحکم اضافی منافع حاصل کیا جاسکتا ہے۔ یہ ان سرمایہ کاروں کے لئے موزوں ہے جن کے پاس مارکیٹ کا واضح فیصلہ نہیں ہے لیکن وہ رجحانات کی پیروی کرنا چاہتے ہیں۔
/*backtest
start: 2024-01-23 00:00:00
end: 2024-02-22 00:00:00
period: 1h
basePeriod: 15m
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/
// © HeWhoMustNotBeNamed
//@version=4
strategy("BuyHigh-SellLow Strategy", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)
donchianEntryLength = input(40, step=10)
donchianExitLength = input(20, step=10)
considerNewLongTermHighLows = input(true)
shortHighLowPeriod = input(120, step=10)
longHighLowPeriod = input(180, step=10)
considerMAAlignment = input(true)
MAType = input(title="Moving Average Type", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
LookbackPeriod = input(40, minval=10,step=10)
atrLength = input(22)
atrMult = input(4)
exitStrategy = input(title="Exit Strategy", defval="tsl", options=["dc", "tsl"])
considerYearlyHighLow = input(true)
backtestYears = input(10, minval=1, step=1)
f_getMovingAverage(source, MAType, length)=>
ma = sma(source, length)
if(MAType == "ema")
ma := ema(source,length)
if(MAType == "hma")
ma := hma(source,length)
if(MAType == "rma")
ma := rma(source,length)
if(MAType == "vwma")
ma := vwma(source,length)
if(MAType == "wma")
ma := wma(source,length)
ma
f_getTrailingStop(atr, atrMult)=>
stop = close - atrMult*atr
stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
stop
f_getMaAlignment(MAType, includePartiallyAligned)=>
ma5 = f_getMovingAverage(close,MAType,5)
ma10 = f_getMovingAverage(close,MAType,10)
ma20 = f_getMovingAverage(close,MAType,20)
ma30 = f_getMovingAverage(close,MAType,30)
ma50 = f_getMovingAverage(close,MAType,50)
ma100 = f_getMovingAverage(close,MAType,100)
ma200 = f_getMovingAverage(close,MAType,200)
upwardScore = 0
upwardScore := close > ma5? upwardScore+1:upwardScore
upwardScore := ma5 > ma10? upwardScore+1:upwardScore
upwardScore := ma10 > ma20? upwardScore+1:upwardScore
upwardScore := ma20 > ma30? upwardScore+1:upwardScore
upwardScore := ma30 > ma50? upwardScore+1:upwardScore
upwardScore := ma50 > ma100? upwardScore+1:upwardScore
upwardScore := ma100 > ma200? upwardScore+1:upwardScore
upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
[newHigh,newLow]
//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
yhigh = security(syminfo.tickerid, '12M', high[1])
ylow = security(syminfo.tickerid, '12M', low[1])
yhighlast = yhigh[365]
ylowlast = ylow[365]
yhighllast = yhigh[2 * 365]
ylowllast = ylow[2 * 365]
yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
yearlyHighCondition = ( (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
yearlyLowCondition = ( (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
label_x = time+(60*60*24*1000*1)
[yearlyHighCondition,yearlyLowCondition]
donchian(rangeLength)=>
upper = highest(rangeLength)
lower = lowest(rangeLength)
middle = (upper+lower)/2
[middle, upper, lower]
inDateRange = true
[eMiddle, eUpper, eLower] = donchian(donchianEntryLength)
[exMiddle, exUpper, exLower] = donchian(donchianExitLength)
maAlignment = f_getMaAlignment(MAType, false)
[yearlyHighCondition, yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHigh,newLow] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)
maAlignmentLongCondition = highest(maAlignment, LookbackPeriod) == 1 or not considerMAAlignment
atr = atr(atrLength)
tsl = f_getTrailingStop(atr, atrMult)
//U = plot(eUpper, title="Up", color=color.green, linewidth=2, style=plot.style_linebr)
//D = plot(exLower, title="Ex Low", color=color.red, linewidth=2, style=plot.style_linebr)
longCondition = crossover(close, eUpper[1]) and yearlyHighCondition and newHigh and maAlignmentLongCondition
exitLongCondition = crossunder(close, exLower[1])
shortCondition = crossunder(close, eLower[1]) and yearlyLowCondition and newLow
exitShortCondition = crossover(close, exUpper[1])
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange, oca_name="oca_buy")
strategy.exit("ExitBuyDC", "Buy", when=exitStrategy=='dc', stop=exLower)
strategy.exit("ExitBuyTSL", "Buy", when=exitStrategy=='tsl', stop=tsl)
plot(strategy.position_size > 0 ? (exitStrategy=='dc'?exLower:tsl) : na, title="Trailing Stop", color=color.red, linewidth=2, style=plot.style_linebr)
//strategy.close("Buy", when=exitLongCondition)