سادہ موونگ ایوریج اور اڈاپٹیو موونگ ایوریج کی حکمت عملیوں کا امتزاج


تخلیق کی تاریخ: 2023-09-14 18:14:34 آخر میں ترمیم کریں: 2023-09-14 18:14:34
کاپی: 0 کلکس کی تعداد: 698
1
پر توجہ دیں
1617
پیروکار

سادہ موونگ ایوریج اور اڈاپٹیو موونگ ایوریج کی حکمت عملیوں کا امتزاج

اس مضمون میں ایک کوانٹم ٹریڈنگ اسٹریٹجی کا تعارف کیا جائے گا جس میں سادہ حرکت پذیر اوسط ((SMA) کا استعمال کیا جاتا ہے اور خود کار طریقے سے چلنے والی اوسط ((ALMA) ۔ اس حکمت عملی میں ایک ہی وقت میں متعدد تکنیکی اشارے شامل ہیں ، جو مختلف پیرامیٹرز کو ترتیب دے کر مارکیٹ میں داخل ہونے اور باہر نکلنے کے لئے تجارتی سگنل تشکیل دیتے ہیں۔

حکمت عملی

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

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

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

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

دوئم، حکمت عملی کے فوائد

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

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

ایک اور فائدہ یہ ہے کہ حکمت عملی سگنل ذرائع کی کثرت ہے۔ مختلف ٹائم ڈیمینشنز پر SMA ، ALMA کے جوڑے کی بات چیت ، حکمت عملی کے لئے کثیر جہتی حوالہ فراہم کرتی ہے۔ یہ Filters out noise/false signals کو مارکیٹ میں بے ترتیب شور کو کچھ حد تک فلٹر کرسکتا ہے ، جس سے سگنل زیادہ قابل اعتماد ہوجاتا ہے۔

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

تیسرا، ممکنہ خطرات

اگرچہ اس حکمت عملی کے کچھ فوائد ہیں ، لیکن اس کے عملی استعمال میں کچھ خطرات بھی ہیں جن کے بارے میں آگاہ ہونا ضروری ہے۔

سب سے پہلے اشارے کی ترتیب کے ساتھ زیادہ سے زیادہ اصلاح کا مسئلہ ہے۔ SMA ، ALMA اور RSI دونوں پیرامیٹرز کو آزادانہ طور پر ایڈجسٹ کرسکتے ہیں ، لیکن غیر مناسب ایڈجسٹمنٹ مارکیٹ کے طویل مدتی ساختی تبدیلیوں کو اپنانے کے بجائے زیادہ سے زیادہ اصلاح کی جاسکتی ہے۔ اس میں مختلف اقسام کی خصوصیات کے مطابق پیرامیٹرز کو احتیاط سے ترتیب دینے کی ضرورت ہے ، جو مختصر مدت کے اثرات کی تلاش میں نہیں ہے۔

دوسرا یہ ہے کہ اسٹریٹجک سگنل میں تاخیر ہوسکتی ہے۔ اگرچہ ALMA کا جواب SMA سے تیز ہے ، لیکن آخر کار کچھ تاخیر موجود ہے۔ تیزی سے بدلتے ہوئے بازاروں میں ، اس سے بہترین داخلے کا وقت ضائع ہوسکتا ہے۔ یہاں مناسب طریقے سے دوسرے پیشگی اشارے کے ساتھ مطابقت پذیر ہونے پر غور کرنے کی ضرورت ہے۔

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

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

چار مضامین، خلاصہ

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

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2023-09-06 00:00:00
end: 2023-09-13 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//The plotchar UP/DOWN Arrows  is the crossover of the fastest MA and fastest IIR MAs
//
//The dots at the bottom are the two simple averages crossing over
//
//The count over/under the candles is the count of bars that the SMAs on their
//respective resolution are fanning out.
//
//The colored background indicates a squeeze, lime=kinda tight : green=very tight squeeze.  based on the 3 IIRs
//
//To answer my own question in a forum, looking at the code, i couldn't figure out how to get it from another timeframe
//and run the same calculations with the same results.  My answer in the end was to scale the chosen MA length
//in the corresponding CurrentPeriod/ChosenMAPeriod proportion.  This results in the same line in the same place when browsing through the
//different time resolutions.  Somebody might find this invaluable
//
//The counts are for MA's fanning out, or going parabolic.  Theres IIRs, Almas, one done of the other.  A lot.  
//The arrows above and below bars are from standard RSI numbers for OB/OS
//
//The IIRs changes color depending on their slope, which can be referenced easily with a variable.
//
//The backgrond on a bar-by-bar basis is colored when 2 sets of moving averages are in a squeeze, aka
//when price is consolidating.  
//
//This aims to help the trader combine conditions and entry criteria of the trade and explore these options visually.  
//They detail things from all time-frames on the current one.  I prefer it because of the fractal nature of price-action, both large and small,
//either yesterday or last year.  For best results, go long in short-term trades when the long-term trend is also up.
//and other profitable insights.  This is also a great example of an automation algorith.  
//
//The pretty ribbon is my script called 'Trading With Colors'. Use them together for fanciest results.  55/233 is my Fib Cross (golden/death)  Compare it to the classic 50/200 if
//you get bored.  I believe it simply works better, at least for Crypto.
//
//Evidently, I am a day-trader.  But this yields higher profits on larger time-frames anyways, so do play around with it. Find what works for you.

//Thanks and credit for code snippets goes to:
//matryskowal
//ChrisMoody, probably twice
//Alex Orekhov (everget)
//author=LucF and midtownsk8rguy, for PineCoders
//If you use code from this, real quick search for perhaps the original and give them a shoutout too.  I may have missed something

//Author: Sean Duffy
//@version=4
strategy(title = "Combination Parabolic MA/IIR/ALMA Strategy",
         shorttitle = "MA-QuickE", 
         overlay = true, 
         backtest_fill_limits_assumption = 0, 
         default_qty_type = strategy.cash, 
         default_qty_value = 1000, 
         initial_capital = 1000,
         currency = currency.USD,
         linktoseries = true)
        //  calc_on_order_fills = true,
        //  calc_on_every_tick = true,
// Input Variables
showFIBMAs = input(false, type=input.bool, title="═══════════════ Show Fibby MAs ═══════════════")
maRes = input(960, type=input.integer, title="MA-Cross Resolution")
mal1 = input(8, type=input.integer, title="MA#1 Length")
mal2 = input(13, type=input.integer, title="MA#2 Length")
mal3 = input(34, type=input.integer, title="MA#3 Length")
loosePercentClose = input(1.1, type=input.float, title="SMA LooseSqueeze Percent")
showIIRs = input(false, type=input.bool, title="═══════════════════ Show IIRs ═══════════════════")
iirRes = input(60, type=input.integer, title="IIR Resolution")
percentClose = input(title="IIR Squeeze PercentClose", type=input.float, defval=.8)
iirlength1 = input(title="IIR Length 1", type=input.integer, defval=34)
iirlength2 = input(title="IIR Length 2", type=input.integer, defval=144)//input(title="ATR Period", type=input.integer, defval=1)
iirlength3 = input(title="IIR Length 3", type=input.integer, defval=720)//input(title="ATR Period", type=input.integer, defval=1)
showIIR1 = input(true, type=input.bool, title="Show IIR1")
showIIR2 = input(true, type=input.bool, title="Show IIR2")
showIIR3 = input(true, type=input.bool, title="Show IIR3")
showCounts = input(true, type=input.bool, title="═════════════ Show Parabolic MA Counts ════════════")
showSignals = input(true, type=input.bool, title="══════════════ Show Buy/Sell Signals ══════════════")
showBackground = input(true, type=input.bool, title="══════════════ Show Background Colors ══════════════")
//runStrategy = input(true, type=input.bool, title="══════════════ Run Strategy  ══════════════")
debug = input(false, type=input.bool, title="══════════════ Show Debug ══════════════")

barLookbackPeriod = input(title="══ Bar Lookback Period ══", type=input.integer, defval=5)
percentageLookbackPeriod = input(title="══ Percentage Lookback Period ══", type=input.integer, defval=1)

bullcolor = color.green
bearcolor = color.red
color bgcolor = na

var bool slope1Green = na
var bool slope2Green = na
var bool slope3Green = na

var bool buySignal = na
var bool sellSignal = na
var bool bigbuySignal = na
var bool bigsellSignal = na
bool smbuySignal = false
bool smsellSignal = false
var bool insqueeze = na
var bool intightsqueeze = na
var bool infastsqueeze = na
var bool awaitingEntryIn = false

// My counting variables
var int count1 = 0
var float madist1 = 0
var int count2 = 0
var float madist2 = 0
var int sinceSmSignal = 0

var entryPrice = 0.0
var entryBarIndex = 0
var stopLossPrice = 0.0
// var updatedEntryPrice = 0.0
// var alertOpenPosition = false
// var alertClosePosition = false
// var label stopLossPriceLabel = na
// var line stopLossPriceLine = na
positionType = "LONG" // Strategy type, and the only current option

hasOpenPosition = strategy.opentrades != 0
hasNoOpenPosition = strategy.opentrades == 0

strategyClose() =>
    if (hasOpenPosition)
        if positionType == "LONG"
            strategy.close("LONG", when=true)
        else 
            strategy.close("SHORT", when=true)
strategyOpen() =>
    if (hasNoOpenPosition)
        if positionType == "LONG"
            strategy.entry("LONG", strategy.long, when=true)
        else 
            strategy.entry("SHORT", strategy.short, when=true)
checkEntry() =>
    buysignal = false
    if (hasNoOpenPosition)
        strategyOpen()
        buysignal := true
    // if (slope1Green and (trend1Green or trend2Green) and awaitingEntryIn and hasNoOpenPosition)
    //     strategyOpen()
    //     buysignal := true
    buysignal
checkExit() =>
    sellsignal = false
    // if (trend1Green == false and trend2Green == false) // to later have quicker exit strategy
    //     sellsignal := true
    //     strategyClose()
    if (hasOpenPosition)
        sellsignal := true
        strategyClose()
    sellsignal

multiplier(_adjRes, _adjLength) => // returns adjusted length
    multiplier = _adjRes/timeframe.multiplier
    round(_adjLength*multiplier)
    
    
//reset the var variables before new calculations
buySignal := false
sellSignal := false
smbuySignal := false
smsellSignal := false
bigbuySignal := false
bigsellSignal := false

ma1 = sma(close, multiplier(maRes, mal1))
ma2 = sma(close, multiplier(maRes, mal2))
ma3 = sma(close, multiplier(maRes, mal3))


madist1 := abs(ma1 - ma2)
madist2 := abs(ma1 - ma3) // check if MA's are fanning/going parabolic
if (ma1 >= ma2 and ma2 >= ma3 and madist1[0] > madist1[1]) //and abs(dataB - dataC >= madist2)  // dataA must be higher than b, and distance between gaining, same with C
    count1 := count1 + 1
else 
    count1 := 0
if (ma1 <= ma2 and ma2 <= ma3 and madist1[0] > madist1[1])  //<= madist2 and dataB <= dataC) //and abs(dataB - dataC >= madist2)  // dataA must be higher than b, and distance between gaining, same with C
    count2 := count2 + 1
else 
    count2 := 0


crossoverAB = crossover(ma1, ma2) 
crossunderAB = crossunder(ma1, ma2)

plot(showFIBMAs ? ma1 : na, linewidth=3)
plot(showFIBMAs ? ma2 : na)
plot(showFIBMAs ? ma3 : na)


// Fast Squeese Check WORK IN PROGRESS
// 
float singlePercent = close / 100 
if max(madist1, madist2) <= singlePercent*loosePercentClose
    bgcolor := color.yellow
    infastsqueeze := true
else
    infastsqueeze := false



// IIR MOVING AVERAGE
f(a) => a[0] // fixes mutable error
iirma(iirlength, iirsrc) =>
    cf = 2*tan(2*3.14159*(1/iirlength)/2)
    a0 = 8 + 8*cf + 4*pow(cf,2) + pow(cf,3)
    a1 = -24 - 8*cf + 4*pow(cf,2) + 3*pow(cf,3)
    a2 = 24 - 8*cf - 4*pow(cf,2) + 3*pow(cf,3)
    a3 = -8 + 8*cf - 4*pow(cf,2) + pow(cf,3)
    //----
    c = pow(cf,3)/a0
    d0 = -a1/a0
    d1 = -a2/a0
    d2 = -a3/a0
    //----
    out = 0.
    out := nz(c*(iirsrc + iirsrc[3]) + 3*c*(iirsrc[1] + iirsrc[2]) + d0*out[1] + d1*out[2] + d2*out[3],iirsrc)
    f(out)


iirma1 = iirma(multiplier(iirRes, iirlength1), close)
iirma2 = iirma(multiplier(iirRes, iirlength2), close)
iirma3 = iirma(multiplier(iirRes, iirlength3), close)

// adjusts length for current resolution now, length is lengthened/shortened accordingly, upholding exact placement of lines
// iirmaD1 = security(syminfo.tickerid, tostring(iirRes), iirma1, barmerge.gaps_on, barmerge.lookahead_on)
// iirmaD2 = security(syminfo.tickerid, tostring(iirRes), iirma2, barmerge.gaps_on, barmerge.lookahead_on)
// iirmaD3 = security(syminfo.tickerid, tostring(iirRes), iirma3, barmerge.gaps_on, barmerge.lookahead_on)

slope1color = slope1Green ? color.lime : color.blue
slope2color = slope2Green ? color.lime : color.blue
slope3color = slope3Green ? color.lime : color.blue

plot(showIIR1 and showIIRs ? iirma1 : na, title="IIR1", color=slope1color, linewidth=2, transp=30)
plot(showIIR2 and showIIRs ? iirma2 : na, title="IIR2", color=slope2color, linewidth=3, transp=30)
plot(showIIR3 and showIIRs ? iirma3 : na, title="IIR3", color=slope3color, linewidth=4, transp=30)

// checks slope of IIRs to create a boolean variable and and color it differently
if (iirma1[0] >= iirma1[1])
    slope1Green := true
else
    slope1Green := false
if (iirma2[0] >= iirma2[1])
    slope2Green := true
else
    slope2Green := false
if (iirma3[0] >= iirma3[1])
    slope3Green := true
else
    slope3Green := false

// calculate space between IIRs and then if the price jumps above both
//float singlePercent = close / 100  // = a single percent
var float distIIR1 = na
var float distIIR2 = na
distIIR1 := abs(iirma1 - iirma2)
distIIR2 := abs(iirma1 - iirma3)

if (distIIR1[0] < percentClose*singlePercent and close[0] >= iirma1[0])
    if close[0] >= iirma2[0] and close[0] >= iirma3[0]
        bgcolor := color.green
        insqueeze := true
        intightsqueeze := true
    else
        bgcolor := color.lime
        insqueeze := true
        intightsqueeze := false
else
    insqueeze := false
    intightsqueeze := false


// if (true)//sinceSmSignal > 0) //  cutting down on fastest MAs noise
//     sinceSmSignal := sinceSmSignal + 1
//     if (crossoverAB)
//         //checkEntry()
//         //smbuySignal := true
//         sinceSmSignal := 0
//     if (crossunderAB) // and all NOT greennot (slope1Green and slope2Green and slope3Green)
//         //checkExit()
//         //smsellSignal := true
//         sinceSmSignal := 0
// else
//     sinceSmSignal := sinceSmSignal + 1


f_draw_infopanel(_x, _y, _line, _text, _color)=>
    _rep_text = ""
    for _l = 0 to _line
        _rep_text := _rep_text + "\n"
    _rep_text := _rep_text + _text
    var label _la = na
    label.delete(_la)
    _la := label.new(
         x=_x, y=_y, 
         text=_rep_text, xloc=xloc.bar_time, yloc=yloc.price, 
         color=color.black, style=label.style_labelup, textcolor=_color, size=size.normal)

posx = timenow + round(change(time)*60)
posy = highest(50)

// CONSTRUCTION ZONE
// TODO:  program way to eliminate noise and false signals
// MAYBEDO: program it to differentiate between a moving average bump and a cross
//          I think the best way would be to calculate the tangent line... OR
//          Take the slope of both going back a couple bars and if it's close enough, its a bounce off
//          and an excellent entry signal
// program in quickest exit, 2 bars next to eachother both closing under, as to avoid a single wick from
// prompting to close the trade
// Some other time, have it move SMA up or down depending on whether trending up or down.  Then use those MA crosses

//THIS CHECKS THE SLOPE FROM CURRENT PRICE TO BACK 10 BARS
checkSlope(_series) =>  (_series[0]/_series[10])*100 // it now returns it as a percentage

doNewX = input(true, type=input.bool, title="══════════ Show misc MA Cross Strategy ══════════")

iirX = input(13, title="IIRx Length: ", type=input.integer)
iirXperiod = input(21, title="IIRx Period/TF: ", type=input.integer)

iirX2 = input(144, title="IIRx2 Length: ", type=input.integer)
iirX2period = input(233, title="IIRx2 Period/TF: ", type=input.integer) //15

almaXperiod = input(defval=21, title="Alma of IIR1 Period: ", type=input.integer)
almaXalpha = input(title="Alma Alpha Value: ", defval=.99, maxval=.99, type=input.float)
almaXsigma = input(title="Alma Sigma Value: ", defval=8, type=input.float)

iirmaOTF = iirma(multiplier(iirXperiod, iirX), close)
iirma2OTF = iirma(multiplier(iirX2period, iirX2), close)
smaOTF = alma(iirmaOTF, almaXperiod, almaXalpha, almaXsigma) // maybe dont touch, its precise  // I took the ALMA of the IIRMA, and i hope thats not cheating ;)

// I could have removed this.  the multiplier function adjusts the length to fit the current timeframe while displaying the same
// smaXOTF = security(syminfo.tickerid, smaXperiod, smaOTF, barmerge.gaps_on, barmerge.lookahead_on)
// iirmaXOTF = security(syminfo.tickerid, iirXperiod, iirmaOTF, barmerge.gaps_on, barmerge.lookahead_on)
// iirmaX2OTF = security(syminfo.tickerid, iirX2period, iirma2OTF, barmerge.gaps_on, barmerge.lookahead_on)
plot(doNewX ? smaOTF : na, title="FastMA X-Over :  ", color=color.blue, linewidth=1, transp=40)
plot(doNewX ? iirmaOTF : na, title="IIR MAx :  ", color=color.purple, linewidth=1, transp=30)
plot(doNewX ? iirma2OTF : na, title="IIR MAx :  ", color=color.purple, linewidth=2, transp=20)

iirma2Up = iirma2OTF[0] > iirma2OTF[1] // just another slope up/down variable. 

//calculate spaces between averages
distiiralma = abs(iirmaOTF - smaOTF)

crossoverFast = crossover(iirmaOTF[0], smaOTF[0]) // and (iirmaOTF[1] <= smaOTF[1])
crossunderFast = crossunder(iirmaOTF[0], smaOTF[0]) // and (iirmaOTF[1] >= smaOTF[1])

if (crossoverFast and iirma2Up == true) // and (count1 != 0))// or close[0] < (lowest(barLookbackPeriod) + singlePercent*3))) // must be at most a few percent up from a recent low.  Avoid buying highs :P
    buySignal := true
    strategyOpen()
    // if (slope1Green and slope2Green and slope3Green and infastsqueeze == false)
    //     checkEntry()
if (crossunderFast)
    sellSignal := true
    checkExit()

// I feel like I didn't cite the OG author for this panel correctly. I hope I did, but there are extentions of his/her work in multiple places.
// I could have gotten it confused.
if (debug)
    f_draw_infopanel(posx, posy, 18, "distiiralma from IIR: " + tostring(distiiralma), color.lime)
    //f_draw_infopanel(posx, posy, 16, "distiirs: " + tostring(distiirX1), color.lime)
    f_draw_infopanel(posx, posy, 14, "Value of iirmaOTF: " + tostring(iirmaOTF), color.lime)
    f_draw_infopanel(posx, posy, 6, "slope X: " + tostring(abs(100 - checkSlope(iirmaOTF))), color.lime)
    f_draw_infopanel(posx, posy, 12, "value of smaOTF: " + tostring(smaOTF), color.lime)
    f_draw_infopanel(posx, posy, 6, "slopeAlma: " + tostring(abs(100 - checkSlope(smaOTF))), color.lime)
    f_draw_infopanel(posx, posy, 2, "slopeIIR2 " + tostring(abs(100 - checkSlope(iirma2OTF))), color.lime)
    f_draw_infopanel(posx, posy, 2, "slopeIIR2 " + tostring(abs(100 - checkSlope(iirma2OTF))), color.lime)


// I kept this separate because it discludes the calculations.  Its hard to hold a train of thought while fishing for the right section
bgcolor(showBackground ? bgcolor : na)
plotshape(showSignals ? buySignal : na, location=location.bottom, style=shape.circle, text="", size=size.tiny, color=color.blue, transp=60)
plotshape(showSignals ? sellSignal : na, location=location.bottom, style=shape.circle, text="", size=size.tiny, color=color.red, transp=60)
plotchar(showSignals and smbuySignal, title="smBuy", location=location.belowbar, char='↑', size=size.tiny, color=color.green, transp=0)
plotchar(showSignals and smsellSignal, title="smSell", location=location.abovebar, char='↓', size=size.tiny, color=color.orange, transp=0)

// can not display a variable. Can only match the count to a corresponding plotchar
// to display a non-constant variable, use the debug box, which was so kindly offered up by our community.
plotchar(showCounts and count1==1, title='', char='1', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==2, title='', char='2', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==3, title='', char='3', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==4, title='', char='4', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==5, title='', char='5', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==6, title='', char='6', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==7, title='', char='7', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==8, title='', char='8', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1==9, title='', char='9', location=location.belowbar, color=#2c9e2c, transp=0)
plotchar(showCounts and count1>=10, title='', char='$', location=location.belowbar, color=#2c9e2c, transp=0)
    
plotchar(showCounts and count2==1, title='', char='1', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==2, title='', char='2', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==3, title='', char='3', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==4, title='', char='4', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==5, title='', char='5', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==6, title='', char='6', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==7, title='', char='7', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==8, title='', char='8', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2==9, title='', char='9', location=location.abovebar, color=#e91e63, transp=0)
plotchar(showCounts and count2>=10, title='', char='$', location=location.abovebar, color=#e91e63, transp=0)

showRSIind = input(true, type=input.bool, title="═══════════════════ Show RSI Arrows ═══════════════════")
// Get user input
rsiSource = input(title="RSI Source", type=input.source, defval=close)
rsiLength = input(title="RSI Length", type=input.integer, defval=14)
rsiOverbought = input(title="RSI Overbought Level", type=input.integer, defval=80)
rsiOversold = input(title="RSI Oversold Level", type=input.integer, defval=20)
// Get RSI value
rsiValue = rsi(rsiSource, rsiLength)
isRsiOB = rsiValue >= rsiOverbought
isRsiOS = rsiValue <= rsiOversold
// Plot signals to chart
plotshape(isRsiOB, title="Overbought", location=location.abovebar, color=color.red, transp=0, style=shape.triangledown)
plotshape(isRsiOS, title="Oversold", location=location.belowbar, color=color.green, transp=0, style=shape.triangleup)

//reset the var variables before new calculations
buySignal := false
sellSignal := false
smbuySignal := false
smsellSignal := false
bigbuySignal := false
bigsellSignal := false