PowerShellによる仮想通貨システムトレードの始め方(bitFlyer APIの使い方)

窓使いのCoin Trading System -Vol.2

前回紹介したように、取引所のAPIはアカウントの認証を必要とせず一般的に公開されている「Public API」と、取引所のアカウントに関連付けられた「Private API」の2種類に分けることができます。Private APIを利用するためには各取引所のアカウントを取得してAPIのキーを取得する必要があります。

前提・条件

  • 開発実行環境は、24時間システムを稼働することも考慮し、「お名前.comデスクトップクラウド」の仮想マシンを使って作成~稼働まで行っています。
  • PowerShellの基本的な文法、使い方については解説を省略しています。
  • APIを公開している仮想通貨取引所の口座開設が完了しているものとします。口座開設方法については省略しています。
  • システムトレードを行うことによって必ずしも利益が出るという保証はありません。
  • .NET Framework で TLS1.1 および 1.2 を有効化する

PowerShellで使用される暗号化プロトコルは以下で確認することができます。

[Net.ServicePointManager]::SecurityProtocol
Ssl3, Tls

既定ではSSL3、TLS(1.0)が利用可能となっています。
しかし最近では暗号化プロトコルにTLS 1.2を必須とするサイトが増えてきており、仮想通貨取引所のAPIも同様となっています。既定の設定では.NET Frameworkを利用しているInvoke-WebRequestコマンドを実行するとエラーとなる場合があります。Invoke-WebRequestコマンドでTLS 1.2を利用するようにあらかじめ設定をしておきましょう。

1つ目の方法としてはInvoke-WebRequestコマンドを呼び出す前にTLS 1.2で通信することを明記します。こちらはスクリプト毎にその都度明記する必要があります。

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"

もう1つの方法としては、以下のコマンドを実行して、レジストリでTLS 1.2で通信を既定値として設定しておきます。

Set-ItemProperty -Path HKLM:\\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 -Name SchUseStrongCrypto -Value 1"

いずれかの対策を事前に行うことで、Invoke-WebRequestコマンドでAPIを利用する場合のエラーを回避することが可能です。

参考:.NET Framework で TLS1.1 および 1.2 を有効化する方法

bitFlyer APIの使い方

最初に紹介するのは、bitFlyerのAPIの使い方です。bitFlyerはビットコインやイーサリアムなど現物と呼ばれる仮想通貨取引とは別に、FX取引と呼ばれる仮想通貨の証拠金取引を行うことができます。APIは共通の部分があるものの、資産情報や注文方法が異なるところもあるので、「bitFlyer」と「bitFlyerFX」として2つに分けて紹介します。

まずはコードの一覧です。

Function Get-Price($SiteName){
    Switch ($SiteName)
    {
        "bitFlyer" {$Url = "https://api.bitflyer.jp/v1/getboard?product_code=BTC_JPY"}
        "bitFlyerFX" {$Url = "https://api.bitflyer.jp/v1/getboard?product_code=FX_BTC_JPY"}
    }
    $res = Invoke-RestMethod $Url -Method GET
    Switch ($SiteName)
    {
        {($_ -eq "bitFlyer") -Or ($_ -eq "bitFlyerFX")}{  
            $AskPrice = $res.asks[0].price
            $BidPrice = $res.bids[0].price
            $AskSize = $res.asks[0].size
            $BidSize = $res.bids[0].size
        }
    }
    $objPs = New-Object PSCustomObject
    $objPs | Add-Member -NotePropertyMembers @{Name = $SiteName}
    $objPs | Add-Member -NotePropertyMembers @{AskPrice =  $AskPrice}
    $objPs | Add-Member -NotePropertyMembers @{AskSize = $AskSize.ToString("0.00000")}
    $objPs | Add-Member -NotePropertyMembers @{BidPrice = $BidPrice}
    $objPs | Add-Member -NotePropertyMembers @{BidSize = $BidSize.ToString("0.00000")}
    $objPs | FT
}

Function Get-Keys($SiteName){
    Return (Get-Content  (".\Keys.json")  -Encoding UTF8 -Raw | ConvertFrom-Json) | Where Site -eq $SiteName
}

Function Get-Header($SiteName, $Query){
    $Keys = Get-Keys $SiteName
    $APIKey = $Keys.APIKey
    $SecretKey = $Keys.SecretKey 
    Switch ($SiteName)
    {        
        {($_ -eq "bitFlyer") -Or ($_ -eq "bitFlyerFX")}{           
            $Nonce = ([DateTimeOffset](Get-Date)).ToUnixTimeMilliseconds()
            $Query = $Nonce.ToString() + $Query
            $KeyData = [System.Text.Encoding]::UTF8.GetBytes($SecretKey)
            $QueryData = [System.Text.Encoding]::UTF8.GetBytes($Query)
            Add-Type -AssemblyName System.Security
            $HMAC = New-Object System.Security.Cryptography.HMACSHA256
            $HMAC.Key = $KeyData
            $HMACHash = $HMAC.ComputeHash($QueryData)
            $Sign = [System.BitConverter]::ToString($HMACHash).ToLower().Replace("-", "")
            $Header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Header.Add("ACCESS-KEY", "$APIKey")
            $Header.Add("ACCESS-TIMESTAMP", "$Nonce")
            $Header.Add("ACCESS-SIGN", "$Sign")
            Return $Header
        }
    }
}

Function Get-Asset($SiteName, $AssetName){
    Switch ($SiteName){
        "bitFlyer"{
            $Url ="https://api.bitflyer.jp/v1/me/getbalance"
            $Query = "GET/v1/me/getbalance"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header
            $Asset =  ($res | Where currency_code -eq "$AssetName").amount
        }
        "bitFlyerFX"{
            $Url ="https://api.bitflyer.jp/v1/me/getcollateral"
            $Query = "GET/v1/me/getcollateral"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header            
            If($AssetName -eq "jpy"){$Asset =  $res.collateral}Else{$Asset = 0}
        }    
    }
    If($AssetName -eq "jpy"){
        Return $Asset.ToString("#,0")
    }Else{
        Return $Asset.ToString("#,0.00000000")
    }
    Return $Asset
}

Function Set-Order($SiteName, $Side, $Type, $Price, $Amount){
    Switch ($SiteName)
    {
        "bitFlyer"{
            $Url ="https://api.bitflyer.jp/v1/me/sendchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "BTC_JPY")
            $Body.Add("side", $Side.ToUpper())
            $Body.Add("child_order_type",  $Type.ToUpper())
            $Body.Add("price",  "$Price")
            $Body.Add("size", "$Amount")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/sendchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            Try{
                $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
            }Catch{
                Write-Host "Oder Error! " $_.ErrorDetails.Message -ForegroundColor Red
                Return 0            
            }
            Return $res.child_order_acceptance_id
        }
        "bitFlyerFX"{
            $Url ="https://api.bitflyer.jp/v1/me/sendchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "FX_BTC_JPY")
            $Body.Add("side", $Side.ToUpper())
            $Body.Add("child_order_type",  $Type.ToUpper())
            $Body.Add("price",  "$Price")
            $Body.Add("size", "$Amount")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/sendchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            Try{
                $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
            }Catch{
                Write-Host "Oder Error! " $_.ErrorDetails.Message -ForegroundColor Red
                Return 0            
            }
            Return $res.child_order_acceptance_id
        }
    }    
}

Function Get-Order($SiteName){
    Switch ($SiteName)
    {        
        "bitFlyer"{
            $Url ="https://api.bitflyer.jp/v1/me/getchildorders?product_code=BTC_JPY&child_order_state=ACTIVE"
            $Query = "GET/v1/me/getchildorders?product_code=BTC_JPY&child_order_state=ACTIVE"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header   
        }
        "bitFlyerFX"{
            $Url ="https://api.bitflyer.jp/v1/me/getchildorders?product_code=FX_BTC_JPY&child_order_state=ACTIVE"
            $Query = "GET/v1/me/getchildorders?product_code=FX_BTC_JPY&child_order_state=ACTIVE"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header 
        }
    }
    Return $res
}

Function Cancel-Order($SiteName, $OrderID){
    Switch ($SiteName)
    {
        "bitFlyer"{     
            $Url ="https://api.bitflyer.jp/v1/me/cancelchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "BTC_JPY")
            $Body.Add("child_order_acceptance_id", "$OrderID")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/cancelchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
         }
        "bitFlyerFX"{     
            $Url ="https://api.bitflyer.jp/v1/me/cancelchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "FX_BTC_JPY")
            $Body.Add("child_order_acceptance_id", "$OrderID")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/cancelchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
         }
    }
}

#取引所 (bitFlyer, bitFlyerFX)
    $SiteName = "bitFlyer"
#資産 (jpy, btc)
    $AssetName = "jpy"
#売買 (sell, buy)
    $Side = "buy"
#指値・成行 (limit, market)
    $Type = "limit"
#価格
    $Price = 700000
#注文量 (>0.001)
    $Amount = 0.001

#価格情報
    #Get-Price $SiteName
#資産情報
    #Get-Asset $SiteName $AssetName
#売買注文
    #$OrderID = Set-Order $SiteName $Side $Type $Price $Amount
#注文情報
    #Get-Order $SiteName
#注文取消し
    #Cancel-Order $SiteName $OrderID

viwe raw

価格情報の取得:Get-Price

Function Get-Price($SiteName){
    Switch ($SiteName)
    {
        "bitFlyer" {$Url = "https://api.bitflyer.jp/v1/getboard?product_code=BTC_JPY"}
        "bitFlyerFX" {$Url = "https://api.bitflyer.jp/v1/getboard?product_code=FX_BTC_JPY"}
    }
    $res = Invoke-RestMethod $Url -Method GET
    Switch ($SiteName)
    {
        {($_ -eq "bitFlyer") -Or ($_ -eq "bitFlyerFX")}{  
            $AskPrice = $res.asks[0].price
            $BidPrice = $res.bids[0].price
            $AskSize = $res.asks[0].size
            $BidSize = $res.bids[0].size
        }
    }
    $objPs = New-Object PSCustomObject
    $objPs | Add-Member -NotePropertyMembers @{Name = $SiteName}
    $objPs | Add-Member -NotePropertyMembers @{AskPrice =  $AskPrice}
    $objPs | Add-Member -NotePropertyMembers @{AskSize = $AskSize.ToString("0.00000")}
    $objPs | Add-Member -NotePropertyMembers @{BidPrice = $BidPrice}
    $objPs | Add-Member -NotePropertyMembers @{BidSize = $BidSize.ToString("0.00000")}
    $objPs | FT
}

Public APIを使ってまずは板情報から売値(Ask)と買値(Bid)を取得してみましょう。

4-5: REST APIのURLを組み立てます。

エンドポイントhttps://api.bitflyer.jp/v1/
コマンドgetboard
パラメーターproduct_code
パラメーター値BTC_JPY, FX_BTC_JPY
(ビットコインもしくはFXでproduct_codeが異なります。)

7: Invoke-RestMethodで単純なGetメソッドなので、組み立てたURLを直接ブラウザで参照してもjson形式板情報を参照することができます。


17-23: PSCustomObjectに売値の最安値と買値の最高値の情報を格納してテーブル形式で表示しています。

Get-Price "bitFlyer"

Name AskPrice AskSize BidPrice BidSize
---- -------- ------- -------- -------
bitFlyer 1009000.0 0.24939 1008562.0 0.11000

API KeyとSecret Keyの取得:Get-Keys

Private APIを利用するための「API Key」と「Secret Key」を取得します。Web取引ツールの「bitFlyer Lightning」にログインして、左メニューから「API」を選択します。「新しいAPIキーを追加」で「API Key」と「Secret Key」を作成します。

APIキーの取得
Function Get-Keys($SiteName){
    Return (Get-Content  (".\Keys.json")  -Encoding UTF8 -Raw | ConvertFrom-Json) | Where Site -eq $SiteName
}

1-3:キーを直接コード内に記述するのは避けたいので、Keys.jsonファイルとして別途保存しておきます。bitFlyerとbitFlyerFXは、キー自体は同じものが利用できるので同様のキーを保存しておきます。

[
{
"SiteName": "bitFlyer",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
},
{
"SiteName": "bitFlyerFX",
"APIKey": "取得したAPIキー",
"SecretKey": "取得したシークレットキー"
}
]

(Keys.json)

Get-Keys "bitFlyer"

Site APIKey SecretKey
---- ------ ---------
bitFlyer aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Header情報の作成:Get-Header

取得したキーを使ってAPIの認証を行うためには、Invoke-RestMethodコマンドにHeaderとして認証情報を作成して渡す必要があります。取引所によって詳細は異なりますが、おおよそ必要な情報を文字列として連結して、SHA256ハッシュ関数を使ってシークレットキーで署名したものが認証に必要な情報となります。難しい話は読み飛ばしてもコードをそのまま再利用すれば使えるものを紹介します。

必要なHeader情報

項目
ACCESS-KEY
APIキー
ACCESS-TIMESTAMPリクエスト実行時刻 ※1
ACCESS-SIGN署名値 ※2

※1:協定世界時(UTC)の1970年1月1日午前0時0分0秒からGet-Dateコマンドで取得した時間までの経過時間(UnixTime)をミリ秒で表したもの。Nonce(number used once:ノンス)と呼ばれる重複しないための値。

※2:ACCESS-TIMESTAMP、メソッド(Get or Post or Put)、クエリー値(リクエストパス + コマンド + パラメーター)を文字列として連結してシークレットキーを使ってSHA256ハッシュ関数で署名したもの。

Function Get-Header($SiteName, $Query){
    $Keys = Get-Keys $SiteName
    $APIKey = $Keys.APIKey
    $SecretKey = $Keys.SecretKey 
    Switch ($SiteName)
    {        
        {($_ -eq "bitFlyer") -Or ($_ -eq "bitFlyerFX")}{           
            $Nonce = ([DateTimeOffset](Get-Date)).ToUnixTimeMilliseconds()
            $Query = $Nonce.ToString() + $Query
            $KeyData = [System.Text.Encoding]::UTF8.GetBytes($SecretKey)
            $QueryData = [System.Text.Encoding]::UTF8.GetBytes($Query)
            Add-Type -AssemblyName System.Security
            $HMAC = New-Object System.Security.Cryptography.HMACSHA256
            $HMAC.Key = $KeyData
            $HMACHash = $HMAC.ComputeHash($QueryData)
            $Sign = [System.BitConverter]::ToString($HMACHash).ToLower().Replace("-", "")
            $Header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Header.Add("ACCESS-KEY", "$APIKey")
            $Header.Add("ACCESS-TIMESTAMP", "$Nonce")
            $Header.Add("ACCESS-SIGN", "$Sign")
            Return $Header
        }
    }

31: 作成したGet-KeysコマンドでAPIキーを読み込みます。
36: bitFlyerとbitFlyerFXは、Header情報は同じものを利用できます。
37: NonceとしてUnixTimeを利用します。
38: NonceにQuery(メソッド + リクエストパス + コマンド + パラメーター)を追加したものを再定義します。
39: シークレットキーをバイナリに変換します。
40: Queryをバイナリに変換します。
41: System.Securityを参照する場合Add-Typeを使わないとうまくいきません。
42-44: ハッシュ関数で署名します。
45: 署名したものを、ハイフンを省いた文字列として取得します。
46-50: Header情報を作成します。

Get-Header "bitFlyer" "GET/v1/me/getbalance"

Key Value
--- -----
ACCESS-KEY aaaaaaaaaaaaaaaaaaaaaa
ACCESS-TIMESTAMP 1524622926031
ACCESS-SIGN abcd4534889e04a2d9c7f591055c3591f082cfb8d1b450853eba214d52...

資産情報の取得:Get-Asset

bitFlyerに保持している日本円とビットコインの残高を取得します。bitFlyerFXでは、資産情報として証拠金残高を取得しています。「bitFlyer Lightning」では入出金メニューから簡単に日本円の資金移動が現物とFX間でできるようになっています。

資金の移動画面
Function Get-Asset($SiteName, $AssetName){
    Switch ($SiteName){
        "bitFlyer"{
            $Url ="https://api.bitflyer.jp/v1/me/getbalance"
            $Query = "GET/v1/me/getbalance"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header
            $Asset =  ($res | Where currency_code -eq "$AssetName").amount
        }
        "bitFlyerFX"{
            $Url ="https://api.bitflyer.jp/v1/me/getcollateral"
            $Query = "GET/v1/me/getcollateral"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header            
            If($AssetName -eq "jpy"){$Asset =  $res.collateral}Else{$Asset = 0}
        }    
    }
    If($AssetName -eq "jpy"){
        Return $Asset.ToString("#,0")
    }Else{
        Return $Asset.ToString("#,0.00000000")
    }
    Return $Asset
}

62: $AssetNameで指定した資産、 “jpy”もしくは”btc”を抽出します。
69: 証拠金は日本円のみなので、$AssetNameが”jpy”のときのみ取得します。

Get-Asset "bitFlyer" "jpy"

10,000

資産情報はInvoke-RestMethodコマンドのGetメソッドで取得できます。このときHeader情報に認証データを含めることになります。

売買注文:Set-Order

Function Set-Order($SiteName, $Side, $Type, $Price, $Amount){
    Switch ($SiteName)
    {
        "bitFlyer"{
            $Url ="https://api.bitflyer.jp/v1/me/sendchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "BTC_JPY")
            $Body.Add("side", $Side.ToUpper())
            $Body.Add("child_order_type",  $Type.ToUpper())
            $Body.Add("price",  "$Price")
            $Body.Add("size", "$Amount")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/sendchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            Try{
                $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
            }Catch{
                Write-Host "Oder Error! " $_.ErrorDetails.Message -ForegroundColor Red
                Return 0            
            }
            Return $res.child_order_acceptance_id
        }
        "bitFlyerFX"{
            $Url ="https://api.bitflyer.jp/v1/me/sendchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "FX_BTC_JPY")
            $Body.Add("side", $Side.ToUpper())
            $Body.Add("child_order_type",  $Type.ToUpper())
            $Body.Add("price",  "$Price")
            $Body.Add("size", "$Amount")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/sendchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            Try{
                $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
            }Catch{
                Write-Host "Oder Error! " $_.ErrorDetails.Message -ForegroundColor Red
                Return 0            
            }
            Return $res.child_order_acceptance_id
        }
    }    
}

売買注文はInvoke-RestMethodコマンドのPostメソッドで発注することができます。このときHeader情報に認証データ、Bodyに注文内容と、合わせて送信することになります。

85: 注文情報を作成します。
86: product_codeとして”BTC_JPY”を指定していますが、他の仮想通貨も変更することで売買可能です。
87: 売買のsideは、”sell” “buy”を小文字でいずれかを指定します。
88: 成り行き、指値を、”market” ”limit”のいずれかで指定します。
89: 成り行きの場合、売買価格は無視されます。
90: 売買量はbitFlyerの場合最低で0.001btc以上を指定する必要があります。
91: 注文内容のBodyはjsonデータ形式に変換して送信します。
94-100: 売買注文を発注して成功した場合には、child_order_acceptance_idを返します。失敗した場合にはエラー内容を表示して0を返します。APIは混雑状況などにより、エラーとなる場合もあるので注意が必要です。
105: bitFlyerFXの場合は、product_codeとして”FX_BTC_JPY”を指定します。

Set-Order "bitFlyer" "buy" "limit" "700000" "0.001"

JRF20180425-035814-350185
売買注文の発注

注文の確認:Get-Order

Function Get-Order($SiteName){
    Switch ($SiteName)
    {        
        "bitFlyer"{
            $Url ="https://api.bitflyer.jp/v1/me/getchildorders?product_code=BTC_JPY&child_order_state=ACTIVE"
            $Query = "GET/v1/me/getchildorders?product_code=BTC_JPY&child_order_state=ACTIVE"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header   
        }
        "bitFlyerFX"{
            $Url ="https://api.bitflyer.jp/v1/me/getchildorders?product_code=FX_BTC_JPY&child_order_state=ACTIVE"
            $Query = "GET/v1/me/getchildorders?product_code=FX_BTC_JPY&child_order_state=ACTIVE"
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method GET -Headers $Header 
        }
    }
    Return $res
}

128: ビットコインのオープンしている注文を選択しています。
129: Queryはメソッド(Get) + リクエストパス(/v1/me/) + コマンド(getchildorders) + パラメーター(?product_code=BTC_JPY&child_order_state=ACTIVE”)を文字列として連結したものです。

Get-Order "bitFlyer"

id : 0
child_order_id : JOR20180425-035822-120972
product_code : BTC_JPY
side : BUY
child_order_type : LIMIT
price : 700000.0
average_price : 0.0
size : 0.001
child_order_state : ACTIVE
expire_date : 2018-05-25T03:58:14
child_order_date : 2018-04-25T03:58:21
child_order_acceptance_id : JRF20180425-035814-350185
outstanding_size : 0.001
cancel_size : 0.0
executed_size : 0.0
total_commission : 0.0000015

注文のキャンセル:Cancel-Order

Function Cancel-Order($SiteName, $OrderID){
    Switch ($SiteName)
    {
        "bitFlyer"{     
            $Url ="https://api.bitflyer.jp/v1/me/cancelchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "BTC_JPY")
            $Body.Add("child_order_acceptance_id", "$OrderID")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/cancelchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
         }
        "bitFlyerFX"{     
            $Url ="https://api.bitflyer.jp/v1/me/cancelchildorder"
            $Body = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
            $Body.Add("product_code", "FX_BTC_JPY")
            $Body.Add("child_order_acceptance_id", "$OrderID")
            $Body = ConvertTo-JSON $Body 
            $Query = "POST/v1/me/cancelchildorder" + $Body
            $Header = Get-Header $SiteName $Query
            $res = Invoke-RestMethod $Url -Method POST -Headers $Header -Body $Body -ContentType "application/json"
         }
    }
}

注文のキャンセルは注文発注時に取得したオーダーIDを指定して行います。

Cancel-Order "bitFlyer" JRF20180425-035814-350185

コマンドサンプル

以降は作成した各コマンドのサンプルとなります。

#取引所 (bitFlyer, bitFlyerFX)
    $SiteName = "bitFlyer"
#資産 (jpy, btc)
    $AssetName = "jpy"
#売買 (sell, buy)
    $Side = "buy"
#指値・成行 (limit, market)
    $Type = "limit"
#価格
    $Price = 700000
#注文量 (>0.001)
    $Amount = 0.001

#価格情報
    #Get-Price $SiteName
#資産情報
    #Get-Asset $SiteName $AssetName
#売買注文
    #$OrderID = Set-Order $SiteName $Side $Type $Price $Amount
#注文情報
    #Get-Order $SiteName
#注文取消し
    #Cancel-Order $SiteName $OrderID

以上がbitFlyerの基本的なAPIの利用方法となります。

この他にもAPIを利用して様々な情報の取得や、取引管理などが可能となっています。
これらのサンプルコードについても必要となる折にその都度追加していく予定です。

参考:
bitFlyer(https://bitflyer.jp/)
APIリファレンス(https://lightning.bitflyer.jp/docs?lang=ja)

著書の紹介欄

Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!

できるPRO Windows Server 2016 Hyper-V

◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

ブログの著者欄

樋口 勝一

GMOインターネット株式会社

1999年6月GMOインターネットに入社。Windows Serverをプラットフォームとしたサービス開発から運用・保守まで幅広く担当。講演登壇や出版、ネット記事連載などでマイクロソフト社と強い信頼関係を構築。2007年より「マイクロソフトMVPアワード」を受賞し、インターネットソリューションのスペシャリストとして活躍。

採用情報

関連記事