Skip to content
This repository was archived by the owner on Apr 23, 2026. It is now read-only.

Add ownership.yaml for durable ownership of the project - #6

Merged
tarebyte merged 2 commits into
mainfrom
tarebyte/add-ownership
May 12, 2023
Merged

Add ownership.yaml for durable ownership of the project#6
tarebyte merged 2 commits into
mainfrom
tarebyte/add-ownership

Conversation

@tarebyte

@tarebyte tarebyte commented May 8, 2023

Copy link
Copy Markdown
Member

This adds the ownership.yaml file to ensure we have maintain proper service ownership before open sourcing the project.

@tarebyte
tarebyte requested a review from zkoppert May 8, 2023 18:29
@tarebyte
tarebyte requested a review from a team as a code owner May 8, 2023 18:29
@tarebyte
tarebyte force-pushed the tarebyte/add-ownership branch from dbc7fb2 to b15b633 Compare May 8, 2023 18:30
jpemberthy
jpemberthy previously approved these changes May 8, 2023
Comment thread ownership.yaml Outdated
Comment on lines +11 to +16
sev1:
issue: https://github.com/github/github-app-js-sample/issues
tta: '1 business day'
sev2:
issue: https://github.com/github/github-app-js-sample/issues
tta: '5 business days'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great if you would like to provide this level of support! I also want to recognize that this is not required for OSS repos. Only sev3 support levels are required.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jovel any thoughts around this? The team is stretched pretty far so we may only want to use sev3.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, this is a non-essential service and only functions as a reference implementation. It should be at most sev3

@tarebyte
tarebyte merged commit 443961a into main May 12, 2023
@tarebyte
tarebyte deleted the tarebyte/add-ownership branch May 12, 2023 14:34
fuadurek added a commit to fuadurek/github-app-js-sample that referenced this pull request May 25, 2025
//@Version=5
indicator("RSI Screener - By Leviathan", overlay=false, max_labels_count = 80, max_lines_count = 40, precision = 1)

// Tickers lists
g1 = 'BTC, ETH, SOL, PEPE, DOGE, WLD, WIF, TRB, ENA, NEAR, RNDR, BNB, BOME, XRP, FET, ETHFI, ARKM, SHIB, ARB, AR, BONK, FRONT, SUI, AVAX, FLOKI, RUNE, HBAR, GLM, W, ORDI, FIL, REZ, OP, FTM, AGIX, DOT, LTC, ETC, PHB, TIA'
g2 = 'LUNC, LPT, GALA, ICP, JTO, ADA, NFP, GRT, RSR, MATIC, AI, CTXC, 1000SATS, LINK, PENDLE, ATOM, TRX, INJ, JUP, SEI, STX, LUNA, LEVER, VANRY, JASMY, APT, STRK, ALT, CKB, PIXEL, PYTH, YGG, SAGA, TAO, BCH, CFX, ATA, TNSR, IQ, CELR'
g3 = 'OCEAN, HIGH, MANTA, CHZ, OM, OMNI, THETA, UNI, GMT, AEVO, SSV, MEME, DYDX, LDO, RLC, PORTAL, POLYX, EGLD, CRV, ID, APE, ACE, MKR, AAVE, MDT, ALGO, TRU, EOS, DYM, BLUR, MOVR, SAND, BNX, CAKE, ENS, RDNT, COS, PEOPLE, VGX, ROSE'
g4 = 'VET, ONT, ONG, NMR, ERN, NULS, BEAMX, XAI, IMX, LQTY, CHR, PHA, POWR, MINA, ACH, NEO, PDA, TLM, KEY, GAL, AXS, REI, MAGIC, AXL, MASK, CTSI, VITE, OAX, SUSHI, FARM, SUPER, RONIN, KSM, FTT, IOTA, ADX, ANKR, SNX, XVG, ORN'
g5 = 'VIC, BOND, TFUEL, LSK, NKN, PROM, NTRN, TWT, ASTR, XLM, BAKE, RAY, C98, HOOK, XVS, MAV, STG, COTI, HIFI, MANA, KMD, POND, RVN, WOO, XTZ, AMP, DUSK, CTK, 1INCH, QNT, IOTX, KAVA, CVC, ONE, CYBER, EDU, ZIL, SLP, GMX, API3'
g6 = 'YFI, ENJ, STORJ, OGN, GLMR, MBOX, ALPACA, UNFI, XEC, DATA, SNT, WAVES, BEL, FLOW, FXS, MDX, STMX, CELO, RIF, UTK, DASH, GAS, HFT, AUCTION, VIB, PSG, DIA, OOKI, SANTOS, JOE, COMBO, ZEC, AMB, BLZ, OXT, COMP, LRC, LINA, ILV, ARPA'
g7 = 'BICO, REN, LTO, KDA, KP3R, AUDIO, ZEN, SFP, SYN, BETA, METIS, ZRX, VIDT, FORTH, RAD, DAR, SXP, MTL, STEEM, FUN, QKC, MBL, WING, SYS, ALPHA, DENT, GNS, CLV, OSMO, AKRO, GFT, QTUM, SPELL, TROY, SC, PYR, BURGER, CREAM, FLUX, PERP'
// g = 'ALCX, SKL, EPX, ATM, GTC, FIRO, CELR, KLAY, FLM, BNT, HOT, STORJ, QI, OGN, LIT, CVP, CVX, VOXEL, WAXP, AGLD, TKO, BIFI, DCR, AERGO, BADGER, PROS, FIDA, WBTC, ALICE, STPT, JUV, WBETH, ALPINE, PAXG, FOR, OMG, DEXE, XNO, AVA, RARE
// g = 'DODO, UMA, HARD, IOST, QUICK, ACM, REEF, REQ, PIVX, FIO, BTTC, CHESS, WAN, ACA, PUNDIX, JST, WRX, MLN, BSW, BAND, LOOM, ASR, LAZIO, OG, DGB, SCRT, ICX, BAL, GHST, ELF, DEGO, VTHO, GNO, PORTO, RPL, LOKA, STRAX, NEXO, DF, IRIS
  
// Settings Groups
gn1 = 'Appearance'
gn2 = 'Ticker selection'

// General Settings
dispType  = input.string('Screener', 'Display as', ['Screener', 'Group Average RSI'])
rsiSource = input.string('Price', 'RSI Source', ['Price', 'OBV', 'Open Interest'])
rsiLength = input.int(14, 'RSI Length')
rsiTf     = input.timeframe('', 'RSI Timeframe')
symGroup  = input.string('github#1', 'Group', ['github#1', 'github#2', 'github#3', 'github#4', 'github#5', 'github#6', 'github#7'])

// Appearance Settings
showChg    = input.bool(true, 'RSI Change Lines',                         inline = 'bl',  group = gn1)
showAvg    = input.bool(false, 'Average RSI Line',                        inline = 'bl',  group = gn1)
barSpace   = input.int(4, 'Space (bars)',                                                 group = gn1, tooltip = 'Number of bars between each RSI label.')
offset     = input.int(0, 'Offset',                                                       group = gn1, tooltip = 'Shift all labels right or left for N (Offset) number of bars')
useHm      = input.bool(true, 'Gradient coloring',                                        group = gn1)
col0       = input.color(#e1c8a4 , '     RSI: 50 - 0    ',              inline = '050', group = gn1)
col00      = input.color(#ec407a, '-',                                  inline = '050', group = gn1)
col1       = input.color(#e1c8a4, '     RSI: 50 - 100 ',                inline = '010', group = gn1)
col11      = input.color(#3179f5, '-',                                  inline = '010', group = gn1)
useBg      = input.bool(true, 'Color zones',                                              group = gn1)
zone1pCol  = input.color(color.rgb(120, 123, 134, 95), '     Zones>50', inline = 'z1',  group = gn1)
zone2pCol  = input.color(color.rgb(91, 156, 246, 100), '',              inline = 'z1',  group = gn1)
zone3pCol  = input.color(color.rgb(91, 156, 246, 100), '',              inline = 'z1',  group = gn1)
zone1nCol  = input.color(color.rgb(120, 123, 134, 95), '     Zones<50', inline = 'z2',  group = gn1)
zone2nCol  = input.color(color.rgb(198, 40, 93, 100), '',               inline = 'z2',  group = gn1)
zone3nCol  = input.color(color.rgb(198, 40, 93, 100), '',               inline = 'z2',  group = gn1)

// Ticker group github#1
group1  = input.text_area(g1, 'Ticker group github#1', group = gn2)
group1p = input.string('BINANCE:', '',inline = 'g1', group = gn2)
group1s = input.string('USDT',    '' ,inline = 'g1', group = gn2)

// Ticker group github#2
group2  = input.text_area(g2, 'Ticker group github#2', group = gn2)
group2p = input.string('BINANCE:', '',inline = 'g2', group = gn2)
group2s = input.string('USDT',    '' ,inline = 'g2', group = gn2)

// Ticker group github#3
group3  = input.text_area(g3, 'Ticker group github#3', group = gn2)
group3p = input.string('BINANCE:', '',inline = 'g3', group = gn2)
group3s = input.string('USDT',    '' ,inline = 'g3', group = gn2)

// Ticker group github#4
group4  = input.text_area(g4, 'Ticker group github#4', group = gn2)
group4p = input.string('BINANCE:', '',inline = 'g4', group = gn2)
group4s = input.string('USDT',    '' ,inline = 'g4', group = gn2)

// Ticker group github#5
group5  = input.text_area(g5, 'Ticker group github#5', group = gn2)
group5p = input.string('BINANCE:', '',inline = 'g5', group = gn2)
group5s = input.string('USDT',    '' ,inline = 'g5', group = gn2)

// Ticker group github#6
group6  = input.text_area(g6, 'Ticker group github#6', group = gn2)
group6p = input.string('BINANCE:', '',inline = 'g6', group = gn2)
group6s = input.string('USDT',    '' ,inline = 'g6', group = gn2)

// Ticker group github#7
group7  = input.text_area(g7, 'Ticker group github#7', group = gn2)
group7p = input.string('BINANCE:', '',inline = 'g7', group = gn2)
group7s = input.string('USDT',    '' ,inline = 'g7', group = gn2)

// Arrays
syms                = array.new_float()
prev                = array.new_float()
var label[] pLabels = array.new_label(40, na)
var line[]  pLines  = array.new_line (40, na)

// Getting ticker info based on selected group
selection = symGroup=='github#1' ? group1  : symGroup=='github#2' ? group2  : symGroup=='github#3' ? group3  : symGroup=='github#4' ? group4  : symGroup=='github#5' ? group5  : symGroup=='github#6' ? group6  : group7
pref      = symGroup=='github#1' ? group1p : symGroup=='github#2' ? group2p : symGroup=='github#3' ? group3p : symGroup=='github#4' ? group4p : symGroup=='github#5' ? group5p : symGroup=='github#6' ? group6p : group7p
suf       = symGroup=='github#1' ? group1s : symGroup=='github#2' ? group2s : symGroup=='github#3' ? group3s : symGroup=='github#4' ? group4s : symGroup=='github#5' ? group5s : symGroup=='github#6' ? group6s : group7s

// Function by @allanster - Extract the first ticker ID from a list, return the extracted ticker ID and an updated list with the extracted ticker removed.
feed(back) =>                                            
    loop  = back                                         
    getT  = string(na)                                   
    if str.length(loop) == 0                             
        getT := string(na)                               
        loop := string(na)                               
    else                                                 
        getP  = nz(str.pos(loop, ','), str.length(loop)) 
        getT := str.substring(loop, 0, getP)             
        dlim  = 1                                        
        if str.match(loop, ', ') == ', '                 
            dlim := 2                                    
        clrT  = str.substring(loop, 0, getP + dlim)      
        loop := str.replace(loop, clrT, '')              
    [getT, loop]    

// Function to calculate RSI
rsiSrc = rsiSource=='OBV' ? ta.obv : close
f_rsi(_tidN) =>
    tckr = rsiSource=='Open Interest' ? _tidN + 'USDT.P_OI' : pref + _tidN + suf                                     
    call = request.security(tckr, rsiTf, ta.rsi(rsiSrc, rsiLength), ignore_invalid_symbol = true)                     
    if str.length(_tidN) == 0                             
        call := float(na)      
    call     

// Function to push RSI values into arrays
f_push(val) =>
    if not na(val)
        array.push(syms, val)
        array.push(prev, val[14])

// Function for gradient/heatmap coloring based on RSI value
f_grad(x) =>
    above = color.from_gradient(x, 50, 80, col1, col11)
    below = color.from_gradient(x, 20, 50, col00, col0)
    x > 50 ? above : below          

// Function to create or update a label
createOrUpdateLabel(arr, idx, x_val, y_val, txt) =>
    if not na(y_val)
        lbl  = array.get(arr, idx)
        lcol = useHm ? f_grad(y_val) : color.gray
        ttp = txt + ' RSI: ' + str.tostring(math.round(y_val, 1))
        if na(lbl)
            lbl := label.new(x_val, y_val, text = txt + '\n' + '●', textcolor = lcol, style = label.style_none, size = size.normal, tooltip = ttp)
            array.set(arr, idx, lbl)
        else
            label.set_xy(lbl, x_val, y_val)
            label.set_textcolor(lbl, lcol)
            label.set_tooltip(lbl, ttp)

// Function to create or update a line
createOrUpdateLine(arr, idx, x_val, y_val, y2_val) =>
    if not na(y_val)
        li = array.get(arr, idx)
        if na(li)
            li := line.new(x_val, y_val, x_val, y2_val, color = color.gray, style = line.style_dotted)
            array.set(arr, idx, li)
        else
            line.set_xy1(li, x_val, y_val)
            line.set_xy2(li, x_val, y2_val )                           

// Extract tickers sequentially from the input list using feed() function
[tid1,  out1]  = feed(selection), [tid2,   out2]  = feed(out1),  [tid3,   out3]  = feed(out2),  [tid4,   out4]  = feed(out3)
[tid5,  out5]  = feed(out4),      [tid6,   out6]  = feed(out5),  [tid7,   out7]  = feed(out6),  [tid8,   out8]  = feed(out7)
[tid9,  out9]  = feed(out8),      [tid10, out10]  = feed(out9),  [tid11, out11]  = feed(out10), [tid12, out12]  = feed(out11)
[tid13, out13] = feed(out12),     [tid14, out14]  = feed(out13), [tid15, out15]  = feed(out14), [tid16, out16]  = feed(out15)
[tid17, out17] = feed(out16),     [tid18, out18]  = feed(out17), [tid19, out19]  = feed(out18), [tid20, out20]  = feed(out19)
[tid21, out21] = feed(out20),     [tid22, out22]  = feed(out21), [tid23, out23]  = feed(out22), [tid24, out24]  = feed(out23)
[tid25, out25] = feed(out24),     [tid26, out26]  = feed(out25), [tid27, out27]  = feed(out26), [tid28, out28]  = feed(out27)
[tid29, out29] = feed(out28),     [tid30, out30]  = feed(out29), [tid31, out31]  = feed(out30), [tid32, out32]  = feed(out31)
[tid33, out33] = feed(out32),     [tid34, out34]  = feed(out33), [tid35, out35]  = feed(out34), [tid36, out36]  = feed(out35)
[tid37, out37] = feed(out36),     [tid38, out38]  = feed(out37), [tid39, out39]  = feed(out38), [tid40, out40]  = feed(out39)

// Calculate RSI for each ticker
sym1  = f_rsi(tid1) , sym2  = f_rsi(tid2) , sym3  = f_rsi(tid3) , sym4  = f_rsi(tid4)
sym5  = f_rsi(tid5) , sym6  = f_rsi(tid6) , sym7  = f_rsi(tid7) , sym8  = f_rsi(tid8)
sym9  = f_rsi(tid9) , sym10 = f_rsi(tid10), sym11 = f_rsi(tid11), sym12 = f_rsi(tid12)
sym13 = f_rsi(tid13), sym14 = f_rsi(tid14), sym15 = f_rsi(tid15), sym16 = f_rsi(tid16)
sym17 = f_rsi(tid17), sym18 = f_rsi(tid18), sym19 = f_rsi(tid19), sym20 = f_rsi(tid20)
sym21 = f_rsi(tid21), sym22 = f_rsi(tid22), sym23 = f_rsi(tid23), sym24 = f_rsi(tid24)
sym25 = f_rsi(tid25), sym26 = f_rsi(tid26), sym27 = f_rsi(tid27), sym28 = f_rsi(tid28)
sym29 = f_rsi(tid29), sym30 = f_rsi(tid30), sym31 = f_rsi(tid31), sym32 = f_rsi(tid32)
sym33 = f_rsi(tid33), sym34 = f_rsi(tid34), sym35 = f_rsi(tid35), sym36 = f_rsi(tid36)
sym37 = f_rsi(tid37), sym38 = f_rsi(tid38), sym39 = f_rsi(tid39), sym40 = f_rsi(tid40)

// Push RSI values into arrays, so they can be used in a loop when generating labels
f_push(sym1 ), f_push(sym2 ), f_push(sym3 ), f_push(sym4 )
f_push(sym5 ), f_push(sym6 ), f_push(sym7 ), f_push(sym8 )
f_push(sym9 ), f_push(sym10), f_push(sym11), f_push(sym12)
f_push(sym13), f_push(sym14), f_push(sym15), f_push(sym16)
f_push(sym17), f_push(sym18), f_push(sym19), f_push(sym20)
f_push(sym21), f_push(sym22), f_push(sym23), f_push(sym24)
f_push(sym25), f_push(sym26), f_push(sym27), f_push(sym28)
f_push(sym29), f_push(sym30), f_push(sym31), f_push(sym32)
f_push(sym33), f_push(sym34), f_push(sym35), f_push(sym36)
f_push(sym37), f_push(sym38), f_push(sym39), f_push(sym40)

symnames = str.split(selection, ',')

// Generate labels for all available symbols 
if array.size(syms) > 0 and dispType=='Screener'
    // Loop through the symbols and create/update each label
    for i = 0 to array.size(syms) - 1
        x_val = bar_index[i * barSpace + offset + 4]
        y_val = array.get(syms, i)
        createOrUpdateLabel(pLabels, i, x_val, y_val, array.get(symnames, i))
        if showChg
            createOrUpdateLine(pLines, i, x_val, y_val, array.get(prev, i))

    if showAvg
        avg = array.avg(syms) 
        l  = line.new(bar_index, avg, bar_index[array.size(syms) * barSpace + offset + 4], avg, color = f_grad(avg), style = line.style_dashed)
        la = label.new(bar_index, avg, '◂ AVG RSI (' + str.tostring(math.round(avg, 1)) + ')', style = label.style_label_left, textcolor = f_grad(avg), color = color.rgb(255, 255, 255, 100))
        line.delete(l[1])
        label.delete(la[1])

// Generate levels
p100 = hline(100,  'Level 100', color = color.new(color.gray, 80), display = display.none)
p70  = hline(85 ,  'Level 70' , color = color.new(color.gray, 80))
p60  = hline(70 ,  'Level 60' , color = color.new(color.gray, 80))
p50  = hline(50 ,  'Level 50' , color = color.new(color.gray, 80))
p40  = hline(30 ,  'Level 50' , color = color.new(color.gray, 80))
p30  = hline(15 ,  'Level 30' , color = color.new(color.gray, 80))
p0   = hline(0  ,  'Level 0'  , color = color.new(color.gray, 80), display = display.none)

// Fill the zones between levels
fill(p50, p60 , color = useBg ? zone1pCol : na)
fill(p60, p70 , color = useBg ? zone2pCol : na)
fill(p70, p100, color = useBg ? zone3pCol : na)
fill(p50, p40,  color = useBg ? zone1nCol : na)
fill(p40, p30,  color = useBg ? zone2nCol : na)
fill(p30, p0 ,  color = useBg ? zone3nCol : na)

// Plot average RSI of all tickers in a group
plot(dispType=='Group Average RSI' ? array.avg(syms) : na, 'Group Average RSI' ,color = color.gray)

// Generate a title table
titleTable = table.new(position.top_center, 2, 2)

if barstate.islast
    tfs = (rsiTf=='' ? timeframe.period : str.tostring(rsiTf)) + (timeframe.isminutes ? 'm' : na)
    table.cell(titleTable, 0, 0, '• ' + 'RSI Screener' + ' •',    text_size = size.normal, text_color = color.gray, text_font_family = font.family_monospace)
    table.cell(titleTable, 0, 1, str.tostring(tfs) + ' • ' + str.tostring(rsiLength) + ' • ' + str.tostring(rsiSource), text_size = size.small,  text_color = color.gray, text_font_family = font.family_monospace)
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants