Path: blob/master/ invest-robot-contest_TinkoffInvestBot-main/sandbox.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_sandbox_account_id, convert_price, get_shares_lot_size, INSTRUMENT_TICKER567TOKEN = 'TOKEN'8INITIAL_DIRECTION = 1 # Направление сделки: 0 - покупка, 1 - продажа91011def test_hypothesis():12with ti.Client(TOKEN) as client:13sharefigi = get_shares_figi(client, INSTRUMENT_TICKER)14sharecandles = get_time_series(client, sharefigi)15# Проверка гипотезы на последних 500 записях16money = 10000 # Первоначальная баланс счета17akcii = 0 # Направление сделки: 0 - покупка, 1 - продажа18n = sharecandles.shape[0] - 50019lot = get_shares_lot_size(client, INSTRUMENT_TICKER)20for i in range(500):21k = sharecandles.loc[i + n, '%K']22d = sharecandles.loc[i + n, '%D']23price = sharecandles.loc[i + n, 'close']24t = sharecandles.loc[i + n, 'time']25if k < d < 20 and akcii == 0:26print(t, 'Покупка акции', INSTRUMENT_TICKER, 'по цене', price)27akcii = 128money = money - price * lot29if k > d > 80 and akcii == 1:30print(t, 'Продажа акции', INSTRUMENT_TICKER, 'по цене', price)31akcii = 032money = money + price * lot33print('Баланс счета', money)34print('Количество акций на счете', akcii)353637def start():38logging.basicConfig(filename='tinkoff_invest_bot_sandbox.log', level=logging.DEBUG,39format='%(asctime)s %(levelname)s:%(message)s')40with ti.Client(TOKEN, app_name='Loginov-Mikhail_TinkoffInvestBot') as client:41sandbox_account_id = get_sandbox_account_id(client)42sharefigi = get_shares_figi(client, INSTRUMENT_TICKER)43sharecandles = get_time_series(client, sharefigi)44# Включение подписки на свечи указанного тикера45market_data_stream = client.create_market_data_stream()46market_data_stream.candles.subscribe(47[48ti.CandleInstrument(49figi=sharefigi,50interval=ti.SubscriptionInterval.SUBSCRIPTION_INTERVAL_FIVE_MINUTES,51)52]53)54akcii = INITIAL_DIRECTION55oi = '' # order_id - необходим для проверки исполнения выставленной заявки56for marketdata in market_data_stream:57print(marketdata)58if marketdata.subscribe_candles_response is not None:59print(marketdata.subscribe_candles_response.tracking_id)60logging.info('Включена подписка на данные для инструмента ' + INSTRUMENT_TICKER + ' c tracking_id=' +61marketdata.subscribe_candles_response.tracking_id)62if marketdata.candle is not None:63# TODO: Добавить проверку на завершение периода свечи64tempdf = create_df_from_stream(marketdata.candle)65sharecandles = recalculate_time_series(sharecandles, tempdf)66# print(sharecandles.tail())67j = sharecandles.index[-1]68k = sharecandles.loc[j, '%K']69d = sharecandles.loc[j, '%D']70price = sharecandles.loc[j, 'close']71t = sharecandles.loc[j, 'time']72print(t, price)73logging.info('Цена закрытия ' + str(price))74if oi != '':75r = client.sandbox.get_sandbox_order_state(account_id=sandbox_account_id, order_id=oi)76if r.lots_executed > 0:77logging.info('Заявка ' + oi + ' исполнена по цене ' +78str(convert_price(r.executed_order_price)) + ' в ' +79r.order_date.strftime('%Y-%m-%d %H:%M:%S'))80oi = ''81if k < d < 20 and akcii == 0 and oi == '':82print(t, k, d, price, 'Купить')83akcii = 184datestr = datetime.now().strftime('%Y-%m-%d %H:%M:%S')85r = client.sandbox.post_sandbox_order(figi=sharefigi, quantity=1, account_id=sandbox_account_id,86order_id='Loginov-Mikhail_TinkoffInvestBot_'+datestr,87direction=ti.OrderDirection.ORDER_DIRECTION_BUY,88order_type=ti.OrderType.ORDER_TYPE_LIMIT,89price=marketdata.candle.close)90print(r)91oi = r.order_id92logging.info('Выставлена заявка ' + oi + ' на покупку одного лота ' + INSTRUMENT_TICKER +93' по цене ' + str(convert_price(marketdata.candle.close)))94if k > d > 80 and akcii == 1 and oi == '':95print(t, k, d, price, 'Продать')96akcii = 097datestr = datetime.now().strftime('%Y-%m-%d %H:%M:%S')98r = client.sandbox.post_sandbox_order(figi=sharefigi, quantity=1, account_id=sandbox_account_id,99order_id='Loginov-Mikhail_TinkoffInvestBot_' + datestr,100direction=ti.OrderDirection.ORDER_DIRECTION_SELL,101order_type=ti.OrderType.ORDER_TYPE_LIMIT,102price=marketdata.candle.close)103print(r)104oi = r.order_id105logging.info('Выставлена заявка ' + oi + ' на продажу одного лота ' + INSTRUMENT_TICKER +106' по цене ' + str(convert_price(marketdata.candle.close)))107108109if __name__ == '__main__':110test_hypothesis()111start()112113114