Python {Article114}

ようこそ「Python」へ...

ITエンジニアが仮想通貨の自作自動売買システム(bot)で月収7万円のパッシブインカムを得るには [6] BOTのGmailクラスを作成する

ここではITエンジニアがPythonで仮想通貨の自動売買システム(BOT)を作成してパッシブインカム(Passive Income)を得る方法を解説します。 「仮想通貨のボット(BOT)でパッシブインカムを得る」シリースは以下の11回に分けて解説します。 第6回目ではこのシリーズで作成するBOTのGmailクラスを作成する方法を解説します。 なお、このシリーズで作成するBOTは日本の取引所「GMOコイン」を利用することを前提にしています。 bitFlyer、Binanceなどの取引所を利用するBOTについては後日、別記事にて解説します。

予め断っておきますが、BOTを作成したからといってすぐには稼げるようにはなりません。 3ヶ月から6ヶ月かけて仮想取引とリアル取引をしてBOTのアルゴリズムとパラメータを調整する必要があります。 そうすれば半年後には投資額にもよりますが月5万円から10万円くらいは稼げるようになっているはずです。

半年経っても月10万円稼げないときは次の「座右の銘」を思い出してください。 きっと稼げるようになるはずです。

「上がり始めたら買え(下がっている間は買うな)。 下がり始めたなら売れ(上がっている間は売るな)。 また、そもそも当てられるわけのない天井や底で売買しようとするな。 一番安いところで買ったり、 一番高いところで売れるものだと思うな。」 このシリーズではMicrosoftのVisual Studio Code(VS Code)を使用しますが、Jupyter NotebookなどのツールでもOKです。 説明文の左側に図の画像が表示されていますが縮小されています。 画像を拡大するにはマウスを画像上に移動してクリックします。 画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。 画像の任意の場所をクリックして閉じることもできます。

【免責事項】
当記事や当サイトの情報を参考に仮想通貨のBOT(自動トレードプログラム)を動かす場合は、すべて自己責任でお願いいたします。 当サイトの情報を参考にして発生したいかなる損害も責任を負いません。

BOTのGmailクラスを作成する前に、予め以下の「オブジェクト指向プログラミング」のシリーズを読んでクラスの基本を理解してください。

BOTのGmailクラスを作成する

  1. GmailConfigクラスを作成する

    ここではGmailConfigクラスを作成します。 このクラスにはGmailのサーバー、ポート番号、パスワード、メールアドレス等の情報を定義します。

    Gmailを使用するには、2段階認証を設定してアプリ専用の16桁のパスワードを取得する必要があります。 Gmailの16桁のパスワードを取得する方法については 「記事(Article050)」で詳しく解説しています。

    パスワードを取得したらVisual Studio Code (VS Code)を起動して新規ファイル「gmail_config.py」を作成して行1-7を入力します。 行5-7にはご自分のメールアドレスとパスワードを入力してください。

    gmail_config.py:
    ################## GmailConfig class
    class GmailConfig:
        GMAIL_SERVER = 'smtp.gmail.com'    # your smtp server
        GMAIL_PORT = 587                   # your port number
        GMAIL_FROM = '●●●@gmail.com'    # your from email id
        GMAIL_TO = '●●●@gmail.com'      # your to email ids  
        GMAIL_PASS = '●●●'              # your email id's password

    click image to zoom!
    図1-1
    Googleアカウントから「2段階認証プロセス」を「オン」にします。


    click image to zoom!
    図1-2
    16桁のパスワードを取得するアプリ名を入力して[生成]をクリックします。


    click image to zoom!
    図1-3
    16桁のアプリ専用のパスワードをコピーしてGmailConfigクラスのパスワードに設定します。


  2. Gmailクラスを作成して__init__(), __str__()メソッドを追加する

    ここではGmailクラスを作成して__init__()と__str__()メソッドを追加します。 __init__()メソッドはGmailクラスのインスタンスを生成したときに自動的に呼ばれます。 __str__()メソッドはprint()等でGmailクラスを表示したときに呼ばれます。 __init__()、__str__()の詳しいことは、 「記事(Article085)」、 「記事(Article087)」で詳しく解説しています。

    gmail.py:
    # gmail.py
    
    """
    Gmail class
    """
    
    ### import the libraries
    import winsound
    
    from time import sleep  
    import datetime as dt
    
    # email
    import smtplib
    
    # email body
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    
    from lib.base import Gvar
    from lib.debug import Debug
    from lib.gmail_config import GmailConfig
    
    import warnings
    warnings.simplefilter('ignore')
    
    ############ gmail class
    class Gmail:
        """
        __init__(self, gvar, debug), __str__()
        send_gmail(), send_gmail_order()
        """        
        ########################################################
        def __init__(self, gvar: object, debug: object) -> None:
            self.gvar = gvar   
            self.debug = debug                            
    
        #########################
        def __str__(self) -> str:
            return f"Gmail({self.gvar=}, {self.debug=})"

    click image to zoom!
    図2
    図2ではGmailクラスのプロパティを表示しています。


  3. Gmailクラスにsend_gmail()メソッドを追加する

    ここではGmailクラスにsend_gamil()メソッドを追加します。 このメソッドは通常のメールを送信するときに使用します。 send_gmail()メソッドの引数にはメールの「件名」と「本文」を指定します。 「本文」はhtml形式で記述することができます。

    gmail.py:
        ###################################################### 
        def send_gmail(self, subject: str, body: str) -> None:    # ('subject', 'body message')
            # get email info
            SERVER = GmailConfig.GMAIL_SERVER  # smtp server
            PORT = GmailConfig.GMAIL_PORT      # port number
            FROM = GmailConfig.GMAIL_FROM      # from email id
            TO = GmailConfig.GMAIL_TO          # to email ids : can be a list
            PASS = GmailConfig.GMAIL_PASS      # email id's password
    
            msg = MIMEMultipart()
            msg['Subject'] = f'{subject}: ' + dt.datetime.now().strftime('%Y/%m/%d')  # Subject : 2022/09/24
            msg['From'] = FROM
            msg['To'] = TO
    
            content = f'{body}<br />'
            content +=('<br />End of body')
    
            msg.attach(MIMEText(content, 'html'))  
    
            server = smtplib.SMTP(SERVER, PORT)
            server.set_debuglevel(0)    # 0-suppress debug info, 1-display debug info
            server.ehlo()
            server.starttls()
            server.login(FROM, PASS)
            server.sendmail(FROM, TO, msg.as_string())
    
            self.debug.trace_write(f".... send_gmail(): {subject} ")    # send_gmail: Subject
            self.debug.sound_alert(1)  # alert 1 time
            server.quit()

    click image to zoom!
    図3-1
    図3-1はデモプログラムの実行結果です。


    click image to zoom!
    図3-2
    図3-2はGmailの画面です。 ここでは受信メールの件名を表示しています。


    click image to zoom!
    図3-3
    図3-3ではメールの本文を表示しています。


  4. Gmailクラスにsend_gmail_order()メソッドを追加する

    ここではGmailクラスにsend_gmail_order()メソッドを追加します。 このメソッドは仮想通貨の「買い注文」、「売り注文」をメールで送信します。 send_gmail_order()の引数1には仮想通貨のシンボル(BTC_JPY)を指定します。 引数2には「BUY」「SELL」のいずれかを指定します。 引数3には「注文内容」を指定します。 注文内容はhtml形式で記述することができます。

    gmail.py:
        ####################################################################### 
        def send_gmail_order(self, symbol: str, side: str, order: str) -> None:    # ('BTC_JPY', 'BUY' or 'SELL', 'order info')
            # get email info
            SERVER = GmailConfig.GMAIL_SERVER  # smtp server
            PORT = GmailConfig.GMAIL_PORT      # port number
            FROM = GmailConfig.GMAIL_FROM      # from email id
            TO = GmailConfig.GMAIL_TO          # to email ids  : can be a list
            PASS = GmailConfig.GMAIL_PASS      # email id's password
    
            msg = MIMEMultipart()
            msg['Subject'] = f'GMO {symbol} {side} ORDER: ' + dt.datetime.now().strftime('%Y/%m/%d')  # GMO BTC_JPN BUY ORDER: 2022/09/24
            msg['From'] = FROM
            msg['To'] = TO
    
            content = f'<b>GMO {symbol} {side} ORDER:</b><br />'
            content += f'domain={self.gvar.domain}, exchange={self.gvar.exchange}, real={self.gvar.real_mode} <br />'   # domain=desktop-pc, exchange=bot, real=True or False
        
            content += order
            # create_buy_order(buy_time, symbol=BTC_JPY, qty=0.01, price=999999)
            # create_sell_order(sell_time, symbol=BTC_JPY, ms_price_str=999999, buy_time=any): 
            content +=('<br />End of Order')
    
            msg.attach(MIMEText(content, 'html'))
    
            #print_log('.... send_gmail(): Initiating Server...')
    
            server = smtplib.SMTP(SERVER, PORT)
            server.set_debuglevel(0)    # 0-suppress debug info, 1-display debug info
            server.ehlo()
            server.starttls()
            server.login(FROM, PASS)
            server.sendmail(FROM, TO, msg.as_string())
    
            self.debug.trace_write(f".... send_gmail_order(): {symbol} {side}")    # send_gmail_order: BTC_JPY BUY or SELL
            self.debug.sound_alert(1)  # alert 1 time
            server.quit()

    click image to zoom!
    図4-1
    図4-1はデモプログラムの実行結果です。


    click image to zoom!
    図4-2
    図4-2はGmailの画面です。 ここでは受信メールの件名を表示しています。


    click image to zoom!
    図4-3
    図4-3ではメールの本文を表示しています。 ここでは「買い注文」の内容が表示されています。


  5. Gmailクラスの全てを掲載

    
    # gmail.py
    
    """
    Gmail class
    """
    
    ### import the libraries
    import winsound
    
    from time import sleep  
    import datetime as dt
    
    # email
    import smtplib
    
    # email body
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    
    from lib.base import Gvar
    from lib.debug import Debug
    from lib.gmail_config import GmailConfig
    
    import warnings
    warnings.simplefilter('ignore')
    
    ############ gmail class
    class Gmail:
        """
        __init__(self), __init__(self, gvar, debug), __str__()
        send_gmail(), send_gmail_order()
        """
        ###########################
        def __init__(self) -> None:
            self.gvar = Gvar()  
            self.debug = Debug()              
    
        ########################################################
        def __init__(self, gvar: object, debug: object) -> None:
            self.gvar = gvar   
            self.debug = debug                            
    
        #########################
        def __str__(self) -> str:
            return f"Gmail({self.gvar=}, {self.debug=})"    
        
        ###################################################### 
        def send_gmail(self, subject: str, body: str) -> None:    # ('subject', 'body message')
            # get email info
            SERVER = GmailConfig.GMAIL_SERVER  # smtp server
            PORT = GmailConfig.GMAIL_PORT      # port number
            FROM = GmailConfig.GMAIL_FROM      # from email id
            TO = GmailConfig.GMAIL_TO          # to email ids : can be a list
            PASS = GmailConfig.GMAIL_PASS      # email id's password
    
            msg = MIMEMultipart()
            msg['Subject'] = f'{subject}: ' + dt.datetime.now().strftime('%Y/%m/%d')  # GMO Subject : 2022/09/12
            msg['From'] = FROM
            msg['To'] = TO
    
            content = f'{body}<br />'
            content +=('<br />End of body')
    
            msg.attach(MIMEText(content, 'html'))  
    
            server = smtplib.SMTP(SERVER, PORT)
            server.set_debuglevel(0)    # 0-suppress debug info, 1-display debug info
            server.ehlo()
            server.starttls()
            server.login(FROM, PASS)
            server.sendmail(FROM, TO, msg.as_string())
    
            self.debug.trace_write(f".... send_gmail(): {subject} ")    # send_gmail: Subject
            self.debug.sound_alert(1)  # alert 1 time
            server.quit()   
    
        ####################################################################### 
        def send_gmail_order(self, symbol: str, side: str, order: str) -> None:    # ('BTC_JPY', 'BUY' or 'SELL', 'order info')
            # get email info
            SERVER = GmailConfig.GMAIL_SERVER  # smtp server
            PORT = GmailConfig.GMAIL_PORT      # port number
            FROM = GmailConfig.GMAIL_FROM      # from email id
            TO = GmailConfig.GMAIL_TO          # to email ids  # can be a list
            PASS = GmailConfig.GMAIL_PASS      # email id's password
    
            msg = MIMEMultipart()
            msg['Subject'] = f'GMO {symbol} {side} ORDER: ' + dt.datetime.now().strftime('%Y/%m/%d')  # GMO BTC_JPN BUY ORDER: 2022/09/12
            msg['From'] = FROM
            msg['To'] = TO
    
            content = f'<b>GMO {symbol} {side} ORDER:</b><br />'
            content += f'domain={self.gvar.domain}, exchange={self.gvar.exchange}, real={self.gvar.real_mode} <br />'   # domain=desktop-pc, exchange=bot, real=True or False
        
            content += order
            # create_buy_order(buy_time, symbol=BTC_JPY, qty=0.01, price=999999)
            # create_sell_order(sell_time, symbol=BTC_JPY, ms_price_str=999999, buy_time=any): 
            content +=('<br />End of Order')
    
            msg.attach(MIMEText(content, 'html'))
    
            #print_log('.... send_gmail(): Initiating Server...')
    
            server = smtplib.SMTP(SERVER, PORT)
            server.set_debuglevel(0)    # 0-suppress debug info, 1-display debug info
            server.ehlo()
            server.starttls()
            server.login(FROM, PASS)
            server.sendmail(FROM, TO, msg.as_string())
    
            self.debug.trace_write(f".... send_gmail_order(): {symbol} {side}")    # send_gmail_order: BTC BUY or SELL
            self.debug.sound_alert(1)  # alert 1 time
            server.quit()