มีโจทย์ว่าต้องการคำนวนค่า Indicator ชื่อ RSI ของกองทุนรวมในต่างประเทศ ซึ่งปิดการซื้อขายเวลา 04:00 ของเวลาในประเทศไทย ทางกองทุนจะประกาศราคา (NAV) ในเวลาประมาณ 09:00 แต่ในการตัดสินใจลงทุน จะต้องพิจารณาค่า RSI ซึ่งกองทุนจะคำนวนและประกาศให้ประมาณ 12:00 ซึ่งบางทีก็หลงลืม และไม่ทันการ
การคำนวนค่า RSI ใช้ค่าการเปลี่ยนแปลงของราคา แบ่งเป็น Gain และ Loss แล้วมาหาค่าเฉลี่ยและเข้าสูตรคำนวน (ไม่ขอกล่าวถึง หากต้องการทราบข้อมูลเพิ่มเติม อ่าน http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi)
สรุปคือ หากต้องการทราบค่า RSI ก่อนที่ทางกองทุนจะประกาศให้ ก็ต้องคำนวนเอง โดยจดค่าการเปลี่ยนแปลงของราคาในแต่ละวันซึ่งเป็นงานที่น่าเบื่อ จึงต้องหาวิธีลดภาระ
แนวคิดคือ เว็บไซต์ http://www.bloomberg.com/quote/WGHCEPA:ID ซึ่งจะประกาศราคา NAV ในเวลา 09:00 นั้น หากเปิด HTML ดูจะพบว่าข้อมูลที่ต้องการจะอยู่ในรูปแบบของ
... <meta itemprop="price" content="46.92"> ... <meta itemprop="priceChange" content="0.16"> ... <meta itemprop="priceChangePercent" content="0.34"> ... <meta itemprop="quoteTime" content="2015-05-11T00:59:30-0400">
จากนั้น สร้าง Function ตามนี้
function getWGHCEPA(){ var content=UrlFetchApp.fetch("http://www.bloomberg.com/quote/WGHCEPA:ID"); //'<meta itemprop="priceChange" content="0.16">'; var data = content.getContentText().match(/meta itemprop="(.*)" content="(.*)"/mg ); var id="xxxxxxxxxxxxxxxxxxxx Your file ID xxxxxxxxxxxxxx"; var db=SpreadsheetApp.openById(id); var table=db.setActiveSheet(db.getSheetByName("Data")); var result=[]; for (var i=0; i<data.length; i++){ var temp=data[i].match(/meta itemprop="(.*)" content="(.*)"/); result[temp[1]]=temp[2]; } table.appendRow([result["quoteTime"], result["price"], result["priceChange"], result["priceChangePercent"]]); }
จากนั้น ตั้ง Trigger ให้ทำงานวันละครั้ง เวลาตั้งแต่ 09:00-10:00 เป็นอันเรียบร้อย
ผลที่ได้