Path: blob/master/ invest-robot-contest_TinkoffInvestBot-main/main.py
5925 views
import logging1import tinkoff.invest as ti2from datetime import datetime3from functions import get_shares_figi, get_time_series, create_df_from_stream, recalculate_time_series,\4get_account_id, convert_price, INSTRUMENT_TICKER567TOKEN = 'TOKEN'8INITIAL_DIRECTION = 1 # Направление сделки: 0 - покупка, 1 - продажа91011def main():12logging.basicConfig(filename='tinkoff_invest_bot.log', level=logging.DEBUG,13format='%(asctime)s %(levelname)s:%(message)s')14with ti.Client(TOKEN, app_name='Loginov-Mikhail.TinkoffInvestBot') as client:15account_id = get_account_id(client)16if account_id == 0:17exit(0)18print(account_id)19sharefigi = get_shares_figi(client, INSTRUMENT_TICKER)20sharecandles = get_time_series(client, sharefigi)21# Включение подписки на свечи указанного тикера22market_data_stream = client.create_market_data_stream()23market_data_stream.candles.subscribe(24[25ti.CandleInstrument(26figi=sharefigi,27interval=ti.SubscriptionInterval.SUBSCRIPTION_INTERVAL_FIVE_MINUTES,28)29]30)31akcii = INITIAL_DIRECTION32oi = '' # order_id - необходим для проверки исполнения выставленной заявки33for marketdata in market_data_stream:34# print(marketdata)35if marketdata.subscribe_candles_response is not None:36# print(marketdata.subscribe_candles_response.tracking_id)37logging.info('Включена подписка на данные для инструмента ' + INSTRUMENT_TICKER + ' c tracking_id=' +38marketdata.subscribe_candles_response.tracking_id)39if marketdata.candle is not None:40# TODO: Добавить проверку на завершение периода свечи41tempdf = create_df_from_stream(marketdata.candle)42sharecandles = recalculate_time_series(sharecandles, tempdf)43# print(sharecandles.tail())44j = sharecandles.index[-1]45k = sharecandles.loc[j, '%K']46d = sharecandles.loc[j, '%D']47price = sharecandles.loc[j, 'close']48t = sharecandles.loc[j, 'time']49print(t, price)50logging.info('Цена закрытия ' + str(price))51if oi != '':52r = client.orders.get_order_state(account_id=account_id, order_id=oi)53if r.lots_executed > 0:54logging.info('Заявка ' + oi + ' исполнена по цене ' +55str(convert_price(r.executed_order_price)) + ' в ' +56r.order_date.strftime('%Y-%m-%d %H:%M:%S'))57oi = ''58if k < d < 20 and akcii == 0 and oi == '':59print(t, k, d, price, 'Купить')60akcii = 161datestr = datetime.now().strftime('%y-%m-%d_%H:%M:%S')62r = client.orders.post_order(figi=sharefigi, quantity=1, account_id=account_id,63order_id='Loginov-Mikhail_'+datestr,64direction=ti.OrderDirection.ORDER_DIRECTION_BUY,65order_type=ti.OrderType.ORDER_TYPE_LIMIT,66price=marketdata.candle.close)67print(r)68oi = r.order_id69logging.info('Выставлена заявка ' + oi + ' (Loginov-Mikhail_' + datestr +70') на покупку одного лота ' + INSTRUMENT_TICKER + ' по цене ' +71str(convert_price(marketdata.candle.close)))72if k > d > 80 and akcii == 1 and oi == '':73print(t, k, d, price, 'Продать')74akcii = 075datestr = datetime.now().strftime('%y-%m-%d_%H:%M:%S')76r = client.orders.post_order(figi=sharefigi, quantity=1, account_id=account_id,77order_id='Loginov-Mikhail_' + datestr,78direction=ti.OrderDirection.ORDER_DIRECTION_SELL,79order_type=ti.OrderType.ORDER_TYPE_LIMIT,80price=marketdata.candle.close)81print(r)82oi = r.order_id83logging.info('Выставлена заявка ' + oi + ' (Loginov-Mikhail_' + datestr +84') на продажу одного лота ' + INSTRUMENT_TICKER + ' по цене ' +85str(convert_price(marketdata.candle.close)))868788if __name__ == '__main__':89main()909192