미국장이 개장하는 시간인 9시,그리고 한국인이 투자가능해지는 시간인 5시에
전일 대비 얼마나 갭상 갭락했는지 보여주는 코드입니다. 이걸 보고 투자하기 편하겠죠?
1. 먼저 구글 스프레드 시트에 들어가서 시트명을 "투자현황"으로 바꾸시고,
이런 형태로 (체크를 원하는 )종목명을 입력합니다.
그리고 나서 "확장 프로그램 - app Script " 를 들어가면
여기에 아래의 코드를 복사 붙여넣기 합니다.
아래의 세개 api키는 발급을 받으셔야 합니다.
전부 무료고 쉽습니다. 텔레그램이 조금 걸리실 텐데
[Telegram Bot API] 1. Bot 생성 및 API Key, Bot id 얻기(python)
카카오톡으로 공모주 정보를 전달하려는데, 너무 제약이 많다. 카카오톡 채널을 생성하고 친구 추가한 모두에게 메시지를 전송하려면 건당 금액이 들고, 친구에게 보내는 API는 너무 제한적이어
hzoo.tistory.com
여기를 따라하시면 될 것 같네요.
그리고 데이터 무료로 받아올 API : https://finnhub.io/dashboard (야후 파이넨스는 무료를 종료 했더군요!)
여기는 1분에 60번 api호출이 공짜라고 하네요
/**
* Google Apps Script: 미국장 갭상/갭락 알림 (Finnhub API)
* – 매일 한국 시간 09:00·17:00 실행
* – Finnhub 무료 플랜(API key) 사용: 시가·전일종가 조회
* – Telegram Bot API로 알림 전송
*/
var FINNHUB_TOKEN = '발급받은API키'; // Alpha Vantage API 키
var TELEGRAM_TOKEN = '발급받은API키'; // Telegram 봇 토큰
var CHAT_ID = '발급받은API키';//
/**
* Telegram 메시지 전송
* @param {string} text Markdown 형식의 메시지
*/
function sendTelegramMessage(text) {
if (!text) return;
var url = 'https://api.telegram.org/bot' + TELEGRAM_TOKEN + '/sendMessage';
var payload = { chat_id: CHAT_ID, text: text, parse_mode: 'Markdown' };
var res = UrlFetchApp.fetch(url, { method: 'post', payload: payload, muteHttpExceptions: true });
Logger.log('[sendTelegram] code=%s, body=%s', res.getResponseCode(), res.getContentText());
}
/**
* Finnhub API로 단일 종목의 시가·전일종가 조회
* @param {string} symbol 티커 (예: 'AAPL')
* @return {{open:number, prevClose:number}|null}
*/
function fetchQuoteFH(symbol) {
var url = 'https://finnhub.io/api/v1/quote'
+ '?symbol=' + encodeURIComponent(symbol)
+ '&token=' + FINNHUB_TOKEN;
try {
var res = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var code = res.getResponseCode();
var body = res.getContentText();
Logger.log('[fetchQuoteFH] %s → code=%s, body=%s', symbol, code, body);
if (code !== 200) return null;
var j = JSON.parse(body);
// j.o = open, j.pc = previous close
if (j.o == null || j.pc == null) return null;
return { open: j.o, prevClose: j.pc };
} catch (e) {
Logger.log('[fetchQuoteFH] Exception %s: %s', symbol, e);
return null;
}
}
/**
* 갭상/갭락 체크 및 Telegram 알림
*/
function checkUSGapWithFinnhub() {
var now = new Date(), day = now.getDay();
Logger.log('[checkUSGap] start %s (weekday=%s)', now, day);
if (day === 0 || day === 6) {
Logger.log('[checkUSGap] 주말 스킵');
return;
}
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('투자현황');
if (!sheet) { Logger.log('[checkUSGap] ERROR: 시트 없음'); return; }
var lastRow = sheet.getLastRow();
if (lastRow < 2) { Logger.log('[checkUSGap] 티커 없음'); return; }
var tickers = sheet.getRange(2,1,lastRow-1,1).getValues().flat().filter(String);
Logger.log('[checkUSGap] 조회 티커: %s', JSON.stringify(tickers));
if (tickers.length === 0) return;
var lines = [];
tickers.forEach(function(sym) {
var q = fetchQuoteFH(sym);
if (!q) {
Logger.log('[checkUSGap] %s: 데이터 조회 실패', sym);
return;
}
var diff = q.open - q.prevClose;
if (diff === 0) {
Logger.log('[checkUSGap] %s: 갭 없음', sym);
return;
}
var pct = (diff / q.prevClose * 100).toFixed(2);
var icon = diff > 0 ? '📈 갭상↑' : '📉 갭락↓';
lines.push(
`*${sym}* ${icon}\n` +
`• 시가: ${q.open}\n` +
`• 전일 종가: ${q.prevClose}\n` +
`• 변동률: ${pct}%`
);
// 분당 60회 제한 고려: 필요시 sleep
Utilities.sleep(1000);
});
Logger.log('[checkUSGap] lines=%d', lines.length);
if (lines.length) {
var dateStr = Utilities.formatDate(now, 'Asia/Seoul', 'yyyy-MM-dd');
var header = `*미국장 갭 알림 (${dateStr})*`;
sendTelegramMessage(header + '\n\n' + lines.join('\n\n'));
}
}
/**
* 트리거 설정: 매일 09:00·17:00 (Asia/Seoul) 에 checkUSGapWithFinnhub 실행
*/
function setUpTriggers() {
ScriptApp.getProjectTriggers().forEach(function(tr) {
if (tr.getHandlerFunction() === 'checkUSGapWithFinnhub') {
ScriptApp.deleteTrigger(tr);
Logger.log('[setUpTriggers] 삭제된 트리거=%s', tr.getUniqueId());
}
});
[9,17].forEach(function(h) {
ScriptApp.newTrigger('checkUSGapWithFinnhub')
.timeBased().atHour(h).everyDays(1).inTimezone('Asia/Seoul').create();
Logger.log('[setUpTriggers] 생성된 트리거: 매일 %d시', h);
});
}
/**
* 트리거 비활성화
*/
function disableUSGapTriggers() {
ScriptApp.getProjectTriggers().forEach(function(tr) {
if (tr.getHandlerFunction() === 'checkUSGapWithFinnhub') {
ScriptApp.deleteTrigger(tr);
Logger.log('[disableTriggers] 삭제된 트리거=%s', tr.getUniqueId());
}
});
}
/**
* Telegram 연결 테스트
*/
function testTelegram() {
Logger.log('[testTelegram] 호출');
sendTelegramMessage('테스트 메시지: ' + Utilities.formatDate(new Date(), 'Asia/Seoul','yyyy-MM-dd HH:mm:ss'));
}
/**
* Telegram Updates 조회
*/
function getTelegramUpdates() {
Logger.log('[getUpdates] 호출');
var res = UrlFetchApp.fetch('https://api.telegram.org/bot'+TELEGRAM_TOKEN+'/getUpdates',
{ muteHttpExceptions:true });
Logger.log('[getUpdates] code=%s, body=%s', res.getResponseCode(), res.getContentText());
}
위 코드를 입력하고, checkUSGapWithFinnhub 테스트, setUpTriggers실행하시면 됩니다!.
이런 형태로 알람이 올 것입니다.
감사합니다.
추신
checkUSGapWithFinnhub 함수를 먼저 쓰면 텔레그램 알람 잘 가는지 체크가능
'IT - 코딩 > 트레이딩 관련' 카테고리의 다른 글
옵션 전략을 위한 일봉 데이터 주봉으로 변환 _ for Option[파생상품 옵션](with python) (1) | 2023.06.23 |
---|---|
환전소 금액 1초마다 크로링 (1) | 2023.05.22 |
1배숏을 응용한 차익거래 프로그램(주요 이슈 및 해결 방안) (1) | 2023.02.28 |
통계적 차익거래를 위한 데이터 분석 및 머신러닝 활용방안 (0) | 2023.02.27 |
무위험 차익거래 자동매매 프로그램 2.주요 이슈와 해결 내용. (0) | 2023.02.26 |