mirror of
https://github.com/aljazceru/bitfinex-api-py.git
synced 2025-12-20 07:14:20 +01:00
models: create static create methods
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import time
|
import time
|
||||||
|
import datetime
|
||||||
|
|
||||||
class OrderClosedModel:
|
class OrderClosedModel:
|
||||||
ID = 0
|
ID = 0
|
||||||
@@ -24,51 +25,59 @@ def now_in_mills():
|
|||||||
return int(round(time.time() * 1000))
|
return int(round(time.time() * 1000))
|
||||||
|
|
||||||
class Order:
|
class Order:
|
||||||
def __init__(self, bfxapi, closingOrderArray):
|
def __init__(self, id, gId, cId, symbol, mtsCreate, mtsUpdate, amount, amountOrig, oType,
|
||||||
self.bfxapi = bfxapi
|
typePrev, flags, status, price, priceAvg, priceTrailing, priceAuxLimit, notfiy, placeId):
|
||||||
self.id = closingOrderArray[OrderClosedModel.ID]
|
self.id = id
|
||||||
self.gId = closingOrderArray[OrderClosedModel.GID]
|
self.gId = gId
|
||||||
self.cId = closingOrderArray[OrderClosedModel.CID]
|
self.cId = cId
|
||||||
self.symbol = closingOrderArray[OrderClosedModel.SYMBOL]
|
self.symbol = symbol
|
||||||
self.mtsCreate = closingOrderArray[OrderClosedModel.MTS_CREATE]
|
self.mtsCreate = mtsCreate
|
||||||
self.mtsUpdate = closingOrderArray[OrderClosedModel.MTS_UPDATE]
|
self.mtsUpdate = mtsUpdate
|
||||||
self.amount = closingOrderArray[OrderClosedModel.AMOUNT]
|
self.amount = amount
|
||||||
self.amountOrig = closingOrderArray[OrderClosedModel.AMOUNT_ORIG]
|
self.amountOrig = amountOrig
|
||||||
self.type = closingOrderArray[OrderClosedModel.TYPE]
|
self.type = oType
|
||||||
self.typePrev = closingOrderArray[OrderClosedModel.TYPE_PREV]
|
self.typePrev = typePrev
|
||||||
self.flags = closingOrderArray[OrderClosedModel.FLAGS]
|
self.flags = flags
|
||||||
self.status = closingOrderArray[OrderClosedModel.STATUS]
|
self.status = status
|
||||||
self.price = closingOrderArray[OrderClosedModel.PRICE]
|
self.price = price
|
||||||
self.priceAvg = closingOrderArray[OrderClosedModel.PRIVE_AVG]
|
self.priceAvg = priceAvg
|
||||||
self.priceTrailing = closingOrderArray[OrderClosedModel.PRICE_TRAILING]
|
self.priceTrailing = priceTrailing
|
||||||
self.priceAuxLimit = closingOrderArray[OrderClosedModel.PRICE_AUX_LIMIT]
|
self.priceAuxLimit = priceAuxLimit
|
||||||
self.notfiy = closingOrderArray[OrderClosedModel.NOTIFY]
|
self.notfiy = notfiy
|
||||||
self.placeId = closingOrderArray[OrderClosedModel.PLACE_ID]
|
self.placeId = placeId
|
||||||
|
|
||||||
self.is_pending_bool = True
|
self.is_pending_bool = True
|
||||||
self.is_confirmed_bool = False
|
self.is_confirmed_bool = False
|
||||||
self.is_open_bool = False
|
self.is_open_bool = False
|
||||||
|
|
||||||
async def update(self, price=None, amount=None, delta=None, price_aux_limit=None,
|
self.date = datetime.datetime.fromtimestamp(mtsCreate/1000.0)
|
||||||
price_trailing=None, flags=None, time_in_force=None):
|
if priceAvg:
|
||||||
payload = { "id": self.id }
|
## if cancelled then priceAvg wont exist
|
||||||
if price is not None:
|
self.fee = (priceAvg * abs(amount)) * 0.002
|
||||||
payload['price'] = str(price)
|
|
||||||
if amount is not None:
|
|
||||||
payload['amount'] = str(amount)
|
|
||||||
if delta is not None:
|
|
||||||
payload['delta'] = str(delta)
|
|
||||||
if price_aux_limit is not None:
|
|
||||||
payload['price_aux_limit'] = str(price_aux_limit)
|
|
||||||
if price_trailing is not None:
|
|
||||||
payload['price_trailing'] = str(price_trailing)
|
|
||||||
if flags is not None:
|
|
||||||
payload['flags'] = str(flags)
|
|
||||||
if time_in_force is not None:
|
|
||||||
payload['time_in_force'] = str(time_in_force)
|
|
||||||
await self.bfxapi._send_auth_command('ou', payload)
|
|
||||||
|
|
||||||
async def close(self):
|
@staticmethod
|
||||||
await self.bfxapi._send_auth_command('oc', { 'id': self.id })
|
def from_raw_order(raw_order):
|
||||||
|
id = raw_order[OrderClosedModel.ID]
|
||||||
|
gId = raw_order[OrderClosedModel.GID]
|
||||||
|
cId = raw_order[OrderClosedModel.CID]
|
||||||
|
symbol = raw_order[OrderClosedModel.SYMBOL]
|
||||||
|
mtsCreate = raw_order[OrderClosedModel.MTS_CREATE]
|
||||||
|
mtsUpdate = raw_order[OrderClosedModel.MTS_UPDATE]
|
||||||
|
amount = raw_order[OrderClosedModel.AMOUNT]
|
||||||
|
amountOrig = raw_order[OrderClosedModel.AMOUNT_ORIG]
|
||||||
|
oType = raw_order[OrderClosedModel.TYPE]
|
||||||
|
typePrev = raw_order[OrderClosedModel.TYPE_PREV]
|
||||||
|
flags = raw_order[OrderClosedModel.FLAGS]
|
||||||
|
status = raw_order[OrderClosedModel.STATUS]
|
||||||
|
price = raw_order[OrderClosedModel.PRICE]
|
||||||
|
priceAvg = raw_order[OrderClosedModel.PRIVE_AVG]
|
||||||
|
priceTrailing = raw_order[OrderClosedModel.PRICE_TRAILING]
|
||||||
|
priceAuxLimit = raw_order[OrderClosedModel.PRICE_AUX_LIMIT]
|
||||||
|
notfiy = raw_order[OrderClosedModel.NOTIFY]
|
||||||
|
placeId = raw_order[OrderClosedModel.PLACE_ID]
|
||||||
|
|
||||||
|
return Order(id, gId, cId, symbol, mtsCreate, mtsUpdate, amount, amountOrig, oType,
|
||||||
|
typePrev, flags, status, price, priceAvg, priceTrailing, priceAuxLimit, notfiy, placeId)
|
||||||
|
|
||||||
def set_confirmed(self):
|
def set_confirmed(self):
|
||||||
self.is_pending_bool = False
|
self.is_pending_bool = False
|
||||||
|
|||||||
@@ -4,17 +4,27 @@ class Trade:
|
|||||||
SHORT = 'SHORT'
|
SHORT = 'SHORT'
|
||||||
LONG = 'LONG'
|
LONG = 'LONG'
|
||||||
|
|
||||||
def __init__(self, order, tag=''):
|
def __init__(self, id, pair, mts_create, order_id, amount, price, order_type,
|
||||||
self.order = order
|
order_price, maker, fee, fee_currency):
|
||||||
self.amount = order.amount
|
self.id = id
|
||||||
self.price = order.priceAvg
|
self.pair = pair
|
||||||
self.fee = (order.priceAvg * abs(order.amount)) * 0.002
|
self.mts_create = mts_create
|
||||||
self.mts = order.mtsCreate
|
self.date = datetime.datetime.fromtimestamp(mts_create/1000.0)
|
||||||
self.date = datetime.datetime.fromtimestamp(order.mtsCreate/1000.0)
|
self.order_id = order_id
|
||||||
self.direction = self.SHORT if order.amount < 0 else self.LONG
|
self.amount = amount
|
||||||
self.tag = tag
|
self.direction = Trade.SHORT if amount < 0 else Trade.LONG
|
||||||
|
self.price = price
|
||||||
|
self.order_type = order_type
|
||||||
|
self.order_price = order_price
|
||||||
|
self.maker = maker
|
||||||
|
self.fee = fee
|
||||||
|
self.fee_currency = fee_currency
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def from_raw_rest_trade(raw_trade):
|
||||||
|
# [24224048, 'tBTCUSD', 1542800024000, 1151353484, 0.09399997, 19963, None, None, -1, -0.000188, 'BTC']
|
||||||
|
return Trade(*raw_trade)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
''' Allow us to print the Trade object in a pretty format '''
|
return "Trade '{}' x {} @ {} <direction='{}' fee={}>".format(
|
||||||
return "Trade {} @ {} fee={} <order='{}'>".format(
|
self.pair, self.amount, self.price, self.direction, self.fee)
|
||||||
self.amount, self.price, self.fee, self.order)
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class OrderManager:
|
|||||||
# "EXCHANGE MARKET",null,null,null,0,"EXECUTED @ 18922.0(0.03299997): was PARTIALLY FILLED
|
# "EXCHANGE MARKET",null,null,null,0,"EXECUTED @ 18922.0(0.03299997): was PARTIALLY FILLED
|
||||||
# @ 18909.0(0.06700003)",null,null,18909,18913.2899961,0,0,null,null,null,0,0,null,null,null,
|
# @ 18909.0(0.06700003)",null,null,18909,18913.2899961,0,0,null,null,null,0,0,null,null,null,
|
||||||
# "API>BFX",null,null,null]]
|
# "API>BFX",null,null,null]]
|
||||||
order = Order(self.bfxapi, raw_ws_data[2])
|
order = Order.from_raw_order(raw_ws_data[2])
|
||||||
order.set_open_state(False)
|
order.set_open_state(False)
|
||||||
if order.id in self.open_orders:
|
if order.id in self.open_orders:
|
||||||
del self.open_orders[order.id]
|
del self.open_orders[order.id]
|
||||||
@@ -61,7 +61,7 @@ class OrderManager:
|
|||||||
osData = raw_ws_data[2]
|
osData = raw_ws_data[2]
|
||||||
self.open_orders = {}
|
self.open_orders = {}
|
||||||
for raw_order in osData:
|
for raw_order in osData:
|
||||||
order = Order(self.bfxapi, raw_order)
|
order = Order.from_raw_order(raw_ws_data[2])
|
||||||
order.set_open_state(True)
|
order.set_open_state(True)
|
||||||
self.open_orders[order.id] = order
|
self.open_orders[order.id] = order
|
||||||
self.bfxapi._emit('order_snapshot', self.get_open_orders())
|
self.bfxapi._emit('order_snapshot', self.get_open_orders())
|
||||||
@@ -72,7 +72,7 @@ class OrderManager:
|
|||||||
# 1542629458189, 0.01, 0.01, 'EXCHANGE LIMIT', None, None, None, 0, 'ACTIVE',
|
# 1542629458189, 0.01, 0.01, 'EXCHANGE LIMIT', None, None, None, 0, 'ACTIVE',
|
||||||
# None, None, 100, 0, 0, 0, None, None, None, 0, 0, None, None, None, 'API>BFX',
|
# None, None, 100, 0, 0, 0, None, None, None, 0, 0, None, None, None, 'API>BFX',
|
||||||
# None, None, None]]
|
# None, None, None]]
|
||||||
order = Order(self.bfxapi, raw_ws_data[2])
|
order = Order.from_raw_order(raw_ws_data[2])
|
||||||
order.set_open_state(True)
|
order.set_open_state(True)
|
||||||
self.open_orders[order.id] = order
|
self.open_orders[order.id] = order
|
||||||
await self._confirm_order(order)
|
await self._confirm_order(order)
|
||||||
@@ -85,7 +85,7 @@ class OrderManager:
|
|||||||
# 1542624024617, 0.01, 0.01, 'EXCHANGE LIMIT', None, None, None, 0, 'ACTIVE',
|
# 1542624024617, 0.01, 0.01, 'EXCHANGE LIMIT', None, None, None, 0, 'ACTIVE',
|
||||||
# None, None, 100, 0, 0, 0, None, None, None, 0, 0, None, None, None, 'API>BFX',
|
# None, None, 100, 0, 0, 0, None, None, None, 0, 0, None, None, None, 'API>BFX',
|
||||||
# None, None, None]]
|
# None, None, None]]
|
||||||
order = Order(self.bfxapi, raw_ws_data[2])
|
order = Order.from_raw_order(raw_ws_data[2])
|
||||||
order.set_open_state(True)
|
order.set_open_state(True)
|
||||||
self.open_orders[order.id] = order
|
self.open_orders[order.id] = order
|
||||||
await self._confirm_order(order)
|
await self._confirm_order(order)
|
||||||
@@ -117,7 +117,7 @@ class OrderManager:
|
|||||||
raise Exception("Order id={} is not open".format(orderId))
|
raise Exception("Order id={} is not open".format(orderId))
|
||||||
order = self.open_orders[orderId]
|
order = self.open_orders[orderId]
|
||||||
self.pending_callbacks[order.cId] = (onConfirm, onClose)
|
self.pending_callbacks[order.cId] = (onConfirm, onClose)
|
||||||
await order.update(*args, **kwargs)
|
await order._update(orderId, *args, **kwargs)
|
||||||
self.logger.info("Update Order order_id={} dispatched".format(orderId))
|
self.logger.info("Update Order order_id={} dispatched".format(orderId))
|
||||||
|
|
||||||
async def close_order(self, orderId, onConfirm=None, onClose=None):
|
async def close_order(self, orderId, onConfirm=None, onClose=None):
|
||||||
@@ -125,7 +125,7 @@ class OrderManager:
|
|||||||
raise Exception("Order id={} is not open".format(orderId))
|
raise Exception("Order id={} is not open".format(orderId))
|
||||||
order = self.open_orders[orderId]
|
order = self.open_orders[orderId]
|
||||||
self.pending_callbacks[order.cId] = (onConfirm, onClose)
|
self.pending_callbacks[order.cId] = (onConfirm, onClose)
|
||||||
await order.cancel()
|
await self._close_order(orderId)
|
||||||
self.logger.info("Order cancel order_id={} dispatched".format(orderId))
|
self.logger.info("Order cancel order_id={} dispatched".format(orderId))
|
||||||
|
|
||||||
async def close_all_orders(self):
|
async def close_all_orders(self):
|
||||||
@@ -139,3 +139,25 @@ class OrderManager:
|
|||||||
asyncio.ensure_future(self.open_orders[oid].close())
|
asyncio.ensure_future(self.open_orders[oid].close())
|
||||||
]
|
]
|
||||||
await asyncio.wait(*[ task_batch ])
|
await asyncio.wait(*[ task_batch ])
|
||||||
|
|
||||||
|
async def _close_order(self, orderId):
|
||||||
|
await self.bfxapi._send_auth_command('oc', { 'id': orderId })
|
||||||
|
|
||||||
|
async def _update(self, orderId, price=None, amount=None, delta=None, price_aux_limit=None,
|
||||||
|
price_trailing=None, flags=None, time_in_force=None):
|
||||||
|
payload = { "id": orderId }
|
||||||
|
if price is not None:
|
||||||
|
payload['price'] = str(price)
|
||||||
|
if amount is not None:
|
||||||
|
payload['amount'] = str(amount)
|
||||||
|
if delta is not None:
|
||||||
|
payload['delta'] = str(delta)
|
||||||
|
if price_aux_limit is not None:
|
||||||
|
payload['price_aux_limit'] = str(price_aux_limit)
|
||||||
|
if price_trailing is not None:
|
||||||
|
payload['price_trailing'] = str(price_trailing)
|
||||||
|
if flags is not None:
|
||||||
|
payload['flags'] = str(flags)
|
||||||
|
if time_in_force is not None:
|
||||||
|
payload['time_in_force'] = str(time_in_force)
|
||||||
|
await self.bfxapi._send_auth_command('ou', payload)
|
||||||
|
|||||||
Reference in New Issue
Block a user