TrendHunter w/MF ملٹی ٹائم فریم ٹرینڈ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2024-03-15 16:01:54
ٹیگز:

img

جائزہ

ٹرینڈ ہنٹر ڈبلیو / ایم ایف ملٹی ٹائم فریم ٹرینڈ حکمت عملی متعدد ٹائم فریموں میں متعدد تکنیکی اشارے کے جامع تجزیے پر مبنی ایک رجحان کی پیروی کرنے والی حکمت عملی ہے۔ یہ حکمت عملی مارکیٹ کے اہم رجحانات کو حاصل کرنے اور انٹری پوائنٹس کا تعین کرنے کے لئے سخت شرائط کا استعمال کرتے ہوئے ، Ichimoku Cloud ، Moving Averages ، SuperTrend ، WaveTrend ، اور MoneyFlow جیسے عوامل کو مدنظر رکھتی ہے۔

حکمت عملی کا اصول

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

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

  2. سپر ٹرینڈ: قیمت اور سپر ٹرینڈ کی رشتہ دار پوزیشن کا تجزیہ کرکے ، موجودہ مارکیٹ کے رجحان کی تصدیق کی جاتی ہے۔ جب قیمت سپر ٹرینڈ سے اوپر ہوتی ہے تو ، اسے اپ ٹرینڈ سمجھا جاتا ہے۔ بصورت دیگر ، اسے ڈاؤن ٹرینڈ سمجھا جاتا ہے۔

  3. ویو ٹرینڈ: ویو ٹرینڈ اشارے کی سمت اور پوزیشن کا تجزیہ کرکے ، موجودہ مارکیٹ کا رجحان طے کیا جاتا ہے۔ جب ویو ٹرینڈ بڑھ رہا ہے اور زیادہ خریدنے والے زون تک نہیں پہنچا ہے تو ، اسے اپ ٹرینڈ سمجھا جاتا ہے۔ جب ویو ٹرینڈ گر رہا ہے اور زیادہ فروخت والے زون تک نہیں پہنچا ہے تو ، اسے ڈاؤن ٹرینڈ سمجھا جاتا ہے۔

  4. منی فلو: منی فلو اشارے کی حالت کا تجزیہ کرکے ، موجودہ مارکیٹ کے رجحان کی تصدیق کی جاتی ہے۔ جب منی فلو مثبت ہوتا ہے تو ، اسے اپ ٹرینڈ سمجھا جاتا ہے۔ بصورت دیگر ، اسے ڈاؤن ٹرینڈ سمجھا جاتا ہے۔

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

فوائد کا تجزیہ

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

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

  3. ملٹی ٹائم فریم تجزیہ ، بڑے رجحان کو پکڑنا: حکمت عملی متعدد ٹائم فریموں میں تجزیہ کرتی ہے ، جس سے حکمت عملی کو مارکیٹ کے اہم رجحانات کو وسیع تر تناظر سے سمجھنے میں مدد ملتی ہے ، جس سے قلیل مدتی شور کی مداخلت سے بچنے میں مدد ملتی ہے۔

  4. واضح اسٹاپ نقصان کی حکمت عملی ، قابل کنٹرول خطرہ: حکمت عملی سپر ٹرینڈ کو اسٹاپ نقصان کی شرط کے طور پر استعمال کرتی ہے۔ ایک بار جب مارکیٹ کا رجحان بدل جاتا ہے تو ، حکمت عملی نقصان کو قابل قبول حد کے اندر رکھتے ہوئے بروقت نقصان کو روک سکتی ہے۔

خطرے کا تجزیہ

  1. متحرک ایڈجسٹمنٹ کا فقدان ، مارکیٹ میں ہونے والی تبدیلیوں کا جواب دینے کی محدود صلاحیت: اس حکمت عملی کی پیرامیٹر کی ترتیبات فکسڈ ہیں اور مارکیٹ کے حالات کے مطابق متحرک طور پر ایڈجسٹ کرنے کی صلاحیت کا فقدان ہے۔ جب مارکیٹ کے حالات میں نمایاں تبدیلی آتی ہے تو ، حکمت عملی ناکام ہوسکتی ہے۔

  2. بہت زیادہ سخت اندراج کی شرائط اچھے مواقع کو کھو سکتی ہیں۔ حکمت عملی کے اندراج کی شرائط بہت سخت ہیں ، جو ، اگرچہ یہ کثرت سے تجارت سے بچ سکتی ہے ، اس کے نتیجے میں حکمت عملی کچھ اچھے اندراج کے مواقع سے محروم ہوسکتی ہے۔

  3. انتہائی مارکیٹ کے حالات میں موافقت نامعلوم ہے۔ یہ حکمت عملی عام مارکیٹ کے حالات میں اچھی کارکردگی کا مظاہرہ کرتی ہے ، لیکن اس کی کچھ انتہائی مارکیٹ کے حالات میں موافقت ، جیسے تیزی سے اور کافی تبدیلیوں کا تجربہ کرنا باقی ہے۔

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

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

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

  2. اندراج کے حالات کو بہتر بنائیں ، حساسیت کو بہتر بنائیں: قابل اعتماد کو یقینی بناتے ہوئے ، زیادہ تجارتی مواقع حاصل کرنے کے ساتھ ہی حکمت عملی کی حساسیت کو بہتر بنانے کے ل more ، زیادہ تصدیق کے اشارے متعارف کرانے جیسے اندراج کے حالات کو بہتر بنانے پر غور کریں۔

  3. انتہائی مارکیٹ کے حالات کے لئے ردعمل کے اقدامات شامل کریں: کچھ انتہائی مارکیٹ کے حالات کے لئے، جیسے تیز رفتار اور اہم واپسی، کچھ خصوصی ردعمل کے اقدامات کو متعارف کرانے پر غور کریں، جیسے سٹاپ نقصان کی شدت میں اضافہ یا انتہائی مارکیٹ کے حالات میں حکمت عملی کے خطرے کو کم کرنے کے لئے تجارت کو معطل کرنا.

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

خلاصہ

ٹرینڈ ہنٹر ڈبلیو / ایم ایف ملٹی ٹائم فریم ٹرینڈ حکمت عملی ایک رجحان کی پیروی کرنے والی حکمت عملی ہے جو کثیر اشارے ، کثیر ٹائم فریم تجزیہ پر مبنی ہے۔ یہ حکمت عملی ، عوامل جیسے Ichimoku Cloud ، Moving Averages ، SuperTrend ، WaveTrend ، اور MoneyFlow ، سخت انٹری کی شرط کی ترتیبات ، اور کثیر ٹائم فریم تجزیہ جیسے عوامل پر جامع غور کے ذریعے ، مارکیٹ کے اہم رجحانات کو نسبتا reliably قابل اعتماد طریقے سے گرفت میں لے سکتی ہے ، رینج سے منسلک مارکیٹوں میں کثرت سے تجارت سے گریز کرتی ہے ، اور اس میں استحکام اور قابل اعتماد ہے۔

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

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


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © godzcopilot / blockybears

// Thanks to anthonyf50 for his MTF Ichimoku https://www.tradingview.com/script/Pw9cBFma/
// Thanks to KivancOzbilgic for his SuperTrend https://www.tradingview.com/script/r6dAP7yi/
// Thanks to ZenAndTheArtOfTrading / PineScriptMastery for their Higher Timeframe EMA https://www.tradingview.com/script/Vh3XG9sD-Higher-Timeframe-EMA/
//  Thanks to LazyBear for WaveTrend Oscillator https://www.tradingview.com/script/2KE8wTuF-Indicator-WaveTrend-Oscillator-WT/
//  Thanks to andreholanda73 for MFI+RSI Area https://www.tradingview.com/script/UlGZzUAr/

//@version=5
strategy("TrendHunter w/MF [Blocky]", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=80, initial_capital=1000, pyramiding=0)

// ================
// Strategy Inputs
// ================

// Defines user inputs for configuring the strategy.

// Inputs for EMA
len     = input.int(title="EMA Length", defval=200, group ='== EMA ==')
col     = input.bool(title="Colour EMA", defval=true, group ='== EMA ==')

// SuperTrend
Periods = input(title='ATR: Period', defval=10, group = '== Supertrend ==', inline = 'atr')
Multiplier = input.float(title='Mult', step=0.1, defval=3.0, group = '== Supertrend ==', inline = 'atr')
Src = input.source(title='Src', defval=hl2, group = '== Supertrend ==', inline = 'atr')

// Ichimoku
conversionPeriods = input.int(9, minval=1, title='Conversion', group = '== Ichimoku ==', inline = 'ich1')
basePeriods = input.int(26, minval=1, title='Base', group = '== Ichimoku ==', inline = 'ich1')
laggingSpan2Periods = input.int(52, minval=1, title='Lagging', group = '== Ichimoku ==', inline = 'ich2')
displacement = input.int(26, minval=1, title='Displacement', group = '== Ichimoku ==', inline = 'ich2')

// Ichimoku Display Options
isActiveConversion = input(false, 'Conversion', group = '== Ichimoku ==', inline = 'lines1')
isActiveBase = input(false, 'Base', group = '== Ichimoku ==', inline = 'lines1')
isActiveLagging = input(false, 'Lagging', group = '== Ichimoku ==', inline = 'lines1')
isActiveCloud = input(true, 'Cloud', group = '== Ichimoku ==', inline = 'lines1')


// Input for WaveTrend
n1 = input(9, 'Channel Length', group = '== WaveTrend ==', inline = 'wt1')
n2 = input(12, 'Average Length', group = '== WaveTrend ==', inline = 'wt1')

obLevel = input(60, 'Over Bought', group = '== WaveTrend ==', inline = 'wt2')
osLevel = input(-60, 'Over Sold', group = '== WaveTrend ==', inline = 'wt2')

// Input for Money Flow
rsiMFIperiod = input(60, 'Money Flow Length', group = '== Money Flow ==', inline = 'mf')
rsiMFIMultiplier = input(190, 'RSI+MFI Area multiplier', group = '== Money Flow ==', inline = 'mf')
MFRSIMA = input.string(defval='SMA', title='Money Flow MA Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'VWMA'], group = '== Money Flow ==', inline = 'mf')


// ================
// Strategy Options
// ================

bTable = input.bool(false, title='Trade Table', group='== Strategy Options ==', tooltip = "Show table that shows current selected options and trade trade entry parameters")

bLong = input.bool(true, title='Enter Longs', group='== Strategy Options ==', inline = 'LongShort')
bShort = input.bool(true, title='Enter Shorts', group='== Strategy Options ==', inline = 'LongShort', tooltip = "Filter long / short trade signals")

bPriceCloud = input.bool(true, title='Price outside cloud', group='== Strategy Options ==', inline='PriceCloud')
priceActionOption = input.string(title="", defval="Close", options=["Close", "Candle Body", "Full Candle"], group = "== Strategy Options ==", inline='PriceCloud')

bPriceEMA = input.bool(false, title='Price above/below EMA', group='== Strategy Options ==', inline='PriceEMA')
priceEMAOption = input.string(title="", defval="Close", options=["Close", "Candle Body", "Full Candle"], group = "== Strategy Options ==", inline='PriceEMA')

bSuper = input.bool(true, title='Supertrend transistions', group='== Strategy Options ==', tooltip = "Trade in direction of the supertrend transitions")

bEMACloud1 = input.bool(true, title='EMA Outside Cloud', group='== Strategy Options ==', tooltip = "EMA must be outside the ichimoku cloud")
bEMACloud2 = input.bool(false, title='EMA above/below Cloud', group='== Strategy Options ==', tooltip = "Longs when EMA above the cloud.\nShort when EMA below the cloud")

bMFI = input.bool(false, title='Money Flow', group='== Strategy Options ==', tooltip = "Money Flow Green for Long\nMoney Flow Red for Short")
bWT = input.bool(false, title='Wavetrend', group='== Strategy Options ==', inline = 'WT')
bWTOB = input.bool(false, title='Overbought/sold', group='== Strategy Options ==', tooltip = "Longs when WT Rising\nShort when WT Falling\n\nRestrict entries if in overbough or oversold levels",inline = 'WT')

bExitHTFTrail = input.bool(true, title='Super Trend Exits', group='== Strategy Options ==', inline = 'Exits')


// ===========================
// EMA Functions and Plotting
// ===========================

// Calculate EMA
ema = ta.ema(close, len)
emaSmooth = request.security(syminfo.tickerid, "", ema[barstate.isrealtime ? 1 : 0], gaps=barmerge.gaps_on)[barstate.isrealtime ? 0 : 1]


// Draw EMA
plot(emaSmooth, color=col ? (close > emaSmooth ? color.rgb(76, 163, 175) : color.rgb(6, 23, 173)) : color.black, linewidth=2, title="HTF EMA")


// ==================================
// Supertrend Functions and Plotting
// ==================================

// Function to calculate SuperTrend
calcSuperTrend(src, atrPeriods, multiplier) =>
    atr = ta.atr(atrPeriods)
    up = src - multiplier * atr
    up1 = nz(up[1], up)
    up := close[1] > up1 ? math.max(up, up1) : up
    dn = src + multiplier * atr
    dn1 = nz(dn[1], dn)
    dn := close[1] < dn1 ? math.min(dn, dn1) : dn
    trend = 1
    trend := nz(trend[1], trend)
    trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
    [up, dn, trend]


// Fetching the higher time frame data
[HTF_up, HTF_dn, HTF_trend] = request.security(syminfo.tickerid, "", calcSuperTrend(hl2, Periods, Multiplier), lookahead=barmerge.lookahead_on)

// Plotting for the higher time frame
plot(HTF_trend == 1 ? HTF_up : HTF_dn, title='HTF Up Trend', color= HTF_trend == 1 ? color.green : color.red, linewidth=4)


// ===============================
// Ichimoku Functions and Plotting
// ===============================

// Function to convert timeframe to hours
f_convertTimeframeToHours(tf) =>
    val = 0.0
    if tf == "1S" or tf == "S"
        val := 1.0 / 3600.0
    else if str.contains(tf, "S")
        val := str.tonumber(str.replace(tf, "S", "")) / 3600.0
    else if tf == "1D" or tf == "D"
        val := 24.0
    else if str.contains(tf, "D")
        val := str.tonumber(str.replace(tf, "D", "")) * 24.0
    else if tf == "1W" or tf == "W"
        val := 24.0 * 7.0
    else if str.contains(tf, "W")
        val := str.tonumber(str.replace(tf, "W", "")) * 24.0 * 7.0
    else if tf == "1M" or tf == "M"
        val := 24.0 * 30.0  // Approximation for a month
    else if str.contains(tf, "M")
        val := str.tonumber(str.replace(tf, "M", "")) * 24.0 * 30.0  // Approximation for months
    else
        // Default to minutes
        val := str.tonumber(tf) / 60.0
    val

// Time
timeOffset = time - time[1]


// Returns the displacement based on the chart / HTF resolution
f_getDisplacement(_res) =>
    _res == '' ? displacement : math.round(f_convertTimeframeToHours(_res) / f_convertTimeframeToHours(timeframe.period) * displacement)
    //f_avgDilationOf(_res) * displacement

// Returns average value between lowest and highest
f_avgLH(_len) =>
    math.avg(ta.lowest(_len), ta.highest(_len))

// Returns f_donchian data 
f_donchian(_tf, _src) =>
    request.security(syminfo.tickerid, _tf, _src, barmerge.gaps_off, barmerge.lookahead_on)

// Returns ichimoku data
f_ichimokuData(_tf) =>
    _isShow = _tf == '' or f_convertTimeframeToHours(_tf) >= f_convertTimeframeToHours(timeframe.period)
    _displacement = _isShow ? f_getDisplacement(_tf) : na
    _Conversion = _isShow ? f_donchian(_tf, f_avgLH(conversionPeriods)) : na
    _Base = _isShow ? f_donchian(_tf, f_avgLH(basePeriods)) : na
    _Lagging = _isShow ? f_donchian(_tf, close) : na
    _SSA = _isShow ? math.avg(_Conversion, _Base) : na
    _SSB = _isShow ? f_donchian(_tf, f_avgLH(laggingSpan2Periods)) : na
    _middleCloud = _isShow ? _SSA[0] > _SSB[0] ? _SSA[0] - math.abs(_SSA[0] - _SSB[0]) / 2 : _SSA[0] + math.abs(_SSA[0] - _SSB[0]) / 2 : na
    [_displacement, _Conversion, _Base, _Lagging, _SSA, _SSB, _middleCloud]

// Plotting ichimoku data

[Displacement, Conversion, Base, Lagging, SSA, SSB, fisrtMiddleCloud] = f_ichimokuData("")

// ————— Conversion
plot(isActiveConversion ? Conversion : na, color=color.new(color.blue, 0), title=' Conversion', linewidth=1)
// ————— Base
plot(isActiveBase ? Base : na, color=color.new(color.fuchsia, 0), title=' Base', linewidth=2)
// ————— Lagging
plot(isActiveLagging ? Lagging : na, offset=-Displacement, color=color.new(color.green, 0), title=' Lagging')

// ————— SSA + SSB
ssa = plot(isActiveCloud ? SSA : na, offset=Displacement, color=color.new(color.green, 0), title=' SSA', linewidth=1)
ssb = plot(isActiveCloud ? SSB : na, offset=Displacement, color=color.new(color.red, 0), title=' SSB', linewidth=1)
fill(ssa, ssb, color=color.new(SSA > SSB ? color.green : color.red , 80), title=' Cloud')


// ===============================
// Makret Cypher Additions
// ===============================


// WaveTrend calculations
ap = hlc3
esa = ta.ema(ap, n1)
d = ta.ema(math.abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * d)
tci = ta.ema(ci, n2)

wt1 = tci
wt2 = ta.sma(wt1, 3)

// WaveTrend plotting
//plot(0, color=color.rgb(120, 123, 134), title='Zero Line')
//plot(emaSmooth + wt1, color=color.rgb(191, 228, 255), style=plot.style_linebr, title='WaveTrend 1')
//plot(emaSmooth + wt2, color=color.rgb(56, 56, 56, 40), style=plot.style_linebr, title='WaveTrend 2')

// WaveTrend shapes
plotshape(ta.crossover(wt1, wt2) and wt2[2] < osLevel ? close : na, title='Pos Crossover', location=location.belowbar, style=shape.cross, size=size.small, color=color.rgb(63, 255, 0, 60))
plotshape(ta.crossover(wt2, wt1) and wt1[2] > osLevel ? close : na, title='Neg Crossover', location=location.abovebar, style=shape.cross, size=size.small, color=color.rgb(255, 82, 82, 60))
plotshape(ta.crossover(wt1, wt2) and osLevel ? close : na, title='Positive Crossover', location=location.belowbar, style=shape.triangleup, size=size.tiny, color=color.rgb(63, 255, 0, 60))
plotshape(ta.crossover(wt2, wt1) and obLevel ?  close : na, title='Negative Crossover', location=location.abovebar, style=shape.triangledown, size=size.tiny, color=color.rgb(255, 82, 82, 60))

// Function to determine WaveTrend direction and steepness
isWaveTrendUp() =>
    wt1Slope = wt1 - wt1[1]
    wt2Slope = wt2 - wt2[1]
    if wt1 > wt2 // wt1Slope > 0 and wt2Slope > 0
        1  // Both are going up
    else if wt1 < wt2 // wt1Slope < 0 and wt2Slope < 0
        2 // Both are going down
    else
        na  // Trends are not in the same direction



ma(matype, src, length) =>
    if matype == 'RMA'
        ta.rma(src, length)
    else
        if matype == 'SMA'
            ta.sma(src, length)
        else
            if matype == 'EMA'
                ta.ema(src, length)
            else
                if matype == 'WMA'
                    ta.wma(src, length)
                else
                    if matype == 'VWMA'
                        ta.vwma(src, length)
                    else
                        src

// Money Flow calculations
candleValue = (close - open) / (high - low)
MVC = ma(MFRSIMA, candleValue, rsiMFIperiod)
MVC := MVC * rsiMFIMultiplier
mfi_transp = math.abs(MVC) > 35 ? 0 : math.abs(MVC) > 30 ? 20 : math.abs(MVC) > 25 ? 30 : math.abs(MVC) > 20 ? 40 : math.abs(MVC) > 15 ? 50 : math.abs(MVC) > 10 ? 60 : math.abs(MVC) > 5 ? 65 : math.abs(MVC) > 2 ? 70 : 80
color_area = MVC > 0 ? color.rgb(76, 255, 80, mfi_transp) : color.rgb(255, 82, 82, mfi_transp)

// Money Flow plotting
// RSIMFIplot = plot(MVC * rsiMFIMultiplier, title='Money Flow', color=color_area, style=plot.style_area)
// fill(RSIMFIplot, plot(0), color_area)

plotshape(MVC > 0 ? true : na, title='MFI', location=location.top, style=shape.labeldown, size= size.tiny, color=color_area)
plotshape(MVC < 0 ? true : na, title='MFI', location=location.top, style= shape.labelup, size= size.tiny, color=color_area)




// ===============================
// Strategy Entries
// ===============================

// Checks whether price is inside the Ichimoku cloud
f_PriceCloud(dir) =>
    _enter = false
    if bPriceCloud
        if bLong and dir == 1
            _enter := switch priceActionOption
                "Close" => close > math.max(SSA[Displacement], SSB[Displacement])
                "Candle Body" => open > math.max(SSA[Displacement], SSB[Displacement]) and close > math.max(SSA[Displacement], SSB[Displacement])
                "Full Candle" => low > math.max(SSA[Displacement], SSB[Displacement]) and high > math.max(SSA[Displacement], SSB[Displacement]) 
        if bShort and dir == 2
            _enter := switch priceActionOption
                "Close" => close < math.min(SSA[Displacement], SSB[Displacement])
                "Candle Body" => open < math.min(SSA[Displacement], SSB[Displacement]) and close < math.min(SSA[Displacement], SSB[Displacement])
                "Full Candle" => low < math.min(SSA[Displacement], SSB[Displacement]) and high < math.min(SSA[Displacement], SSB[Displacement]) 
    else
        _enter := na
    _enter

// Checks whether price is above / below the ema
f_PriceEMA(dir) =>
    _enter = false
    if bPriceEMA
        if bLong and dir == 1
            _enter := switch priceEMAOption
                "Close" => close > math.max(SSA[Displacement], SSB[Displacement])
                "Candle Body" => open > math.max(SSA[Displacement], SSB[Displacement]) and close > math.max(SSA[Displacement], SSB[Displacement])
                "Full Candle" => low > math.max(SSA[Displacement], SSB[Displacement]) and high > math.max(SSA[Displacement], SSB[Displacement]) 
        if bShort and dir == 2
            _enter := switch priceEMAOption
                "Close" => close < math.min(SSA[Displacement], SSB[Displacement])
                "Candle Body" => open < math.min(SSA[Displacement], SSB[Displacement]) and close < math.min(SSA[Displacement], SSB[Displacement])
                "Full Candle" => low < math.min(SSA[Displacement], SSB[Displacement]) and high < math.min(SSA[Displacement], SSB[Displacement]) 
    else
        _enter := na
    _enter

// Checks HTF supertrend direction
f_Super(dir) =>
    _enter = false
    if bSuper
        if bLong and dir == 1
            _enter := HTF_trend == 1
        if bShort and dir == 2
            _enter := HTF_trend == -1
    else
        _enter := na

    _enter

// Checks whether ema is inside the Ichimoku cloud
f_EMACloud1(dir) =>
    _enter = false
    if bEMACloud1
        if bLong and dir == 1
            _enter := (emaSmooth > math.max(SSA[Displacement], SSB[Displacement])) or (emaSmooth < math.min(SSA[Displacement], SSB[Displacement]))
        if bShort and dir == 2
            _enter := (emaSmooth > math.max(SSA[Displacement], SSB[Displacement])) or (emaSmooth < math.min(SSA[Displacement], SSB[Displacement]))
    else
        _enter := na
    _enter

// Checks whether ema is above/below Ichimoku cloud
f_EMACloud2(dir) =>
    _enter = false
    if bEMACloud2
        if bLong and dir == 1
            _enter := emaSmooth > math.max(SSA[Displacement], SSB[Displacement])
        if bShort and dir == 2
            _enter := emaSmooth < math.min(SSA[Displacement], SSB[Displacement])
    else
        _enter := na
    _enter

// Checks whether moneyflow is positive
f_MFI(dir) =>
    _enter = false
    if bMFI
        if bLong and dir == 1
            _enter := MVC > 0
        if bShort and dir == 2
            _enter := MVC < 0
    else
        _enter := na
    _enter


// Checks whether wavetrend is rising or falling
f_WT(dir) =>
    _enter = false
    if bWT
        if bLong and dir == 1
            _enter := isWaveTrendUp() == dir
        if bShort and dir == 2
            _enter := isWaveTrendUp() == dir
    else
        _enter := na
    _enter


f_WTOB(dir) =>
    _enter = false
    if bWT and bWTOB
        if bLong and dir == 1
            _enter := wt1 < obLevel
        if bShort and dir == 2
            _enter := wt1 > osLevel
    else
        _enter := na
    _enter


// Check if a value is 'na' or true.
f_NATrue(val) =>
    _enter = false
    if na(val)
        _enter := true
    if val
        _enter := true
    _enter   
    

// Consolidates entry conditions.
f_checkCondition(dir) =>
    _enter = false
    if na(f_PriceCloud(dir)) and na(f_PriceEMA(dir)) and na(f_Super(dir)) and na(f_EMACloud1(dir)) and na(f_EMACloud2(dir)) and na(f_MFI(dir)) and na(f_WT(dir)) and na(f_WTOB(dir))
        _enter := false
    else if f_NATrue(f_PriceCloud(dir)) and f_NATrue(f_PriceEMA(dir)) and f_NATrue(f_Super(dir)) and f_NATrue(f_EMACloud1(dir)) and f_NATrue(f_EMACloud2(dir)) and f_NATrue(f_MFI(dir)) and f_NATrue(f_WT(dir)) and f_NATrue(f_WTOB(dir))
        _enter := true
    _enter

        
// Execute long trade entries
longCondition = bLong and f_checkCondition(1)
if (longCondition)
    strategy.entry("Long", strategy.long)

// Execute short trade entries
shortCondition = bShort and f_checkCondition(2)
if (shortCondition)
    strategy.entry("Short", strategy.short)

// Excute trade exits
exitLong = (bExitHTFTrail and (close < HTF_up or HTF_trend == -1))
exitShort = (bExitHTFTrail and (close > HTF_dn or HTF_trend == 1))

if exitLong
    strategy.close("Long")

if exitShort
    strategy.close("Short")

// Creates a table shoing all the user options and their current status for entering a trade
if bTable
    // Create a table
    tbl = table.new(position = position.bottom_right, columns = 4, rows = 11, bgcolor=color.new(color.black,100), border_width = 0, frame_width = 0)

    table.cell(tbl, 1, 0, "Selected", text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 0, "Long", bgcolor=na(bLong) ? color.new(color.black,100) : bShort ? color.rgb(4, 112, 8) : color.rgb(100, 7, 7), text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 0, "Short", bgcolor=na(bShort) ? color.new(color.black,100) : bShort ? color.rgb(4, 112, 8) : color.rgb(100, 7, 7), text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 1, "Entry", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 1, longCondition  ? "✓" : "✗", bgcolor=longCondition ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 1, shortCondition  ? "✓" : "✗", bgcolor=shortCondition ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))


    table.cell(tbl, 0, 3, "Price Cloud", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 3, bPriceCloud ? "✓" : "✗", bgcolor=na(bPriceCloud) ? color.new(color.black,100) : bPriceCloud ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 3, f_PriceCloud(1) ? "✓" : "✗", bgcolor=na(f_PriceCloud(1)) ? color.new(color.black,100) : f_PriceCloud(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 3, f_PriceCloud(2)  ? "✓" : "✗", bgcolor=na(f_PriceCloud(2)) ? color.new(color.black,100) : f_PriceCloud(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 4, "Price EMA", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 4, bPriceEMA ? "✓" : "✗", bgcolor=na(bPriceEMA) ? color.new(color.black,100) : bPriceEMA ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 4, f_PriceEMA(1) ? "✓" : "✗", bgcolor=na(f_PriceEMA(1)) ? color.new(color.black,100) : f_PriceEMA(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 4, f_PriceEMA(2) ? "✓" : "✗", bgcolor=na(f_PriceEMA(2)) ? color.new(color.black,100) : f_PriceEMA(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 5, "SuperTrend", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 5, bSuper ? "✓" : "✗", bgcolor=na(bSuper) ? color.new(color.black,100) : bSuper ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 5, f_Super(1) ? "✓" : "✗", bgcolor=na(f_Super(1)) ? color.new(color.black,100) : f_Super(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 5, f_Super(2) ? "✓" : "✗", bgcolor=na(f_Super(2)) ? color.new(color.black,100) : f_Super(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 6, "EMA Outside Cloud", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 6, bEMACloud1 ? "✓" : "✗", bgcolor=na(bEMACloud1) ? color.new(color.black,100) : bEMACloud1 ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 6, f_EMACloud1(1) ? "✓" : "✗", bgcolor=na(f_EMACloud1(1)) ? color.new(color.black,100) : f_EMACloud1(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 6, f_EMACloud1(2) ? "✓" : "✗", bgcolor=na(f_EMACloud1(2)) ? color.new(color.black,100) : f_EMACloud1(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 7, "EMA Above/Below Cloud", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 7, bEMACloud2 ? "✓" : "✗", bgcolor=na(bEMACloud2) ? color.new(color.black,100) : bEMACloud2 ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 7, f_EMACloud2(1) ? "✓" : "✗", bgcolor=na(f_EMACloud2(1)) ? color.new(color.black,100) : f_EMACloud2(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 7, f_EMACloud2(2) ? "✓" : "✗", bgcolor=na(f_EMACloud2(2)) ? color.new(color.black,100) : f_EMACloud2(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 8, "Moneyflow", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 8, bMFI ? "✓" : "✗", bgcolor=na(bMFI) ? color.new(color.black,100) : bMFI ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 8, f_MFI(1) ? "✓" : "✗", bgcolor=na(f_MFI(1)) ? color.new(color.black,100) : f_MFI(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 8, f_MFI(2) ? "✓" : "✗", bgcolor=na(f_MFI(2)) ? color.new(color.black,100) : f_MFI(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 9, "WaveTrend", text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 9, bWT ? "✓" : "✗", bgcolor=na(bWT) ? color.new(color.black,100) : bWT ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 9, f_WT(1) ? "✓" : "✗", bgcolor=na(f_WT(1)) ? color.new(color.black,100) : f_WT(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 9, f_WT(2) ? "✓" : "✗", bgcolor=na(f_WT(2)) ? color.new(color.black,100) : f_WT(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))

    table.cell(tbl, 0, 10, "Overbought/Sold  " + str.tostring(wt1, '#.#'), text_halign = text.align_left, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 1, 10, bWTOB ? "✓" : "✗", bgcolor=na(bWTOB) ? color.new(color.black,100) : bWTOB ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 2, 10, f_WTOB(1) ? "✓" : "✗", bgcolor=na(f_WTOB(1)) ? color.new(color.black,100) : f_WTOB(1) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))
    table.cell(tbl, 3, 10, f_WTOB(2) ? "✓" : "✗", bgcolor=na(f_WTOB(2)) ? color.new(color.black,100) : f_WTOB(2) ? color.green : color.red, text_halign = text.align_center, text_size = size.small, text_color = color.rgb(207, 207, 207))


مزید