Python {Article154}

ようこそ「Python」へ...

仮想通貨の自動トレードBOTで月6万円稼ぐ!20代・60代でも実現できる理由

はじめに質問です。20代と60代の人の共通点は何だと思いますか。 それは「自由な時間はあるがお金がない」ということです。 もちろん、例外はあります。

20代の方へ!

大学を卒業して就職して社会人になったのはいいけれど、 どうも自分はサラリーマンには向いていないと考えたことはありませんか。 「石の上にも三年」という諺がありますが、 サラリーマンに向いていなくても3年間は、 今の会社で頑張ってみようという選択肢もあります。

しかし、頑張り過ぎて「鬱」になる人も少なくありません。 そこで、フリーランスとして生きることを考えて見てはどうでしょか。 フリーランスになると、自分の好きな時間に、好きな場所で、好きな仕事ができます。 そんな理想的な生き方を実現できるかもしれません。

今は、インターネットを使えばさまざまな方法でお金を稼ぐことができます。
  • 株、FX、仮想通貨の投資で稼ぐ
  • ブログやSNSで収益化する
  • デザインやプログラミングなどのスキルを活かして仕事を請ける
  • オンラインレッスンやセミナーを開く
  • 商品やサービスを販売する
おすすめなのは、Pythonのプログラミング言語を勉強して仮想通貨のBOTを作って稼ぐことです。 後述しますが、今がBOTで稼ぐ絶好のタイミングです。

60代の方へ!

国民年金のみで生活する高齢者世帯の増加が問題になっています。 国民年金の平均受給額は、2022年度で月額約65,000円です。 この金額では、一人暮らしでも生活が苦しいという人が多くいます。

そこで、アルバイトやパート、副業など、さまざまな仕事をして生活費を補填する人が増えています。 また、節約をしながら、少ない収入で生活する人もいます。 巷では、5万円から10万円で暮らす節約本や稼ぐ本がたくさん販売されています。
  • BIG tomorrowマネー 年金プラス10万円!「金持ち老後」を手に入れる5つの方法(雑誌)
  • 72歳ひとり暮らし、「年金月5万」が教えてくれたお金との向き合いかた40(著者:紫苑)
  • もう、年金に頼らない: 月収5万円からはじめるインターネット起業入門(著者:中村静雄)
しかし、節約に目を向けていては、本当に幸せな老後を送ることは難しいのではないでしょうか。 自分の好きなことでお金を稼いで、節約しなくても、そこそこの生活ができるような生き方の方が、充実した老後を送ることができるのではないでしょうか。

お金を稼ぐというと、すぐに「他人に雇われる」と考える人が多いと思います。 しかし、第二の人生は、「他人に雇われない」でお金を稼ぐ方法を考えるべきではないでしょうか。

そういった意味でも、「投資」で稼ぐことが60代のシニアにとって賢い選択なのではないでしょうか。 余談ですが、健康で長生きする秘訣は生涯現役で仕事(投資)をすることです。 投資はどうしてもできないという人は、 自分のスキルを活かしてフリーランスとして働いたり、趣味や特技を活かして副業を始めるといった選択肢もあります。

働きたくても、働けなくなって後悔する前に「人的資本(自分がすでに持っている経済的な価値: 技能や知識、時間)」から「金融資本」へシフトしたらどうでしょうか。

本シリーズでは「自由な時間」を「お金」に変える方法を教えます。 具体的にどのようにして「お金」を稼ぐかといえば、 Pythonで仮想通貨の自動トレードのBOTを作成して稼ぎます。 BOTを使用した自動トレードで利益が出るようになれば、 あなたが寝ている間でもBOTが24時間365日お金を稼いでくれます。 つまり、不労所得(Passive Income)を得ることが可能になります。

ただし、Pythonで自動トレード用のBOTをゼロから作るのは高度なプログラミングスキルが必要になります。 そこで、BOTを作るための基本的な部分はPythonのクラスライブラリとして無償で公開します。 このクラス・ライブラリを使用すれば、Pythonの初心者でも簡単にBOTを作成することができます。

なぜ、「今」、「Pythonで仮想通貨のBOTを作る」必要があるのか?

仮想通貨のBOTで利益を上げるための秘訣は、さまざまなテクニカル指数を使用して未来の相場を予測することです。 テクニカル指数には、移動平均線、ボリンジャーバンド、RSIなどさまざまな種類があり、それぞれに特徴があります。 これらのテクニカル指数を組み合わせることで、より精度の高い相場予測を行うことができます。

生成AIの登場により、これらのテクニカル指数を組み合わせた相場予測モデルを簡単に作成することができるようになりました。 これまでは、これらのテクニカル指数を調べて、Pythonで実装するには、専門的な知識やスキルが必要でした。 しかし、生成AIを利用することで、これらの作業時間を大幅に短縮することができ、誰でも簡単に相場予測モデルを作成することができるようになりました。

例えば、ChatGPTやGoogle Bardを利用することで、以下のコードを生成することができます。
import pandas as pd
import numpy as np

def technical_analysis(data):
    # 移動平均線
    close = data['Close']
    moving_average = close.rolling(window=20).mean()

    # ボリンジャーバンド
    upper_band = moving_average + 2 * np.std(close)
    lower_band = moving_average - 2 * np.std(close)

    # RSI
    rsi = pd.Series(np.zeros(len(data)))
    for i in range(len(data)):
        rsi[i] = 100 - (100 / (1 + (data['Close'][i] - data['Close'].rolling(window=14).min()) / (data['Close'].rolling(window=14).max() - data['Close'].rolling(window=14).min())))

    return {
        'moving_average': moving_average,
        'bollinger_band': [upper_band, lower_band],
        'rsi': rsi
    }

data = pd.read_csv('data.csv')

technical_analysis(data)

このコードは、移動平均線、ボリンジャーバンド、RSIの3つのテクニカル指数を組み合わせた相場予測モデルを作成しています。 生成AIを利用することで、このようなコードを簡単に作成することができるようになりました。

生成AIの登場により、仮想通貨のBOTで利益を上げるためのハードルが大きく下がりました。 これまでは、専門的な知識やスキルがないと、仮想通貨のBOTを作成することは困難でした。 しかし、生成AIを利用することで、誰でも簡単に仮想通貨のBOTを作成することができるようになりました。

仮想通貨のBOTは、うまく活用することで、高い収益を得ることができます。 生成AIの活用により、仮想通貨のBOTで利益を上げるためのチャンスが広がったと言えるでしょう。

本シリーズは、10回から20回くらいに分けて1週間に1回の頻度で配信する予定です。
  • [1]仮想通貨の自動トレードBOTの本番環境を公開します
  • [2]Pythonで自動トレードBOTを開発する環境を構築しよう
  • [3]仮想通貨の取引所APIを取得して、データのダウンロードを始めよう
  • [4]トレンド解析で、仮想通貨の値動きを予測しよう
  • [5]チャートパターン解析で、より精度の高い取引ルールを設計しよう
  • [6]AI(機械学習)で仮想通貨の未来の価格を予測しよう
  • [7]バックテストで、取引ルールの有効性を検証しよう
  • [8]本番運用で、自動トレードBOTを稼働させよう
本シリーズでは、MicrosoftのVisual Studio Code(VS Code)を使用します。 説明文の左側に図の画像が表示されていますが縮小されています。 画像を拡大するにはマウスを画像上に移動してクリックします。 画像が拡大表示されます。拡大された画像を閉じるには右上の[X]をクリックします。 画像の任意の場所をクリックして閉じることもできます。

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


仮想通貨の自動トレードBOTの本番環境を公開します

BOTを利用した自動トレードの本番運用環境

「木を見て森を見ず」という諺がありますが、本シリーズではまず「森」を見せて、それから「木」そして木の「枝」「葉」という順番で解説します。 シリーズ初回では、実際に私が運用している本番の環境を公開します。
  1. BOTのフォルダ・ファイル構成

    自動トレードのフォルダ・ファイル構成は、「リスト1」のようになっています。 「Gmo」フォルダには、Pythonのプログラムファイル(LoadMaster.py, GmoResetConfig.py, GmoVerifyOpenPositions.py, FakeBot.py, RealBot.py)が格納されています。

    「lib」フォルダには、BOTのクラスファイル(base.py, debug.py, gmail.py,...)が格納されています。

    「root」フォルダはBOTが使用するフォルダです。 「root」フォルダには、GMOコインからダウンロードした仮想通貨の取引データがCSVファイル「master(BTC_JPY).csv, master_buy(BTC_JPY), master_sell(BTC_JPY).csv,...」に作成されます。 これらのCSVファイルは、バックエンドの「LoadMaster.py」プログラムが作成します。

    「root/fake」フォルダは、「FakeBot.py」プログラムが使用します。 「root/real」フォルダは、「RealBot.py」プログラムが使用します。

    「root/fake」フォルダには、BOT専用のフォルダ「bot1A, bot1B, bot1C,..」があります。 そして、「root/fake/bot1A」フォルダには「buy_sell」と「sell_buy」フォルダがあります。 「buy_sell」フォルダには「買いと売り」注文の各種CSVファイルが作成されます。 「sell_buy」フォルダには「空売りと買い戻し」注文の各種CSVファイルが作成されます。

    「root/real」フォルダには、BOT専用のフォルダ「bot1A, bot1B, bot1C,..」があります。 そして、「root/real/bot1A」フォルダには「buy_sell」と「sell_buy」フォルダがあります。 「buy_sell」フォルダには「買いと売り」注文の各種CSVファイルが作成されます。 「sell_buy」フォルダには「空売りと買い戻し」注文の各種CSVファイルが作成されます。

    BOTの環境設定ファイル「config.csv」は、 「root」「fake」「real」、そして各BOT専用のフォルダ「bot1A, bot1B, bot1C,...」に格納されています。

    リスト1: BOTのフォルダ・ファイル構成
    Gmo/
    ├── LoadMaster.py
    ├── GmoResetConfig.py
    ├── GmoVerifyOpenPositions.py
    ├── FakeBot.py
    ├── RealBot.py
    ├── lib/
    │   ├── base.py
    │   ├── debug.py
    │   ├── gmail.py
    │   ├── gmail_config.py
    │   ├── coin.py
    │   ├── api.py
    │   ├── csv.py
    │   ├── trade.py
    │   └── buy_sell.py
    │   └── sell_buy.py
    └── root/
        ├── config.csv
        ├── master(BTC_JPY).csv
        ├── master_buy(BTC_JPY).csv
        ├── master_sell(BTC_JPY).csv
        └── fake/
            ├── config.csv
            └── bot1A/
                ├── config.csv
                ├── log(yyyymmdd).txt
                └── buy_sell/
                    ├── buy_order(BTC_JPY).csv
                    ├── buy_order_sub(BTC_JPY).csv
                    ├── buy_order_child(BTC_JPY).csv
                    ├── sell_order(BTC_JPY).csv
                    ├── sell_order_sub(BTC_JPY).csv
                    ├── sell_order_child(BTC_JPY).csv
                    ├── buy_order(BTC_JPY)_header.csv
                    ├── buy_order_sub(BTC_JPY)_header.csv
                    ├── buy_order_child(BTC_JPY)_header.csv
                    ├── sell_order(BTC_JPY)_header.csv
                    ├── sell_order_sub(BTC_JPY)_header.csv
                    ├── sell_order_child(BTC_JPY)_header.csv
                    └── order(BTC_JPY).csv
                    └── order(BTC_JPY).xlsx
                └── sell_buy/
                    ├── buy_order(BTC_JPY).csv
                    ├── buy_order_sub(BTC_JPY).csv
                    ├── buy_order_child(BTC_JPY).csv
                    ├── sell_order(BTC_JPY).csv
                    ├── sell_order_sub(BTC_JPY).csv
                    ├── sell_order_child(BTC_JPY).csv
                    ├── buy_order(BTC_JPY)_header.csv
                    ├── buy_order_sub(BTC_JPY)_header.csv
                    ├── buy_order_child(BTC_JPY)_header.csv
                    ├── sell_order(BTC_JPY)_header.csv
                    ├── sell_order_sub(BTC_JPY)_header.csv
                    ├── sell_order_child(BTC_JPY)_header.csv
                    └── order(BTC_JPY).csv
                    └── order(BTC_JPY).xlsx
            └── bot2A/
                ├── buy_sell/
                └── sell_buy/
            └── bot3A/
                ├── buy_sell/
                └── sell_buy/
            :::::::::::::
            └── bot9A/
                ├── buy_sell/
                └── sell_buy/
        └── real/
            ├── config.csv
            ├── daily_profit.csv
            ├── daily_net_proft.csv
            ├── daily_bot_profit.csv
            ├── daily_bot_order_count.csv
            ├── open_positions_found.csv
            ├── open_positions_not_found.csv
            └── bot1A/
                ├── config.csv
                ├── log(yyyymmdd).txt
                └── buy_sell/
                    ├── buy_order(BTC_JPY).csv
                    ├── buy_order_sub(BTC_JPY).csv
                    ├── buy_order_child(BTC_JPY).csv
                    ├── sell_order(BTC_JPY).csv
                    ├── sell_order_sub(BTC_JPY).csv
                    ├── sell_order_child(BTC_JPY).csv
                    ├── buy_order(BTC_JPY)_header.csv
                    ├── buy_order_sub(BTC_JPY)_header.csv
                    ├── buy_order_child(BTC_JPY)_header.csv
                    ├── sell_order(BTC_JPY)_header.csv
                    ├── sell_order_sub(BTC_JPY)_header.csv
                    ├── sell_order_child(BTC_JPY)_header.csv
                    └── order(BTC_JPY).csv
                    └── order(BTC_JPY).xlsx
                └── sell_buy/
                    ├── buy_order(BTC_JPY).csv
                    ├── buy_order_sub(BTC_JPY).csv
                    ├── buy_order_child(BTC_JPY).csv
                    ├── sell_order(BTC_JPY).csv
                    ├── sell_order_sub(BTC_JPY).csv
                    ├── sell_order_child(BTC_JPY).csv
                    ├── buy_order(BTC_JPY)_header.csv
                    ├── buy_order_sub(BTC_JPY)_header.csv
                    ├── buy_order_child(BTC_JPY)_header.csv
                    ├── sell_order(BTC_JPY)_header.csv
                    ├── sell_order_sub(BTC_JPY)_header.csv
                    ├── sell_order_child(BTC_JPY)_header.csv
                    └── order(BTC_JPY).csv
                    └── order(BTC_JPY).xlsx
            └── bot2A/
                ├── buy_sell/
                └── sell_buy/
            └── bot3A/
                ├── buy_sell/
                └── sell_buy/
            :::::::::::::
            └── bot9A/
                ├── buy_sell/
                └── sell_buy/
    

    click image to zoom!
    図1-1
    図1-1では「root」フォルダの「config.csv」ファイルの内容を表示しています。 この環境設定ファイルは全てのBOTを停止させるときに使用します。 「config.csv」ファイルの「run_mode」のカラムに「stop bot」を設定すると、全てのBOTが停止します。 「LoadMaster.py」のプログラムを停止させるときは「stop master」を設定します。 全てのBOTと「LoadMaster.py」を停止させるときは「stop all」を設定します。 BOTと「LoadMaster.py」を再起動させるときは「run」を設定します。


    click image to zoom!
    図1-2
    図1-2では「root」フォルダに格納されている「master(BTC_JPY).csv」ファイルの内容を表示しています。 ここでは「BTC」の取引データを表示しています。 このCSVファイルには、取引データとして「price, side, size, timestamp」が格納されます。 「master(BTC_JPY).csv」ファイルは、バックエンドの「LoadMaster.py」が作成します。 masterファイルは各コイン(BTC_JPY, ETH_JPY, XRP_JPY, BCH_JPY, LTC_JPY)ごとに作成されます。

    「LoadMaster.py」は、「master_buy(BTC_JPY).csv」と「master_sell(BTC_JPY).csv」ファイルも作成しますが、 これらのファイルの内容については後述します。


    click image to zoom!
    図1-3
    図1-3では「root/real」フォルダに格納されている「config.csv」ファイルの内容を表示しています。 この環境設定ファイルは「run_mode, daily_profit_target, daily_trade_max_count」のカラムから構成されています。

    「run_mode」のカラムには「run, stop」を設定します。 「daily_profit_target」のカラムには「日次目標利益額」を設定します。 例えば、月6万円稼ぎたいとします。 この場合、1日当たり2000円稼ぐと月6万円になります。 BOTを27本走らせれば、 BOT当たり約「75」円稼げばよいことになるので「daily_profit_target」のカラムに「75」円を設定します。 この金額なら稼げそうな気がしませんか?

    参考までに、27本のBOTを同時に走らせると投資金額は50万円から100万円くらい必要です。 レバレッジを2倍にすれば100万円から200万円まで投資できます。

    「daily_trade_max_count」のカラムには、日次のBOTの約定件数の目標値を設定します。 月6万円稼ぎたいときは「3」くらいの件数を設定します。 ここで設定した情報は、「root/real」直下のすべてのBOTに適用されます。

    参考までに、私の場合「日次利益目標額」に「9999」円を設定しています。 「日次約定件数」に「9」を設定しています。


    click image to zoom!
    図1-4
    図1-4には「root/real」フォルダに格納されている「daily_profit.csv」ファイルの内容を表示しています。 このCSVファイルには、仮想通貨ごとの「損益額」と「約定件数」が格納されます。 このCSVファイルは、仮想通貨ごとのパフォーマンスを評価するときに参考にすると便利です。


    click image to zoom!
    図1-5
    図1-5には「root/real」フォルダに格納されている「daily_bot_profit.csv」ファイルの内容を表示しています。 このCSVファイルには、BOTごとの「損益額」と「目標達成」フラグが格納されています。 このCSVファイルは、BOTが目標を達成したかどうかを管理するのに使用します。


    click image to zoom!
    図1-6
    図1-6には「root/real」フォルダに格納されている「open_positions_found.csv」ファイルの内容を表示しています。 このCSVファイルには、まだ決済されていないポジション(買いと売りのポジション:ロングポジション、ショートポジション)とBOTとの対応情報が格納されています。 このCSVファイルは、今BOTのパフォーマンスがどんな状態かを把握するときに使用します。 また、手動で利確、損切りするときにも使用します。

    手動で利確、損切りするときは、BOT(root/real/bot1X)の環境設定ファイル「config.csv」の「close_pending_orders_request」カラムに「close」を設定します。 詳細は後述します。


    click image to zoom!
    図1-7
    図1-7には「root/real/bot1X」フォルダに格納されている「config.csv」ファイルの内容を表示しています。 この環境設定ファイルは「run_mode, close_pending_orders_request, daily_profit_target, daily_trade_max_count」のカラムから構成されています。

    「run_mode」には、「run」「stop」を設定します。「stop」を設定するとBOTが停止します。

    「close_pending_orders_requestには「open」「close」「close_buy」「close_sell」を設定します。 「close」を設定すると、BOTが保持している「ポジション」を決済して「損切りまたは利確」します。 「close_buy」を設定すると、BOTが保持している「買いポジション:ロングポジション」を決済して「損切りまたは利確」します。 「close_sell」を設定すると、BOTが保持している「売りポジション:ショートポジション」を決済して「損切りまたは利確」します。

    「daily_profit_target」のカラムには「日次の利益目標額」を設定します。 「daily_trade_max_count」のカラムには、日次のBOTの約定件数の目標値を設定します。 ここで設定した値は、現在のBOTにのみ適用されます。 つまり、「root/real」フォルダの「config.csv」に設定した値が上書きされます。

    例えば、BOT1Aのパフォーマンスが良いときは、このBOTの「config.csv」に通常の目標値より高い値を設定します。 「root/real」フォルダの「config.csv」の「利益目標額」に「75」円が設定されているとします。 もし、特定のBOTのパフォーマンスの良いときは、そのBOTの「config.csv」の「利益目標額」には「75」円より高い金額「100」円を設定します。 同様に約定件数の目標値も高く設定します。


    click image to zoom!
    図1-8
    図1-8では、「root/real/bot1X」フォルダに格納されているログファイル「log(yyyymmdd).txt」の内容を表示しています。 ログファイルには、BOTがどんな処理を行ったかが記録されます。 このログファイルは、BOTでバグが発生したときなどに使用します。


    click image to zoom!
    図1-9
    図1-9では、「root/real/bot1C/buy_sell」フォルダに格納されている注文ファイルの内容を表示しています。 ここでは、「buy_order(XRP_JPY).csv」「buy_order_sub(XRP_JPY).csv」「buy_order_child(XRP_JPY).csv」ファイルの内容を表示しています。 これらのCSVファイルは3階層構造になっています。

    買注文ヘッダー「buy_order(XRP_JPY).csv」ファイルには「買注文日時(buy_time)」、「注文数(qty, real_qty)」「価格(price, real_price」などが格納されます。

    買注文サブ「buy_order_sub(XRP_JPY).csv」ファイルには、 「買注文ID(buy_order_id)」「ポジションID(position_id)」「注文数(qty, real_qty)」「価格(price, real_price」などが格納されます。

    買注文チャイルド「buy_order_child(XRP_JPY).csv」ファイルには、 「買注文ID(buy_order_id)」「ポジションID(position_id)」「注文数(qty, real_qty)」「価格(price, real_price」などが格納されます。 このファイルには、2件のレコードが格納されていますが、これは注文数(600XRP)が「520XRP」と「80XRP」に分割されて約定したためです。


    click image to zoom!
    図1-10
    図1-10では、「root/real/bot1C/buy_sell」フォルダに格納されている注文ファイルの内容を表示しています。 ここでは、「sell_order(XRP_JPY).csv」「sell_order_sub(XRP_JPY).csv」「sell_order_child(XRP_JPY).csv」ファイルの内容を表示しています。 これらのCSVファイルは3階層構造になっています。

    売注文ヘッダー「sell_order(XRP_JPY).csv」ファイルには「売注文日時(sell_time)」、「注文数(qty, real_qty)」「価格(price, real_price」などが格納されます。

    売注文サブ「sell_order_sub(XRP_JPY).csv」ファイルには、 「売注文ID(buy_order_id)」「ポジションID(position_id)」「注文数(qty, real_qty)」「価格(price, real_price」などが格納されます。 このファイルには、2件のレコードが格納されていますが、これは注文数(600XRP)が「520XRP」と「80XRP」に分割されて約定したためです。

    売注文チャイルド「sell_order_child(XRP_JPY).csv」ファイルには、 「売注文ID(sell_order_id)」「ポジションID(position_id)」「注文数(qty, real_qty)」「価格(price, real_price」などが格納されます。 このファイルには、2件のレコードが格納されていますが、これは注文数(600XRP)が「520XRP」と「80XRP」に分割されて約定したためです。

    図1-9と図1-10は「買い注文」で「買いポジション:ロングポジション」を持って、決済の売り注文を行ったときに作成された注文ファイルです。 図1-9と図1-10の注文ファイルは、相互にリンクしています。


    click image to zoom!
    図1-11
    図1-11では、「root/real/bot1C/buy_sell」フォルダに格納されている注文ファイル「order(XRP_JPY).xlsx」の内容を表示しています。 このファイルはExcelのファイルとして作成されます。

    このファイルには、注文日時[time(B), time(S)]、注文ID[order(B), order(S)]、数量[qty(B), qty(S)]、価格[price(B), price(S)]、 利益[profit(AMT)]などが格納されます。 このファイルは、「買い注文」と「売り注文」を一元化したもので損益を計算するするときに使用します。


  2. Pythonの「LoadMaster.py」プログラムの本番実行例

    ここではバックエンドで稼働する「LoadMaster.py」プログラムの起動・停止方法を説明します。 このプログラムを起動するには、Visudal Studio Code(VS Code)から「Terminal Window」を開いて「python LoadMaster.py」を入力します。 プログラムが起動すると図2-1のようなログメッセージが表示されます。

    このプログラムを停止するには、「root」フォルダの環境設定ファイル(config.csv)の「run_mode」カラムに「stop master」を設定します。 このプログラムは、停止させるまで24時間、365日稼働し続けます。 GMOコインが定期メンテ(毎週土曜日の午前9時から午前11時の時間帯)のときは自動的にスリープします。

    このプログラムは、GMOコインから仮想通貨(BTC, ETH, XRP)の直近の取引データをダウンロードしてCSVファイルに蓄積します。 CSVファイルは、図2-2で示すように3種類作成します。詳細は図2-2で説明します。
    python LoadMaster.py⏎
    

    click image to zoom!
    図2-1
    図2-1には、バックエンドの「LoadMaster.py」のログ情報が画面に表示されています。 ログ情報には、仮想通貨のシンボル(BTC_JPY, ETH_JPY, XRP_JPY)、 ローソク足の5分足、10分足、15足の価格変動率(price_change_ptc)とトレンド(trend)が表示されます。


    click image to zoom!
    図2-2
    図2-2では、バックエンドの「LoadMaster.py」が作成した3種類のCSVファイルの内容を表示しています。 これらのCSVファイルは仮想通貨ごとに作成されます。

    「master(BTC_JPY).csv」ファイルには直近の仮想通貨(BTC)の取引データが格納されます。 このファイルには「価格(price)」「サイド(BUY or SELL)」「数量(size)」「タイムスタンプ(timestamp)」が格納されています。

    「master_buy(BTC_JPY).csv」と「master_sell_(BTC_JPY).csv」のCSVファイルは、 「master(BTC_JPY).csv」のファイルを元に「BUY」と「SELL」に分割しています。 さらに、価格データをローソク足のデータ形式(OHLC: open, high, low, close)に変換しています。 ここでは1分足のデータを生成しています。

    1分足のデータは、以下のようなPythonのコードで簡単に生成することができます。
    # Convert 'timestamp' column to datetime
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    
    # Resample data to 1-minute intervals and aggregate OHLC
    df_resampled = df.set_index('timestamp').resample('1T').agg({'price': 'ohlc', 'volume': 'sum'})
    
    # Flatten the multi-level columns
    df_resampled.columns = ['open', 'high', 'low', 'close', 'volume']

  3. Pythonの「GmoResetConfig.py」プログラムの本番実行例

    「GmoResetConfig.py」プログラムを起動するには、VS Codeから「Terminal Window」を開いて「python GmoResetConfig.py」を入力します。 このプログラムは、BOTのフォルダ・ファイル構成を初期化します。 プログラムが終了すると、「リスト1」のようなフォルダ・ファイル構成になります。

    GMOコインでレバレッジ取引を行うときは、1日が当日の午前6時から翌日の午前6日までになります。 したがって、デイトレードを行うときは当日の午前6時にBOTを起動させて翌日の午前5時45分ごろに終了させます。 「GmoResetConfig.py」プログラムは、BOTが終了した翌日の午前5時45分直後に実行します。
    python GmoResetConfig.py⏎
    

    click image to zoom!
    図3-1
    図3-1には、「GmoResetConfig.py」のプログラムを起動したときのログが表示されています。 ここでは「step1」と「step2」の前半部分のログが表示されています。 「step1」では、各種CSVファイル(daily_profit.csv, daily_bot_profit.csv,...)を「root」フォルダから「root/fake」と「root/real」フォルダにコピーして初期化します。

    「step2」では、「root/fake」と「root/real」フォルダからBOTのバックアップフォルダ「buy_sell(1), buy_sell(2),...」を削除しています。 「buy_sell(1)」「sell_buy(1)」等のバックアップフォルダは、BOTの注文が約定したときにカレントの「buy_sell」「sell_buy」フォルダをバックアップとして作成したものです。 バックアップフォルダは、BOTでバグが発生したときに参照します。


    click image to zoom!
    図3-2
    図3-2には「step2」の後半部分のログ情報が表示されています。 「step2」でBOTのバックアップフォルダの削除が完了するとプログラムは終了します。 「GmoResetConfig.py」のプログラムを誤ってデイトレード中に起動したときには、警告メッセージを表示して終了します。 このプログラムは、デイトレードが終了した後の翌日の午前5時45分から午前5時59分の時間帯に起動したときのみ通常の処理を行います。


  4. Pythonの「GmoVerifyOpenPositions.py」プログラムの本番実行例

    「GmoVerifyOpenPositions.py」プログラムを起動するには、VS Codeから「Terminal Window」を開いて「python GmoVerifyOpenPositions.py」を入力します。 このプログラムは、デイトレードのレバレッジ取引でまだ決済されていないポジション(ロングポジション、ショートポジション)とBOTとの関連(紐付け)を画面に表示します。 さらに、BOTと関連しないポジション(迷子のポジション)についても表示します。

    余談ですが、BOTを27本くらい同時に実行するとたまにタイミング等のバグで迷子のポジションが発生することがあります。 迷子になったポジションは、GMOコインの取引画面から手動で決済します。

    画面に表示された情報は、CSVファイル(open_positions_found.csv, open_positions_not_found.csv)にも保存されます。 ファイルの内容は図4-1, 図4-2で説明します。
    python GmoVerifyOpenPositions.py⏎
    

    click image to zoom!
    図4-1
    図4-1には、プログラムの実行結果が表示されています。 「open positions found list」には、BOTと紐付けされているポジションが表示されます。

    「open positions not found list」には、BOTと紐付けされていないポジション(迷子のポジション)が表示されます。 ここでは、BOTと紐付けされているポジションが「29」、紐付けされていないポジションが「0」になっています。

    ここで表示された情報は、BOTのパフォーマンスを把握するときにも利用できます。


    click image to zoom!
    図4-2
    図4-2では、CSVファイル「open_positions_found.csv」をExcelで表示しています。 CSVファイルには「ボット名(bot_id)」「ポジションID(position_id)」「買注文ID(buy_order_id)」「売注文ID(sell_order_id)」 「評価損益(gmo_loss_gain)」などが格納されています。

    「bot_id」に「BOT2A(sell->buy)」と表示されているときは、ポジションIDは「ショートポジション」になります。 「bot_id」に「BOT3A(buy->sell)」と表示されているときは、ポジションIDは「ロングポジション」になります。

    評価損益をチェックして特定のポジションを手動で決済したいときは、そのポジションと紐付けされているBOTの環境設定ファイル(config.csv)に「close」を設定します。 これでBOTは、自動的にポジションを損切り、または利確します。 BOTの環境設定ファイル(config.csv)の詳細は、図1-6で説明しています。


  5. Pythonの「FakeBot.py」プログラムの実行例

    BOTを起動するには、VS Codeから「Terminal Window」を開いて「python FakeBotXv10.py 」を入力します。 BOTは通常、当日のレバレッジ取引が開始される15分くらい前に起動しておきます。

    例えば、当日の午前5時50分ごろにBOTを起動すると、BOTは午前6時までスリープして午前6時を経過したら自動的に稼働します。 なので、当日の午前5時45分から5時59分の時間帯に27本のBOTを事前に起動しておきます。 BOTの起動は自動化できますが、現状では手動で起動しています。

    BOTを起動するときは、BOTの引数(パラメータ)を指定する必要があります。 BOTに異なるパラメータを指定することにより、異なるアルゴリズムを適用させることができます。 ここでは重要なパラメータのみ説明します。

    BOTの引数2, 3, 4には、BOTの「ID」を指定します。 たとえば、「BOT1A」として起動したいときは引数に「bot1 1 A」を指定します。 BOTの引数5には、トレードする仮想通貨のシンボル(BTC, ETH, XRP, BCH, LTC)を指定します。 BOTの引数6には、注文する数量のIDを指定します。 例えば、「BTC 1Q」と指定したときは注文単位が「0.01BTC」になります。

    BOTの引数7には、トレードの種別(day, swing)を指定します。 デイトレードを行うときは「day」、スウィングトレードを行うときは「swing」を指定します。 BOTの引数8には、トレードのアルゴリズムを指定します。 レバレッジ取引の場合、買い注文から入って決済するケースと、空売りから入って決済するケースがあります。 BOTは「ロングポジション」と「ショートポジション」を同時に持つことも可能ですが、この場合、引数8にダブルエントリーの「D」を指定します。 「ロングポジション」と「ショートポジション」どちらかしか保持しないときは、引数8にシングルエントリーの「S」を指定します。

    BOTの引数9には、オプションのパラメータを指定することができます。 「verify」を指定すると、同じIDを持つBOTが既に稼働していないかどうかチェックします。 この指定を行うと、同じBOTが複数起動されるのを防止することができます。
    ---------------------------------------------------------------------------
                          1         2    3 4 5   6  7   8           9
    ---------------------------------------------------------------------------
                                                        1 2 3 4 5 6 
    --------------------------------------------------------------------------- BOT1 Day Trading Single Entry  
    python FakeBotXv10.py VOSTRO-PC bot1 1 A BTC 1Q day 1-S-1-F-F-F verify      1A       
     
    python FakeBotXv10.py VOSTRO-PC bot1 1 B ETH 1Q day 1-S-1-F-F-F verify      1B   
           
    python FakeBotXv10.py VOSTRO-PC bot1 1 C XRP 1Q day 1-S-1-F-F-F verify      1C    
    --------------------------------------------------------------------------- BOT2 Swing Trading Single Entry  
    python FakeBotXv10.py VOSTRO-PC bot2 1 A BTC 2Q swing 3-S-1-F-F-F verify    2A       
    
    python FakeBotXv10.py VOSTRO-PC bot2 1 B ETH 1Q swing 3-S-1-F-F-F verify    2B     
    
    python FakeBotXv10.py VOSTRO-PC bot2 1 C XRP 2Q swing 3-S-1-F-F-F verify    2C    
    --------------------------------------------------------------------------- BOT3 Day Trading Duble Entery 
    python FakeBotXv10.py VOSTRO-PC bot3 1 A BTC 3Q day 1-D-1-F-F-F verify      3A      
    
    python FakeBotXv10.py VOSTRO-PC bot3 1 B ETH 1Q day 1-D-1-F-F-F verify      3B          
    
    python FakeBotXv10.py VOSTRO-PC bot3 1 C XRP 3Q day 1-D-1-F-F-F verify      3C          
    --------------------------------------------------------------------------- BOT4 Swing Trading Double Entry   
    python FakeBotXv10.py VOSTRO-PC bot4 1 A BTC 3Q swing 3-D-1-F-F-F verify    4A       
    
    python FakeBotXv10.py VOSTRO-PC bot4 1 B ETH 1Q swing 3-D-1-F-F-F verify    4B          
    
    python FakeBotXv10.py VOSTRO-PC bot4 1 C XRP 3Q swing 3-D-1-F-F-F verify    4C     
    

    click image to zoom!
    図5-1
    図5-1には、BOT起動時の引数に「VOSTRO-PC bot1 1 A BTC 1Q day 1-S-1-F-F-F verify」を指定しています。 この場合、BOTはデイトレードを行います。引数8に「S」が含まれているのでシングルエントリーモードでトレードします。 BOTのログ情報に「FAKE(BOT1A) V10 Day...」が表示されています。「Day」はデイトレードを意味します。

    このBOTは、シングルエントリーモードなので「ロングポジション」か「ショートポジション」のどちらかしか保持しません。 ここでは、「ショートポジション」を保持しているので「ロングポジション」の処理が保留状態(SUSPEND NEW ORDER)になっています。

    ここでは、BOTをDebugモードで起動しているので詳細なログ情報が表示されています。 DebugモードをOFFにすると必要最小限のログのみ表示されます。

    FakeBot.pyは、シミュレーションモードで動作するので実際のトレードは行いません。


    click image to zoom!
    図5-2
    図5-2には、BOT起動時の引数に「VOSTRO-PC bot2 1 A BTC 1Q swing 3-S-1-F-F-F verify」を指定しています。 この場合、BOTはスウィングトレードを行います。引数8に「S」が含まれているのでシングルエントリーモードでトレードします。 BOTのログ情報に「FAKE(BOT2A) V10 Swing...」が表示されています。「Swing」はスウィングトレードを意味します。


    click image to zoom!
    図5-3
    図5-3には、BOT起動時の引数に「VOSTRO-PC bot3 1 A BTC 1Q day 1-D-1-F-F-F verify」を指定しています。 この場合、BOTはデイトレードを行います。引数8に「D」が含まれているのでダブルエントリーモードでトレードします。 BOTのログ情報に「FAKE(BOT3A) V10 Day...」が表示されています。「Day」はデイトレードを意味します。


  6. Pythonの「RealBot.py」プログラムの本番実行例

    本番のBOTを起動するには、VS Codeから「Terminal Window」を開いて「python RealBotXv10.py 」を入力します。 本番のBOTは通常、当日のレバレッジ取引が開始される15分くらい前に起動しておきます。

    BOTは午前6時までスリープして午前6時を経過すると自動的に稼働します。 BOTの起動は自動化できますが、現状では手動で起動しています。
    ---------------------------------------------------------------------------
                          1         2    3 4 5   6  7   8           9
    ---------------------------------------------------------------------------    
                                                        1 2 3 4 5 6 
    --------------------------------------------------------------------------- BOT1 Day Trading Single Entry   
    python RealBotXv10.py VOSTRO-PC bot1 1 A BTC 1Q day 1-S-1-F-F-F verify      1A       
     
    python RealBotXv10.py VOSTRO-PC bot1 1 B ETH 1Q day 1-S-1-F-F-F verify      1B   
           
    python RealBotXv10.py VOSTRO-PC bot1 1 C XRP 1Q day 1-S-1-F-F-F verify      1C    
    --------------------------------------------------------------------------- BOT2   
    python RealBotXv10.py VOSTRO-PC bot2 1 A BTC 2Q day 1-S-1-F-F-F verify      2A       
    
    python RealBotXv10.py VOSTRO-PC bot2 1 B ETH 1Q day 1-S-1-F-F-F verify      2B     
    
    python RealBotXv10.py VOSTRO-PC bot2 1 C XRP 2Q day 1-S-1-F-F-F verify      2C    
    --------------------------------------------------------------------------- BOT3  
    python RealBotXv10.py VOSTRO-PC bot3 1 A BTC 3Q day 1-S-1-F-F-F verify      3A      
    
    python RealBotXv10.py VOSTRO-PC bot3 1 B ETH 1Q day 1-S-1-F-F-F verify      3B          
    
    python RealBotXv10.py VOSTRO-PC bot3 1 C XRP 3Q day 1-S-1-F-F-F verify      3C          
    --------------------------------------------------------------------------- BOT4    
    python RealBotXv10.py VOSTRO-PC bot4 1 A BTC 3Q day 1-S-1-F-F-F verify      4A       
    
    python RealBotXv10.py VOSTRO-PC bot4 1 B ETH 1Q day 1-S-1-F-F-F verify      4B          
    
    python RealBotXv10.py VOSTRO-PC bot4 1 C XRP 3Q day 1-S-1-F-F-F verify      4C    
    --------------------------------------------------------------------------- BOT5    
    python RealBotXv10.py VOSTRO-PC bot5 1 A BTC 1Q day 1-S-1-F-F-F verify      5A       
    
    python RealBotXv10.py VOSTRO-PC bot5 1 B ETH 1Q day 1-S-1-F-F-F verify      5B       
    
    python RealBotXv10.py VOSTRO-PC bot5 1 C XRP 3Q day 1-S-1-F-F-F verify      5C    
    --------------------------------------------------------------------------- BOT6    
    python RealBotXv10.py VOSTRO-PC bot6 1 A BTC 1Q day 1-S-1-F-F-F verify      6A       
    
    python RealBotXv10.py VOSTRO-PC bot6 1 B ETH 1Q day 1-S-1-F-F-F verify      6B          
    
    python RealBotXv10.py VOSTRO-PC bot6 1 C XRP 1Q day 1-S-1-F-F-F verify      6C    
    --------------------------------------------------------------------------- BOT7    
    python RealBotXv10.py VOSTRO-PC bot7 1 A BTC 1Q day 1-S-1-F-F-F verify      7A       
    
    python RealBotXv10.py VOSTRO-PC bot7 1 B ETH 1Q day 1-S-1-F-F-F verify      7B          
    
    python RealBotXv10.py VOSTRO-PC bot7 1 C XRP 1Q day 1-S-1-F-F-F verify      7C    
    --------------------------------------------------------------------------- BOT8    
    python RealBotXv10.py VOSTRO-PC bot8 1 A BTC 1Q day 1-S-1-F-F-F verify      8A       
    
    python RealBotXv10.py VOSTRO-PC bot8 1 B ETH 1Q day 1-S-1-F-F-F verify      8B           
    
    python RealBotXv10.py VOSTRO-PC bot8 1 C XRP 1Q day 1-S-1-F-F-F verify      8C    
    --------------------------------------------------------------------------- BOT9  
    python RealBotXv10.py VOSTRO-PC bot9 1 A BTC 1Q day 1-S-1-F-F-F verify      9A       
    
    python RealBotXv10.py VOSTRO-PC bot9 1 B ETH 1Q day 1-S-1-F-F-F verify      9B          
    
    python RealBotXv10.py VOSTRO-PC bot9 1 C XRP 1Q day 1-S-1-F-F-F verify      9C    
    

    click image to zoom!
    図6-1
    図6-1では、BOTの引数に「VOSTRO-PC bot1 1 A BTC 1Q day 1-S-1-F-F-F verify」指定しています。 BOTのログには「REAL (BOT1A) V10 Day...」が表示されているのでデイトレードになります。 引数に「BTC」の指定があるので仮想通貨「ビットコイン」のトレードを行います。 画面ではまだポジションを持っていない状態になっています。

    VS Codeの「Terminal Window」の名前とアイコンの色は自由にカスタマイズすることができます。 「Terminal Window」の名前「1A-BTC」は、「BOT1A(BTC_JPY)」を意味します。 「Terminal Window」のアイコンの「緑」は「デイトレード」、「赤」は「スウィングトレード」を意味します。 アイコンの形状もカスタマイズできますが、現状では全て同じアイコンを使用しています。

    参考までに、デイトレードではレンジ相場のときにエントリーします。 スウィングトレードではトレンド相場のときにエントリーします。


    click image to zoom!
    図6-2
    図6-2では、BOTの引数に「VOSTRO-PC bot1 1 B ETH 1Q day 1-S-1-F-F-F verify」指定しています。 BOTのログには「REAL (BOT1B) V10 Day...」が表示されているのでデイトレードになります。 引数に「ETH」の指定があるので仮想通貨「イーサリアム」のトレードを行います。 画面では買いのポジションを持っている状態になっています。

    ログ情報には、ロングポジションが板情報の何番目の順位になっているかも表示されます。 「rev_list=[23, 29, 29, 29,....」と表示されていますが順位はリバースになっているので左側の順位が最新の順位になります。 つまり、相場が上昇トレンドでそろそろロングポジションが決済される状態ということが言えます。


    click image to zoom!
    図6-3
    図6-3では、BOTの引数に「VOSTRO-PC bot1 1 C XRP 1Q day 1-S-1-F-F-F verify」指定しています。 BOTのログには「REAL (BOT1C) V10 Day...」が表示されているのでデイトレードになります。 引数に「XRP」の指定があるので仮想通貨「リップル」のトレードを行います。 画面ではロングポジションを持っている状態になっています。

    ログ情報には、ロングポジションが板情報の何番目の順位になっているかも表示されます。 「rev_list=[23, 22, 29, 25,....」と表示されていますが順位はリバースになっているので左側の順位が最新の順位になります。


  7. BOTからGmailに送信する各種メッセージの説明

    BOTは注文が約定したら、約定した注文情報をGoogleのGmailに送信します。 また、注文を途中で利確したり、損切りしたときもGmailに情報を送信します。 このほか、管理者のアクションが必要な場合にもGmailに情報を送信します。

    「リスト7-1」から「リスト7-8」には、Gmailの件名と本文のテンプレート(雛形)を掲載しています。 Gmailの件名には「絵文字」を表示して、管理者がどんなアクションをとればよいのかひと目で分かるようにしています。

    注文が約定したときは「🟢🔴🟡」の3種類のいずれかが表示されます。 「緑」は黒字、「赤」は赤字、「黄」は0円を意味します。

    Gmailの本文の説明は、それぞれの図で説明します。

    リスト7-1: 注文が約定したときのGmail
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   🟢🔴🟡{FAKE|REAL} BOT?A(BTC_JPY): Order Execution Confirmation 
    # BODY:
    #   {FAKE|REAL} BOT?A(BTC_JPY)
    #   Order Execution Confirmation
    #   Option: {day|swing}, algo=[2,double,1,True], freq=[30T,1T,50T], qty=9 
    #   Profit rate: min(0.01%), mid(0.02%), max(0.03%)
    #   Loss cut rate: min(0.50%), mid(10%), max(20%)                   
    #   Trade type: buy_sell(STOP|MARKET|LIMIT) or sell_buy(STOP|MARKET|LIMIT)                
    #   Bot profit: 50 yen, STOP(base on max profit rate: 0.05%) 
    #   Bot profit: 50 yen, MARKET(base on default profit rate: 0.02%) 
    #   Bot profit: 50 yen, LIMIT(base on {min|mid|max} profit rate: 0.99%) 
    #   Bot adjusted accumulated profit: 60 yen
    #   Bot profit target: 100 yen                                                      
    #   Total profit for coin: 340 yen                              
    #   Total profit for all coins: 2500 yen     
    #   Order history list:
    #   0: yyyy-mm-dd HH:MM:SS, buy,  9999 yen
    #   1: yyyy-mm-dd HH:MM:SS, buy,  9999 yen
    #   2: yyyy-mm-dd HH:MM:SS, sell, 9999 yen
    #   Time: 2022-12-03 hh:mm:ss             
    # ---------------------------------------------------------- gmail  
    


    注文が利確・損切りされたときも3種類の絵文字「🔴🟡🟢」のいずれかが表示されます。

    リスト7-2: 注文が利確・損切りされたときのGmail 
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   🔴🟡🟢{FAKE|REAL} BOT?A(BTC_JPY): Order Cancellation: Stop Loss Triggered                   
    # BODY:               
    #   {FAKE|REAL} BOT?A(BTC_JPY)           
    #   Order Cancellation: Stop Loss Triggered
    #   Option: {day|swing}, algo=[2,double,1,True], freq=[30T,1T,50T], qty=9
    #   Profit rate: min(0.01%), mid(0.02%), max(0.03%) 
    #   Loss cut rate: min(5.00%), mid(10%), max(20%)     
    #   Stop loss id: 1-1(stop_loss_price), stop loss price: 99999 
    #   Stop loss id: 2-1(loss_rate), stop loss rate: 0.99%                
    #   Stop loss id: 9-9(xxxxxx)                   
    #   Trade type: buy_sell(STOP|MARKET|LIMIT) or sell_buy(STOP|MARKET|LIMIT)
    #   Stop loss amt: -999 yen        
    #   Time: 2022-12-03 hh:mm:ss
    # ---------------------------------------------------------- gmail   
    


    注文が強制的に決済されたときは件名に「🛑」の絵文字が表示されます。

    リスト7-3: 注文が強制的に決済されたときのGamil
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   🛑{FAKE|REAL} BOT?A(BTC_JPY): close pending orders (cancel)                
    # BODY:               
    #   {FAKE|REAL} BOT?A(BTC_JPY)           
    #   Order Closed at User's Request
    #   Option: {day|swing}, algo=[2,double,1,True], freq=[30T,1T,50T], qty=9                    
    #   Trade type: buy_sell(STOP|MARKET|LIMIT) or sell_buy(STOP|MARKET|LIMIT)
    #   Close amt: -999 yen    
    #   Cumulative daily profit of coin: 9999 yen     
    #   Cumulative daily profit of all coins: 999999 yen     
    #   Time: 2022-12-03 hh:mm:ss
    # ---------------------------------------------------------- gmail   
    


    BOTが日次利益目標を達成したときは件名に「🎉」の絵文字が表示されます。

    リスト7-4: BOTが日次利益目標を達成したときのGmail
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   🎉{FAKE|REAL} BOT?A(BTC_JPY): Bot Achieved Daily Profit Target(1/10)   
    # BODY:
    #   {FAKE|REAL} BOT?A(BTC_JPY)
    #   Bot Achieved Daily Profit Target (1/30)
    #   Option: {day|swing}, {single|double} entry mode                                        
    #   Bot accumulated profit: 888 yen    
    #   Bot adjusted accumulated profit: 999 yen              
    #   Bot profit target: 100 yen                 
    #   Time: 2022-12-03 hh:mm:ss             
    # ---------------------------------------------------------- gmail    
    


    BOTが日次目標注文件数を達成したときは件名に「🎯」の絵文字が表示されます。

    リスト7-5: BOTが日次目標注文件数を達成したときのGamil
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   🎯{FAKE|REAL} BOT?A(BTC_JPY): Bot Reached Daily Trade Count Limit   
    # BODY:
    #   {FAKE|REAL} BOT?A(BTC_JPY)
    #   Bot Reached Daily Trade Count Limit
    #   Option: {day|swing}, {single|double} entry mode                                       
    #   Bot trade count: 999                   
    #   Bot trade count limit: 999                 
    #   Time: 2022-12-03 hh:mm:ss             
    # ---------------------------------------------------------- gmail  
    


    BOTから管理者に警告メッセージを送信するときは件名に「😮」の絵文字が表示されます。

    リスト7-6: BOTからの警告メッセージのGmail
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   😮{FAKE|REAL} BOT?A(BTC_JPY): Alert Message   
    # BODY:
    #   {FAKE|REAL} BOT?A(BTC_JPY)
    #   Alert Message
    #   Option: {day|swing}, algo=[2,double,1,True], freq=[30T,1T,50T], qty=9                                    
    #   Alert Message: {message}                             
    #   Time: 2022-12-03 hh:mm:ss             
    # ---------------------------------------------------------- gmail   
    


    BOTがプログラムの異常(BUG)を検出したときは件名に「🐞」の絵文字が表示されます。

    リスト7-7: BOTが管理者からのアクションが必要なときのGmail
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   🐞{FAKE|REAL} BOT?A(BTC_JPY): gmo master is empty => ACTION REQUIRED!             
    # BODY:                
    #   {FAKE|REAL} BOT?A(BTC_JPY)
    #   method name: buy_sell_algorithm_()
    #   gmo master csv file is empty      
    #   action required        
    #   trade type: buy_sell or sell_buy  
    #   master({symbol}).csv: mas_df.empty=True             
    #   master_buy({symbol}).csv: mas_buy_df.empty=True 
    #   master_sell({symbol}).csv: mas_sell_df.empty=True 
    #   time: 2022-12-03 hh:mm:ss
    # ---------------------------------------------------------- gmail 
    


    BOTが通信系の異常を検出したときは件名に「🌐」の絵文字が表示されます。

    リスト7-8: BOTが通信系の異常を検出したときのGmail
    # ---------------------------------------------------------- gmail
    # SUBJECT:
    #   🌐{FAKE|REAL} BOT?A(BTC_JPY): {subject}                 
    # BODY:                
    #   {FAKE|REAL} BOT?A(BTC_JPY)  
    #   trade type: {coin.trade_type}            
    #   method name: {method name}
    #   message: {message}
    #   time: 2022-12-03 hh:mm:ss
    # ---------------------------------------------------------- gmail 
    
    click image to zoom!
    図7-0
    図7-0には、Gmailの件名が表示されています。 件名の先頭には絵文字が表示されているので管理者はどのメールが重要かが即座に判断できます。 ここでは「🟡🟢🌐」の3種類の絵文字が表示されています。

    「🟡🟢」のメールは重要ではないので「🌐」のメールのみチェックすればよいことが分かります。


    click image to zoom!
    図7-1
    図7-1は、「BOT5A(BTC_JPY)」の注文が約定したときのGmailの本文です。 本文には、BOTの各種情報と注文の利益額などが表示されています。 本文には、仮想通貨「BTC_JPY」の累計利益額(1,685 yen)と全ての仮想通貨の累計利益額(2,294 yen)も表示されます。 さらに、このBOTの約定履歴(Order history list)も表示されます。 この約定履歴を見れば、BOTのパフォーマンスが把握できます。


    click image to zoom!
    図7-2
    図7-2は、「BOT1A(BTC_JPY)」がショートポジションを決済して利確したときのGmailの本文です。 ここでは、利確で「30 yen」の利益が出ています。 BOTは、利確と損切りの処理をすべて「損切り」として処理しています。

    Gmailの件名に「Order Cancellation: Stop Loss Triggered」と表示されても「🟢」なら利確ということになります。

    投資の書籍では、「損切り(stop loss, loss cut)」が重要だと書かれていますが、 多くの人はこの言葉を信じて「損切り貧乏」になっています。 私は基本的に損切りしません。 基本は「デイトレード」ですが、ポジションを翌日に持ち越したときは、BOTは自動的にスウィングトレードに切り替える仕様になっています。


    click image to zoom!
    図7-3
    図7-3は、通信エラーが発生したときにGmail本文です。 ここでは、バックエンドプログラムの(LoadMaster.py」で通信エラーが発生しています。 このエラーは、GMOコインのAPIリクエストが制限を超えたときに発生します。 このエラーが発生したときは、自動的に再試行するので管理者は特に何もアクションをとる必要はありません。

    余談ですが、GMOコインからのエラーメッセージは全て英語で返ってきます。 なので、Gmailのメッセージはすべて英語に統一しています。


    click image to zoom!
    図7-4
    図7-4は、注文をキャンセルしたときのGmail本文です。 ここでは、空売りの新規注文をAPI経由で実行したのですがBOTが途中で注文をキャンセルしています。 BOTはレバレッジ取引で新規の空売りの注文を行うときは「逆指値」で行います。

    つまり、相場が予測した通り下落したときに新規注文が約定するようにしています。 相場が予測に反して上昇したときは一定時間が経過したらBOTは「逆指値」の注文をキャンセルします。 ショートポジションを確保してポジションを決済するときの「買い注文」は「指値」で行います。


    click image to zoom!
    図7-5
    図7-5は、注文のキャンセルでエラーが発生したときのGmail本文です。 このエラーは「逆指値」「指値」の注文をキャンセルしようとしたら、すでに注文が約定しているときに発生します。 27本のBOTを24時間稼働させているとタイミングの問題で1日に5~10回くらい発生します。

    このエラーが発生してもBOTが適切な後処理を行うので管理者は特にアクションをとる必要はありません。


    click image to zoom!
    図7-6
    図7-6は、自作自演(Self Trade)のトレードを行ったときのGmail本文です。 手動でトレードするときは、自作自演のトレードは禁止されていますが、 BOTで自動トレードするときはタイミングにより発生することがあります。 27本のBOTを同時に実行しているので取引のボリュームが少ない時間帯に発生します。

    例えば、取引量の少ない「BCH」「LTC」で自動トレードするとかなりの頻度で「自作自演」のエラーが発生します。 なので、「BCH」と「LTC」はトレードの対象外にしています。

    このエラーが発生したときは、BOTが適切な後処理を行うので管理者は特にアクションをとる必要はありません。


    click image to zoom!
    図7-7
    図7-7は、BOTが日次の目標約定件数を達成したときのGmail本文です。 ここでは、「9」を設定しているので9件注文が約定したことになります。 BOTは目標を達成すると自動的に終了します。


    click image to zoom!
    図7-8
    図7-8は、BOTが日次の目標利益を達成したときのGmail本文です。 ここでは、「120」円を設定しているのでBOTの利益累計が「120」円を超えたときにメールが送信されます。 BOTは目標を達成すると自動的に終了します。

    BOTを作るときは、連続して24時間トレードするのではなく、目標を設定して目標を達成したら当日のトレードを手仕舞うことが重要です。


    click image to zoom!
    図7-9
    図7-9は、通信エラーが発生したときにGmail本文です。 ここでは、「BOT4A(BTC_JPY)」がGMOコインから板情報(Order Book)を取得するリクエストで通信エラーが発生しています。 通信エラーが発生したときは、BOTが自動的に再試行するので管理者は特にアクションをとる必要はありません。 BOTを24時間稼働させるとかなりの頻度で通信エラーが発生します。 なので、通信系のエラーは必ず再試行の処理を行う必要があります。


  8. まとめ

    仮想通貨の取引所、OS、開発ツール、Pythonのプログラムをまとめると以下のようになります。

    【BOTを利用した自動トレードの本番運用環境】
    • 仮想通貨の取引所: GMOコイン
      現物取引とレバレッジ取引がありますが、レバレッジ取引のみ行います。 現物取引は相場が上昇トレンドのときしか利益を出せませんが、 レバレッジ取引では相場が上昇トレンドでも下降トレンドでも利益が出せます。 また、2倍までレバレッジをかけることができるといったメリットもあります。
    • OS: Windows 11 (SSD, RAM: 16GBx2)
      実メモリが不足するときは、SSDを仮想メモリとして使用します。 ここでは、Windows 11を使用していますが、Macでも動作します。
    • 開発ツール: Visual Studio Code
      Jupyter Notebookでも可能ですが、MicrosoftのVisual Studio Codeを使用することをおすすめします。
      ここで紹介するBOTは、Windows/MacのOSで動作するように設計していますが、スマホで動作させることもできます。 スマホでも動作するBOTを作るには、Flask、Django, Dashなどのフレームワークを使用してWebアプリとして設計します。 FlaskでWebアプリを開発する方法は、 「記事(017)」、 記事(107) で解説しています。 DashでWebアプリを開発する方法は、 「記事(137)」、 「記事(138)」、 「記事(143)」、 「記事(144)」 で解説しています。
    • Pythonのプログラム:
      • LoadMaster.py:
        GMOコインから仮想通貨の取引データをダウンロードするバックエンドのプログラムです。 このプログラムは24時間365日ひたすら取引データをダウンロードしてCSVファイルに蓄積します。 取引データは1日分保存します。
      • GmoResetConfig.py:
        このプログラムはBOTが使用するフォルダ・ファイルを初期化します。
      • GmoVerifyOpenPositions.py:
        このプログラムはBOTとポジション(買いポジション、売りポジション)の関係をリスト形式で表示します。 また、BOTで管理されていないポジション(迷子のポジション)についても表示します。
      • FakeBot.py:
        このプログラムは自動トレードのシミュレーション用BOTです。 このBOTは自動トレードのシミュレーションを行うときに使います。 また、BOTをデバッグするときにも使います。
      • RealBot.py:
        このプログラムは自動トレードの本番用BOTです。 BOTを起動するときに、各種引数(パラメータ)を指定することができます。 BOTを起動するときの引数を変えることによりアルゴリズムの異なるBOTを複数実行させることができます。 本番では27本のBOTを同時に実行させています。
    • Pythonの各種クラスライブラリ
      Pythonのクラスライブラリは、以下の10のクラスファイルから構成されています。 PythonのBOTからこれら各種クラスのメソッドを呼び出すことにより、 初心者でも簡単にBOTを作成することができます。
      • base.py:
        このクラスファイルには「Bcolors」「Gvar」「Coin」「Gmo_dataframe」のクラスが定義されています。 「Bcolors」クラスには文字を画面に表示するときのカラー(色)が定義されています。 「Gvar」クラスには、BOTが使用するグローバルな情報が定義されています。 「Coin」クラスには、仮想通貨(BTC, ETH, XRP, BCH, LTC)の情報が定義されています。 「Gmo_dataframe」クラスには、BOTが作成するCSVファイルのレイアウトが定義されています。
      • debug.py:
        このクラスファイルには、BOTが例外処理、デバッグなどの情報を画面に表示するときに使用するメソッドが定義されています。 「print_log()」メソッドは、情報を常時画面に表示するときに使用します。 「trace_write()」「trace_warn()」「trace_error()」メソッドは、デバッグ情報を画面に表示するときに使用します。 debugクラスのメソッドを使用して文字を画面に表示したときは、自動的にテキストファイルにログ情報として記録されます。 「sound_alart()」メソッドは警告音を鳴らすときに使用します。
      • gmail.py:
        このクラスファイルは、GoogleのGmailにメールを送信するメソッドが定義されています。 「send_gmail()」メソッドは、汎用的なコンテンツを送信するときに使用します。 「send_gmail_order()」メソッドは、注文関連のコンテンツを送信するときに使用します。
      • gmail_config.py:
        このクラスファイルは、GoogleのGmailにメールを送信するための環境設定を行います。 環境設定クラスでは、GmailのSMTP Server, Port Number, Email Address、Password等を設定します。
      • api.py:
        このクラスファイルは、インターネット経由でGMOコインで各種取引を行うためのメソッドが定義されています。
      • csv.py:
        このクラスファイルは、各種CSVファイルを作成、更新、ロードするためのメソッドが定義されています。
      • trade.py:
        このクラスファイルには、自動トレード行うときに便利な処理がメソッドとして定義されています。 ここで定義されているメソッドは、主に「buy_sell.py」と「sell_buy.py」クラスから呼ばれます。
      • buy_sell.py:
        このクラスファイルには、買いの新規注文と決済するための売り注文を行うための各種メソッドが定義されています。
      • sell_buy.py:
        このクラスファイルには、空売りの新規注文と決済するための買い戻し注文を行うための各種メソッドが定義されています。
      • coin_config.py
        このクラスファイルには、Coinクラスの各種属性(プロパティ)を初期化するためのメソッドが定義されています。