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クラスを作成する
-
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
Googleアカウントから「2段階認証プロセス」を「オン」にします。
16桁のパスワードを取得するアプリ名を入力して[生成]をクリックします。
16桁のアプリ専用のパスワードをコピーしてGmailConfigクラスのパスワードに設定します。
-
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=})"
図2ではGmailクラスのプロパティを表示しています。
-
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()
図3-1はデモプログラムの実行結果です。
図3-2はGmailの画面です。
ここでは受信メールの件名を表示しています。
図3-3ではメールの本文を表示しています。
-
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()
図4-1はデモプログラムの実行結果です。
図4-2はGmailの画面です。
ここでは受信メールの件名を表示しています。
図4-3ではメールの本文を表示しています。
ここでは「買い注文」の内容が表示されています。
-
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()