Skip to content

Commit

Permalink
[BB] Improve order management #34
Browse files Browse the repository at this point in the history
  • Loading branch information
4TT1L4 committed May 22, 2024
1 parent 5251934 commit c463ed3
Showing 1 changed file with 58 additions and 44 deletions.
102 changes: 58 additions & 44 deletions strategies/bollinger_bands_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
class bollinger_bands_strategy:
def __init__(self, api_client, CONFIG, logger):
logger.info(" > init: bollinger_bands_strategy instance created.")

logger.info("========================================================================")
logger.info(" ")
logger.info(" ⚠️ WARNING! ⚠️ ")
Expand All @@ -25,13 +25,10 @@ def __init__(self, api_client, CONFIG, logger):
self.start_time = datetime.now()
self.counter = 0
self.last_execution_time = None
self.last_order_ref=None
self._values = (None, None)
self.api_client=api_client
self.logger=logger
self.api_client : Api = api_client
self.logger = logger
self.initialized = False
self.sell_order_ref = None
self.buy_order_ref = None
self.last_candle = None

# Strategy configuration:
Expand All @@ -55,20 +52,10 @@ def __init__(self, api_client, CONFIG, logger):
def place_buy_order(self, api_client, logger, price):
logger.info(" ⚙️ Placing BUY order...")

if not self.buy_order_ref == None:
logger.info(f" > Already placed BUY order. Nothing to do.")
return

if self.sell_order_ref == None:
logger.debug(f" > No SELL order. Nothing to cancel.")
else:
try:
response = api_client.cancel_order(self.sell_order_ref)
logger.info(f" > [OK] Canceled SELL order: {self.sell_order_ref}")
self.sell_order_ref = None
except:
logger.exception(f" > ⚠️ [FAILED] could not cancel order: {self.sell_order_ref} ⚠️")
logger.error(f" > Exception! ")
logger.info(" > Cancel all SELL orders...")
self.cancel_sell_orders()
logger.info(" > [OK] Canceled all SELL orders.")

try:
balance_available = int(api_client.get_balances().get(self.base_asset, 0))
logger.debug(f" > balance_available : {balance_available}")
Expand All @@ -89,29 +76,17 @@ def place_buy_order(self, api_client, logger, price):
price_amount=f"{int(math.floor(offered_amount / price))}"
)
logger.info(f" > [OK] PLACED NEW BUY ORDER: {response.order_ref}")
self.buy_order_ref=response.order_ref
except:
logger.error(" > ⚠️ [FAILED] Could not place BUY order. ⚠️")
logger.exception(f" > Exception! ")

def place_sell_order(self, api_client, logger, price):
logger.info("Placing SELL order...")

if not self.sell_order_ref == None:
logger.info(f" > Already placed SELL order. Nothing to do.")
return

if self.buy_order_ref == None:
logger.debug(f" > No BUY order placed. Nothing to cancel.")
else:
try:
logger.info(f" ⚙️ Canceling BUY order: {self.buy_order_ref}")
response = api_client.cancel_order(self.buy_order_ref)
logger.info(f" > [OK] Canceled BUY order: {self.buy_order_ref}")
self.buy_order_ref = None
except:
logger.error(f" > ⚠️ [FAILED] could not cancel order: {self.buy_order_ref} ⚠️")
logger.exception(f" > Exception! ")
logger.info(" > Cancel all BUY orders...")
self.cancel_buy_orders()
logger.info(" > [OK] Canceled all BUY orders.")

try:
balance_available = int(api_client.get_balances().get(self.target_asset, 0))
logger.info(f" > balance_available : {balance_available}")
Expand All @@ -130,11 +105,41 @@ def place_sell_order(self, api_client, logger, price):
price_amount=f"{int(math.floor(order_size * price))}"
)
logger.info(f" > [OK] PLACED NEW SELL ORDER: {response.order_ref}")
self.sell_order_ref=response.order_ref
self.sell_order_ref = response.order_ref
except:
logger.error(f" > ⚠️ [FAILED] Could not place SELL order. ⚠️")
logger.exception(f" > Exception! ")

def cancel_buy_orders(self):
self.cancel_orders("bid")

def cancel_sell_orders(self):
self.cancel_orders("ask")

def cancel_orders(self, side):

while True:
orders = []
own_orders = self.api_client.get_own_orders(self.market)
if (side == "ask"):
orders = own_orders.asks
else:
orders = own_orders.bids

if len(orders) == 0:
return
else:
self.logger.info(f" Remaining {side} orders: {len(orders)}.")

order = orders[0]
try:
self.logger.info(f" ⚙️ Canceling order: {order.output_reference}")
self.api_client.cancel_order(order.output_reference)
self.logger.info(f" > [OK] Canceled order: {order.output_reference}")
except:
self.logger.error(f" > ⚠️ [FAILED] could not cancel order: {order.output_reference} ⚠️")
self.logger.exception(f" > Exception! ")

def process_candle(self, candle):
self.logger.info(f"--------------------------------------------------------------------------------")
self.logger.info(f" > processsing candle - timestamp: {candle.timestamp} - base_close: {candle.base_close}")
Expand All @@ -158,9 +163,6 @@ def process_candle(self, candle):
self.logger.info(f" Bollinger Bands: Initializing... ⚙️ ⏳ ")
self.logger.info(f" > Upper band: Not available.")
self.logger.info(f" > Lower band: Not available.")
self.logger.info(f" Orders: ")
self.logger.info(f" > On-Chain BUY order: {self.buy_order_ref} ")
self.logger.info(f" > On-Chain SELL order: {self.sell_order_ref} ")
return

self.logger.info(f" Bollinger Bands: ")
Expand All @@ -179,11 +181,23 @@ def process_candle(self, candle):
elif self._values[-2] <= self.bb[-2].ub and self._values[-1] > self.bb[-1].ub:
self.logger.info(f" -> Price moved above the upper band -> SELL! 💲 💲 💲 ")
self.place_sell_order(self.api_client, self.logger, candle.base_close)

self.logger.info(f" Orders: ")
self.logger.info(f" > On-Chain BUY order: {self.buy_order_ref} ")
self.logger.info(f" > On-Chain SELL order: {self.sell_order_ref} ")

self.log_orders()

def log_orders(self):
own_orders = self.api_client.get_own_orders(self.market)

self.logger.info(" Orders:")

if (len(own_orders.asks) + len(own_orders.bids)) == 0:
self.logger.info(f" > No orders.")
return

for sell_order in own_orders.asks:
self.logger.info(f" > SELL: {sell_order.output_reference} ")

for sell_order in own_orders.bids:
self.logger.info(f" > BUY: {sell_order.output_reference} ")

def execute(self, api_client : Api, CONFIG, logger):
current_time = datetime.now()
Expand Down

0 comments on commit c463ed3

Please sign in to comment.