Если вы спешите получить код, перейдите в конец, где вы найдете ссылку на репозиторий 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.

Как я его создал:

  1. Я начал с обработчика 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')

Зоны улучшения:

В этом коде так много улучшений:

=› Добавить другие биржи

=› Разрешить другие типы заказов

=› интегрировать производные

=> Добавьте еще один уровень проверки заказа (проверьте, было ли получено сообщение вовремя или с опозданием)

Ссылка на репозиторий GitHub:

https://github.com/azizimgh/tradeBmessage.git