Skip to content

Instantly share code, notes, and snippets.

/.rb Secret

Created September 4, 2017 07:37
Show Gist options
  • Save anonymous/de65878978336172f2f23d5e40362540 to your computer and use it in GitHub Desktop.
Save anonymous/de65878978336172f2f23d5e40362540 to your computer and use it in GitHub Desktop.
require "rest-client"
require "colorize"
require "json"
require "rubygems"
require "bittrex"
BASE_URL = "https://bittrex.com/api/v1.1/"
API_KEY = "c70107519c1a4e81925da93ff6c0369c"
API_SECRET = "9c72e39c6acb4cdd9d2c7e4f0436fbb9"
@units_bought = 0
@currency = ARGV[0]
@market_name = "BTC-"+@currency
BOT_TYPE = ARGV[1].to_i
URIs = {
:public => {
:markets => "public/getmarkets",
:currencies => "public/getcurrencies",
:market_ticker => "public/getticker?market=%s",
:market_day_summaries => "public/getmarketsummaries",
:market_day_summary => "public/getmarketsummary?market=%s",
:order_book => "public/getorderbook?market=%s&type=%s&depth=%s",
:last_trades => "public/getmarkethistory?market=%s",
},
:account => {
:balance => "account/getbalances",
:currency_balance => "account/getbalance?currency=%s",
:deposit_address => "account/getdepositaddress?currency=%s",
:withdraw => "account/withdraw?currency=%s&quantity=%s&address=%s",
:get_order_by_uuid => "account/getorder&uuid=%s",
:orders_history => "account/getorderhistory",
:market_orders_history => "account/getorderhistory?market=%s",
:withdrawal_history => "account/getwithdrawalhistory?currency=%s",
:deposit_history => "account/getwithdrawalhistory?currency=%s"
},
:market => {
:buy => "market/buylimit?market=%s&quantity=%s&rate=%s",
:sell => "market/selllimit?market=%s&quantity=%s&rate=%s",
:cancel_by_uuid => "market/cancel?uuid=%s",
:open_orders => "market/getopenorders?market=%s"
}
}
def hmac_sha256(msg, key)
digest = OpenSSL::Digest.new("sha512")
OpenSSL::HMAC.hexdigest(digest, key, msg)
end
def get_url(params)
url = BASE_URL + URIs[params[:api_type].to_sym][params[:action].to_sym]
case params[:action]
when "buy"
url = sprintf(url, params[:market], params[:quantity], params[:rate])
when "sell"
url = sprintf(url, params[:market], params[:quantity], params[:rate])
when "cancel_by_uuid"
url = sprintf(url, params[:uuid])
when "open_orders", "getticker", "market_day_summary", "last_trades", "market_orders_history"
url = sprintf(url, params[:market])
when "currency_balance", "deposit_address"
url = sprintf(url, params[:currency])
when "order_book"
url = sprintf(url, params[:market], params[:order_type], params[:depth])
end
nonce = Time.now.to_i.to_s
url = url + "&apikey=#{API_KEY}&nonce=#{nonce}" if ["market", "account"].include? params[:api_type]
return url
end
def call_api(url)
response = RestClient.get(url)
parsed_body = JSON.parse(response.body)
puts "Fetching Market Summary...".yellow
p [url, parsed_body]
puts (parsed_body["success"] ? "Success".green : "Failed".red)
parsed_body["result"] if parsed_body["success"]
end
def call_secret_api(url)
sign = hmac_sha256(url, API_SECRET)
response = RestClient.get(url, {:apisign => sign})
puts "Calling API...".yellow
parsed_body = JSON.parse(response.body)
p [url, parsed_body]
puts (parsed_body["success"] ? "Success".green : "Failed".red)
parsed_body["result"] if parsed_body["success"]
end
# method to cancel all open BTC pair orders on bittrex
def cancel_all_bot
markets_url = get_url({:api_type => "public", :action => "markets"})
markets = call_api(markets_url)
markets.each do |market|
currency = market["MarketCurrency"]
base_currency = market["BaseCurrency"]
market_name = market["MarketName"]
if market["IsActive"] and base_currency == "BTC"
open_orders_url = get_url({:api_type => "market", :action => "open_orders", :market => market_name})
open_orders = call_secret_api(open_orders_url)
if open_orders.size > 0
p [market_name, open_orders]
open_orders.each do |open_order|
cancel_order_url = get_url({:api_type => "market", :action => "cancel_by_uuid", :uuid => open_order["OrderUuid"]})
order = call_secret_api(cancel_order_url)
end
p ["Orders cancelled for #{market_name}"]
end
end
end
end
# method to sell all BTC pair orders on bittrex
# params- profit_rate(float)[default = 0.2] at which sell orders need to be set
def sell_all_bot(profit_rate = 0.2)
markets_url = get_url({:api_type => "public", :action => "markets"})
markets = call_api(markets_url)
expected_worth = 0.0
markets.each do |market|
currency = market["MarketCurrency"]
base_currency = market["BaseCurrency"]
market_name = market["MarketName"]
if market["IsActive"] and base_currency == "BTC"
get_balance_url = get_url({:api_type => "account", :action => "currency_balance", :currency => currency})
balance_details = call_secret_api(get_balance_url)
if balance_details["Available"] and balance_details["Available"] > 0.0 #purchased coins
orders_history_url = get_url({:api_type => "account", :action => "market_orders_history", :market => market_name})
orders_history = call_secret_api(orders_history_url)
net_value = 0.0
orders_history.each do |order|
net_value += order["Price"] if order["OrderType"] == "LIMIT_BUY"
net_value -= order["Price"] if order["OrderType"] == "LIMIT_SELL"
end
if net_value > 0 # buys are more, we need to get more than this net value by selling available coins
sell_price = (net_value + net_value*profit_rate)/balance_details["Available"]
sell_price = "%.8f" % sell_price
sell_limit_url = get_url({:api_type => "market", :action => "sell", :market => market_name, :quantity => balance_details["Available"], :rate => sell_price})
order_placed = call_secret_api(sell_limit_url)
p [order_placed, "for #{market_name} at #{sell_price}"]
end
expected_worth += (net_value + net_value*profit_rate)
end
end
end
p ["Expected Worth=", expected_worth]
end
def get_market_summary(market_name)
market_summary_url = get_url({:api_type => "public", :action => "market_day_summary", :market => market_name})
summary = call_api(market_summary_url).first
low_24_hr, last_price, ask_price, volume = summary["Low"], summary["Last"], summary["Ask"], summary["BaseVolume"]
[low_24_hr, last_price, ask_price, volume]
end
def buy_chunk(last_price, market_name, percent_increase, chunk)
unit_price = last_price + last_price * percent_increase
quantity = chunk/unit_price
buy_limit_url = get_url({:api_type => "market", :action => "buy", :market => market_name, :quantity => quantity, :rate => unit_price})
puts "Purchasing coin...".yellow
p [{:api_type => "market", :action => "buy", :market => market_name, :quantity => quantity, :rate => unit_price}]
order = call_secret_api(buy_limit_url)
puts ((order and !order["uuid"].nil?) ? "Success".green : "Failed".red)
cnt = 1
while cnt <= 3 and order and order["uuid"].nil? #retry
puts "Retry #{cnt}: Purchasing coin...".yellow
sleep(1) # half second
order = call_secret_api(buy_limit_url)
puts ((order and !order["uuid"].nil?) ? "Success".green : "Failed".red)
cnt += 1
end
@units_bought = quantity if order and !order["uuid"].nil?
order
end
# method to place BUY order
# params:
# percent_increase(float) - BUY price will be percent_increase of last_price of the market i.e BUY_PRICE = (1.0 + percent_increase)*last_price
# chunk(float) - Amount of BTC to invest for buying altcoin i.e BUY IF [last_price < (1.0 + prepump_buffer)*low_24_hr]
# prepump_buffer(float) - Allowed buffer for prepump
def buy_bot(percent_increase = 0.05, chunk = 0.006, prepump_buffer = 0.5)
market_name = @market_name
low_24_hr, last_price, ask_price, volume = get_market_summary(market_name)
total_spent = 0.0
p [low_24_hr, last_price, ask_price, volume]
if volume < 100 and last_price < (1.0 + prepump_buffer) * low_24_hr #last_price is smaller than 50% increase since yerterday
puts "Coin is not prepumped".blue
order = buy_chunk(last_price, market_name, percent_increase, chunk)
p [order, "Units Bought : #{@units_bought}"]
end
end
# method to BUY all low volume coins
# params:
# percent_increase(float) - BUY price will be percent_increase of last_price of the market i.e BUY_PRICE = (1.0 + percent_increase)*last_price
# chunk(float) - Amount of BTC to invest for buying altcoin i.e BUY IF [last_price < (1.0 + prepump_buffer)*low_24_hr]
# prepump_buffer(float) - Allowed buffer for prepump
def buy_all_bot(percent_increase = 0.05, chunk = 0.006, prepump_buffer = 0.5)
markets_url = get_url({:api_type => "public", :action => "markets"})
markets = call_api(markets_url)
markets.each do |market|
currency = market["MarketCurrency"]
base_currency = market["BaseCurrency"]
market_name = market["MarketName"]
if market["IsActive"] and base_currency == "BTC"
@market_name = market_name
buy_bot(percent_increase, chunk, prepump_buffer)
end
end
end
# method to place SELL order
# params:
# percent_decrease(float) - BUY price will be percent_decrease of last_price of the market, eg. SELL_PRICE = (1.0 - percent_decrease)*last_price
def sell_bot(percent_decrease = 0.1)
market_name = @market_name
currency = @currency
low_24_hr, last_price, ask_price = get_market_summary(market_name)
sell_price = last_price - percent_decrease*last_price
get_balance_url = get_url({:api_type => "account", :action => "currency_balance", :currency => currency})
balance_details = call_secret_api(get_balance_url)
sell_price = "%.8f" % sell_price
if balance_details and balance_details["Available"] and balance_details["Available"] > 0.0
p [market_name, last_price, balance_details["Available"], sell_price]
sell_limit_url = get_url({:api_type => "market", :action => "sell", :market => market_name, :quantity => balance_details["Available"], :rate => sell_price})
puts "Selling coin...".yellow
p [{:api_type => "market", :action => "sell", :market => market_name, :quantity => balance_details["Available"], :rate => sell_price}]
order_placed = call_secret_api(sell_limit_url)
puts (order_placed and !order_placed["uuid"].nil? ? "Success".green : "Failed".red)
cnt = 1
while cnt <= 3 and order_placed and order_placed["uuid"].nil? #retry
puts "Retry #{cnt} : Selling coin...".yellow
sleep(1) # half second
order_placed = call_secret_api(sell_limit_url)
puts (order_placed and !order_placed["uuid"].nil? ? "Success".green : "Failed".red)
cnt += 1
end
p [order_placed, "Sell #{balance_details["Available"]} of #{market_name} at #{sell_price}"]
else
puts "Insufficient Balance".red
end
end
# method to place BUY and SELL order immediately after purchase
# params :
# percent_increase(float) -> BUY_PRICE = (1.0 + percent_increase) * last_price
# chunk(float) -> Amount of BTC to invest for buying altcoin
# prepump_buffer(float) - Allowed buffer for prepump
# profit(float) -> SELL_PRICE = (1.0 + profit) * BUY_PRICE
# splits(int) -> How many splits of available quantity you want to make [profit] increment each time in next sell order
def buy_sell_bot(percent_increase = 0.05, chunk = 0.004, prepump_buffer = 0.5, profit = 0.2, splits = 2)
market_name = @market_name
currency = @currency
low_24_hr, last_price, ask_price = get_market_summary(market_name)
total_spent = 0.0
p [low_24_hr, last_price, ask_price]
if last_price < (1.0 + prepump_buffer)*low_24_hr #last_price is smaller than 50% increase since yerterday
order = buy_chunk(last_price, market_name, percent_increase, chunk)
buy_price = last_price + last_price * percent_increase
get_balance_url = get_url({:api_type => "account", :action => "currency_balance", :currency => currency})
balance_details = call_secret_api(get_balance_url)
p balance_details
if balance_details and balance_details["Available"] and balance_details["Available"] > 0.0 # available coins present
qty = balance_details["Available"]/splits
splits.times do |i|
qty += (balance_details["Available"].to_i % splits) if (i-1 == splits)
sell_price = buy_price + buy_price * (profit * (i+1))
sell_price = "%.8f" % sell_price
sell_limit_url = get_url({:api_type => "market", :action => "sell", :market => market_name, :quantity => qty, :rate => sell_price})
puts "Selling coin...".yellow
p [{:api_type => "market", :action => "sell", :market => market_name, :quantity => qty, :rate => sell_price}]
order_placed = call_secret_api(sell_limit_url)
puts (order_placed and !order_placed["uuid"].nil? ? "Success".green : "Failed".red)
cnt = 1
while cnt <= 3 and order_placed and order_placed["uuid"].nil? #retry
puts "Retry #{cnt} : Selling coin...".yellow
sleep(1) # half second
order_placed = call_secret_api(sell_limit_url)
puts (order_placed and !order_placed["uuid"].nil? ? "Success".green : "Failed".red)
cnt += 1
end
p [order_placed, "Sell #{qty} of #{market_name} at #{sell_price}"]
end
end
end
end
# method to place SELL order by cancelling all open orders
# params:
# percent_decrease(float) - BUY price will be percent_decrease of last_price of the market, eg. SELL_PRICE = (1.0 - percent_decrease)*last_price
def sell_at_any_cost(percent_decrease = 0.3)
market_name = @market_name
open_orders_url = get_url({:api_type => "market", :action => "open_orders", :market => market_name})
open_orders = call_secret_api(open_orders_url)
#cancel all orders
if open_orders.size > 0
open_orders.each do |open_order|
cancel_order_url = get_url({:api_type => "market", :action => "cancel_by_uuid", :uuid => open_order["OrderUuid"]})
call_secret_api(cancel_order_url)
end
end
# call sell bot again with lower profit
sell_order = sell_bot(percent_decrease)
end
buy_bot(0.05, 0.006, 0.5) if BOT_TYPE == 1
sell_order = sell_bot(0.1) if BOT_TYPE == 2
buy_sell_bot(0.05, 0.003, 0.5, 0.1, 0) if BOT_TYPE == 3
sell_at_any_cost(0.3) if BOT_TYPE == 4
buy_all_bot(0.05, 0.006, 0.5) if BOT_TYPE == 5
sell_all_bot(0.2) if BOT_TYPE == 6
cancel_all_bot if BOT_TYPE == 7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment