#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