Class: BitexBot::SellOpeningFlow

Inherits:
OpeningFlow
  • Object
show all
Defined in:
lib/bitex_bot/models/sell_opening_flow.rb

Overview

A workflow for selling bitcoin in Bitex and buying on another exchange. The SellOpeningFlow factory function estimates how much you could buy on the other exchange and calculates a reasonable price taking into account the remote order book and the recent operated volume.

When created, a SellOpeningFlow places an Ask on Bitex for the calculated quantity and price, when the Ask is matched on Bitex an OpenSell is created to buy the same quantity for a lower price on the other exchange.

A SellOpeningFlow can be cancelled at any point, which will cancel the Bitex order and any orders on the remote exchange created from its OpenSell’s

Instance Attribute Summary collapse

Class Method Summary collapse

Methods inherited from OpeningFlow

active, active_transaction?, calc_remote_value, create_open_position!, create_order!, enough_funds?, enough_remote_funds?, expected_kind_transaction?, expected_order_book?, #finalise!, maker_plus, old_active, open_position?, sought_transaction?, #statuses, sync_open_positions

Instance Attribute Details

#order_idObject

The first thing a SellOpeningFlow does is placing an Ask on Bitex, this is its unique id.

Returns:

  • (Object)

    the current value of order_id



13
14
15
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 13

def order_id
  @order_id
end

Class Method Details

.available_maker_balanceObject



110
111
112
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 110

def self.available_maker_balance
  Robot.maker.balance.crypto.available
end

.create_for_market(taker_fiat_balance, taker_asks, taker_transactions, maker_fee, taker_fee, store) ⇒ SellOpeningFlow

Start a workflow for selling bitcoin on bitex and buying on the other exchange. The quantity to be sold on bitex is retrieved from Settings, if there is not enough BTC on bitex or USD on the other exchange then no order will be placed and an exception will be raised instead.

The amount a SellOpeningFlow will try to sell and the price it will try to charge are derived from these parameters:

of USD on the other exchange.

Parameters:

  • usd_balance (BigDecimal)

    amount of usd available in the other exchange that can be spent to balance this sale.

  • order_book ([price, quantity])

    a list of lists representing an ask order book in the other exchange.

  • transactions (Hash)

    a list of hashes representing all transactions in the other exchange: Each hash contains ‘date’, ‘tid’, ‘price’ and ‘amount’, where ‘amount’ is the BTC transacted.

  • maker_fee (BigDecimal)

    the transaction fee to pay on our maker exchange.

  • taker_fee (BigDecimal)

    the transaction fee to pay on the taker exchange.

  • store (Store)

    An updated config for this robot, mainly to use for profit.

Returns:

Raises:

  • (CannotCreateFlow)

    If there’s any problem creating this flow, for example when you run out of BTC on bitex or out



31
32
33
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 31

def self.create_for_market(taker_fiat_balance, taker_asks, taker_transactions, maker_fee, taker_fee, store)
  super
end

.fx_rateObject

end: create_for_market helpers



82
83
84
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 82

def self.fx_rate
  Settings.selling_fx_rate
end

.maker_balanceObject



106
107
108
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 106

def self.maker_balance
  store.maker_crypto
end

.maker_price(fiat_to_spend_re_buying) ⇒ Object

create_for_market helpers



52
53
54
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 52

def self.maker_price(fiat_to_spend_re_buying)
  fiat_to_spend_re_buying * fx_rate / value_to_use * (1 + profit / 100)
end

.maker_specie_to_obtainObject



94
95
96
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 94

def self.maker_specie_to_obtain
  Robot.maker.quote.upcase
end

.maker_specie_to_spendObject



90
91
92
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 90

def self.maker_specie_to_spend
  Robot.maker.base.upcase
end

.open_position_classObject



40
41
42
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 40

def self.open_position_class
  OpenSell
end

.order_classObject



56
57
58
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 56

def self.order_class
  Bitex::Ask
end

.order_typeObject



61
62
63
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 61

def self.order_type
  :sell
end

.profitObject



65
66
67
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 65

def self.profit
  store.selling_profit || Settings.selling.profit
end

.remote_value_to_use(value_to_use_needed, safest_price) ⇒ Object



69
70
71
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 69

def self.remote_value_to_use(value_to_use_needed, safest_price)
  value_to_use_needed * safest_price
end

.safest_price(transactions, taker_asks, bitcoins_to_use) ⇒ Object



73
74
75
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 73

def self.safest_price(transactions, taker_asks, bitcoins_to_use)
  OrderBookSimulator.run(Settings.time_to_live, transactions, taker_asks, nil, bitcoins_to_use, nil)
end

.taker_specie_to_obtainObject



102
103
104
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 102

def self.taker_specie_to_obtain
  Robot.taker.base.upcase
end

.taker_specie_to_spendObject



98
99
100
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 98

def self.taker_specie_to_spend
  Robot.taker.quote.upcase
end

.transaction_classObject

sought_transaction helpers



46
47
48
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 46

def self.transaction_class
  Bitex::Sell
end

.transaction_order_id(transaction) ⇒ Object

sync_open_positions helpers



36
37
38
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 36

def self.transaction_order_id(transaction)
  transaction.raw.ask_id
end

.value_per_orderObject



86
87
88
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 86

def self.value_per_order
  value_to_use
end

.value_to_useObject



77
78
79
# File 'lib/bitex_bot/models/sell_opening_flow.rb', line 77

def self.value_to_use
  store.selling_quantity_to_sell_per_order || Settings.selling.quantity_to_sell_per_order
end