빗썸API 자동매매일지 2021.04.17 17:00

가상화폐|2021. 4. 17. 18:02
반응형

안녕하세요?

 

간만에 자동매매일지를 올립니다.

최근 가상화폐의 급상승 이후, 알트코인들의 동반등락과 급락장세가 이어지면서,

비트코인 8천만원 신고가 달성의 그늘에서 저를 비롯하여 고생하시는 분들이 

많을 듯 합니다.

 

그래도 저는 자동매매의 희망을 놓지 않고, 

추세의 흐름속에서 돈버는 매수타이밍과 전략을 꾸준히 Update 해 나가고 있습니다.

 

현시점의 자산현황입니다.

투자원금에서 -9%이네요. 한때는 26%까지 수익을 올렸었는데, 지금은 마이너스 입니다.

어제 오늘 매수타이밍 로직을 추가 개선했습니다.

 

로직No. M5-1

###########################################################
# 5-1) 급등신호: MACD OSC 0선 이상 반전
#                    MA5, 10, 20, 60, 120 우상향 정배열 초입
#                    not(MA5 > MA10 > MA20) > MA60 > MA120
###########################################################

로직No. M8

#######################################################################################
# 8) macd_osc 0선이하에서 최저점을 돌아설때(최저가도 최저점을 돌아선다)(거래량도 점차 주는 현상이 있음)
#    macd signal 0선 아래에 있어야 한다. , 60이평선은 하락상태이며,
#    전전봉은 음봉이고, 현재봉은 양봉이면서, 전봉이 최저점을 찍고 상승전환하는 현상을 로직에 반영함
또한, macd도 전봉을 기준으로 감소에서 증가로 돌아설때가 현재 매수타이밍이다#######################################################################################

로직No. M9

#######################################################################################
# 9) macd_osc 0선이하에서 최저점을 돌아설때(최저가도 최저점을 돌아선다)(거래량도 점차 주는 현상이 있음)
# macd signal 0선 아래에 있어야 한다. , 60이평선은 하락상태이며,
# 양봉, 음봉 상관없이, 전전전봉부터 현재봉까지 최저가가 꾸준히 상승하고
# 또한, macd도 전봉을 기준으로 감소에서 증가로 돌아설때가 현재 매수타이밍이 된다.
#######################################################################################

 

이 로직이 적용된 결과 두건 체크해 보겠습니다.

퀀텀과 트론이 자동 매수되어 자동 매도 되었습니다.

퀀텀은 12:40분에 22,810원에 매수했다가 14:39분에 23,250원에 매도 되었네요.

약 4%이상? 수익률이 되겠네요? 정확한 %계산이 중요한게 아닙니다. 1%이상 수익만 나면 됩니다.

1%도 자동으로 늘었다가 줄었다가 하긴 합니다만, 최소는 1%이상 남도록 로직이 되어 있습니다.

 

트론은 14:35분에 213.1원에 매수했다가 217.2원에 매도 되었습니다. 이건 2.5%이상? 수익률 같습니다.

 

그럼, 이제, 매수매도 타이밍이 적절했는지 확인해 보겠습니다.

먼저, 퀀텀을 봐 볼게요.

 

12:39분에 자동매매프로그램에서 Slack에 남겨놓은 메세지 로그입니다.

일봉기준이 매수추천이 된 후,

곧바로 5분봉에 의해서 다시 매수추추천되어 바로 매수주문이 들어간 Slack 메세지 내용입니다.

 

로직No(M8)이라는 부분이

5분봉기준 로직 M8번 로직에 의해 매수타이밍을 잡았음을 알려줍니다.

그 당시의 실제 bithumb 5분봉차트를 확인해 보겠습니다.

Slack Message에 url 링크를 누르면 바로 해당 차트로 갑니다.

 

12:39분 매수는 12:35분봉을 현재봉으로 해서 판단하여 매수했으므로, 35분봉을 보셔야 합니다.

자동매매 프로그램은 25분봉, 30분봉, 35분봉 3개봉을 기준으로 39분에 판단했습니다.

매 5분봉의 최저가의 추이과 거래량추이, MACD OSC값의 추이, 그리고, 

macd선과 macd_signal선의 기울기 각도를 보고 판단했습니다.

어쩌면 저만의 비법인데.. 이렇게 밝혀도 되는지 모르겠습니다. ㅎㅎ

 

매수와 매도 타이밍으로 자동 거래된 부분을 표시하면 다음과 같습니다.

 

자동매매 프로그램에서 표시된 매매이력을 확인해 보겠습니다.

매수타이밍에는 "B"라고 표시되어 있고,  매도된 시간에는 "S"로 표시되어 있습니다.

트론도 이와 비슷하게 거래된 것 같습니다.

 

항상 이렇게만 거래된다면, 더이상 바랄게 없겠습니다만, 

문제는, 매수하여 매도타이밍 대기중인 코인이 계속해서 급락할때가 문제 같습니다.

매도 타이밍을 못잡거나, 매수하자마자 바로 급락으로 떨어지게되면, 매도타이밍을 잡을 수가 없겠죠...

 

급락장을 피하는 가장 좋은 방법은 최적의 매수타이밍까지 기다렸다가

타이밍이 오면 바로 매수하여 최소의 매도 수익을 달성하고 파는거라고 봅니다.

이것도 신의 영역이긴합니다만, 최대한 신의 영역에 다가가기 위해 노력하는거죠.. 

 

욕심내지 않고, 적절한 수익을 내고, 바로 빠지기~ 이게 최고입니다.

 

이 글이 자동매매를 이해하시는데 도움되길 바랍니다.

반응형

댓글()

파이썬3 웹 크롤링 HTTP error 403 발생시 해결방법

반응형

안녕하세요?

 

오늘은 그동안 잘 되던 웹크롤링에서 http error 403 이 발생하여 해결한 내용 기록하겠습니다.

 

urllib . error . HTTPError :   HTTP  Error  403 :  Forbidden

 

에러가 발생한 이유는 mod_security 또는 다른 비슷한 서버 시큐리티가 알려진 사용자 봇을 블록 시키기 때문이라고 합니다.

가이드에 따라,

브라우저 유저 에이전트를 시도해 보았습니다.

 

수정전>

from urllib.request import Request, urlopen

urlTicker = urllib.request.urlopen('https://api.bithumb.com/public/ticker/%s_KRW' % ticker) 
readTicker = urlTicker.read()
jsonTicker = json.loads(readTicker)

<수정후>

from urllib.request import Request, urlopen

urlTicker = 
Request('https://api.bithumb.com/public/ticker/%s_KRW' % ticker, headers={'User-Agent': 'Mozilla/5.0'})
readTicker = urlopen(urlTicker).read()
jsonTicker = json.loads(readTicker)

오~ 역시, 깔끔하게 해결이 되었습니다.

 

다음 블러그를 참조하여 작성하였습니다. 도움에 감사드립니다.

 

m.blog.naver.com/PostView.nhn?blogId=naturelove87&logNo=221908009605&proxyReferer=https:%2F%2Fwww.google.com%2F

 

파이썬3 웹 크롤링 HTTP error 403이 뜰 때 해결하는 방법

파이썬3에서 urllib.request를 사용할 때 HTTP Error 403이 뜰 때 해결하는 방법​다음과 같은 코드를...

blog.naver.com

https://stackoverflow.com/questions/16627227/http-error-403-in-python-3-web-scraping

 

HTTP error 403 in Python 3 Web Scraping

I was trying to scrap a website for practice, but I kept on getting the HTTP Error 403 (does it think I'm a bot)? Here is my code: #import requests import urllib.request from bs4 import Beautiful...

stackoverflow.com

 

반응형

댓글()

python exe 파일 실행시 failed to execute script 오류 해결하기

가상화폐|2021. 3. 7. 10:36
반응형

일단, pyinstaller를 삭제하고 다시 설치해 보겠습니다.

pip uninstall pyinstaller

다시 설치하기

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

다시 auto-py-to-exe 를 실행합니다.

하지만. 동일한 오류가 발생합니다. pyinstaller 버젼이나 설치오류와는 아무 관련이 없었습니다.

다시.. 여기 사이트를 참조하여 다시 해 보겠습니다.

In PyInstaller, Why Won't NumPy.Random.Common Load as a Module?

 

import pandas as pd 앞부분에 붉은색 부분 추가합니다.

# 추가한 부분
import numpy.random.common 
import numpy.random.bounded_integers 
import
 numpy.random.entropy

import pandas as pd

다음과 같이 다시 pyinstaller를 실행해 봅니다.

pyinstaller --icon=test.ico --onefile --noconsole -F -n goldcoin.exe -c --clean main.py
-F: 한 개의 파일로 만들기. 용량은 당연히 조금더 커진다. (없을 시 dll 파일들과 분리되어 폴더로 생성됨)
-n: 이름짓기. 이름은 바로 오른쪽에 기입 (없을 시 소스파일명과 동일한 파일이 생성됨)
--noconsole: exe파일 실행시 콘솔창 띄우지 않기
--onefile: import 된 라이브러리를 따로 생성하지 않고 exe 파일 안에 다 넣고 싶은 경우
--icon=test.ico: 실행파일의 아이콘을 바꾸고 싶다면 추가


D:\PycharmProject\BithumAPI\dist 여기에 goldcoin.exe파일이 잘 만들어져 있네요.

하지만.. 실행시에 다음과 같은 오류가 또... 

 

GUI 라이브러리를 사용할 때는 pyinstaller 후 생성된 .spec 파일을 수정해야 된다고 하네요.

(1) .spec 파일에서 라이브러리를 추가하고, coll 부분을 수정

(2) pyinstaller .spec

(3) .exe 파일 실행

 

함 해 보죠.. 

m.blog.naver.com/PostView.nhn?blogId=qbxlvnf11&logNo=221791248065&proxyReferer=https:%2F%2Fwww.google.com%2F

 

상세내용은 여기를 참조하라고 하네요..

kivy.org/doc/stable/guide/packaging-windows.html

 

다음은 main.spec의 내용입니다.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None



a = Analysis(['main.py'],
             pathex=['D:\\PycharmProject\\BithumAPI'],
             binaries=[],
             datas=[('./TA_Lib-0.4.19-cp37-cp37m-win32.whl', '.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='goldcoin.exe',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

 

이번에는 수정한 spec파일을 pyinstaller 실행합니다.

pyinstaller --icon=.\image\goldcoin_1.ico --onefile --noconsole -F -n goldcoin.exe -c --clean main.spec

여전히 talib.stream 모듈을 찾을수 없다는 에러가 떠서,

python 소스에 추가해 주었습니다.

import talib
import talib.stream

 

이제 talib.stream오류는 해결되었나 봅니다.

다른 오류가 뜹니다.

KeyError: 'formatters'

 

원인을 보니, log config파일을 실행단계에서  logging.conf파일을 가져오지 못하는 오류인것으로 보입니다.

일반적으로 py파일을 실행할때는 아무 문제가 없던 부분입니다.

 

하기 붉은 색 부분을 os.path함수를 이용해서 명시적으로 path를 지정해 줍니다.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging.config
from datetime import datetime
import os

class Logging():
    def __init__(self, config_path='config/logging.conf', log_path='log'):
        folderPath3 = os.path.abspath(os.getcwd()) + '/config'
        if not os.path.isdir(os.path.abspath(os.getcwd()) + '/config'):

           os.makedirs(os.path.abspath(os.getcwd()) + '/config')
        folderPath3 = str(folderPath3)
        config_path = os.path.abspath(folderPath3 + str("\\logging.conf"))

        folderPath3 = os.path.abspath(os.getcwd()) + '/log'
        if not os.path.isdir(os.path.abspath(os.getcwd()) + '/log'):

           os.makedirs(os.path.abspath(os.getcwd()) + '/log')
        log_path = str(folderPath3)
   
        self.config_path = config_path
        self.log_path = log_path

하지만, 소용이 없어 보입니다.

결국, pyinstaller에서 exe 실행파일 만들때는 log용 formater는 사용할 수가 없을 것 같습니다.

결국 모든 log 파일용 format 설정정보와 함수는 모두 지운후에 다시 실행해 보니, 정상적으로 exe파일이 실행됩니다.

pyinstaller --icon=.\image\goldcoin_1.ico --onefile --noconsole -F -n goldcoin.exe -c --clean main.spec

추가로, goldcoin.exe가 죽으면 계속해서 끊임없이 다시 실행시켜줄 ParentTrader.exe파일도 만들었습니다.

pyinstaller --onefile --noconsole -F -n ParentTrader.exe -c --clean ParentTrader.py

ParentTrader.exe를 실행하니, 다음과 같은 command창이 뜨면서 main창이 뜹니다.

여기서 "빗썸코인거래 시작"버튼을 누르면, 빗썸으로 자동접속되면서 매수추천 및 자동매매가 시작됩니다.

폴더내의 전체 파일 및 하위폴더 구조입니다.

반응형

댓글()

파이썬에서 Slack API를 통한 주식매매정보 보내기

반응형

안녕하세요?

 

오늘은 주식자동매매 구현시 자동매매 도중에 발생되는 정보나

Status, 추천종목정보, 자동매수 매도 결과를 자신의 Slack 메신저로 보내주기 위해

필요한 Slack API 설정 및 그 설정을 이용한 파이썬 코드, 

그리고, 그 결과 메세지가 전송된 결과 화면을 공유해 보고자 합니다.

 

1. slack API 설정화면

   하기 화면 메뉴에서 Bot User OAuth Access Token 값을 Copy합니다.

   여기서 token생성하는 과정은 다른 전문가님들의 가이드 메뉴 참조하시기 바랍니다.

   여기서는 생략하겠습니다. 

 

추가로, Scope도 추가 정의해 줘야 합니다.

slack bot에 access하는 application python에서 slack bot에 어떠어떠한 권한까지

가질수 있는지를 지정한다고 보시면 됩니다.

저는 channel읽기, chat에 글 올리기, 파일읽기 등 총 5가지 모두를 부여해 봤습니다.

 

2. Python slack.py 소스 코드

   우선 slack.py로 파이썬 코드를 분리했습니다.

   나중에 main 파이썬에서 from slack import *

   로 포함시키도록 하면 됩니다.

from slacker import Slacker

class Slack():
   def __init__(self):
       ############################################################
       # Slack API에서 "auto Traders" 
       # Installed App Settings
에서의 "OAuth Tokens for Your Team"
       #  >"Bot User OAuth Access Token"(Access Level: Workspace)
       ############################################################
       self.token = 'xoxb-1251878735248-1513295792086-k4wHoOdyjaWUsjXtVQL6JQeZ'

   def notification(self, pretext=None, title=None, fallback=None, text=None):
       attachments_dict = dict()
       attachments_dict['pretext'] = pretext
       attachments_dict['title'] = title
       attachments_dict['fallback'] = fallback
       attachments_dict['text'] = text

       attachments = [attachments_dict]

       slack = Slacker(self.token)
       slack.chat.post_message(channel='#gold-stock', text=None, attachments=attachments, as_user=None)

   Slack class내에 1번에서 copy한 token 값을 self.token에 저장하고,

   다른 class에서 notification 함수를 통해 호출할 수 있도록 정의합니다.

   

   다음은 main.py의 코드 일부입니다.

   매수 추천주를 골라서 slack으로 알려주는 기능입니다. 

from config.slack import *
...

class MyWindow(QWidget, metaclass=Singleton):
   def __init__(self, parent=None, **kwargs):
       super().__init__(parent, **kwargs)

      self.slack = Slack() # 슬랙 동작
   
  def ai_recommend_click(self):
      # 매수 추천주 확인
      market_status = self.get_recommend_items(stockCode, self.recommInterval, self.click_row)

      # 실제 매수 매도처리
      if market_status == "매수":
        self.slack.notification(pretext="(%s(%s)) 매수 추천종목" % (name, stockCode),
                                   t
itle="%s 자동매매 List에 추가했습니다. 로직No.(%s)" % (datetime.now().strftime("%Y-%m-%d %H:%M:%S"), str_decision_list),
                                   text="https://www.bithumb.com/trade/chart/" + stockCode + "_KRW")
      .
      .

 

이 부분이 slace에서 메세지로 받아보면 아래와 같은 메세지를 slack에서 자동으로 

받아볼 수 있습니다.

여기서 맨 마지막 URL Link를 누르면, 다음 화면으로 연결도 됩니다. ^^

 

이상으로 띄엄띄엄이긴 하지만, slack bot을 통해서

파이썬 자동매매 프로그램에서 종목을 추천한 결과를 slace 메세지로 보내고,

slack 에서 해당 메세지를 보고, 첨부된  url링크를 눌러서 

추가 상세정보도 확인할 수 있다는 걸 

간단한 예로 보여드렸습니다.

 

이상입니다.

반응형

댓글()

ValueError: invalid literal for int() with base 10

AI주식자동매매|2020. 5. 18. 10:06
반응형

파이썬 형변환에서 발생하는 오류입니다.

 

우리는 보통 형 변환시에는 하기 함수를 사용합니다.

문자형으로 바꿀 때는 str()

정수형으로 바꿀 때는 int()

실수형으로 바꿀 때는 float() 


문자열을 정수로 변환

>>> a = '10'

>>> int(a)

10

 

문자열을 실수로 변환

>>> b = '4.3'

>>> float(b)

4.3

 

정수를 문자열로 변환

>>> c = 7

>>> str(c)

'7'

 

실수를 문자열로 변환

>>> d = 2.71

>>> str(d)

'2.71'

 

문제 상황

 

하지만, 여기서 문제 상황은 조금 다릅니다.

>>> d = '51,800'

>>> int(d)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '51,800'

 

파이썬에서 다음 라인에서 에러가 걸렸습니다.

self.currentPrice = int(thirdColumnInRow.text()) 

 

thirdColumnInRow.text() 의 value가 '51,800'이기 때문에 바로 int()함수를 사용할 수 없기 때문입니다.

콤마(',')를 제거한 후 int()함수를 사용해야 합니다.

 

해결 방법

 

currentPrice = thirdColumnInRow.text().strip().replace(',', '')
self.currentPrice = int(currentPrice) 

 

이렇게 로직을 수정하니 깔끔하게 해결되었습니다.

반응형

댓글()