ساخت ربات خرید و فروش ارز دیجیتال با پایتون و بایننس (پارت اول)

سلام به دوستان عزیزم، در این بخش قصد داریم به “ساخت ربات خرید و فروش ارز دیجیتال با پایتون و بایننس” بپردازیم. که در سه پارت تهیه شده است. لازم به ذکر است که ما در این بخش به استراتژی یا هدف خرید و فروش کار نداریم و فقط می خواهیم یک ربات طراحی کنیم که با توجه به یک استراتژی دلخواه به خرید و فروش از سایت معروف بایننس (Binance) بپردازه. با ما همراه باشید…

ما برای ساخت ربات از پایتون ورژن ۳.۹.۲ استفاده کردیم که شما هم بهتره ورژن ۳.۹ به بالا استفاده کنید. در استراکچر پروژمون ما سه پوشه داریم:

/exchanges
/strategies
/models

از پوشه exchanges برای ذخیره بسته های API و دوتا فولدر دیگه هم برای ذخیره استراتژی ها و مدل هاست.

بخش مدل ها (models):

ما چندین بیزینس آبجکت برای این پروژه داریم مثل قیمت (Price)، ارز (Currency) یا سفارش (Order). در ابتدا با آبجکت Price شروع می کنیم. به همین خاطر در پوشه models یک فایل به نام models.py ایجاد می کنیم و یک کلاس با نام AbstractModel ایجاد می کنیم: که یک لایه مشترک برای بیزینس آبجکت ماست.

from datetime import datetime


class AbstractModel:
    created: datetime

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

توضیحات خط به خط کد بالا:

خط ۱: در این خط کتابخانه datetime رو به فایلمون اضافه کردیم. (توجه داشته باشید که همه import ها یا اضافه کردنا باید اول فایل انجام بشه)
خط ۴: ساخت یک کلاس با نام AbstractModel
خط ۵: ساخت یک آبجکت از نوع datetime یا زمان که در ابتدای کد import شده بود.
خط ۷: ایجاد یک تابع با نام __init__ با دو ورودی self و kwargs**
خط ۸: یک حلقه for که دارای دو پارامتر key و value است درون آبجکت kwargs که یک دیکشنری است در واقع این حلقه for برای تمام آیتم ها یا مقادیر درون دیکشنری kwargs دو پارامتر key و value را می خواند.
خط ۹: به ازای تک تک المانهای حلقه for برای دیکشنری kwargs مقدار key درون آبجکت self برابر value خواهد شد.


در قدم بعدی اولین کلاس قیمتی یا price خودمون رو در فایل models.py به صورت زیر ایجاد می کنیم:

from models.model import AbstractModel


class Price(AbstractModel):
    pair: str = ''
    exchange: str = ''
    current: float = 0
    lowest: float = 0
    highest: float = 0
    currency: str = ''
    asset: str = ''

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.pair = self.get_pair()

    def get_pair(self):
        return self.currency + '_' + self.asset

توضیحات خط به خط کد بالا:

خط ۱: در این خط کلاس Abstractmodel رو از فایل models.py اضافه می کنیم (برای اینکه بتونیم به اون کلاس دسترسی داشته باشیم)
خط ۴: یک کلاس ایجاد می کنیم با نام Price که ورودی اون کلاس AbstractModel است. یعنی یجورایی ما به دیتای اون دسترسی داریم حالا.
خط ۵: یک متغیر با نام pair از نوع str یا string ایجاد می کنیم که مقدار اولیه اون خالیه (‘ ‘).
خط ۶: یک متغیر با نام exhchange از نوع str یا رشته ایجاد می کنیم که مقدار اولیه اون خالیه (‘ ‘).
خط ۷: یک متغیر با نام current از نوع float یا عدد اعشاری ایجاد می کنیم که مقدار اولیه اون صفره (۰).
خط ۸: یک متغیر با نام lowest از نوع float یا عدد اعشاری ایجاد می کنیم که مقدار اولیه اون صفره (۰).
خط ۹: یک متغیر با نام highest از نوع float یا عدد اعشاری ایجاد می کنیم که مقدار اولیه اون صفره (۰).
خط ۱۰: یک متغیر با نام currency از نوع str یا رشته ایجاد می کنیم که مقدار اولیه اون خالیه (‘ ‘).
خط ۱۱: یک متغیر با نام asset از نوع str یا رشته ایجاد می کنیم که مقدار اولیه اون خالیه (‘ ‘).
خط ۱۳: ایجاد یک تابع با نام __init__ با دو ورودی self و kwargs**
خط ۱۴: با استفاده از تابع super به آبجکت های کلاس AbstractModel دسترسی پیدا می کنیم.
خط ۱۵: با استفاده از تابع get_pair برای گرفتن مقادیر currency و asset استفاده می کنیم و درون متغیر pair می ریزیم.
خط ۱۶: تعریف تابع get_pair با ورودی self
خط ۱۷: بازگرداندن دو متغیر currency و asset


بخش استراتژی ها (strategy):

وظیفه استراتژی اینه که بر اساس یک منطق یا اصول تجاری عمل کنه در واقع استراتژی میتونه با استفاده از یک API پیاده سازی بشه. حالا اینکه API چی هست میتونید به این بخش مراجعه کنید. برای راه اندازی رباتمون ما یک استراتژی ABSTRACT که یک نمونه استراتژی است استفاده می کنیم. برای اینکار در پوشه strategies یک فایل با نام strategy.py ایجاد می کنیم.

import json
import threading
import time
from datetime import datetime
from decouple import config
from models.price import Price


class Strategy(object):
    price: Price

    def __init__(self, exchange, interval=60, *args, **kwargs):
        self._timer = None
        self.interval = interval
        self.args = args
        self.kwargs = kwargs
        self.is_running = False
        self.next_call = time.time()
        self.portfolio = {}
        self.exchange = exchange
        # Load account portfolio for pair at load
        self.get_portfolio()

    def _run(self):
        self.is_running = False
        self.start()
        self.run(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            print(datetime.now())
            if self._timer is None:
                self.next_call = time.time()
            else:
                self.next_call += self.interval

            self._timer = threading.Timer(self.next_call - time.time(), self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False

    def get_portfolio(self):
        self.portfolio = {'currency': self.exchange.get_asset_balance(self.exchange.currency),
                          'asset': self.exchange.get_asset_balance(self.exchange.asset)}

    def get_price(self):
        try:
            self.price = self.exchange.symbol_ticker()
        except Exception as e:
            pass




توضیحات خط به خط کد بالا:

خط۱: اضافه کردن کتابخانه json برای کار کردن با دیتاهای json (انکد کردن و دیکد کردن)
خط۲: اضافه کردن threading برای کار کردن با کلاس java’s threading
خط۳: اضافه کردن time برای کار با تایمر یا زمان
خط۴: اضافه کردن datetime برای دسترسی به تاریخ میلادی
خط ۵: اضافه کردن Decouple جهت سازماندهی تنظیمات برنامه که بوسیله اون میشه پارامترها رو عوض کرد بدون اینکه برنامه دوباره از اول اجرا بشه.
خط۶: اضافه کردن کلاس price از فایل models.py
خط۹: ایجاد یک کلاس با نام Strategy
خط۱۰: ایجاد یک متغیر با نام price از نوع کلاس Price
خط۱۲: ایجاد یک تابع با نام init با ۵ ورودی
خطوط ۱۳ تا ۲۰ : در این خطوط مقادیر اولیه self مقداردهی می شن
خط۲۲: تابع get_portfolio از self اجرا میشه
خط۲۴: ایجاد تابع run_ با ورودی self
خط۲۵: مقدار دهی متغیر is_runing از slef
خط ۲۶: اجرای تابع start از self
خط۲۷: اجرای تابع run با دو متغیر ورودی دیکشنری از self
خط۲۹: ایجاد تابع start
خط۳۰: بررسی شرط self.is_running که اگر برقرار نبود:
خط۳۱: پرینت کردن تاریخ حال با دستور datetime.now
خط۳۲: بررسی شرط self._timer که اگر none یا خالی بود:
خط۳۳: خواندن زمان با دستور time.time و ریختن مقدار آن درون next_Call
خط۳۴: اگر خلاف شرط خط ۳۲ بود:
خط۳۵: یک self.interval به self.next_Call اضافه کن
خط۳۷: محاسبه زمان از طریق تابع threading.timer وریختن آن در self._timer
خط۳۸: استارت یا شروع تایمر با دستور self._timer.start
خط۳۹: مقدار دهی متغیر is_Running با مقدار True
خط۴۱: تعریف تابع stop
خط۴۲: متوقف کردن تایمر با دستور timer_cancel
خط۴۳: مقدار دهی متغیر is_running با مقدار stop
خط۴۵: تعریف تابع get_portfolio
خط۴۶: مقدار دهی portfolio با مقدار دیکشنری از نوع دیتای ارزهای دیجیتال
خط۴۹: تعریف تابع get_price
خط۵۰: دستور اجرا با دستور try :
خط۵۱: مقدار دهی price با تابع exhchange.symbol_ticker
خط۵۲: تعریف استثنا e
خط۵۳: عبور از این بخش


و همچنین یک فایل با نام watcher.py در همون پوشه strategies ایجاد می کنیم که بتونیم هرلحظه قیمت هارو بخونیم به صورت زیر:

from exchanges.exchange import Exchange
from strategies.strategy import Strategy


class Watcher(Strategy):
    def __init__(self, exchange: Exchange, timeout=60, *args, **kwargs):
        super().__init__(exchange, timeout, *args, **kwargs)

    def run(self):
        self.get_price()
        print('*******************************')
        print('Exchange: ', self.exchange.name)
        print('Pair: ', self.exchange.get_symbol())
        print('Available: ', self.portfolio['currency'] + ' ' + self.exchange.currency)
        print('Available: ', self.portfolio['asset'] + ' ' + self.exchange.asset)
        print('Price: ', self.price.current)

توضیحات خط به خط کد بالا:

خط۱: اضافه کردن کتابخانه exchange مرتبط با ارزهای دیجیتال
خط۲: اضافه کردن کلاس strategy از فایل strategy.py
خط۵: ایجاد کردن کلاس Watcher با ورودی کلاس strategy
خط۶: تعریف تابع __init__ با ۵ ورودی
خط۷: استفاده از تابع super که در کدهای قبلی توضیح داده شد.
خط۹: تعریف تابع جدید با نام run و با ورودی self
خط۱۰: دریافت قیمت یا price با دستور get_price
خط۱۱: پرینت یک خط با علامت * (فقط جنبه ظاهری داره)
خط۱۲: پرینت کردن نام ارز دیجیتال با استفاده از دستور exchange.name
خط۱۳: پرینت علامت ارز دیجیتال با استفاده از دستور get_symbol
خط۱۴: پرینت بررسی دسترسی به currency ارز دیجیتال
خط۱۵: پرینت بررسی دسترسی به asset ارز دیجیتال
خط۱۶: پرینت قیمت لحظه ای ارز دیجیتال

ادامه دارد…

4 دیدگاه در “ساخت ربات خرید و فروش ارز دیجیتال با پایتون و بایننس (پارت اول)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...