def send_thread_orders(self, host: str, thread_orders: List[ThreadOrderItem], datetime_start: datetime.datetime, datetime_end: datetime.datetime): log_debug('Starting threads from ' + datetime_start.strftime('%H:%M:%S.%f') + ' to ' + datetime_end.strftime('%H:%M:%S.%f')) for threaded_order in thread_orders: for i in range(0, threaded_order.threads): headers = EasyTraderOrderProcessor.get_headers_with_cookie(host, threaded_order) threading.Thread(target=self.send_thread_order_until_time, args=(host, threaded_order, datetime_start, datetime_end, headers)).start() log_debug('All threads started')
def process_orders_async(self, host: str, async_orders: List[AsyncOrderItem], datetime_start: datetime.datetime, datetime_end: datetime.datetime): asyncio.set_event_loop(asyncio.new_event_loop()) loop = asyncio.get_event_loop() async_tasks = [] for async_order in async_orders: async_tasks.append( self.send_orders_async(host=host, async_order=async_order, datetime_start=datetime_start, datetime_end=datetime_end)) log_debug('waiting for ' + str(len(async_tasks)) + ' tasks') loop.run_until_complete(asyncio.wait(async_tasks))
async def send_order_async(self, host: str, async_order: AsyncOrderItem, session: aiohttp.ClientSession, sem: asyncio.Semaphore, datetime_end: datetime.datetime): headers = AgahOnlineOrderProcessor.get_headers_with_cookie(host, async_order) tmp_data = AgahOnlineOrderProcessor.get_temp_date(async_order) send_order_url = AgahOnlineOrderProcessor.get_send_order_url(host=host) # acquire a semaphore async with sem: try: dt_now = datetime.datetime.now(tz=pytz.timezone("Asia/Tehran")) tic = timeit.default_timer() if dt_now <= datetime_end: try: async with session.post(url=send_order_url, json=tmp_data, headers=headers, verify_ssl=False) as resp: # pass toc = timeit.default_timer() log_debug("resp:" + await resp. text() + ", sendTime: " + dt_now.strftime("%H:%M:%S.%f") + ', duration:' + str(toc-tic) + ' seconds') # delete later # log_debug("resp:"+str(resp.status)+", sendTime: "+dt_now.strftime("%H:%M:%S.%f")+', duration:'+str(toc-tic) +' seconds') except Exception as ex: log_warning(str(ex) + '\n' + traceback.format_exc()) else: # this usually happens if a lot of tasks are waiting behind semaphore. # since time has passed the datetime_end, we should not make new request log_debug("time is passed of datetime_end so we do not make new request") except: log_debug("Exception happened when sending request: "+traceback. format_exc())
async def send_order_async(self, host: str, async_order: AsyncOrderItem, session: aiohttp.ClientSession, sem: asyncio.Semaphore, datetime_end: datetime.datetime): headers = EasyTraderOrderProcessor.get_headers_with_cookie(host, async_order) tmp_data = {"model": {"isin": async_order.isin_code, "financeId": "Broker", "quantity": async_order.quantity, "price": async_order.price, "state": 2, "side": EasyTraderOrderProcessor.get_order_side_int(async_order.side), "validityType": "Day", "iceberg": 0, "clientSendingUnixTimeStamp": int(time. time()*1000)}} send_order_url = EasyTraderOrderProcessor.get_send_order_url(host=host) # acquire a semaphore async with sem: try: dt_now = datetime.datetime.now(tz=pytz.timezone("Asia/Tehran")) tic = timeit.default_timer() if dt_now <= datetime_end: try: async with session.post(url=send_order_url, json=tmp_data, headers=headers, verify_ssl=False) as resp: # pass toc = timeit.default_timer() log_debug("resp:" + await resp. text() + ", sendTime: " + dt_now.strftime("%H:%M:%S.%f") + ', duration:' + str(toc-tic) + ' seconds') # delete later # log_debug("resp:"+str(resp.status)+", sendTime: "+dt_now.strftime("%H:%M:%S.%f")+', duration:'+str(toc-tic) +' seconds') except Exception as ex: log_warning(str(ex) + '\n' + traceback.format_exc()) else: # this usually happens if a lot of tasks are waiting behind semaphore. # since time has passed the datetime_end, we should not make new request log_debug("time is passed of datetime_end so we do not make new request") except: log_debug("Exception happened when sending request: "+traceback. format_exc())
async def send_orders_async(self, host: str, async_order: AsyncOrderItem, datetime_start: datetime.datetime, datetime_end: datetime.datetime): tasks = [] sem = asyncio.Semaphore(async_order.limit) delta_time = 1.0 / async_order.request_per_second timeout = aiohttp.ClientTimeout(total=40, connect=30) # unit is seconds connector = aiohttp.TCPConnector(limit=None, verify_ssl=False) async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session: a = 0 while True: if datetime.datetime.now( tz=pytz.timezone("Asia/Tehran")) < datetime_start: await asyncio.sleep(0.1) continue if datetime.datetime.now( tz=pytz.timezone("Asia/Tehran")) > datetime_end: break a += 1 # if a%50 ==49:# delete this later. just for test # await asyncio.sleep(1) log_debug( str(a) + " sending req at:" + str(datetime.datetime.now( tz=pytz.timezone("Asia/Tehran")))) coro = self.send_order_async(host=host, async_order=async_order, session=session, sem=sem, datetime_end=datetime_end) task = asyncio.ensure_future(coro) tasks.append(task) # await asyncio.sleep(0) # if we do this, we send all requests at once # it is better to send requests uniformly spread over time await asyncio.sleep(delta_time * 0.7) log_debug('waiting for tasks') if len(tasks) != 0: await asyncio.wait(tasks) log_debug('wait finished')
def send_thread_order_until_time(self, host: str, threaded_order: ThreadOrderItem, datetime_start: datetime.datetime, datetime_end: datetime.datetime, headers: Dict[str, Any]): tmp_data = OnlinePlusOrderProcessor.get_temp_date(threaded_order) send_order_url = OnlinePlusOrderProcessor.get_send_order_url(host=host) total_wait_time = (datetime_start - datetime.datetime.now( tz=pytz.timezone("Asia/Tehran"))).total_seconds() if total_wait_time > 0: log_debug('waiting ' + str(total_wait_time) + ' seconds') time.sleep(total_wait_time) dt_now = datetime.datetime.now(tz=pytz.timezone("Asia/Tehran")) while dt_now < datetime_end: tic = timeit.default_timer() log_debug('sending order') try: o = requests.post(url=send_order_url, json=tmp_data, headers=headers, timeout=10000) log_debug('order id:' + str(o.text)) except Exception as ex: log_debug(str(ex)) toc = timeit.default_timer() log_debug('order for ' + threaded_order.isin_code + ' sent in ' + str(toc - tic) + ' seconds (' + dt_now.strftime('%H:%M:%S.%f') + ')') # time.sleep(0.5) time.sleep(0.001) dt_now = datetime.datetime.now(tz=pytz.timezone("Asia/Tehran")) log_debug('Thread for ' + threaded_order.isin_code + ' finished')
def send_thread_order_until_time(self, host: str, threaded_order: ThreadOrderItem, datetime_start: datetime.datetime, datetime_end: datetime.datetime, headers: dict): tmp_data = {"model": {"isin": threaded_order.isin_code, "financeId": "Broker", "quantity": threaded_order.quantity, "price": threaded_order.price, "state": 2, "side": threaded_order.side, "validityType": "Day", "iceberg": 0, "clientSendingUnixTimeStamp": int(time.time() * 1000)}} send_order_url = EasyTraderOrderProcessor.get_send_order_url(host=host) total_wait_time = (datetime_start - datetime.datetime.now(tz=pytz.timezone("Asia/Tehran"))).total_seconds() if total_wait_time > 0: log_debug('waiting '+str(total_wait_time)+' seconds') time.sleep(total_wait_time) dt_now = datetime.datetime.now(tz=pytz.timezone("Asia/Tehran")) while dt_now < datetime_end: tic = timeit.default_timer() log_debug('sending order') try: o = requests.post(url=send_order_url, json=tmp_data, headers=headers, timeout=10000) log_debug('order id:' + str(o.text)) except Exception as ex: log_debug(str(ex)) toc = timeit.default_timer() log_debug('order for '+threaded_order.isin_code+' sent in ' + str(toc - tic) + ' seconds (' + dt_now.strftime('%H:%M:%S.%f') + ')') # time.sleep(0.5) time.sleep(0.001) dt_now = datetime.datetime.now(tz=pytz.timezone("Asia/Tehran")) log_debug('Thread for '+threaded_order.isin_code+' finished')