def open(self, trader, instrument, direction, order_type, order_price, quantity, take_profit, stop_loss, leverage=1.0, hedging=None): """ Open a position or buy an asset. @param hedging If defined use the defined value else use the default from the market. """ order = Order(trader, instrument.market_id) order.direction = direction order.order_type = order_type order.quantity = quantity order.leverage = leverage order.margin_trade = True order.post_only = False if order_type == Order.ORDER_LIMIT: order.price = order_price if hedging: order.hedging = hedging # generated a reference order id trader.set_ref_order_id(order) self.create_ref_oid = order.ref_order_id self.dir = order.direction self.op = order.price # retains the order price self.oq = order.quantity # ordered quantity self.tp = take_profit self.sl = stop_loss self.leverage = leverage self._stats['entry-order-type'] = order.order_type if trader.create_order(order, instrument): # keep the related create position identifier if available self.create_oid = order.order_id self.position_id = order.position_id if not self.eot and order.created_time: # only at the first open self.eot = order.created_time return True else: self._entry_state = StrategyTrade.STATE_REJECTED return False
def open(self, trader, instrument, direction, order_type, order_price, quantity, take_profit, stop_loss, leverage=1.0, hedging=None): """ Open a position or buy an asset. """ order = Order(trader, instrument.market_id) order.direction = direction order.price = order_price order.order_type = order_type order.quantity = quantity order.post_only = False order.margin_trade = True order.leverage = leverage # generated a reference order id trader.set_ref_order_id(order) self.create_ref_oid = order.ref_order_id self.dir = order.direction self.op = order.price # retains the order price self.oq = order.quantity # ordered quantity self.tp = take_profit self.sl = stop_loss self.leverage = leverage self._stats['entry-order-type'] = order.order_type if trader.create_order(order, instrument): self.position_id = order.position_id # might be market-id if not self.eot and order.created_time: self.eot = order.created_time return True else: self._entry_state = StrategyTrade.STATE_REJECTED return False
def __update_orders(self): if not self.connected: return # filters only siis managed orders src_orders = self._watcher.connector.ws.open_orders("") # "siis_") # first delete older orders order_rm_list = [] for k, order in self._orders.items(): found = False for src_order in src_orders: src_order_id = src_order['clOrdID'] or src_order['orderID'] if order.order_id == src_order[ 'clOrdID'] or order.order_id == src_order['orderID']: found = True break if not found: order_rm_list.append(order.order_id) for order_id in order_rm_list: del self._orders[order_id] # insert or update active orders for src_order in src_orders: found = False src_order_id = src_order['clOrdID'] or src_order['orderID'] order = self._orders.get(src_order_id) if order is None: # insert order = Order(self, src_order['symbol']) order.set_order_id(src_order_id) self._orders[order.order_id] = order else: order = self._orders.get(src_order_id) # logger.info(src_order) # probably modifier or when leavesQty is update the ordStatus must change # if src_order['ordStatus'] != "New": # continue # update order.direction = Position.LONG if src_order[ 'side'] == 'Buy' else Position.SHORT # 'orderQty' (ordered qty), 'cumQty' (cumulative done), 'leavesQty' (remaning) order.quantity = src_order.get('leavesQty', src_order.get('orderQty', 0)) if src_order.get('transactTime'): order.transact_time = self._parse_datetime( src_order.get('transactTime')).timestamp() if src_order['ordType'] == "Market": order.order_type = Order.ORDER_MARKET elif src_order['ordType'] == "Limit": order.order_type = Order.ORDER_LIMIT order.price = src_order.get('price') elif src_order['ordType'] == "Stop": order.order_type = Order.ORDER_STOP order.stop_price = src_order.get('stopPx') elif src_order['ordType'] == "StopLimit": order.order_type = Order.ORDER_STOP_LIMIT order.price = src_order.get('price') order.stop_price = src_order.get('stopPx') elif src_order['ordType'] == "MarketIfTouched": order.order_type = Order.ORDER_TAKE_PROFIT order.stop_price = src_order.get('stopPx') elif src_order['ordType'] == "LimitIfTouched": order.order_type = Order.ORDER_TAKE_PROFIT_LIMIT order.price = src_order.get('price') order.stop_price = src_order.get('stopPx') if src_order['timeInForce'] == 'GoodTillCancel': order.time_in_force = Order.TIME_IN_FORCE_GTC elif src_order['timeInForce'] == 'ImmediateOrCancel': order.time_in_force = Order.TIME_IN_FORCE_IOC elif src_order['timeInForce'] == 'FillOrKill': order.time_in_force = Order.TIME_IN_FORCE_FOK else: order.time_in_force = Order.TIME_IN_FORCE_GTC # triggered, ordRejReason, currency # @todo # execution options exec_inst = src_order['execInst'].split(',') # taker or maker fee if 'ParticipateDoNotInitiate' in exec_inst: order.post_only = True else: order.post_only = False # close reduce only if 'Close' in exec_inst: # close only order (must be used with reduce only, only reduce a position, and close opposites orders) order.close_only = True else: order.close_only = False # close reduce only if 'ReduceOnly' in exec_inst: # reduce only order (only reduce a position) order.reduce_only = True else: order.redeuce_only = False # execution price if 'LastPrice' in exec_inst: order.price_type = Order.PRICE_LAST elif 'IndexPrice' in exec_inst: order.price_type = Order.PRICE_MARK elif 'MarkPrice' in exec_inst: order.price_type = Order.PRICE_INDEX