비트코인과 같은 암호화폐 시장은 24시간 운영되며 가격 변동이 심합니다. 많은 투자자들이 기술적 분석 지표를 활용하여 매매 타이밍을 결정하는데, 그중에서도 이동평균선은 가장 기본적이면서도 효과적인 지표로 알려져 있습니다. 이 글에서는 무료로 사용할 수 있는 구글 스프레드시트를 활용하여 비트코인 120일 이동평균 기반 매매 신호 시스템을 구축하고, 구글 챗으로 실시간 알림을 받는 방법을 단계별로 알아보겠습니다.
왜 120일 이동평균선을 사용하나요?
120일 이동평균선은 중장기 추세를 파악하는 데 유용한 지표입니다. 비트코인의 경우, 가격이 120일 이동평균선 위에 있으면 상승 추세로 보고 ‘매수’ 신호로, 아래에 있으면 하락 추세로 보고 ‘매도’ 신호로 해석할 수 있습니다. 물론 이것만으로 투자 결정을 내리는 것은 위험하지만, 기본적인 추세 파악과 매매 시그널로 활용하기에 좋은 지표입니다.
시스템 구축 전 준비사항
- 구글 계정
- 구글 스프레드시트 기본 사용법
- 구글 챗 알림을 위한 웹훅 URL (선택사항)
1. 구글 스프레드시트 설정하기
1.1 실시간 비트코인 가격 데이터 가져오기
비트코인 가격을 가져오는 방법은 두 가지가 있습니다:
방법 1: GOOGLEFINANCE 함수 사용하기
가장 간단한 방법은 구글 스프레드시트의 내장 함수인 GOOGLEFINANCE를 사용하는 것입니다. A2 셀에 다음 함수를 입력합니다:
=GOOGLEFINANCE("CURRENCY:BTCUSD")
이 방법은 약 2분 지연된 데이터를 제공하지만, 별도의 설정 없이 바로 사용할 수 있다는 장점이 있습니다.

방법 2: 바이낸스 API + IMPORTJSON 함수 사용하기
더 실시간에 가까운 데이터를 원한다면 바이낸스 API를 활용할 수 있습니다:
- 스프레드시트에서 ‘확장 프로그램 > Apps Script’를 선택합니다.
- 다음 코드를 입력하고 저장합니다:
function IMPORTJSON(url, query, noHeaders) {
var json = UrlFetchApp.fetch(url).getContentText();
var data = JSON.parse(json);
var path = query.split("/");
for (var i=0; i<path.length; i++){ if(path[i]) data = data[path[i]]; }
return [[data]];
}
- A2 셀에 다음 함수를 입력합니다:
=VALUE(IMPORTJSON("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT","/price",0))
이 함수는 바이낸스에서 제공하는 BTC/USDT 실시간 가격을 가져옵니다. 바이낸스 API는 초당 10회 정도의 호출 제한이 있으나, 스프레드시트의 자동 새로고침 주기를 고려하면 충분합니다.
1.2 120일 이동평균 계산하기
B2 셀에 다음 함수를 입력하여 120일 이동평균을 계산합니다:
=AVERAGE(QUERY(GOOGLEFINANCE("CURRENCY:BTCUSD","close",TODAY()-119,TODAY()), "select Col2",0))
이 함수는 오늘부터 과거 119일까지(총 120일) 비트코인의 종가 데이터를 가져와 평균을 계산합니다. GOOGLEFINANCE 함수는 “close” 속성을 사용할 때 반드시 기간을 지정해야 합니다.
1.3 매수/매도 신호 생성하기
C2 셀에 다음 함수를 입력하여 매수/매도 신호를 생성합니다:
=IF(A2 < B2, "매도", "매수")
이 함수는 현재 비트코인 가격(A2)이 120일 이동평균(B2)보다 낮으면 “매도” 신호를, 높으면 “매수” 신호를 표시합니다.
1.4 조건부 서식 적용하기 (선택사항)
매수/매도 신호를 시각적으로 더 잘 구분하기 위해 조건부 서식을 적용해 봅시다:
- C2 셀을 선택한 후 ‘서식 > 조건부 서식’을 클릭합니다.
- “매수”일 때는 녹색, “매도”일 때는 빨간색으로 설정합니다.
2. 자동 새로고침 설정하기
스프레드시트가 자동으로 데이터를 새로고침하도록 설정해 봅시다:
- ‘파일 > 설정 > 계산’을 선택합니다.
- ‘변경 사항이 있을 때 및 1분마다’를 선택하고 저장합니다.
이렇게 하면 스프레드시트가 1분마다 자동으로 데이터를 새로고침합니다.
3. 구글 챗으로 알림 설정하기
이제 매수/매도 신호가 변경될 때마다 구글 챗으로 알림을 받도록 설정해 봅시다.
3.1 Apps Script 코드 작성하기
- ‘확장 프로그램 > Apps Script’를 선택합니다.
- 다음 코드를 입력합니다:
/* 설정값 */
const SHEET_NAME = 'Sheet1'; // 비트코인 데이터를 넣어둔 시트 이름
const SIGNAL_CELL = 'C2'; // 매수/매도 결과 셀
// Google Chat 웹훅 URL을 여기에 입력하세요
const CHAT_WEBHOOK = '여기에_실제_웹훅_URL을_입력하세요';
/**
* 시간 트리거로 주기 실행
* 이전 값과 달라지면 Google Chat 알림
*/
function checkSignal() {
const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
const signal = sheet.getRange(SIGNAL_CELL).getValue().toString().trim(); // 현재 신호
const props = PropertiesService.getScriptProperties();
const prev = props.getProperty('prevSignal') || ''; // 직전 신호
if (signal && signal !== prev) { // 바뀌었을 때만 알림
sendChatMessage(signal);
props.setProperty('prevSignal', signal); // 새 값 저장
}
}
/** Google Chat 웹훅으로 메시지 전송 */
function sendChatMessage(text) {
const payload = JSON.stringify({ text: `📢 비트코인 **${text}** 신호 발생` });
UrlFetchApp.fetch(CHAT_WEBHOOK, {
method : 'post',
contentType: 'application/json',
payload: payload,
muteHttpExceptions: true // 실패 시 오류 메시지 확인용
});
}

CHAT_WEBHOOK 변수에 실제 구글 챗 웹훅 URL을 입력하세요. 구글 챗 웹훅 URL을 얻는 방법은 구글 챗 스페이스의 설정에서 ‘앱 및 통합 > 웹훅 관리’에서 확인할 수 있습니다.
3.2 트리거 설정하기
- Apps Script 편집기에서 시계 아이콘을 클릭하거나 ‘트리거’를 선택합니다.
- ‘트리거 추가’ 버튼을 클릭합니다.
- 다음과 같이 설정합니다:
- 실행할 함수:
checkSignal
- 이벤트 소스: ‘시간 기반’
- 시간 간격: ‘분 단위’ – ‘매 5분마다’
- 실행할 함수:
- ‘저장’ 버튼을 클릭합니다.
이제 5분마다 스크립트가 실행되어 매수/매도 신호가 변경될 때마다 구글 챗으로 알림을 보내게 됩니다.
3.3 특정 시간에만 알림 받기 (선택사항)
시장이 활발한 시간대나 자신이 모니터링하고 싶은 특정 시간대에만 알림을 받고 싶다면, 다음과 같이 코드를 수정할 수 있습니다:
function checkSignal() {
const now = new Date();
// 오전 8시부터 오후 7시까지만 알림 보내기
if (now.getHours() < 8 || now.getHours() >= 19) return;
// 기존 코드 계속...
const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
// ...
}

3-2. 이메일로 알림 받는 방법
구글 챗 외에도 이메일로 매수/매도 신호 알림을 받고 싶은 경우가 있을 수 있습니다. 이메일 알림은 설정이 더 간단하고 별도의 웹훅 URL이 필요 없다는 장점이 있습니다. 아래 방법을 통해 비트코인 매매 신호가 변경될 때마다 이메일 알림을 받을 수 있습니다.
3-2.1 Apps Script 코드 수정하기
기존 Apps Script 코드를 다음과 같이 수정하거나 새로운 함수를 추가합니다:
/* 설정값 */
const SHEET_NAME = 'Sheet1'; // 비트코인 데이터를 넣어둔 시트 이름
const SIGNAL_CELL = 'C2'; // 매수/매도 결과 셀
const PRICE_CELL = 'A2'; // 비트코인 현재 가격 셀
const MA_CELL = 'B2'; // 120일 이동평균 셀
const EMAIL_ADDRESS = 'your.email@gmail.com'; // 알림을 받을 이메일 주소
/**
* 시간 트리거로 주기 실행
* 이전 값과 달라지면 이메일 알림
*/
function checkSignalAndSendEmail() {
const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
const signal = sheet.getRange(SIGNAL_CELL).getValue().toString().trim(); // 현재 신호
const price = sheet.getRange(PRICE_CELL).getValue(); // 현재 가격
const ma = sheet.getRange(MA_CELL).getValue(); // 이동평균
const props = PropertiesService.getScriptProperties();
const prev = props.getProperty('prevSignal') || ''; // 직전 신호
if (signal && signal !== prev) { // 바뀌었을 때만 알림
sendEmailAlert(signal, price, ma);
props.setProperty('prevSignal', signal); // 새 값 저장
}
}
/** 이메일로 알림 보내기 */
function sendEmailAlert(signal, price, ma) {
const subject = `비트코인 ${signal} 신호 발생 알림`;
// 이메일 본문 작성
const formattedPrice = Utilities.formatString('$%.2f', price);
const formattedMA = Utilities.formatString('$%.2f', ma);
const priceDiff = price - ma;
const percentDiff = (priceDiff / ma) * 100;
let body = `안녕하세요,\n\n`;
body += `비트코인 가격이 120일 이동평균선을 ${signal === '매수' ? '상향' : '하향'} 돌파하여 "${signal}" 신호가 발생했습니다.\n\n`;
body += `• 현재 비트코인 가격: ${formattedPrice}\n`;
body += `• 120일 이동평균: ${formattedMA}\n`;
body += `• 이동평균과의 차이: ${Utilities.formatString('$%.2f', priceDiff)} (${Utilities.formatString('%.2f', percentDiff)}%)\n\n`;
body += `시간: ${new Date().toLocaleString()}\n\n`;
body += `이 알림은 자동으로 생성되었습니다. 투자 결정을 내리기 전에 추가 분석을 권장합니다.\n`;
// 이메일 전송
MailApp.sendEmail({
to: EMAIL_ADDRESS,
subject: subject,
body: body
});
// 로그 기록 (디버깅용)
Logger.log(`이메일 알림 전송 완료: ${signal} 신호 (${formattedPrice})`);
}
이 코드에서 EMAIL_ADDRESS
변수에 알림을 받고 싶은 이메일 주소를 입력하세요.
3-2.2 트리거 설정하기
- Apps Script 편집기에서 시계 아이콘을 클릭하거나 ‘트리거’를 선택합니다.
- ‘트리거 추가’ 버튼을 클릭합니다.
- 다음과 같이 설정합니다:
- 실행할 함수:
checkSignalAndSendEmail
- 이벤트 소스: ‘시간 기반’
- 시간 간격: ‘분 단위’ – ‘매 5분마다’
- 실행할 함수:
- ‘저장’ 버튼을 클릭합니다.
3-2.3 고급 이메일 알림 옵션
HTML 이메일로 더 시각적인 알림 보내기
더 보기 좋은 이메일 알림을 원한다면 HTML 형식의 이메일을 보낼 수 있습니다:
function sendEmailAlert(signal, price, ma) {
const subject = `비트코인 ${signal} 신호 발생 알림`;
const formattedPrice = Utilities.formatString('$%.2f', price);
const formattedMA = Utilities.formatString('$%.2f', ma);
const priceDiff = price - ma;
const percentDiff = (priceDiff / ma) * 100;
// 신호에 따른 색상 설정
const signalColor = signal === '매수' ? '#28a745' : '#dc3545';
// HTML 이메일 본문
let htmlBody = `
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px;">
<h2 style="color: ${signalColor};">비트코인 ${signal} 신호 발생</h2>
<p>비트코인 가격이 120일 이동평균선을 ${signal === '매수' ? '상향' : '하향'} 돌파했습니다.</p>
<div style="background-color: #f8f9fa; padding: 15px; border-radius: 5px; margin: 15px 0;">
<p style="margin: 5px 0;"><strong>현재 비트코인 가격:</strong> ${formattedPrice}</p>
<p style="margin: 5px 0;"><strong>120일 이동평균:</strong> ${formattedMA}</p>
<p style="margin: 5px 0;"><strong>이동평균과의 차이:</strong> ${Utilities.formatString('$%.2f', priceDiff)} (${Utilities.formatString('%.2f', percentDiff)}%)</p>
</div>
<p style="color: #666; font-size: 12px;">시간: ${new Date().toLocaleString()}</p>
<p style="color: #666; font-size: 12px;">이 알림은 자동으로 생성되었습니다. 투자 결정을 내리기 전에 추가 분석을 권장합니다.</p>
</div>
`;
// 텍스트 버전도 함께 제공 (일부 이메일 클라이언트에서 HTML을 지원하지 않는 경우를 위해)
let plainBody = `비트코인 ${signal} 신호 발생\n\n`;
plainBody += `• 현재 비트코인 가격: ${formattedPrice}\n`;
plainBody += `• 120일 이동평균: ${formattedMA}\n`;
plainBody += `• 이동평균과의 차이: ${Utilities.formatString('$%.2f', priceDiff)} (${Utilities.formatString('%.2f', percentDiff)}%)\n\n`;
plainBody += `시간: ${new Date().toLocaleString()}\n\n`;
// 이메일 전송
MailApp.sendEmail({
to: EMAIL_ADDRESS,
subject: subject,
htmlBody: htmlBody,
body: plainBody
});
}
여러 수신자에게 알림 보내기
여러 사람에게 알림을 보내고 싶다면 다음과 같이 코드를 수정할 수 있습니다:
const EMAIL_ADDRESSES = ['email1@gmail.com', 'email2@gmail.com', 'email3@gmail.com'];
function sendEmailAlert(signal, price, ma) {
// ... 이메일 내용 작성 코드 ...
// 모든 수신자에게 이메일 전송
EMAIL_ADDRESSES.forEach(email => {
MailApp.sendEmail({
to: email,
subject: subject,
htmlBody: htmlBody,
body: plainBody
});
});
}
특정 조건에서만 알림 보내기
매일 모든 신호 변경에 대해 알림을 받는 것이 아니라, 특정 조건에서만 알림을 받고 싶을 수 있습니다:
function checkSignalAndSendEmail() {
// ... 기존 코드 ...
if (signal && signal !== prev) {
// 특정 조건 추가: 가격이 이동평균에서 5% 이상 차이날 때만 알림
const priceDiff = Math.abs(price - ma);
const percentDiff = (priceDiff / ma) * 100;
if (percentDiff >= 5) {
sendEmailAlert(signal, price, ma);
props.setProperty('prevSignal', signal);
} else {
// 값이 바뀌었지만 차이가 작아서 알림은 보내지 않음
props.setProperty('prevSignal', signal);
Logger.log(`신호가 변경되었으나 차이가 작음: ${percentDiff.toFixed(2)}%`);
}
}
}
3-2.4 이메일 알림 사용 시 주의사항
- 이메일 할당량: Google Apps Script에는 일일 이메일 발송 한도가 있습니다(일반적으로 무료 Gmail 계정은 하루 100건). 너무 빈번한 알림은 이 한도에 도달할 수 있습니다.
- 스팸 필터: 자동 생성된 이메일이 스팸으로 분류될 수 있으므로, 최초 이메일을 받은 후에는 ‘스팸 아님’으로 표시하여 향후 알림이 받은편지함에 제대로 도착하도록 하세요.
- 이메일 지연: 이메일 전송 시스템의 특성상 알림이 약간 지연될 수 있습니다. 즉각적인 대응이 필요한 경우 Google Chat이나 SMS 알림이 더 적합할 수 있습니다.
- 권한 승인: 처음 스크립트를 실행할 때 이메일 전송 권한을 승인해야 합니다. 트리거를 설정한 후 처음에는 수동으로 함수를 실행하여 권한을 승인하는 것이 좋습니다.
이메일 알림은 구글 챗 알림에 비해 설정이 더 간단하고, 대부분의 사람들이 이메일을 자주 확인하기 때문에 효과적인 알림 방법입니다. 두 가지 알림 방법을 함께 사용하여 중요한 신호를 놓치지 않도록 할 수도 있습니다.
시스템 활용 및 주의사항
활용 방법
- 매매 결정 보조 도구: 이 시스템은 기술적 분석의 한 측면만을 보여주므로, 실제 매매 결정을 내릴 때는 다른 지표와 함께 고려하세요.
- 장기 추세 모니터링: 120일 이동평균선은 중장기적인 추세를 파악하는 데 유용합니다.
- 알림 기반 추가 분석: 알림을 받으면 다른 지표들을 함께 확인하여 신호의 유효성을 검증하세요.
주의사항
- API 호출 제한: 바이낸스 API를 사용할 경우 호출 제한에 주의하세요.
- 지연된 데이터: GOOGLEFINANCE 함수는 실시간 데이터가 아니라 약간의 지연이 있을 수 있습니다.
- 단일 지표의 한계: 이동평균선 하나만으로는 완벽한 매매 시그널을 얻기 어렵습니다.
- 투자 결정: 이 시스템은 참고용이며, 실제 투자 결정은 본인의 책임 하에 이루어져야 합니다.
시스템 확장 아이디어
- 여러 이동평균선 추가: 20일, 50일, 200일 등 다양한 이동평균선을 추가하여 골든 크로스, 데드 크로스 등의 신호를 감지할 수 있습니다.
- RSI, MACD 등 추가 지표: 다른 기술적 지표를 추가하여 더 복합적인 분석이 가능합니다.
- 여러 암호화폐 모니터링: 동일한 방식으로 이더리움, 리플 등 다른 암호화폐도 모니터링할 수 있습니다.
- 대시보드 시각화: 차트와 그래프를 추가하여 데이터를 시각적으로 분석할 수 있습니다.
결론
구글 스프레드시트와 Apps Script를 활용하면 비용 없이도 간단한 비트코인 매매 신호 시스템을 구축할 수 있습니다. 120일 이동평균선을 기준으로 매수/매도 신호를 생성하고, 구글 챗으로 알림까지 받을 수 있어 투자 결정에 도움이 됩니다. 이 시스템은 기본적인 틀을 제공하며, 사용자의 필요에 따라 다양하게 확장하고 커스터마이징할 수 있습니다.
암호화폐 투자는 높은 위험을 수반하므로, 이 시스템은 참고용으로만 활용하고 실제 투자 결정은 다양한 요소를 종합적으로 고려한 후 신중하게 내리시기 바랍니다. 항상 본인이 감당할 수 있는 수준 내에서 투자하는 것이 중요합니다.
이 글이 여러분의 투자 여정에 도움이 되길 바랍니다. 구글 스프레드시트의 강력한 기능을 활용하여 더 효과적인 투자 도구를 만들어보세요!