<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 Python 和幣安 API 構(gòu)建數(shù)字貨幣交易機(jī)器人(二)

          共 15612字,需瀏覽 32分鐘

           ·

          2021-05-26 00:43

          在本系列的第一部分中:用 Python 和幣安 API 構(gòu)建數(shù)字貨幣交易機(jī)器人(一),我們討論了文件夾結(jié)構(gòu),添加了我們的第一個(gè)Price業(yè)務(wù)對(duì)象,并為策略抽象層進(jìn)行編碼。
          下面將通過(guò)編碼我們需要的貨幣和訂單的業(yè)務(wù)對(duì)象開(kāi)始。
          此處,貨幣業(yè)務(wù)對(duì)象存儲(chǔ)所有不同的加密貨幣或法定貨幣。

          ./models/order.py

          from models.model import AbstractModel


          class Currency(AbstractModel):
              name: str = ''
              symbol: str = ''
              fiat: bool

              def __init__(self, **kwargs):
                  super().__init__(**kwargs)
          然后是訂單業(yè)務(wù)對(duì)象處理我們?cè)诮灰姿鶆?chuàng)建的訂單。

          ./models/order.py

          from models.model import AbstractModel


          class Order(AbstractModel):
              BUY = 'BUY'
              SELL = 'SELL'

              TYPE_LIMIT = 'LIMIT'
              TYPE_MARKET = 'MARKET'
              TYPE_STOP_LOSS = 'STOP_LOSS'
              TYPE_STOP_LOSS_LIMIT = 'STOP_LOSS_LIMIT'
              TYPE_TAKE_PROFIT = 'TAKE_PROFIT'
              TYPE_TAKE_PROFIT_LIMIT = 'TAKE_PROFIT_LIMIT'
              TYPE_LIMIT_MAKER = 'LIMIT_MAKER'

              uuid = ''
              side: str = ''
              type: str = TYPE_LIMIT
              symbol: str = ''
              currency: str = ''
              asset: str = ''
              price: float = 0
              quantity: int = 0
              test: bool = False

              def __init__(self, **kwargs):
                  super().__init__(**kwargs)
          然后構(gòu)建交換抽象層,并開(kāi)發(fā)我們的第一個(gè)連接器。由于這里不是編寫(xiě)API包裝器的重點(diǎn),因此為了方便起見(jiàn),我們將使用非官方的Binance API包裝器庫(kù)python-binancehttps://python-binance.readthedocs.io/en/latest/binance.html)。

          ./exchanges/exchange.py

          import datetime
          from api import utils
          from abc import ABC, abstractmethod
          from twisted.internet import reactor
          from strategies.strategy import Strategy
          from models.order import Order


          class Exchange(ABC):
              currency: str
              asset: str
              strategy: Strategy

              def __init__(self, key: str, secret: str):
                  self.apiKey = key
                  self.apiSecret = secret
                  self.name = None
                  self.client = None
                  self.socketManager = None
                  self.socket = None
                  self.currency = ''
                  self.asset = ''
                  self.strategy = None

              def set_currency(self, symbol: str):
                  self.currency = symbol

              def set_asset(self, symbol: str):
                  self.asset = symbol

              def set_strategy(self, strategy: Strategy):
                  self.strategy = strategy

              def compute_symbol_pair(self):
                  return utils.format_pair(self.currency, self.asset)

              # abstract methods

              # Override to set current exchange symbol pair notation (default with _ separator currency_asset ex: eur_btc)
              @abstractmethod
              def get_symbol(self):
                  return self.compute_symbol_pair(self)

              # Get current symbol ticker
              @abstractmethod
              def symbol_ticker(self):
                  pass

              # Get current symbol ticker candle for given interval
              @abstractmethod
              def symbol_ticker_candle(self, interval):
                  pass

              # Get current symbol historic value
              @abstractmethod
              def historical_symbol_ticker_candle(self, start: datetime, end=None, interval=60):
                  pass

              # Get balance for a given currency
              @abstractmethod
              def get_asset_balance(self, currency):
                  pass

              # Create an exchange order
              @abstractmethod
              def order(self, order: Order):
                  pass

              # Create an exchange test order
              @abstractmethod
              def test_order(self, order: Order):
                  pass

              # Check an exchange order status
              @abstractmethod
              def check_order(self, orderId):
                  pass

              # Cancel an exchange order
              @abstractmethod
              def cancel_order(self, orderId):
                  pass

              # WebSocket related methods

              @abstractmethod
              def get_socket_manager(self, purchase):
                  pass

              @abstractmethod
              def websocket_event_handler(self, msg):
                  pass

              def start_socket(self):
                  print('Starting WebSocket connection...')
                  self.socketManager.start()

              def close_socket(self):
                  self.socketManager.stop_socket(self.socket)
                  self.socketManager.close()
                  # properly terminate WebSocket
                  reactor.stop()

              @abstractmethod
              def start_symbol_ticker_socket(self, symbol: str):
                  pass

          我們的第一個(gè)Binance API連接器。

          ./exchanges/binance.py

          from datetime import datetime
          from math import floor

          from binance.client import Client
          from binance.enums import *
          from binance.websockets import BinanceSocketManager

          from api import utils
          from exchanges import exchange
          from models.order import Order
          from models.price import Price


          class Binance(exchange.Exchange):
              def __init__(self, key: str, secret: str):
                  super().__init__(key, secret)

                  self.client = Client(self.apiKey, self.apiSecret)
                  self.name = self.__class__.__name__

              def get_client(self):
                  return self.client

              def get_symbol(self):
                  return self.currency + self.asset

              def symbol_ticker(self):
                  response = self.client.get_symbol_ticker(symbol=self.get_symbol())
                  return Price(pair=self.get_symbol(), currency=self.currency.lower(), asset=self.asset.lower(), exchange=self.name.lower(),
                               current=response['price'])

              def symbol_ticker_candle(self, interval=Client.KLINE_INTERVAL_1MINUTE):
                  return self.client.get_klines(symbol=self.get_symbol(), interval=interval)

              def historical_symbol_ticker_candle(self, start: datetime, end=None, interval=Client.KLINE_INTERVAL_1MINUTE):
                  # Convert default seconds interval to string like "1m"
                  if isinstance(interval, int):
                      interval = str(floor(interval/60)) + 'm'

                  output = []
                  for candle in self.client.get_historical_klines_generator(self.get_symbol(), interval, start, end):
                      output.append(
                          Price(pair=self.compute_symbol_pair(), currency=self.currency.lower(), asset=self.asset.lower(), exchange=self.name.lower(),
                                current=candle[1], lowest=candle[3], highest=candle[2], volume=candle[5], openAt=utils.format_date(datetime.fromtimestamp(int(candle[0])/1000)))
                      )

                  return output

              def get_asset_balance(self, currency):
                  response = self.client.get_asset_balance(currency)
                  return response['free']

              def order(self, order: Order):
                  return self.client.create_order(
                      symbol=order.symbol,
                      side=order.side,
                      type=order.type,
                      timeInForce=TIME_IN_FORCE_GTC,
                      quantity=order.quantity,
                      price=order.price
                  )

              def test_order(self, order: Order):
                  return self.client.create_test_order(
                      symbol=order.symbol,
                      side=order.side,
                      type=order.type,
                      timeInForce=TIME_IN_FORCE_GTC,
                      quantity=order.quantity,
                      price=order.price
                  )

              def check_order(self, orderId):
                  return self.client.get_order(
                      symbol=self.get_symbol(),
                      orderId=orderId
                  )

              def cancel_order(self, orderId):
                  return self.client.cancel_order(
                      symbol=self.get_symbol(),
                      orderId=orderId
                  )

              def get_socket_manager(self):
                  return BinanceSocketManager(self.client)

              def start_symbol_ticker_socket(self, symbol: str):
                  self.socketManager = self.get_socket_manager()
                  self.socket = self.socketManager.start_symbol_ticker_socket(
                      symbol=self.get_symbol(),
                      callback=self.websocket_event_handler
                  )

                  self.start_socket()

              def websocket_event_handler(self, msg):
                  if msg['e'] == 'error':
                      print(msg)
                      self.close_socket()
                  else:
                      self.strategy.set_price(
                          Price(pair=self.compute_symbol_pair(), currency=self.currency, asset=self.asset, exchange=self.name,
                                current=msg['b'], lowest=msg['l'], highest=msg['h'])
                      )
                      self.strategy.run()
          現(xiàn)在,只需調(diào)用我們的策略啟動(dòng)方法,我們便擁有了一個(gè)極簡(jiǎn)而強(qiáng)大的交易機(jī)器人系統(tǒng)。使用自己的指標(biāo)和策略,您可以通過(guò)傳遞訂單來(lái)開(kāi)始買賣。但是,在開(kāi)始編寫(xiě)自己的策略代碼之前,請(qǐng)確保對(duì)其進(jìn)行測(cè)試并安全運(yùn)行。所以你需要一個(gè)系統(tǒng)來(lái)做到這一點(diǎn)。
          在下一部分中,我們將實(shí)現(xiàn)回測(cè)模式,以針對(duì)交易所的歷史數(shù)據(jù)來(lái)測(cè)試您的策略,并提供導(dǎo)入這些數(shù)據(jù)的服務(wù)。
          另外,我們將所有這些部分與全局配置和一些依賴項(xiàng)一起打包進(jìn)命令行工具中。
          最后我們將通過(guò)查看如何對(duì)該代碼進(jìn)行容器化和工業(yè)化實(shí)現(xiàn)來(lái)進(jìn)一步介紹。



          歡迎添加下方二維碼進(jìn)群交流
          Python數(shù)字貨幣量化交易技術(shù)

          瀏覽 220
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产三四区,婷婷 | 日韩无码字幕 | 91成人在线免费 | 免费精品久久久久久中文字幕-无删减 | 91人妻在线淋 |