구글 스프레드시트로 만드는 비트코인 120일 이동평균 매매 신호 시스템과 알림 설정 방법

비트코인과 같은 암호화폐 시장은 24시간 운영되며 가격 변동이 심합니다. 많은 투자자들이 기술적 분석 지표를 활용하여 매매 타이밍을 결정하는데, 그중에서도 이동평균선은 가장 기본적이면서도 효과적인 지표로 알려져 있습니다. 이 글에서는 무료로 사용할 수 있는 구글 스프레드시트를 활용하여 비트코인 120일 이동평균 기반 매매 신호 시스템을 구축하고, 구글 챗으로 실시간 알림을 받는 방법을 단계별로 알아보겠습니다.

왜 120일 이동평균선을 사용하나요?

120일 이동평균선은 중장기 추세를 파악하는 데 유용한 지표입니다. 비트코인의 경우, 가격이 120일 이동평균선 위에 있으면 상승 추세로 보고 ‘매수’ 신호로, 아래에 있으면 하락 추세로 보고 ‘매도’ 신호로 해석할 수 있습니다. 물론 이것만으로 투자 결정을 내리는 것은 위험하지만, 기본적인 추세 파악과 매매 시그널로 활용하기에 좋은 지표입니다.

시스템 구축 전 준비사항

  • 구글 계정
  • 구글 스프레드시트 기본 사용법
  • 구글 챗 알림을 위한 웹훅 URL (선택사항)

1. 구글 스프레드시트 설정하기

1.1 실시간 비트코인 가격 데이터 가져오기

비트코인 가격을 가져오는 방법은 두 가지가 있습니다:

방법 1: GOOGLEFINANCE 함수 사용하기

가장 간단한 방법은 구글 스프레드시트의 내장 함수인 GOOGLEFINANCE를 사용하는 것입니다. A2 셀에 다음 함수를 입력합니다:

=GOOGLEFINANCE("CURRENCY:BTCUSD")

이 방법은 약 2분 지연된 데이터를 제공하지만, 별도의 설정 없이 바로 사용할 수 있다는 장점이 있습니다.

비트코인 120선 알림 스프레드시트 화면 - 현재 가격 92652.98, 120일 가격 91795.22644, 상태 '매수' 표시
비트코인 현재 가격이 120일 이동평균선을 상회하여 ‘매수’ 신호를 표시하는 구글 스프레드시트

방법 2: 바이낸스 API + IMPORTJSON 함수 사용하기

더 실시간에 가까운 데이터를 원한다면 바이낸스 API를 활용할 수 있습니다:

  1. 스프레드시트에서 ‘확장 프로그램 > Apps Script’를 선택합니다.
  2. 다음 코드를 입력하고 저장합니다:
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]];
}
  1. 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 조건부 서식 적용하기 (선택사항)

매수/매도 신호를 시각적으로 더 잘 구분하기 위해 조건부 서식을 적용해 봅시다:

  1. C2 셀을 선택한 후 ‘서식 > 조건부 서식’을 클릭합니다.
  2. “매수”일 때는 녹색, “매도”일 때는 빨간색으로 설정합니다.

2. 자동 새로고침 설정하기

스프레드시트가 자동으로 데이터를 새로고침하도록 설정해 봅시다:

  1. ‘파일 > 설정 > 계산’을 선택합니다.
  2. ‘변경 사항이 있을 때 및 1분마다’를 선택하고 저장합니다.

이렇게 하면 스프레드시트가 1분마다 자동으로 데이터를 새로고침합니다.

3. 구글 챗으로 알림 설정하기

이제 매수/매도 신호가 변경될 때마다 구글 챗으로 알림을 받도록 설정해 봅시다.

3.1 Apps Script 코드 작성하기

  1. ‘확장 프로그램 > Apps Script’를 선택합니다.
  2. 다음 코드를 입력합니다:
/* 설정값 */
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              // 실패 시 오류 메시지 확인용
  });
}

비트코인 매매 신호 Apps Script 코드 - checkSignal, sendChatMessage, sendEmailAlert 함수가 포함된 코드 스니펫
구글 스프레드시트와 연동된 Apps Script 코드로 비트코인 매매 신호를 감지하고 알림을 보내는 핵심 함수들

CHAT_WEBHOOK 변수에 실제 구글 챗 웹훅 URL을 입력하세요. 구글 챗 웹훅 URL을 얻는 방법은 구글 챗 스페이스의 설정에서 ‘앱 및 통합 > 웹훅 관리’에서 확인할 수 있습니다.

구글챗 웹훅 확인하는 방법

 

3.2 트리거 설정하기

  1. Apps Script 편집기에서 시계 아이콘을 클릭하거나 ‘트리거’를 선택합니다.
  2. ‘트리거 추가’ 버튼을 클릭합니다.
  3. 다음과 같이 설정합니다:
    • 실행할 함수: checkSignal
    • 이벤트 소스: ‘시간 기반’
    • 시간 간격: ‘분 단위’ – ‘매 5분마다’
  4. ‘저장’ 버튼을 클릭합니다.

이제 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);
  // ...
}

구글 채팅 앱에 표시된 비트코인 매수/매도 신호 알림 메시지들
Apps Script로 자동 전송되는 비트코인 매수/매도 신호 알림이 표시된 구글 채팅 화면

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 트리거 설정하기

  1. Apps Script 편집기에서 시계 아이콘을 클릭하거나 ‘트리거’를 선택합니다.
  2. ‘트리거 추가’ 버튼을 클릭합니다.
  3. 다음과 같이 설정합니다:
    • 실행할 함수: checkSignalAndSendEmail
    • 이벤트 소스: ‘시간 기반’
    • 시간 간격: ‘분 단위’ – ‘매 5분마다’
  4. ‘저장’ 버튼을 클릭합니다.

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 이메일 알림 사용 시 주의사항

  1. 이메일 할당량: Google Apps Script에는 일일 이메일 발송 한도가 있습니다(일반적으로 무료 Gmail 계정은 하루 100건). 너무 빈번한 알림은 이 한도에 도달할 수 있습니다.
  2. 스팸 필터: 자동 생성된 이메일이 스팸으로 분류될 수 있으므로, 최초 이메일을 받은 후에는 ‘스팸 아님’으로 표시하여 향후 알림이 받은편지함에 제대로 도착하도록 하세요.
  3. 이메일 지연: 이메일 전송 시스템의 특성상 알림이 약간 지연될 수 있습니다. 즉각적인 대응이 필요한 경우 Google Chat이나 SMS 알림이 더 적합할 수 있습니다.
  4. 권한 승인: 처음 스크립트를 실행할 때 이메일 전송 권한을 승인해야 합니다. 트리거를 설정한 후 처음에는 수동으로 함수를 실행하여 권한을 승인하는 것이 좋습니다.

이메일 알림은 구글 챗 알림에 비해 설정이 더 간단하고, 대부분의 사람들이 이메일을 자주 확인하기 때문에 효과적인 알림 방법입니다. 두 가지 알림 방법을 함께 사용하여 중요한 신호를 놓치지 않도록 할 수도 있습니다.

시스템 활용 및 주의사항

활용 방법

  1. 매매 결정 보조 도구: 이 시스템은 기술적 분석의 한 측면만을 보여주므로, 실제 매매 결정을 내릴 때는 다른 지표와 함께 고려하세요.
  2. 장기 추세 모니터링: 120일 이동평균선은 중장기적인 추세를 파악하는 데 유용합니다.
  3. 알림 기반 추가 분석: 알림을 받으면 다른 지표들을 함께 확인하여 신호의 유효성을 검증하세요.

주의사항

  1. API 호출 제한: 바이낸스 API를 사용할 경우 호출 제한에 주의하세요.
  2. 지연된 데이터: GOOGLEFINANCE 함수는 실시간 데이터가 아니라 약간의 지연이 있을 수 있습니다.
  3. 단일 지표의 한계: 이동평균선 하나만으로는 완벽한 매매 시그널을 얻기 어렵습니다.
  4. 투자 결정: 이 시스템은 참고용이며, 실제 투자 결정은 본인의 책임 하에 이루어져야 합니다.

시스템 확장 아이디어

  1. 여러 이동평균선 추가: 20일, 50일, 200일 등 다양한 이동평균선을 추가하여 골든 크로스, 데드 크로스 등의 신호를 감지할 수 있습니다.
  2. RSI, MACD 등 추가 지표: 다른 기술적 지표를 추가하여 더 복합적인 분석이 가능합니다.
  3. 여러 암호화폐 모니터링: 동일한 방식으로 이더리움, 리플 등 다른 암호화폐도 모니터링할 수 있습니다.
  4. 대시보드 시각화: 차트와 그래프를 추가하여 데이터를 시각적으로 분석할 수 있습니다.

결론

구글 스프레드시트와 Apps Script를 활용하면 비용 없이도 간단한 비트코인 매매 신호 시스템을 구축할 수 있습니다. 120일 이동평균선을 기준으로 매수/매도 신호를 생성하고, 구글 챗으로 알림까지 받을 수 있어 투자 결정에 도움이 됩니다. 이 시스템은 기본적인 틀을 제공하며, 사용자의 필요에 따라 다양하게 확장하고 커스터마이징할 수 있습니다.

암호화폐 투자는 높은 위험을 수반하므로, 이 시스템은 참고용으로만 활용하고 실제 투자 결정은 다양한 요소를 종합적으로 고려한 후 신중하게 내리시기 바랍니다. 항상 본인이 감당할 수 있는 수준 내에서 투자하는 것이 중요합니다.

이 글이 여러분의 투자 여정에 도움이 되길 바랍니다. 구글 스프레드시트의 강력한 기능을 활용하여 더 효과적인 투자 도구를 만들어보세요!