Path: blob/master/ invest-robot-contest_sirius-master/strategy/buy_sell_utils.py
5933 views
import logging1import time23from api_calls.prod_buy import prod_place_order, prod_get_order_state, prod_cancel_order4from api_calls.sandbox_buy import sandbox_place_order, sandbox_get_order_state, sandbox_cancel_order5from utils.datetime_utils import current_date6from utils.settings import settings7from utils.util import price_to_float89order_poll_interval = 110seconds_to_wait_for_order_finished = 300111213def make_deal_result(price, deal_price, commission, datetime):14return {'price': price, 'deal_price': deal_price, 'commission': commission, 'datetime': datetime}151617def buy(account_info, instrument_info, candles):18try:19if settings()['MAIN']['mode'] == 'history_test':20return execute_history_test_order(instrument_info, candles)21if settings()['MAIN']['mode'] == 'sandbox':22return place_order_and_wait_for_finish(account_info, instrument_info, 'buy', True)23if settings()['MAIN']['mode'] == 'prod':24return place_order_and_wait_for_finish(account_info, instrument_info, 'buy', False)25except Exception as ex:26logging.error("Buy failed, account_info = {}, instrument_info = {}, exception = {}",27account_info, instrument_info, ex)28return None293031def sell(account_info, instrument_info, candles):32try:33if settings()['MAIN']['mode'] == 'history_test':34return execute_history_test_order(instrument_info, candles)35if settings()['MAIN']['mode'] == 'sandbox':36return place_order_and_wait_for_finish(account_info, instrument_info, 'sell', True)37if settings()['MAIN']['mode'] == 'prod':38return place_order_and_wait_for_finish(account_info, instrument_info, 'sell', False)39except Exception as ex:40logging.error("Sell failed, account_info = {}, instrument_info = {}, exception = {}",41account_info, instrument_info, ex)42return None434445def execute_history_test_order(instrument_info, candles):46last_candle = candles[-1]47test_price = last_candle['price']4849min_lot = instrument_info['min_lot']5051deal_price = test_price * min_lot52commission = 0.003 * deal_price53return make_deal_result(test_price, deal_price, commission, last_candle['time'])545556def place_order_and_wait_for_finish(account_info, instrument_info, deal_type, is_sandbox):57account_id = account_info['account_id']5859if is_sandbox:60order = sandbox_place_order(account_id, instrument_info['figi'], 1, deal_type)61else:62order = prod_place_order(account_id, instrument_info['figi'], 1, deal_type)6364order_id = order['orderId']65order_state = wait_for_order_statuses(account_id, order_id,66['EXECUTION_REPORT_STATUS_FILL', 'EXECUTION_REPORT_STATUS_REJECTED'], is_sandbox)67logging.info("Trying to make '{}' for instrument = {}".format(deal_type, instrument_info))6869if order_state['executionReportStatus'] == 'EXECUTION_REPORT_STATUS_FILL':70price = price_to_float(order_state['executedOrderPrice']['units'], order_state['executedOrderPrice']['nano'])71deal_price = price_to_float(order_state['executedOrderPrice']['units'],72order_state['executedOrderPrice']['nano'])73commission = price_to_float(order_state['executedCommission']['units'],74order_state['executedCommission']['nano'])75exec_datetime = current_date()7677logging.info(78"Deal '{}' successfully finished, instrument = {}, price = {}, deal_price = {}, commission = {} datetime = {}"79.format(deal_type, instrument_info, price, deal_price, commission, exec_datetime))8081return make_deal_result(price, deal_price, commission, exec_datetime)82else:83if is_sandbox:84sandbox_cancel_order(account_id, order_id)85else:86prod_cancel_order(account_id, order_id)87logging.error("Deal '{}' failed, instrument = {}, last order state = {}. Cancelling order"88.format(deal_type, instrument_info, order_state))89return None909192def wait_for_order_statuses(account_id, order_id, order_statuses, is_sandbox):93start = time.time()94order_state = None9596while True:97time.sleep(order_poll_interval)98if is_sandbox:99order_state = sandbox_get_order_state(account_id, order_id)100else:101order_state = prod_get_order_state(account_id, order_id)102103logging.debug("Last order state = {}".format(order_state))104order_status = order_state['executionReportStatus']105if order_status in order_statuses:106break107seconds_elapsed = time.time() - start108if seconds_elapsed > seconds_to_wait_for_order_finished:109break110111return order_state112113114