평범한 이야기들

[PHP] PHP를 이용해 업비트(upbit) 자동매매하기 #1 이동평균선 계산하기 본문

평범한 개발 이야기/PHP

[PHP] PHP를 이용해 업비트(upbit) 자동매매하기 #1 이동평균선 계산하기

songsariya 2021. 4. 5. 17:00
728x90

 

 코인 거래도 주식거래와 동일하게 움직입니다. 즉 차트를 이용해 정보를 확인하고 추가 지표들을 이용해서 매수, 매도하는 기법을 사용합니다. (물론 코인은 느낌대로 매수, 매도하지 않을까 생각이 듭니다. ) 그래서 수많은 지표 중에 가장 기본이 되는 이동평균선을 구해서 저장하려고 합니다.

 

이동평균선

 이평선이라고 불리기도 합니다. 5일 이동평균선은 5일간의 주가를 평균 낸 값이며 10일 이평선은 10일 이런 식으로 주로 5, 10, 20, 60, 120 이동평균선을 사용합니다. 또한 5일 이동평균선은 5일간 사람들이 주식을 사고판 평균 가격이라고 보시면 됩니다.

 

 

 저는 업비트(Upbit)에서 3분 캔들 정보를 받아서 DB에 저장을 하고 해당 정보를 사용해 이동평균선을 구해 저장하려고 합니다. 1분 캔들 정보는 시간이 매우 촉박하다 보니 정보를 받아서 저장 후 이동평균선을 구해서 저장 프로세스를 따라갑니다. 그 후 이동평균선을 이용해 매수나 매도를 할 수 있는 프로그램을 만들거나, 급격히 상승하는 코인 정보가 있다면 알람(텔레그램이나 슬랙을 이용해서)을 알려줄 예정입니다.

 

분 캔들 정보를 저장하는 DB 테이블은 API에서 받는 필드명을 그대로 사용합니다. 그리고 마켓명과 시간을 키로 사용하여 저장을 하고 있습니다.

 

테이블 스키마

CREATE TABLE `upbit_minutes_candles` (
  `market` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '마켓명',
  `candle_date_time_utc` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '캔들 기준 시각(UTC 기준)',
  `candle_date_time_kst` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '캔들 기준 시각(KST 기준)',
  `opening_price` decimal(18,2) DEFAULT NULL COMMENT '시가',
  `high_price` decimal(18,2) DEFAULT NULL COMMENT '고가',
  `low_price` decimal(18,2) DEFAULT NULL COMMENT '저가',
  `trade_price` decimal(18,2) DEFAULT NULL COMMENT '종가',
  `timestamp` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '해당 캔들에서 마지막 틱이 저장된 시각',
  `candle_acc_trade_price` decimal(18,2) DEFAULT NULL COMMENT '누적 거래 금액',
  `candle_acc_trade_volume` decimal(18,2) DEFAULT NULL COMMENT '누적 거래량',
  `unit` int DEFAULT NULL COMMENT '분 단위(유닛)',
  PRIMARY KEY (`market`,`candle_date_time_kst`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

 

그리고 저장된 데이터를 이용해 이동평균선을 구하는 쿼리입니다.

SELECT SUM(IF(A.seq <= 5, A.price, 0)) / 5 AS ma5
  	 , SUM(IF(A.seq <= 10, A.price, 0)) / 10 AS ma10
  	 , SUM(IF(A.seq <= 20, A.price, 0)) / 20 AS ma20
  	 , SUM(IF(A.seq <= 60, A.price, 0)) / 60 AS ma60
  	 , SUM(IF(A.seq <= 120, A.price, 0)) / 120 AS ma120  
  FROM (        
    SELECT @rownum := @rownum + 1 AS seq 
    	 , (CAST(trade_price AS DECIMAL (18))) AS price                            
    	 , candle_date_time_kst
      FROM upbit_minutes_candles
         , (SELECT @rownum:=0) TMP
     WHERE market = '마켓명'
     ORDER BY candle_date_time_kst DESC 
     LIMIT 120
    ) A

마켓별로 5, 10, 20, 60, 120 3분 캔들의 이동평균선을 구해야 하기 때문에 120개의 행을 이용하며 마켓 한 개씩 계산해서 넣어주고 있습니다. (더 좋은 쿼리가 있을 거 같은데 급하게 만들다 보니깐 여기서 멈추고 그대로 진행했습니다.)

 

이렇게 구한 데이터를 이용해 이동평균선 매매기법을 사용해 자동 매매를 진행하면 될 것입니다. 이동평균선 매매기법 중 가장 유명한 기법은 골든크로스 매수, 데드크로스 매도 기법입니다.

  • 골든크로스
    골든 크로스란 단기 이동평균선이 장기 이동평균선을 뚫고 상승하는 것을 가리키는 말입니다.
  • 데드크로스
    데드 크로스란 단기 이동평균선이 장기 이동평균선을 꿇고 하락하는 것을 카르키는 말입니다.

 

저희가 구한 데이터를 이용해 골든크로스를 예측하거나 데드크로스를 예측해서 매매를 진행할 수 있습니다.  5 이평선이 상승하면서 60, 120 이평선에 가까워지고 있다면 골든크로스를 예측할 수 있고, 5 이평선이 하락하면서 60, 120, 이평선에 가까워지고 있으면 데드크로스를 예측할 수 있습니다. 그 외 상황은 무시해버리면 됩니다. 계속 상승하고 있는 코인이거나 계속 하락하고 있는 코인이기 때문이죠.

 

즉 실시간까지는 아니더라도 분 캔들 정보를 받고 이동평균선 정보를 저장한 후에 해당 내용을 계산하는 로직을 하나 더 추가하고 알람을 사용하거나 매매를 시도하시면 될 것 같습니다.

728x90
Comments