// Variables used by Scriptable. | |
// These must be at the very top of the file. Do not edit. | |
// icon-color: deep-blue; icon-glyph: book; share-sheet-inputs: plain-text; | |
// Stock Ticker Widget | |
let stocksInfo = await getStockData() | |
let widget = await createWidget() | |
if (config.runsInWidget) { | |
// The script runs inside a widget, so we pass our instance of ListWidget to be shown inside the widget on the Home Screen. | |
Script.setWidget(widget) | |
} else { | |
// The script runs inside the app, so we preview the widget. | |
widget.presentSmall() | |
} | |
// Calling Script.complete() signals to Scriptable that the script have finished running. | |
// This can speed up the execution, in particular when running the script from Shortcuts or using Siri. | |
Script.complete() | |
async function createWidget(api) { | |
let upticker = SFSymbol.named("chevron.up"); | |
let downticker = SFSymbol.named("chevron.down"); | |
let widget = new ListWidget() | |
// Add background gradient | |
let gradient = new LinearGradient() | |
gradient.locations = [0, 1] | |
gradient.colors = [ | |
new Color("141414"), | |
new Color("13233F") | |
] | |
widget.backgroundGradient = gradient | |
for(j=0; j<stocksInfo.length; j++) | |
{ | |
let currentStock = stocksInfo[j]; | |
let row1 = widget.addStack(); | |
// Add Stock Symbol | |
let stockSymbol = row1.addText(currentStock.symbol); | |
stockSymbol.textColor = Color.white(); | |
stockSymbol.font = Font.boldMonospacedSystemFont(12); | |
//Add Current Price | |
row1.addSpacer(); | |
let symbolPrice = row1.addText(currentStock.price); | |
symbolPrice.textColor = Color.white(); | |
symbolPrice.font = Font.boldMonospacedSystemFont(12); | |
//Second Row | |
widget.addSpacer(2) | |
let row2= widget.addStack(); | |
// Add Company name | |
let companyName= row2.addText(currentStock.name); | |
companyName.textColor = Color.white(); | |
companyName.textOpacity = 0.7; | |
companyName.font = Font.boldMonospacedSystemFont(9); | |
//Add Today's change in price | |
row2.addSpacer(); | |
let changeValue = row2.addText(currentStock.changevalue); | |
if(currentStock.changevalue < 0) { | |
changeValue.textColor = Color.red(); | |
} else { | |
changeValue.textColor = Color.green(); | |
} | |
changeValue.font = Font.boldMonospacedSystemFont(9); | |
// Add Ticker icon | |
row2.addSpacer(2); | |
let ticker = null; | |
if(currentStock.changevalue < 0){ | |
ticker = row2.addImage(downticker.image); | |
ticker.tintColor = Color.red(); | |
} else { | |
ticker = row2.addImage(upticker.image); | |
ticker.tintColor = Color.green(); | |
} | |
ticker.imageSize = new Size(8,8); | |
widget.addSpacer(6); | |
} | |
return widget | |
} | |
async function getStockData() { | |
let stocks = null; | |
// Read from WidgetParameter if present or use hardcoded values | |
// Provide values in Widget Parameter as comma seperated list | |
if(args.widgetParameter == null) { | |
stocks = ["PRGS", "AAPL", "INR=X", "XRP-USD"]; | |
} else { | |
stocks = args.widgetParameter.split(","); | |
} | |
let stocksdata = []; | |
for(i=0; i< stocks.length; i++) | |
{ | |
let stkdata = await queryStockData(stocks[i].trim()); | |
let price = stkdata.quoteSummary.result[0].price; | |
let priceKeys = Object.keys(price); | |
let data = {}; | |
data.symbol = price.symbol; | |
data.changepercent = (price.regularMarketChangePercent.raw * 100).toFixed(2); | |
data.changevalue = price.regularMarketChange.raw.toFixed(2); | |
data.price = price.regularMarketPrice.raw.toFixed(2); | |
data.high = price.regularMarketDayHigh.raw.toFixed(2); | |
data.low = price.regularMarketDayLow.raw.toFixed(2); | |
data.prevclose = price.regularMarketPreviousClose.raw.toFixed(2); | |
data.name = price.shortName; | |
stocksdata.push(data); | |
} | |
return stocksdata; | |
} | |
async function queryStockData(symbol) { | |
let url = "https://query1.finance.yahoo.com/v10/finance/quoteSummary/" + encodeURIComponent(symbol) + "?modules=price" | |
let req = new Request(url) | |
return await req.loadJSON() | |
} |
This comment has been minimized.
This comment has been minimized.
Hi, I found a bug, with the composite indexes the widget shows a ^/green value also if the index is negative. For example add NDAQ (nasdaq) and now is -0.36% but the widget shows only the value without the symbol +/- and it’s in green like a positive value but should be red. Probably is due how to indexes work that use point as a value instead of money. I haven’t checked the json query to yahoo and if this is fixable. Anyway for normal stocks and cryptos works perfectly! Thanks |
This comment has been minimized.
This comment has been minimized.
When I run the script I’m receiving the following error. 2020-11-22 15:38:20: Error on line 103:44: TypeError: null is not an object (evaluating 'stkdata.quoteSummary.result[0]') |
This comment has been minimized.
This comment has been minimized.
Hi, is it possible to configure a background image, as is possible in this great calendar script? https://github.com/JoeGit42/simple-calendar/blob/main/simple_calender.js |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
hey thanks for using this script. but i want to show the price of stock like 12345$ this script shows decimal? point like 12345.000 |
This comment has been minimized.
This comment has been minimized.
Change line 106 to that will show the price without decimal. |
This comment has been minimized.
This comment has been minimized.
wow thx i love you |
This comment has been minimized.
This comment has been minimized.
Hello, I'd possibly like to toggle this code and personalize it a little more. |
This comment has been minimized.
This comment has been minimized.
I think line 118 should be updated to use encodeURIComponent(). That way you don't have to remember to manually encode a symbol like
|
This comment has been minimized.
This comment has been minimized.
hey i want to open an external application when click this widget. or open stock application. how can i do it?? |
This comment has been minimized.
This comment has been minimized.
I love this, Are you able do a crypto version? Edit: Also how to I show Australian stocks, ie A200 |
This comment has been minimized.
This comment has been minimized.
Thanks for pointing that out. updated the script. |
This comment has been minimized.
This comment has been minimized.
This supports crypto as well, all you need to do is add the symbol. |
This comment has been minimized.
Instructions
a. Download the script to your scriptable app and add Scriptable Widget to home screen,
b. Edit Widget by activating the Jiggle mode
c. Choose the script, set it to run script.
d. Parameters: provide stock symbols you need to have on widget, separated by commas
Eg: GOOG, INR=X, BTC-USD, AAPL
Look of the widget -
Settings -
