Как я могу заставить этот скрипт Python добавить ограничение для сделок, совершаемых с помощью API? - PullRequest
0 голосов
/ 12 октября 2018

Я собираю скрипт на 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&currencyPair=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 ]

0 голосов
/ 12 октября 2018

Если вы используете сервер приложений, такой как 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

0 голосов
/ 12 октября 2018

Возможно, вам нужен какой-то флаг, который сбрасывается.Может быть, что-то вроде этого:

        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
...