ビットコイン自動売買BOT作成 その4:「現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りがセットのOCO注文)」の作り方
この記事の読了目安は約 7 分です。

目次
前回の記事はこちら
前回の記事(その3)は、「現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りが独立した指値注文)」の作り方の記事でした。
今回の目標;「現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りがセットのOCO注文)」の作成
記事その3で作った「現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りが独立した指値注文)」では、買い注文と売り注文が独立しているので、買い注文が約定しても、売り注文は残ります。
このプログラムをOCO注文(One-Cancels-the-Other order)に変更することで、買いと売りをセットで注文を出して、一方が成立(約定)すれば、もう一方は自動でキャンセルする注文方法です。
OCO注文は2つの子注文(child order)を組み合わせて出す注文なので、API上では親注文(parent order)の一種として利用できます。
プログラム作成の流れ
下記の記事その3で作った「現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りが独立した指値注文)」をベースに作成を開始します。
####################################################################################################
#「③ 現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りが独立した指値注文)」
# https://soutai.info/how-to-make-bitcoin-trade-bot-03/
####################################################################################################
#冒頭にrequire等呼び出し関係列挙
require 'net/http'
require 'uri'
require 'json' #JSONメソッド呼出し
require "openssl"
require './api-key' #同じディレクトリのapi-key.rbから呼出し
key = API_KEY #api-key.rbから呼出し
secret = API_SECRET #api-key.rbから呼出し
#現在価格チェック(始)
uri = URI.parse("https://api.bitflyer.jp")
uri.path = '/v1/getboard'
uri.query = 'product_code=FX_BTC_JPY' #FX_BTC_JPYを選択。空欄の場合は"BTC_JPY(現物)"
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.get uri.request_uri
response_hash = JSON.parse(response.body) #JSON.parse()メソッドでJSON形式の文字列からハッシュ形式へ変換
puts "現在価格チェック↓"
puts check_price = response_hash["mid_price"].to_i #ハッシュから中値("mid_price")のみ抽出。「.to_i」で整数に変換
#現在価格チェック(終)
#発注する価格の計算(始)
puts "発注する価格の計算(buy_price)↓"
puts buy_price = check_price - 100000 #現在価格マイナス10万円で買い注文
puts "発注する価格の計算(sell_price)↓"
puts sell_price = check_price + 100000 #現在価格プラス10万円で売り注文
#発注する価格の計算(終)
#買い注文を出す(始)
timestamp = Time.now.to_i.to_s
method = "POST"
uri = URI.parse("https://api.bitflyer.jp")
uri.path = "/v1/me/sendchildorder"
body = '{
"product_code": "FX_BTC_JPY",
"child_order_type": "LIMIT",
"side": "BUY",
"price": ' + buy_price.to_s + ',
"size": 0.01,
}'
text = timestamp + method + uri.request_uri + body
sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret, text)
options = Net::HTTP::Post.new(uri.request_uri, initheader = {
"ACCESS-KEY" => key,
"ACCESS-TIMESTAMP" => timestamp,
"ACCESS-SIGN" => sign,
"Content-Type" => "application/json"
});
options.body = body
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.request(options)
puts "買い注文の承認ID↓"
puts response.body
#買い注文を出す(終)
#売り注文を出す(始)
timestamp = Time.now.to_i.to_s
method = "POST"
uri = URI.parse("https://api.bitflyer.jp")
uri.path = "/v1/me/sendchildorder"
body = '{
"product_code": "FX_BTC_JPY",
"child_order_type": "LIMIT",
"side": "SELL",
"price": ' + sell_price.to_s + ',
"size": 0.01,
}'
text = timestamp + method + uri.request_uri + body
sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret, text)
options = Net::HTTP::Post.new(uri.request_uri, initheader = {
"ACCESS-KEY" => key,
"ACCESS-TIMESTAMP" => timestamp,
"ACCESS-SIGN" => sign,
"Content-Type" => "application/json"
});
options.body = body
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.request(options)
puts "売り注文の承認ID↓"
puts response.body
#売り注文を出す(終)
上記の単発の指値注文は子注文(child order)のAPI利用で、今回のOCO注文は親注文(parent order)のAPI利用なので、注文で利用するAPIをsendchildorderからsendparentorderに差し替えます。
####################################################################################################
#「④ 現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りがセットのOCO注文)」
# https://soutai.info/how-to-make-bitcoin-trade-bot-04/
####################################################################################################
#冒頭にrequire等呼び出し関係列挙
require 'net/http'
require 'uri'
require 'json' #JSONメソッド呼出し
require "openssl"
require './api-key' #同じディレクトリのapi-key.rbから呼出し
key = API_KEY #api-key.rbから呼出し
secret = API_SECRET #api-key.rbから呼出し
#現在価格チェック(始)
uri = URI.parse("https://api.bitflyer.jp")
uri.path = '/v1/getboard'
uri.query = 'product_code=FX_BTC_JPY' #FX_BTC_JPYを選択。空欄の場合は"BTC_JPY(現物)"
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.get uri.request_uri
response_hash = JSON.parse(response.body) #JSON.parse()メソッドでJSON形式の文字列からハッシュ形式へ変換
puts "現在価格チェック↓"
puts check_price = response_hash["mid_price"].to_i #ハッシュから中値("mid_price")のみ抽出。「.to_i」で整数に変換
#現在価格チェック(終)
#発注する価格の計算(始)
puts "発注する価格の計算(buy_price)↓"
puts buy_price = check_price - 100000 #現在価格マイナス10万円で買い注文
puts "発注する価格の計算(sell_price)↓"
puts sell_price = check_price + 100000 #現在価格プラス10万円で売り注文
#発注する価格の計算(終)
#買いと売りがセットのOCO注文を出す(始)
timestamp = Time.now.to_i.to_s
method = "POST"
uri = URI.parse("https://api.bitflyer.jp")
uri.path = "/v1/me/sendparentorder" #OCO注文なので親注文に変更
body = '{
"order_method": "OCO",
"minute_to_expire": 43200,
"time_in_force": "GTC",
"parameters": [{
"product_code": "FX_BTC_JPY",
"condition_type": "LIMIT",
"side": "BUY",
"price": ' + buy_price.to_s + ',
"size": 0.01
},
{
"product_code": "FX_BTC_JPY",
"condition_type": "LIMIT",
"side": "SELL",
"price": ' + sell_price.to_s + ',
"size": 0.01
}]
}'
text = timestamp + method + uri.request_uri + body
sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret, text)
options = Net::HTTP::Post.new(uri.request_uri, initheader = {
"ACCESS-KEY" => key,
"ACCESS-TIMESTAMP" => timestamp,
"ACCESS-SIGN" => sign,
"Content-Type" => "application/json"
});
options.body = body
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.request(options)
puts "買いと売りがセットのOCO注文の承認ID↓"
puts response.body
#買いと売りがセットのOCO注文を出す(終)
実行してみるとうまく注文が出せました^^。注文が出せたのでAPI の承認 ID(“JRF********-******-******”)が返ってきてます。
今回は「現在価格から一定額下落で指値買い、一定額上昇で指値売りプログラム(買いと売りがセットのOCO注文)」を作成しました。
初心者の自分でもなんとかできそうです。Rubyプログラミング面白いです^^。
それでは、続きはまた後日(^^)ノ
続きはこちら
↓↓続きのその5では「一定時間毎に現在価格をチェックし、売り目標まで下落で成行売り、買い目標まで上昇で成行買いプログラム」を作成してみます。↓↓
br>
関連リンク集
この記事のBOTはビットフライヤーLightning用です。登録がまだの方は下のバナーからどうぞ。

この記事について
仮想通貨の利益の投資先について
ビットコインをはじめとする仮想通貨は基本的にハイリスクハイリターンのキャピタルゲイン型の投資ですので、利益をそのまま仮想通貨へ再投資するとリスクも増大していきます。利益を再投資して「ガンガンいこうぜ」ってアツくなる気持ちを抑えて、仮想通貨の利益はできるだけソーシャルレンディング等のミドルリスクミドルリターンのインカムゲイン型の投資へ回すという投資方針でいこうと考えています。
ハイリスクハイリターンな投資はアーリーリタイアを目指すため
そもそもなぜ、ハイリスクハイリターンの投資も並行して行っているかといえば、それはアーリーリタイアを目指しているためです。インカムゲイン型の投資の中で比較的利回りの良いソーシャルレンディングですが、アーリーリタイアの資金をソーシャルレンディングだけの投資で回すと時間がかかり過ぎて、リタイア資金が貯まった頃には、定年が近づいてきてあまりアーリーではなくなってしまうのです(笑)
ということで、アーリーリタイアが目的ではなく、今の収入+αで生活にゆとりを得るために投資を考えている人でしたら、ソーシャルレンディング等のミドルリスクミドルリターンのインカムゲイン型の投資をオススメします。仮想通貨取引よりも損失を出すリスクはぐっと低くなります。
ソーシャルレンディング会社の情報については下記(ソーシャルレンディングのカテゴリー)をご覧ください。
注意事項
- 仮想通貨取引は、法定通貨取引(FX取引)よりもハイリスクハイリターンです。
- リスク対策として、他の案件にも資金を分散して投資することをおすすめします。
- 投資は自己責任で行ってください。
.
Category:アーリーリタイア(FIRE)の記事一覧
- 「タイは物価が安くて日本より優雅なリタイア生活ができる」というのが過去の話になった件
- 年金受給開始「75歳とか、もっと延ばしてもいい」 内閣府の検討会で意見が!
- 待ちに待った休暇とアーリーリタイア
- 65歳定年延長とアーリーリタイア
- 【投資実績公開】 会社依存度編:2017年上半期は、投資の利益が給与収入を上回り、会社依存度は38%
- 人生における豊かさとは何か?価値観は人それぞれ【私の価値観】
- 投資資金と生活資金に対するスタンス;生活還元型と生活分離型【私の投資資金スタンス】
- 「普通の人が老後まで安心して暮らすためのお金の話」を読んで
- 投資ライフバランス(方針の見直し)
![]()
Tweet

