プログラミング

【BitMEX】C#で仮想通貨自動取引BOTを作ってみようー準備編ー

はじめに

こんばんは!どらです!

今日はBitMEX(ビットメックス)で自動で仮想通貨を取引してくれるBOTを作ってみようと思います!

仮想通貨を日々のトレードで増やそうと思うと、ずっとチャートに張り付きっぱなしになったり、毎日ニュースをチェックしたりとけっこう大変ですよね;;

しかも、自分でトレードすると事前に決めていたトレードルールを守れず欲をかいて思わぬ損を出してしまうことありますよね。。。僕もありました。。。

そんな悩みを解消するために!
自分の代わりに24時間365日トレードを行ってくれるBOTを作ります!

BOTなら自分の決めたルールでしか動かず毎日フル稼働してくれます。

この記事はBOTを開発するまでの準備編になります。

今回試しにAPIプログラムを作っていますがBitMEXだとかなり簡単にBOTを作れそうです。

ユニ
ユニ
もともとプログラミングが出来ないと作れないんでしょ?
どら
どら
初心者の人でも少し勉強すれば作れるようになると思うよ!

開発編はこちら

あわせて読みたい
【BitMEX】C#で仮想通貨自動取引BOTを作ってみようー開発編ーBitMEXで仮想通貨取引を自動で行うBOTを開発するための機能をソースコードを交えて解説しています。BOTを開発してみたい方はぜひご覧ください。...

準備

BitMEXに登録

BitMEXで取引を行うので、まずBitMEXにアカウントを登録しないと何も始まりません。

BitMEXは海外の取引所で仮想通貨FXが出来る取引所です。
レバレッジを100倍までかけることができ追証もありません。
追証がないということは借金をするリスクがないということです!

今回BOTを作るにあたってBitMEXを選んだり理由が以下になります。

  • APIで取得できる情報が豊富でドキュメント(説明)がわかりやすい
  • APIを扱うサンプルコードがある
  • 1日の取引量が十分にある
  • レバレッジが最大100倍まで選択できる

APIというのは注文や入金といった取引所で行える操作をプログラム(BOTなど)で扱えるようにする仕組みです。

 

それではBitMEXの登録方法を紹介します!

1分程度で登録できるので興味ある方はぜひ登録してみてください!

  1. BitMEXの公式サイトを開きます。
  2. 日本語化されていない場合は右上の日本国旗を押して日本語化します。
  3. 右上の「登録」を押します。
  4. 必要な情報を入力して「登録」を押してください。
  5. 登録したメールに本登録メールがきているので本登録して終了です。

開発環境の構築

次は開発環境の準備をします。

といっても用意するものはVisualStudioというマイクロソフト社製の開発ソフトのみです。
ダウンロードはこちら

Visual Studio Communityなら無料でインストールできるので興味ある方はぜひ!

APIキー作成

API経由でBitMEXとやり取りするために個人を識別するためのAPIキーを取得します。

APIキーは以下のページから取得できます。
https://www.bitmex.com/app/apiKeys

  • 名前・・・APIの名前
  • CIDR・・・IPアドレスで制限がかけられますが入力しなくても大丈夫です。
  • キーのアクセス許可・・・注文を選択
  • 2要素トークン・・・ログイン画面で使用している2段階認証のトークンを入力してください

「APIキーを作成」ボタンを押すとAPIキーが発行されます!

IDと秘密鍵が出てきますので秘密鍵は必ずメモするか何かして保管しましょう。

どら
どら
準備するものは以上になります!

開発

自分のユーザー情報を取得する

準備は出来たので試しに少しだけAPIをさわってみます。

BitMEXのAPIとやり取りするクラスがサンプルで公開されていますので、そこにユーザー情報を取得するGetUserというメソッドを追加します。

そのコードがこちら

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;

namespace BitMEXBot
{
    public class BitMEXApi
    {
        private const string domain = "https://www.bitmex.com";
        private string apiKey;
        private string apiSecret;
        private int rateLimit;

        public BitMEXApi(string bitmexKey = "", string bitmexSecret = "", int rateLimit = 5000)
        {
            this.apiKey = bitmexKey;
            this.apiSecret = bitmexSecret;
            this.rateLimit = rateLimit;
        }

        private string BuildQueryData(Dictionary<string, string> param)
        {
            if (param == null)
                return "";

            StringBuilder b = new StringBuilder();
            foreach (var item in param)
                b.Append(string.Format("&{0}={1}", item.Key, WebUtility.UrlEncode(item.Value)));

            try { return b.ToString().Substring(1); }
            catch (Exception) { return ""; }
        }

        private string BuildJSON(Dictionary<string, string> param)
        {
            if (param == null)
                return "";

            var entries = new List<string>();
            foreach (var item in param)
                entries.Add(string.Format("\"{0}\":\"{1}\"", item.Key, item.Value));

            return "{" + string.Join(",", entries) + "}";
        }

        public static string ByteArrayToString(byte[] ba)
        {
            StringBuilder hex = new StringBuilder(ba.Length * 2);
            foreach (byte b in ba)
                hex.AppendFormat("{0:x2}", b);
            return hex.ToString();
        }

        private long GetNonce()
        {
            DateTime yearBegin = new DateTime(1990, 1, 1);
            return DateTime.UtcNow.Ticks - yearBegin.Ticks;
        }

        private string Query(string method, string function, Dictionary<string, string> param = null, bool auth = false, bool json = false)
        {
            string paramData = json ? BuildJSON(param) : BuildQueryData(param);
            string url = "/api/v1" + function + ((method == "GET" && paramData != "") ? "?" + paramData : "");
            string postData = (method != "GET") ? paramData : "";

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(domain + url);
            webRequest.Method = method;

            if (auth)
            {
                string nonce = GetNonce().ToString();
                string message = method + url + nonce + postData;
                byte[] signatureBytes = hmacsha256(Encoding.UTF8.GetBytes(apiSecret), Encoding.UTF8.GetBytes(message));
                string signatureString = ByteArrayToString(signatureBytes);

                webRequest.Headers.Add("api-nonce", nonce);
                webRequest.Headers.Add("api-key", apiKey);
                webRequest.Headers.Add("api-signature", signatureString);
            }

            try
            {
                if (postData != "")
                {
                    webRequest.ContentType = json ? "application/json" : "application/x-www-form-urlencoded";
                    var data = Encoding.UTF8.GetBytes(postData);
                    using (var stream = webRequest.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }

                using (WebResponse webResponse = webRequest.GetResponse())
                using (Stream str = webResponse.GetResponseStream())
                using (StreamReader sr = new StreamReader(str))
                {
                    return sr.ReadToEnd();
                }
            }
            catch (WebException wex)
            {
                using (HttpWebResponse response = (HttpWebResponse)wex.Response)
                {
                    if (response == null)
                        throw;

                    using (Stream str = response.GetResponseStream())
                    {
                        using (StreamReader sr = new StreamReader(str))
                        {
                            return sr.ReadToEnd();
                        }
                    }
                }
            }
        }

        private byte[] hmacsha256(byte[] keyByte, byte[] messageBytes)
        {
            using (var hash = new HMACSHA256(keyByte))
            {
                return hash.ComputeHash(messageBytes);
            }
        }

        /// <summary>
        /// ユーザー情報を取得する
        /// </summary>
        /// <returns></returns>
        public string GetUser()
        {
            return Query("GET", "/user", null, true);
        }

    }

}

このクラスを使うだけでAPIと簡単にやり取りできます。

ではメインで呼び出してみましょう。
動かす前に自分のAPIキーと秘密鍵をコードに入力しておきましょう。

using System;

namespace BitMEXBot
{
    class Program
    {
        private static string bitmexKey = "APIキー";
        private static string bitmexSecret = "APIキーの秘密鍵";

        static void Main(string[] args)
        {
            BitMEXApi bitmex = new BitMEXApi(bitmexKey, bitmexSecret);
            var user = bitmex.GetUser();
            Console.WriteLine(user);
            Console.ReadKey();
        }

    }
}

自分のユーザー情報がコンソールに出てきたら成功です。

最後に

今回でBOTを開発する準備が整いました。

BitMEXはサンプルコードやAPIのドキュメントが豊富なので30分もかからずAPIとやり取りするプログラムを開発することができました。

BitMEXの開発者が用意してくれているプログラムは読みやすくとても参考になりました。

今はまだユーザー情報の取得しか出来ていませんが、次の記事では実際に取引するところまで開発します。(がんばります…!)

取引結果やソースコードも公開しますので、ぜひぜひ参考にしてみてください。

ありがとうございましたmm

 

bitFlyer ビットコインを始めるなら安心・安全な取引所で