وسائل لوڈ ہو رہے ہیں... لوڈنگ...

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

مصنف:چاؤ ژانگ، تاریخ: 2024-01-30 17:20:59
ٹیگز:

img

جائزہ

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

اصول

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

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

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

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

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

فوائد

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

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

خطرات

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

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

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

اصلاح کی ہدایات

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

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

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

  3. کارکردگی کو بہتر بنانے کے لئے اسٹاپ نقصان کے طریقوں کو بہتر بنائیں۔ ٹریلنگ اسٹاپ نقصان ، چنڈلیئر ایگزٹ پر غور کیا جاسکتا ہے۔

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

  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)


مزید