مومنٹم بریک آؤٹ اور اینگلفنگ ماڈل الگورتھمک ٹریڈنگ حکمت عملی


تخلیق کی تاریخ: 2024-01-30 17:20:59 آخر میں ترمیم کریں: 2024-01-30 17:20:59
کاپی: 0 کلکس کی تعداد: 721
1
پر توجہ دیں
1617
پیروکار

مومنٹم بریک آؤٹ اور اینگلفنگ ماڈل الگورتھمک ٹریڈنگ حکمت عملی

جائزہ

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

اصول

اس حکمت عملی کا بنیادی منطق دو غیر متعلقہ اشارے کے امتزاج پر مبنی ہے:

  1. نگلنے کی شکل: دو K لائنوں کا ایک الٹ ماڈل ، جس میں دوسری K لائن کی ہستی نے پہلی K لائن کی ہستی کو مکمل طور پر نگل لیا ، اس کا استعمال الٹ کے مواقع کی نشاندہی کرنے کے لئے کیا جاتا ہے۔

  2. قیمت اور چلتی اوسط کی کراسنگ: جب قیمت چلتی اوسط کے نیچے سے اوپر کی طرف سے کراسنگ حرکت پذیری اوسط کو توڑتی ہے تو ، خریدنے کا اشارہ پیدا ہوتا ہے۔ جب قیمت چلتی اوسط کے اوپر سے نیچے کی طرف سے کراسنگ حرکت پذیری اوسط کو توڑتی ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔

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

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

فوائد

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

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

خطرات

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

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

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

اصلاح کی سمت

اس حکمت عملی کو مندرجہ ذیل طریقوں سے بہتر بنایا جاسکتا ہے:

  1. زیادہ اقسام کی حرکت پذیری اوسط کی جانچ کرنا ، بہترین پیرامیٹرز کا مجموعہ تلاش کرنا۔ جیسے وزنی حرکت پذیری اوسط ، حرکت پذیری اوسط کا تسلسل ہموار کرنا وغیرہ۔

  2. رجحانات کی پیمائش کرنے والے اشارے کو بڑھانا ، اتار چڑھاؤ کی صورتحال سے بچنے کے لئے۔ مثال کے طور پر ، ADX ، برن بینڈ وغیرہ۔

  3. نقصان کو روکنے کے طریقوں کو بہتر بنانے کے لئے ، نقصان کو روکنے کے اثر کو بہتر بنائیں۔

  4. مشین لرننگ کے طریقوں کو K لائن کی شکل کا تعین کرنے میں اضافہ کریں اور نگلنے کی شناخت کی درستگی کو بہتر بنائیں۔

  5. خود کار طریقے سے پیرامیٹرز کو بہتر بنانے کے لئے شامل کریں، پیرامیٹرز کو خود کو اپنانے کے لئے.

خلاصہ کریں۔

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

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2023-12-30 00:00:00
end: 2024-01-29 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

StrategyName = "BEST Engulfing + MA"
ShortStrategyName = "BEST Engulfing + MA"

strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true)

includeEngulfing = true

includeMA = true
source_ma = input(title="Source Price vs MA", type=input.source, defval=close)
typeofMA = input(title="Type of MA", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "KMA", "TMA", "HullMA", "DEMA", "TEMA"])
length_ma = input(32, title = "MA Length", type=input.integer)

// ---------- Candle components and states
GreenCandle = close > open
RedCandle = close < open
NoBody = close==open
Body = abs(close-open)


// bullish conditions
isBullishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
isBullishEngulfing2 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) <= min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]

// bearish conditions
isBearishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
isBearishEngulfing2 = max(close[1],open[1]) >= max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]

// consolidation of conditions
isBullishEngulfing = isBullishEngulfing1 or isBullishEngulfing2
isBearishEngulfing = isBearishEngulfing1 or isBearishEngulfing2

//isBullishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
//isBearishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]

Engulf_curr = 0 - barssince(isBearishEngulfing) + barssince(isBullishEngulfing)
Engulf_Buy = Engulf_curr < 0 ? 1 : 0
Engulf_Sell = Engulf_curr > 0 ? 1 : 0


// Price vs MM


smma(src, len) =>
    smma = 0.0
    smma := na(smma[1]) ? sma(src, len) : (smma[1] * (len - 1) + src) / len
    smma

ma(smoothing, src, length) => 
    if smoothing == "RMA"
        rma(src, length)
    else
        if smoothing == "SMA"
            sma(src, length)
        else 
            if smoothing == "EMA"
                ema(src, length)
            else 
                if smoothing == "WMA"
                    wma(src, length)
				else
					if smoothing == "VWMA"
						vwma(src, length)
					else
						if smoothing == "SMMA"
						    smma(src, length)
						else
							if smoothing == "HullMA"
								wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
							else
								if smoothing == "LSMA"
									src
								else
								    if smoothing == "KMA"
								        xPrice = src
                                        xvnoise = abs(xPrice - xPrice[1])
                                        nfastend = 0.666
                                        nslowend = 0.0645
                                        nsignal = abs(xPrice - xPrice[length])
                                        nnoise = sum(xvnoise, length)
                                        nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
                                        nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2) 
                                        nAMA = 0.0
                                        nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1]))
                                        nAMA
								    else
								        if smoothing == "TMA"
									        sma(sma(close, length), length)
						                else
							                if smoothing == "DEMA"
							                    2 * src - ema(src, length)
							                else
							                    if smoothing == "TEMA"
							                        3 * (src - ema(src, length)) + ema(ema(src, length), length) 
							                    else
		    							            src
		    							                

MA = ma(typeofMA, source_ma, length_ma)

plot(MA, color=#006400FF, title="MA breakout", linewidth=3)

macrossover  = crossover (source_ma, MA)
macrossunder = crossunder(source_ma, MA)

since_ma_buy = barssince(macrossover)
since_ma_sell = barssince(macrossunder)
macross_curr = 0 - since_ma_sell + since_ma_buy
bullish_MA_cond = macross_curr < 0 ?  1 : 0
bearish_MA_cond = macross_curr > 0 ? 1  : 0

posUp = (Engulf_Buy ? 1 : 0) + (bullish_MA_cond ? 1 : 0) 
posDn = (Engulf_Sell ? 1 : 0) + (bearish_MA_cond ? 1 : 0) 

conditionUP = posUp == 2 and posUp[1] < 2
conditionDN = posDn == 2 and posDn[1] < 2


sinceUP = barssince(conditionUP)
sinceDN = barssince(conditionDN)

// primary-first signal of the trend
nUP = crossunder(sinceUP,sinceDN)
nDN = crossover(sinceUP,sinceDN)


// and the following secondary signals

// save of the primary signal
sinceNUP = barssince(nUP)
sinceNDN = barssince(nDN)

buy_trend   = sinceNDN > sinceNUP
sell_trend  = sinceNDN < sinceNUP

// engulfing by
barcolor(nUP ? color.orange : na, title="Bullish condition")
barcolor(nDN ? color.yellow : na, title="Bearish condition")

isLong  = nUP
isShort = nDN

long_entry_price    = valuewhen(nUP, close, 0)
short_entry_price   = valuewhen(nDN, close, 0)

longClose   = close[1] < MA
shortClose  = close[1] > MA

///////////////////////////////////////////////
//* Backtesting Period Selector | Component *//
///////////////////////////////////////////////


StartYear = input(2017, "Backtest Start Year",minval=1980)
StartMonth = input(1, "Backtest Start Month",minval=1,maxval=12)
StartDay = input(1, "Backtest Start Day",minval=1,maxval=31)
testPeriodStart = timestamp(StartYear,StartMonth,StartDay,0,0)

StopYear = input(2020, "Backtest Stop Year",minval=1980)
StopMonth = input(12, "Backtest Stop Month",minval=1,maxval=12)
StopDay = input(31, "Backtest Stop Day",minval=1,maxval=31)
testPeriodStop = timestamp(StopYear,StopMonth,StopDay,0,0)

testPeriod() => true


//////////////////////////
//* Profit Component *//
//////////////////////////

input_tp_pips = input(600, "Backtest Profit Goal (in USD)",minval=0)
input_sl_pips = input(300, "Backtest STOP Goal (in USD)",minval=0)


tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips
sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips


long_TP_exit  = buy_trend and high >= tp
short_TP_exit = sell_trend and low <= tp

plot(tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue)
plot(sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red)

if testPeriod()
    strategy.entry("Long", 1, when=isLong)
    strategy.close("Long", when=longClose )
    strategy.exit("XL","Long", limit=tp,  when=buy_trend, stop=sl)


if testPeriod()
    strategy.entry("Short", 0,  when=isShort)
    strategy.close("Short", when=shortClose )
    strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)