Если вы спешите получить код, перейдите в конец, где вы найдете ссылку на репозиторий github
Что это?:
Это простое приложение, основанное на imessage, для заказа спотовых сделок на binance.
Как это работает:
Из своего iMessage вы отправляете заказ в следующем формате: «typeOfOrder Symbol Сумма Цена (необязательно)». Вот и все, код возьмет его отсюда и отправит вам отзыв.
Поддерживаемые типы ордеров: Покупка и продажа с возможностью использования лимитного ордера путем добавления поля с лимитной ценой.
Пример:
Слева: я отправил рыночный ордер на покупку 10 монет «xxx». Так как монеты с таким названием нет. Я получил недействительный отзыв о символе.
Посередине: я пытался купить 5 единиц xrp, но binance не принимает ордера на сумму менее 5 долларов США. Поэтому я разместил заказ, но на этот раз с 10 XRP (стоимость заказа> 10 долларов США)
Справа: я пытался купить 5 единиц xrp, но binance не принимает ордера на сумму менее 5 долларов США. Поэтому я разместил заказ, но на этот раз с 10 XRP (стоимость заказа> 10 долларов США)
Предварительные требования:
Чтобы использовать его:
Чтобы использовать это, вы будете знать начальный уровень: API, спотовые заказы и vps (для развертывания вашего приложения)
Вам также необходимо получить подписку на sendblue.co, чтобы получить ключи API.
Процесс прост: клонируйте репозиторий, измените ключи в файле конфигурации (ключи sendblue и binance). После этого загрузите свое приложение на какой-нибудь vps и запустите main.py. Из этого последнего вы получите свой IP-адрес vps, добавьте к нему / webhook и вставьте его в свою панель sendblue.
Вот оно!
Чтобы развить это:
Пакеты и фреймворки:
Python 3.7, Flaskn, Pyhon-binance (оболочка binance API)
Хостинг:
Я использую gcloud, но вы можете использовать все, что хотите. Вы не можете использовать локальный хост, так как вам нужно будет предоставить ссылку на веб-хук для sendblue.
Как я его создал:
- Я начал с обработчика binance, в котором я определил 4 функции покупки.
class binance_handler: def __init__(self): self.cl = Client(api_key ,api_secret) def buy_market(self,coin,amount): print("buy") try : self.cl.order_market_buy( symbol=coin.upper() +"USDT", quantity=amount) return False except Exception as e: return str(e) def sell_market(self,coin,amount): try: self.cl.order_market_sell(symbol=coin.upper() + "USDT", quantity=amount) return False except Exception as e: return str(e) def buy_limit(self,coin,amount,price): try: self.cl.order_limit_buy(symbol=coin.upper() + "USDT", quantity=amount,price=price) return False except Exception as e: return str(e) def sell_limit(self,coin,amount,price): try: self.cl.order_limit_sell(symbol=coin.upper() + "USDT", quantity=amount, price=price) return False except Exception as e: return str(e)
2. Я создал класс sendblue, который будет отвечать за отправку отзывов после размещения заказа.
3. В моем основном файле я создал свое фляжное приложение, которое будет обрабатывать два запроса:
3.1 Получить: Просто чтобы убедиться, что приложение работает
3.2 Сообщение: Это проанализирует хук, отправленный из sendblue, он получит содержимое сообщения и номер телефона и перейдет к функции «Выполнить сообщение».
Эта функция проанализирует 4 случая, которые мы определили, и выберет соответствующую функцию для вызова из обработчика binance. Как только это будет выполнено, он вызовет функцию ответа, чтобы отправить отзыв пользователю.
Основной код:
from flask import Flask, request import json from send_blue_handler import send_handler from binance_orders import * sender = send_handler() buyer = binance_handler() app = Flask(__name__) def respond_back(state_of_order,number): print(state_of_order) if not state_of_order: sender.send_message("Order placed successfully", number) else: sender.send_message("Order not placed for this reason" + str(state_of_order), number) def execute_message(message,number): print(message) splitted = message.split(" ") print(splitted) #checking for market orders if len(splitted) == 3 and splitted[0].strip().lower() == "buy": respond_back(buyer.buy_market(splitted[1].strip().upper(),float(splitted[2].strip().lower())),number) if len(splitted) == 3 and splitted[0].strip().lower() == "sell": respond_back(buyer.buy_market(splitted[1].strip().upper(),float(splitted[2].strip().lower())),number) # checking for limit orders if len(splitted) == 4 and splitted[0].strip().lower() == "buy": respond_back(buyer.buy_limit(splitted[1].strip().upper(), float(splitted[2].strip().lower()),float(splitted[3].strip().lower())),number) if len(splitted) == 4 and splitted[0].strip().lower() == "sell": respond_back(buyer.sell_limit(splitted[1].strip().upper(), float(splitted[2].strip().lower()),float(splitted[3].strip().lower())),number) @app.route('/', methods=['GET']) def index(): return ('<h1>Trade by message is up and running</h1>', 200, None) @app.route('/order', methods=['POST']) def catch_webhook(): try: content, from_number = json.loads(request.data)['content'], json.loads(request.data)['from_number'] execute_message(content,from_number) return { "code" : "succes" } except Exception as e: return { "code": str(e)} if __name__ == '__main__': app.run(host ='0.0.0.0')
Зоны улучшения:
В этом коде так много улучшений:
=› Добавить другие биржи
=› Разрешить другие типы заказов
=› интегрировать производные
=> Добавьте еще один уровень проверки заказа (проверьте, было ли получено сообщение вовремя или с опозданием)