Casual Developers Note

エンジニアやデザイナー向けの技術情報・英語学習情報・海外留学情報・海外旅行情報を提供中。世界を旅して人生を楽しもう。

  • ホーム
  • 技術 Tips & Tutorials
  • 技術塾
  • ライフハック
  • 海外留学
  • 英語学習
  • コラム
  • お問い合わせ
現在の場所:ホーム / アーカイブtrade

2018年6月18日 By KD コメントを書く

ビットコインでシステムトレード入門(ZaifのAPI編)

ビットコインでシステムトレード入門(ZaifのAPI編)

ビットコインのシステムトレードは単にお金を増やすだけでなく、単純に楽しいプロセスです。今回はZaifのAPIを利用して売買のプログラムを実装する方法を紹介します。

はじめに

前回はbitFlyerのAPIを利用して売買のプログラムを作りました。

ビットコインでシステムトレード入門(bitFlyerのAPI編)

今回はZaifのAPIを利用して売買のプログラムを作る方法を紹介します。

ZaifのAPIを使ったシステムトレード

前提条件

以下を事前に準備してください。

  • Zaifのアカウント(本人確認済)を持っていること
  • Zaifの二段階認証が完了していること
  • Zaifに入金済であること
  • NodeJSがインストールされていること

APIキーの取得

まずはAPIキーをZaifの開発者ページから発行しましょう。

ログインしたら「アカウント -> 各種サービス -> 開発者向けAPI -> API Keys」を選択します。

Zaif 2

二段階認証の番号を入力して「Submit」をクリックします。

Zaif 3

名前は今回は「my-trade」としておきましょう。権限は今回は「Info」と「Trade」のみを選択して、「Create」をクリックします。

Zaif 4

すると新しいAPIのkeyとsecretが発行されます。

Zaif 5

これらの情報はプログラムで使用します。

プロジェクトの準備

それではプロジェクトのファイルとパッケージを準備しましょう。

$ mkdir my-trade
$ cd my-trade
$ yarn init -y
$ yarn add axios crypto qs
$ touch utils.js
$ touch order.js
$ touch cancel.js

API認証用の関数の実装

ZaifのAPI認証の仕組みはここにあります。

const crypto = require('crypto');

function generateAccessHeaders(key, secret, encodedParams) {
  const sign = crypto.createHmac('sha512', secret).update(encodedParams).digest('hex');
  return { key, sign };
}

module.exports = { generateAccessHeaders };

パラメーターの「encodedParams」には「qs」のライブラリでエンコードしたパラメーターを渡します。

ビットコインを売買するスクリプトの実装

メインの売買スクリプトを作りましょう。今回はパラメーターを引数で渡すのではなく、シンプルにソースコード内に記載する形にします。

「order.js」のソースコードは以下です。

const orderKind = 'buy'; // 'buy' or 'sell'
const price = 816525;
const amount = 0.001;

const API_KEY = '{your-api-key}';
const API_SECRET = '{your-api-secret}';

const axios = require('axios');
const qs = require('qs');

const BASE_URL = 'https://api.zaif.jp/tapi';
const METHOD = 'trade';

const { generateAccessHeaders } = require('./utils');

const nonce = Date.now().toString() / 1000;
let params;
if (orderKind === 'buy') {
  params = {
    nonce,
    method: METHOD,
    currency_pair: 'btc_jpy',
    action: 'bid',
    price,
    amount
  };
} else {
  params = {
    nonce,
    method: METHOD,
    currency_pair: 'btc_jpy',
    action: 'ask',
    price,
    amount
  };
}
const encodedParams = qs.stringify(params);
const headers = generateAccessHeaders(API_KEY, API_SECRET, encodedParams);
axios
  .post(`${BASE_URL}`, encodedParams, { headers })
  .then((response) => {
    console.log(response.status);
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error.response.status);
    console.error(error.response.data);
  });

パラメーターの設定は以下です。

  • orderKind -> 買う場合は「buy」、売る場合は「sell」
  • price -> ビットコインの取引金額
  • amount -> ビットコインの取引量

ZaifはパブリックなAPIとプライベートなAPIでURLが異なっているので注意しましょう。

また、ZaifのAPIは指値注文しか対応していません。

ビットコインの売買をキャンセルするスクリプトの実装

「cancel.js」のソースコードは以下です。

const orderId = 'XXXXXXXXX';

const API_KEY = '{your-api-key}';
const API_SECRET = '{your-api-secret}';

const axios = require('axios');
const qs = require('qs');

const BASE_URL = 'https://api.zaif.jp/tapi';
const METHOD = 'cancel_order';

const { generateAccessHeaders } = require('./utilsZaif');

const nonce = Date.now().toString() / 1000;
const params = {
  nonce,
  method: METHOD,
  order_id: orderId,
  currency_pair: 'btc_jpy'
};
const encodedParams = qs.stringify(params);
const headers = generateAccessHeaders(API_KEY, API_SECRET, encodedParams);
axios
  .post(`${BASE_URL}`, encodedParams, { headers })
  .then((response) => {
    console.log(response.status);
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error.response.status);
    console.error(error.response.data);
  });

パラメーターの設定は以下です。

  • orderId -> 注文実行時の返却値に含まれる「order_id」を指定する

動作確認する

それではスクリプトを実行してみましょう。実行が成功すると「order_id」が返却されます。

$ node ./order.js
200
{ success: 1,
  return:
   { received: 0,
     remains: 0.001,
     order_id: XXXXXXXXX,
     funds: [Object] } } }

注文をキャンセルしたい場合はスクリプト内に「child_order_acceptance_id」の値を設定して実行します。

$ node ./cancel.js
200
{ success: 1,
  return:
   { order_id: XXXXXXXXX,
     funds: { jpy: 77774.319, btc: 0.513, xem: 0, mona: 0 } } }

「success」が1であれば成功です。

最後に

いかがでしたか?取引所が提供しているAPIを使えば簡単にシステムトレードが実現できます。最近は取引所のAPIをラップしたライブラリを目にするのですが、この程度の処理であればライブラリを使う必要は全く無いでしょう。では。

カテゴリ : ライフハック タグ : bitcoin, trade, zaif

2018年6月4日 By KD コメントを書く

ビットコインでシステムトレード入門(bitFlyerのAPI編)

ビットコインでシステムトレード入門(bitFlyerのAPI編)

ビットコインを取引所で購入し、トレードしてみたり、買い物してみたりした後、次に興味を持つことはシステムトレードでしょう。今回はbitFlyerのAPIを使ってシステムトレードを行う方法を紹介します。

はじめに

私のブログに遊びに来ている人にとってはご存知だと思いますが、このブログにはビットコインによる寄付の欄がサイドバーに設置してあります。ビットコインを持っていなかった人でも好奇心のある人なら、すぐにビットコインを購入したことでしょう。

ビットコインを購入してトレードしてみたり買い物で使ってみたりすると、次にシステムトレードに興味を持つのが普通です。ほとんどの取引所はトレードをシステムから行うためのAPIを公開していますので、それを利用することでオリジナルのトレードのシステムを簡単に構築できます。

今回はbitFlyerのAPIを使ってビットコインの売買をする簡単なスクリプトをNodeJSで実装する方法を紹介します。

bitFlyerのAPIを使ったシステムトレード

前提条件

以下を事前に準備してください。

  • bitFlyerのアカウント(本人確認済)を持っていること
  • bitFlyerに入金済であること
  • NodeJSがインストールされていること

もし今回初めてアカウントを作った場合は、先に取引所で売買をすることをおすすめします。そうしないと、パラメーターの意味が全く理解できないはずです。

APIキーの取得

まずはAPIキーをbitFlyer Lightningのサイトから発行しましょう。bitFlyerは通常ユーザ用のページとデベロッパー用のページを分けており、APIはデベロッパー用のbitFlyer Lightningのページから発行できます。アカウントは同じです。

ログインしたら左のバツ印から、「API」を選択します。

Bitflyer 1

次に「新しいAPIキーを追加」を選択します。

Bitflyer 2

ラベル名は何でも良いのですが今回は「my-trade」とします。

Bitflyer 3

権限設定ですが、APIキーは漏洩した場合に被害に合う可能性があるので、使うAPIのみに絞るのが懸命です。今回は「トレード」と「資産」を選択し、「OK」をクリックします。

Bitflyer 4

これでAPIキーが追加されました。

Bitflyer 5

この「API Key」と「API Secret」をプログラムで利用します。

プロジェクトの準備

それではプロジェクトのファイルとパッケージを準備しましょう。

$ mkdir my-trade
$ cd my-trade
$ yarn init -y
$ yarn add axios crypto
$ touch utils.js
$ touch order.js
$ touch cancel.js

API認証用の関数の実装

APIにはパブリックなAPIとプライベートなAPIがあります。APIキーが必要なのはプライベートなAPIです。bitFlyerのAPI認証の仕組みはここに書いてあります。

「utils.js」のソースコードは以下です。

const crypto = require('crypto');

function generateAccessHeaders(key, secret, method, path, body) {
  const timestamp = Date.now().toString();
  const bodyStr = body ? JSON.stringify(body) : '';
  const text = timestamp + method + path + bodyStr;
  const sign = crypto.createHmac('sha256', secret).update(text).digest('hex');

  return {
    'ACCESS-KEY': key,
    'ACCESS-TIMESTAMP': timestamp,
    'ACCESS-SIGN': sign
  };
}

module.exports = { generateAccessHeaders };

だいたい最初に実装する時につまずくのがAPI認証だと思いますが、気をつける点はsignを作成する材料のボディには、GETのプライベートAPIの場合は空を設定し、POSTのプライベートAPIの場合はドキュメントの通りのJSON形式を設定するところです。

ビットコインを売買するスクリプトの実装

メインの売買スクリプトを作りましょう。今回はパラメーターを引数で渡すのではなく、シンプルにソースコード内に記載する形にします。

「order.js」のソースコードは以下です。

const orderKind = 'buy'; // 'buy' or 'sell'
const orderType = 'limit'; // 'limit' or 'market
const price = 816525;
const amount = 0.001;

const API_KEY = '{your-api-key}';
const API_SECRET = '{your-api-secret}';

const axios = require('axios');

const BASE_URL = 'https://api.bitflyer.jp';
const RESOURCE_PATH = '/v1/me/sendchildorder';

const { generateAccessHeaders } = require('./utils');

let side;
if (orderKind === 'buy') {
  side = 'BUY';
} else {
  side = 'SELL';
}
let childOrderType;
if (orderType === 'market') {
  childOrderType = 'MARKET';
} else {
  childOrderType = 'LIMIT';
}
const PATH = RESOURCE_PATH;
const URL = `${BASE_URL}${PATH}`;
const method = 'POST';
const body = {
  product_code: 'BTC_JPY',
  child_order_type: childOrderType,
  side,
  price,
  size: amount,
  minute_to_expire: 43200,
  time_in_force: 'GTC'
};
const headers = generateAccessHeaders(API_KEY, API_SECRET, method, PATH, body);
axios
  .post(`${URL}`, body, { headers })
  .then((response) => {
    console.log(response.status);
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error.response.status);
    console.error(error.response.data);
  });

パラメーターの設定は以下です。

  • orderKind -> 買う場合は「buy」、売る場合は「sell」
  • orderType -> 指値注文は「limit」、成行注文は「market」
  • price -> ビットコインの取引金額
  • amount -> ビットコインの取引量

ビットコインの売買をキャンセルするスクリプトの実装

取引所での売買はちょうどよい金額と量を設定すればすんなり終わりますが、誤って売買のオーダーをしてしまった場合や長い間約定しなかった場合に、キャンセルできると便利です。

「cancel.js」のソースコードは以下です。

const orderId = 'JRF2018XXXX-XXXXXX-XXXXXX';

const API_KEY = '{your-api-key}';
const API_SECRET = '{your-api-secret}';

const axios = require('axios');

const BASE_URL = 'https://api.bitflyer.jp';
const RESOURCE_PATH = '/v1/me/cancelchildorder';

const { generateAccessHeaders } = require('./utils');

const PATH = RESOURCE_PATH;
const URL = `${BASE_URL}${PATH}`;
const method = 'POST';
const body = {
  product_code: 'BTC_JPY',
  child_order_acceptance_id: orderId
};
const headers = generateAccessHeaders(API_KEY, API_SECRET, method, PATH, body);
axios
  .post(`${URL}`, body, { headers })
  .then((response) => {
    console.log(response.status);
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error.response.status);
    console.error(error.response.data);
  });

パラメーターの設定は以下です。

  • orderId -> 注文実行時の返却値に含まれる「child_order_acceptance_id」を指定する

動作確認する

それではスクリプトを実行してみましょう。実行が成功すると「child_order_acceptance_id」が返却されます。

$ node ./order.js
200
{ child_order_acceptance_id: 'JRF2018XXXX-XXXXXX-XXXXXX' }

注文をキャンセルしたい場合はスクリプト内に「child_order_acceptance_id」の値を設定して実行します。

$ node ./cancel.js
200

エラーがでなければ成功です。

最後に

いかがでしたか?ここまでくれば後はトレードのロジックを組むだけです。システムトレードを楽しみましょう。では。

カテゴリ : ライフハック タグ : bitcoin, bitflyer, trade

ブログ更新情報や海外の関連情報などを配信する無料メルマガ

Sponsored Links

About Author

KD

世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。挑戦に終わりはない。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。

https://casualdevelopers.com/

最近の投稿

  • 2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介

    2020年JS周辺のバックエンド寄りの注目技術!ネクストNodeJSの「Deno」と分散型パッケージレジストリの「Entropic」の紹介

    2020年1月13日
  • 今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~

    今さら聞けないJavaによる関数型プログラミング入門 ~ラムダ式、ストリーム、関数型インターフェース~

    2019年11月4日
  • ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~

    ReactのためのEslintおよびPrettierの設定方法 ~Airbnb JavaScript Style Guideの適用~

    2019年10月30日
  • BashからZshに移行する方法(Mac編)

    BashからZshに移行する方法(Mac編)

    2019年10月21日
  • Create React Appを使わないでゼロからReactの開発環境を構築する方法(Webpack/Docker編)

    Create React Appを使わないでゼロからReactの開発環境を構築する方法(Webpack/Docker編)

    2019年9月30日

カテゴリ

  • 技術 Tips & Tutorials (100)
  • 技術塾 (6)
  • ライフハック (26)
  • 海外留学 (12)
  • 英語学習 (3)
  • コラム (6)

アーカイブ

最高の学習のために

人気記事ランキング

  • MySQLで「ERROR 2003 (HY000): Can't connect to MySQL server」と怒られた時の対処法
    MySQLで「ERROR 2003 (HY000): Can't connect to MySQL server」と怒られた時の対処法
  • Jupyter Notebookで「The kernel appears to have died. It will restart automatically.」というエラーが出た場合の原因と対処法
    Jupyter Notebookで「The kernel appears to have died. It will restart automatically.」というエラーが出た場合の原因と対処法
  • SAKURAのメールボックスで独自ドメインのメールを設定し、Gmail経由で送受信する方法
    SAKURAのメールボックスで独自ドメインのメールを設定し、Gmail経由で送受信する方法
  • 爆速でJenkinsをマスターしよう(GitHubアカウント統合編) ~ JenkinsのGitHub Organizationの設定方法 ~
    爆速でJenkinsをマスターしよう(GitHubアカウント統合編) ~ JenkinsのGitHub Organizationの設定方法 ~
  • Expressで「Cannot set headers after they are sent to the client」と怒られた時の対処法
    Expressで「Cannot set headers after they are sent to the client」と怒られた時の対処法
  • [tips][perl] Perlで文字コードをいい感じに処理する方法
    [tips][perl] Perlで文字コードをいい感じに処理する方法
  • バンクーバー留学豆知識:バンクーバーのATMで日本の銀行のキャッシュカードを使ってお得にお金を引き出す方法
    バンクーバー留学豆知識:バンクーバーのATMで日本の銀行のキャッシュカードを使ってお得にお金を引き出す方法
  • PythonでWebスクレイピング入門(Scrapy+Selenium編)
    PythonでWebスクレイピング入門(Scrapy+Selenium編)
  • Amazon EC2インスタンスにSSHできなくなった時の対処法
    Amazon EC2インスタンスにSSHできなくなった時の対処法
  • SpringBootのProfile毎にプロパティを使い分ける3つの方法
    SpringBootのProfile毎にプロパティを使い分ける3つの方法

Bitcoin寄付 / BTC Donation

Bitcoinを寄付しよう

BTC
Select Payment Method
Personal Info

Donation Total: BTC 0.0010

このブログの運営のためにBitcoinでの寄付を募集しています。お気持ち程度の寄付を頂けると管理者の励みになります。

Bitcoin寄付について知りたい方はこちらの記事へ

ビットコイン取引ならここ

  • ホーム
  • 技術 Tips & Tutorials
  • 技術塾
  • ライフハック
  • 海外留学
  • 英語学習
  • コラム
  • サイトマップ
  • タグ一覧
  • プライバシーポリシー
  • お問い合わせ

Copyright © 2023 KD - Casual Developers Notes