Pythonanywhere заблокирован при ожидании

#python #pythonanywhere

Вопрос:

Я пытаюсь запустить следующий скрипт python на Pythonanywhere.com . Скрипт заблокирован в функции await в основной функции (см. Цикл while). Этот код работает отлично, когда я запускаю его на своем компьютере без ошибок.

Фрагмент кода

 async def main(coin, minQty, minNotional, histdata, open_position=False, cross_below=True, gotbalance=False):
    bm = BinanceSocketManager(client)
    ts = bm.trade_socket(coin)
    last_high = 0
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            if res:
                frame = createframe(res)
                if last_high < frame.Price[0]:
                    last_high = frame.Price[0]
 

Полный код

 import nest_asyncio
import asyncio
import pandas as pd
from binance import BinanceSocketManager
from binance.client import Client
from keys import api_key, api_secret
import numpy as np
from datetime import datetime
import winsound
import urllib.request

nest_asyncio.apply()

client = Client(api_key, api_secret)

ST = 7
LT = 25
coin = 'BTCUSDT'


def gethistoricals(symbol, LT):
    df = pd.DataFrame(client.get_historical_klines(symbol, '5m', str((LT - 1) * 5)   'mins ago UTC'))
    df = df.iloc[:, :6]
    df.columns = ['Timestamp', 'Open', 'High', 'Low', 'Close', 'Volume']

    df.Open = df.Open.astype('float')
    df.High = df.High.astype('float')
    df.Low = df.Low.astype('float')
    df.Close = df.Close.astype('float')
    df.Volume = df.Volume.astype('float')

    df['ST'] = df.Close.rolling(ST - 1).mean()
    df['LT'] = df.Close.rolling(LT - 1).mean()
    high_low = df['High'] - df['Low']
    high_close = np.abs(df['High'] - df['Close'].shift())
    low_close = np.abs(df['Low'] - df['Close'].shift())

    ranges = pd.concat([high_low, high_close, low_close], axis=1)
    true_range = np.max(ranges, axis=1)

    df['ATR'] = true_range.rolling(14).sum()/14
    df['Datetime'] = df['Timestamp'].iloc[-1]
    df.Datetime = pd.to_datetime(df.Datetime, unit='ms')
    df.dropna(inplace=True)
    # print(df)
    return df


def liveSMA(hist, live):
    liveST = (hist['ST'].values   live.Price.values) / ST
    liveLT = (hist['LT'].values   live.Price.values) / LT
    return liveST, liveLT


def createframe(msg):
    df = pd.DataFrame([msg])
    df = df.loc[:, ['E', 's', 'E', 'p']]
    df.columns = ['Timestamp', 'symbol', 'Time', 'Price']
    df.Price = df.Price.astype(float)
    df.Time = pd.to_datetime(df.Time, unit='ms')
    return df


pnl = []


async def main(coin, minQty, minNotional, histdata, open_position=False, cross_below=True, gotbalance=False):
    bm = BinanceSocketManager(client)
    ts = bm.trade_socket(coin)
    last_high = 0
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            if res:
                frame = createframe(res)
                if last_high < frame.Price[0]:
                    last_high = frame.Price[0]
                last_hist_time = datetime.strptime(
                    str(np.datetime_as_string(histdata['Datetime'].values[0], unit='ms')), '%Y-%m-%dT%H:%M:%S.%f')

                if int((frame.Time[0] - last_hist_time).total_seconds()) >= 305:
                    histdata = gethistoricals(coin, LT)
                livest, livelt, atr = histdata['ST'].values, histdata['LT'].values, histdata['ATR'].values
                try:
                    if not open_position:
                        if not gotbalance:
                            balance = client.get_asset_balance(asset='USDT')
                            balance = float(balance['free'])*0.95
                            gotbalance = True
                            if balance >= minNotional:
                                qty = round(balance/frame.Price[0], 5)
                                print(qty)
                                print(livest[0] > livelt[0], cross_below, qty >= minQty)
                            else:
                                print('Minimum Notional Error')
                        if livest[0] > livelt[0] and cross_below and qty >= minQty:
                            order = client.create_order(symbol=coin,
                                                        side='BUY',
                                                        type='MARKET',
                                                        quantity=qty)
                            print(order)
                            buyprice = float(order['fills'][0]['price'])
                            winsound.Beep(1000, 100)
                            open_position = True
                            cross_below = False
                    if open_position:
                        if frame.Price[0] < (last_high - (2 * atr[0])) or livest[0] < livelt[0]:
                            print(f'SL Trigger: {frame.Price[0] < (last_high - (2 * atr[0]))}')
                            print(f'Cross Trigger: {livest[0] < livelt[0]}')
                            order = client.create_order(symbol=coin,
                                                        side='SELL',
                                                        type='MARKET',
                                                        quantity=qty)
                            print(order)
                            sellprice = float(order['fills'][0]['price'])
                            winsound.Beep(1000, 100)
                            open_position = False
                            print(f'PnL : {(buyprice - sellprice) / buyprice}')
                            pnl.append((buyprice - sellprice) / buyprice)
                            print(f'Mean PnL : {np.mean(pnl)}')
                    if livest[0] < livelt[0]:
                        cross_below = True
                except Exception as e:
                    print(e)


if __name__ == "__main__":
    winsound.Beep(1000, 100)
    info = client.get_symbol_info(coin)
    # print(info)
    minQty = float(info['filters'][2]['minQty'])
    minNotional = float(info['filters'][3]['minNotional'])

    historicals = gethistoricals(coin, LT)
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(coin, minQty, minNotional, historicals))
 

Спасибо

Комментарии:

1. Как вы запускаете этот код на PythonAnywhere?

2. использование консоли Bash

3. Вы используете бесплатную или платную учетную запись?

4. Нет. Я использую бесплатную учетную запись. Я тестирую его, если он работает хорошо, тогда я пойду на платный

5. Тогда, вероятно, какой бы await он ни застрял, он не получает данные, потому что сайт, к которому вы пытаетесь получить доступ, отсутствует в нашем белом списке бесплатных учетных записей: help.pythonanywhere.com/pages/403ForbiddenError