Как я могу заставить этот скрипт Python добавить ограничение для сделок, совершаемых с помощью API?
Я собираю Python-скрипт для совершения сделок на Poloniex с помощью API, и до сих пор у меня есть возможность совершать сделки, когда выполняются определенные условия, но мне все еще нужно, чтобы он НЕ размещал больше сделок до конца этого дня. (У меня весь скрипт зацикливается каждые 60 секунд).
Пока у меня есть этот скрипт:
import requests
import urllib.request
import urllib.parse
import http.client
import hashlib
import hmac
import time
import json
from urllib.request import urlopen
The_Currency_Pair = input('Which Currency Pair?\nPAIRS TO CHOOSE FROM:\nUSDT_BTC\nUSDT_XRP\nUSDT_ETH\nUSDT_BCH\nUSDT_STR\nUSDT_LTC\nUSDT_ETC\nUSDT_XMR\n')
api = 'https://poloniex.com/tradingApi'
key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
secret = 'XXXXXXXXXXXXXXXXXXXXXXXXX'
def main():
poloniexPrices = urlopen('https://poloniex.com/public?command=returnTicker').read()
poloniexjson = json.loads(poloniexPrices)
poloniexlastP = poloniexjson[The_Currency_Pair]['last']
poloniexOCHL = urlopen('https://poloniex.com/public?command=returnChartData¤cyPair=USDT_BCH&start=1538352000&period=86400').read()
poloniexOCHLjson = json.loads(poloniexOCHL)
poloniexlasthigh = poloniexOCHLjson[-2]['high']
print ('Last Price')
print (poloniexlastP)
print ('----------------------------------------')
print ('Last Day High')
print (poloniexlasthigh)
print ('----------------------------------------')
data = {
'command': 'returnBalances',
'nonce' : int(time.time() * 1000)
}
data = urllib.parse.urlencode(data).encode()
signature = hmac.new(secret.encode(), data, hashlib.sha512)
headers = {
'Key' : key,
'Sign': signature.hexdigest()
}
request = urllib.request.Request(
url=api, data=data, headers=headers, method='POST'
)
text = urllib.request.urlopen(request).read().decode()
print ('MY ACCOUNT BALANCE')
try:
print(json.loads(text)['USDT'])
except:
print(text)
print ('-----------------------------------------')
if float(poloniexlastP) > 0:
print ('PLACING TRADE')
print ('-----------------------------------------------')
parms = {"command":"buy",
"currencyPair":The_Currency_Pair,
"rate":100,
"immediateOrCancel":1,
"amount":0.01,
"nonce":int(time.time() * 1000)}
parms = urllib.parse.urlencode(parms).encode()
signature = hmac.new(secret.encode(), parms, hashlib.sha512)
headers = {'Key' : key,
'Sign': signature.hexdigest()}
request = urllib.request.Request(
url=api, data=parms, headers=headers, method='POST')
text = urllib.request.urlopen(request).read().decode()
ordernumber = (json.loads(text)['orderNumber'])
print ('Order Number:')
print (ordernumber)
while True:
main()
time.sleep(60)
В любом случае, после того, как сделка была размещена, мне нужно убедиться, что после 60-секундного сна она не совершит вторую сделку, если это не новый день / день после совершения сделки. (Могу ли я использовать для этого время сервера poloniex?)
Так что, если он дошел до print (ordernumber)
это означает, что он разместил сделку. Но как мне пометить его как сделку на день или что-то подобное и использовать в if float(poloniexlastP) > 0:
для следующего цикла, чтобы убедиться, что он не помещает другой?
2 ответа
Возможно, вам нужен какой-нибудь флаг, который сбрасывается. Может быть, что-то вроде этого:
print ('Order Number:')
print (ordernumber)
return True # You've made a trade
return False # You've didn't make a trade
have_traded = False
while True:
if not have_traded:
have_traded = main()
time.sleep(60)
if new_date_function():
have_traded = False
Если вы используете сервер приложений, такой как Flask, вы можете легко установить ограничитель
from flask_limiter import Limiter
app = Flask(__name__)
limiter = Limiter(app, global_limits=["100 per hour", "20 per minute"])
и затем вы можете украсить каждую конечную точку определенным ограничителем:
@app.route("/slow")
@limiter.limit("1 per day")
def slow():
return "24"
@app.route("/fast")
def fast():
return "42"
@app.route("/ping")
@limiter.exempt
def ping():
return 'PONG'
Более подробно здесь: https://github.com/alisaifee/flask-limiter