{"id":394982,"date":"2024-06-29T11:56:39","date_gmt":"2024-06-29T11:56:39","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=394982"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=394982","title":{"rendered":"<span>\u041a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0430\u043c<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c.  \u041e\u0434\u043d\u043e \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0435\u0439\u0447\u0430\u0441 &#8212; \u0445\u043e\u0447\u0443 \u0437\u0434\u0435\u0441\u044c \u0438 \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c. \u041e\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0435.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u0434 \u043d\u0430 Python, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader_binance\" rel=\"noopener noreferrer nofollow\">backtrader_binance<\/a>, \u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader\" rel=\"noopener noreferrer nofollow\">backtrader<\/a> \u0438 API \u043a\u043b\u044e\u0447 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441 \u0431\u0438\u0440\u0436\u0438\u00a0<a href=\"https:\/\/www.binance.com\/\" rel=\"noopener noreferrer nofollow\">Binance<\/a>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0432\u0430\u0448\u0435\u043c \u043b\u044e\u0431\u0438\u043c\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<p>1) \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Binance API \u0441\u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader\" rel=\"noopener noreferrer nofollow\"><u>Backtrader<\/u><\/a>:<\/p>\n<p><code>pip install backtrader_binance<\/code>  <\/p>\n<p>2) \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0441\u0430\u043c <a href=\"https:\/\/github.com\/WISEPLAT\/backtrader\" rel=\"noopener noreferrer nofollow\">Backtrader<\/a>:<\/p>\n<p><code>pip install git+https:\/\/github.com\/WISEPLAT\/backtrader.git<\/code>  <\/p>\n<p>3) + \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043e\u043f. \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<p><code>pip install python-binance pandas matplotlib<\/code>  <\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0440\u0438\u043f\u0442\u0435, \u0431\u0435\u0440\u0435\u043c <a href=\"https:\/\/github.com\/WISEPLAT\/backtrader_binance\/blob\/master\/DataExamplesBinance_ru\/02%20-%20Symbol%20data%20to%20DF.py\" rel=\"noopener noreferrer nofollow\">\u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/a> (\u0444\u0430\u0439\u043b <strong>02 &#8212; Symbol data to DF.py<\/strong>), \u043e\u043d \u043b\u0435\u0436\u0438\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader_binance\" rel=\"noopener noreferrer nofollow\">backtrader_binance<\/a>.<\/p>\n<p>\u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e \u0441\u044e\u0434\u0430 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">import datetime as dt import backtrader as bt import pandas as pd from backtrader_binance import BinanceStore from ConfigBinance.Config import Config  # \u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438   # \u0422\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 class StrategySaveOHLCVToDF(bt.Strategy):     \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 OHLCV \u0432 DF\"\"\"     params = (  # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b         ('coin_target', ''),  #     )      def __init__(self):         self.df = {}         self.df_tf = {}      def start(self):         for data in self.datas:  # \u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u0442\u0438\u043a\u0435\u0440\u0430\u043c             ticker = data._name             self.df[ticker] = []             self.df_tf[ticker] = self.broker._store.get_interval(data._timeframe, data._compression)      def next(self):         \"\"\"\u041f\u0440\u0438\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0430\u0440\u0430 \u0442\u0438\u043a\u0435\u0440\u0430\"\"\"         for data in self.datas:  # \u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u0442\u0438\u043a\u0435\u0440\u0430\u043c             ticker = data._name             try:                 status = data._state  # 0 - Live data, 1 - History data, 2 - None                 _interval = data.interval             except Exception as e:                 if data.resampling == 1:                     status = 22                     _interval = self.broker._store.get_interval(data._timeframe, data._compression)                     _interval = f\"_{_interval}\"                 else:                     print(\"Error:\", e)              if status == 1:                 _state = \"Resampled Data\"                 if status == 1: _state = \"False - History data\"                 if status == 0: _state = \"True - Live data\"                  self.df[ticker].append([bt.num2date(data.datetime[0]), data.open[0], data.high[0], data.low[0], data.close[0], data.volume[0]])                  print('{} \/ {} [{}] - Open: {}, High: {}, Low: {}, Close: {}, Volume: {} - Live: {}'.format(                     bt.num2date(data.datetime[0]),                     data._name,                     _interval,  # \u0442\u0430\u0439\u043c\u0444\u0440\u0435\u0439\u043c \u0442\u0438\u043a\u0435\u0440\u0430                     data.open[0],                     data.high[0],                     data.low[0],                     data.close[0],                     data.volume[0],                     _state,                 ))   # \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435\/\u043d\u043e\u0432\u044b\u0435 \u0431\u0430\u0440\u044b \u0442\u0438\u043a\u0435\u0440\u0430 if __name__ == '__main__':  # \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430     cerebro = bt.Cerebro(quicknotify=True)      coin_target = 'USDT'  # \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043a\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u044b     symbol = 'BTC' + coin_target  # \u0442\u0438\u043a\u0435\u0440, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 &lt;\u041a\u043e\u0434\u0422\u0438\u043a\u0435\u0440\u0430\u0411\u0430\u0437\u043e\u0432\u044b\u0439\u0422\u0438\u043a\u0435\u0440>      store = BinanceStore(         api_key=Config.BINANCE_API_KEY,         api_secret=Config.BINANCE_API_SECRET,         coin_target=coin_target,         testnet=False)  # \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Binance     broker = store.getbroker()     cerebro.setbroker(broker)      # 1. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 D1 \u0431\u0430\u0440\u044b \u0437\u0430 365 \u0434\u043d\u0435\u0439 + \u0413\u0440\u0430\u0444\u0438\u043a \u0442.\u043a. \u043e\u0444\u0444\u043b\u0430\u0439\u043d\/ \u0442\u0430\u0439\u043c\u0444\u0440\u0435\u0439\u043c D1     from_date = dt.datetime.utcnow() - dt.timedelta(days=365)  # \u0431\u0435\u0440\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 365 \u0434\u043d\u0435\u0439 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438     data = store.getdata(timeframe=bt.TimeFrame.Days, compression=1, dataname=symbol, start_date=from_date, LiveBars=False)      cerebro.adddata(data)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     cerebro.addstrategy(StrategySaveOHLCVToDF, coin_target=coin_target)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0440\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443      results = cerebro.run()  # \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b      print(results[0].df)      df = pd.DataFrame(results[0].df[symbol], columns=[\"datetime\", \"open\", \"high\", \"low\", \"close\", \"volume\"])     print(df)      tf = results[0].df_tf[symbol]      # save to file     df.to_csv(f\"{symbol}_{tf}.csv\", index=False)      # save to file     df[:-5].to_csv(f\"{symbol}_{tf}_minus_5_days.csv\", index=False)      cerebro.plot()  # \u0420\u0438\u0441\u0443\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0430\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u00a0<strong>API \u043a\u043b\u044e\u0447<\/strong>\u00a0\u0438\u00a0<strong>Secret \u043a\u043b\u044e\u0447<\/strong>, \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<strong>ConfigBinance\\Config.py:<\/strong><\/p>\n<pre><code class=\"python\"># content of ConfigBinance\\Config.py  class Config:     BINANCE_API_KEY = \"YOUR_API_KEY\"     BINANCE_API_SECRET = \"YOUR_SECRET_KEY\"<\/code><\/pre>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f Binance API:<\/h3>\n<ol>\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430\u00a0<a href=\"https:\/\/www.binance.com\/\" rel=\"noopener noreferrer nofollow\">Binance<\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u00a0<a href=\"https:\/\/www.binance.com\/en\/my\/settings\/api-management\" rel=\"noopener noreferrer nofollow\">&#171;\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 API&#187;<\/a><\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0440\u0451\u043c &#171;\u0421\u043e\u0437\u0434\u0430\u0442\u044c API&#187; \u0438 &#171;\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439&#187;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0435\u0449\u0435 \u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0432 &#171;\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f API&#187; \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 &#171;\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u043e\u0442\u043e\u0432\u0443\u044e \u0438 \u043c\u0430\u0440\u0436\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u044e&#187;.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u00a0<strong>ConfigBinance\\Config.py<\/strong>\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435\u00a0<strong>&#171;\u041a\u043b\u044e\u0447 API&#187;<\/strong>\u00a0\u0438\u00a0<strong>&#171;\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447&#187;<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434. <\/p>\n<p>\u0412\u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0431\u0438\u0442\u043a\u043e\u0438\u043d (Bitcoin|BTC\/USDT):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d27\/4fa\/698\/d274fa69885166c65efe439fdf11ec82.png\" alt=\"\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e Bitcoin\" title=\"\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e Bitcoin\" width=\"3064\" height=\"1953\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d27\/4fa\/698\/d274fa69885166c65efe439fdf11ec82.png\"\/><\/p>\n<div><figcaption>\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e Bitcoin<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0441\u0442\u0440\u043e\u043a\u0435 92 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 pandas.dataframe \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0435 (\u0441\u0442\u0440\u043e\u043a\u0430 64-65) \u0432 csv \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"python\">    # save to file     df.to_csv(f\"{symbol}_{tf}.csv\", index=False)<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>datetime,open,high,low,close,volume ... 2023-03-20,27972.87,28472.0,27124.47,27717.01,477378.23373 2023-03-21,27717.01,28438.55,27303.1,28105.47,420929.7422 2023-03-22,28107.81,28868.05,26601.8,27250.97,224113.41296 2023-03-23,27250.97,28750.0,27105.0,28295.41,128649.60818 2023-03-24,28295.42,28374.3,27000.0,27454.47,86242.06544 2023-03-25,27454.46,27787.33,27156.09,27462.95,50844.08102 2023-03-26,27462.96,28194.4,27417.76,27968.05,49671.70353 2023-03-27,27968.05,28023.86,26508.14,27124.91,88039.46898 2023-03-28,27124.9,27520.0,26631.78,27261.07,78602.44341 2023-03-29,27261.06,28650.0,27240.1,28348.6,89486.16008 2023-03-30,28348.6,29184.68,27686.0,28028.53,98865.43256<\/code><\/pre>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u0430\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c: <strong>+1<\/strong>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/732126\/\"> https:\/\/habr.com\/ru\/articles\/732126\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043a\u0430\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c.  \u041e\u0434\u043d\u043e \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0435\u0439\u0447\u0430\u0441 &#8212; \u0445\u043e\u0447\u0443 \u0437\u0434\u0435\u0441\u044c \u0438 \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c. \u041e\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0435.<\/p>\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u0434 \u043d\u0430 Python, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader_binance\" rel=\"noopener noreferrer nofollow\">backtrader_binance<\/a>, \u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader\" rel=\"noopener noreferrer nofollow\">backtrader<\/a> \u0438 API \u043a\u043b\u044e\u0447 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441 \u0431\u0438\u0440\u0436\u0438\u00a0<a href=\"https:\/\/www.binance.com\/\" rel=\"noopener noreferrer nofollow\">Binance<\/a>.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0432\u0430\u0448\u0435\u043c \u043b\u044e\u0431\u0438\u043c\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<p>1) \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Binance API \u0441\u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader\" rel=\"noopener noreferrer nofollow\"><u>Backtrader<\/u><\/a>:<\/p>\n<p><code>pip install backtrader_binance<\/code>  <\/p>\n<p>2) \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u0441\u0430\u043c <a href=\"https:\/\/github.com\/WISEPLAT\/backtrader\" rel=\"noopener noreferrer nofollow\">Backtrader<\/a>:<\/p>\n<p><code>pip install git+https:\/\/github.com\/WISEPLAT\/backtrader.git<\/code>  <\/p>\n<p>3) + \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043e\u043f. \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<p><code>pip install python-binance pandas matplotlib<\/code>  <\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0440\u0438\u043f\u0442\u0435, \u0431\u0435\u0440\u0435\u043c <a href=\"https:\/\/github.com\/WISEPLAT\/backtrader_binance\/blob\/master\/DataExamplesBinance_ru\/02%20-%20Symbol%20data%20to%20DF.py\" rel=\"noopener noreferrer nofollow\">\u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/a> (\u0444\u0430\u0439\u043b <strong>02 &#8212; Symbol data to DF.py<\/strong>), \u043e\u043d \u043b\u0435\u0436\u0438\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u00a0<a href=\"https:\/\/github.com\/WISEPLAT\/backtrader_binance\" rel=\"noopener noreferrer nofollow\">backtrader_binance<\/a>.<\/p>\n<p>\u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e \u0441\u044e\u0434\u0430 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">import datetime as dt import backtrader as bt import pandas as pd from backtrader_binance import BinanceStore from ConfigBinance.Config import Config  # \u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438   # \u0422\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 class StrategySaveOHLCVToDF(bt.Strategy):     \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 OHLCV \u0432 DF\"\"\"     params = (  # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b         ('coin_target', ''),  #     )      def __init__(self):         self.df = {}         self.df_tf = {}      def start(self):         for data in self.datas:  # \u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u0442\u0438\u043a\u0435\u0440\u0430\u043c             ticker = data._name             self.df[ticker] = []             self.df_tf[ticker] = self.broker._store.get_interval(data._timeframe, data._compression)      def next(self):         \"\"\"\u041f\u0440\u0438\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u0431\u0430\u0440\u0430 \u0442\u0438\u043a\u0435\u0440\u0430\"\"\"         for data in self.datas:  # \u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u0442\u0438\u043a\u0435\u0440\u0430\u043c             ticker = data._name             try:                 status = data._state  # 0 - Live data, 1 - History data, 2 - None                 _interval = data.interval             except Exception as e:                 if data.resampling == 1:                     status = 22                     _interval = self.broker._store.get_interval(data._timeframe, data._compression)                     _interval = f\"_{_interval}\"                 else:                     print(\"Error:\", e)              if status == 1:                 _state = \"Resampled Data\"                 if status == 1: _state = \"False - History data\"                 if status == 0: _state = \"True - Live data\"                  self.df[ticker].append([bt.num2date(data.datetime[0]), data.open[0], data.high[0], data.low[0], data.close[0], data.volume[0]])                  print('{} \/ {} [{}] - Open: {}, High: {}, Low: {}, Close: {}, Volume: {} - Live: {}'.format(                     bt.num2date(data.datetime[0]),                     data._name,                     _interval,  # \u0442\u0430\u0439\u043c\u0444\u0440\u0435\u0439\u043c \u0442\u0438\u043a\u0435\u0440\u0430                     data.open[0],                     data.high[0],                     data.low[0],                     data.close[0],                     data.volume[0],                     _state,                 ))   # \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435\/\u043d\u043e\u0432\u044b\u0435 \u0431\u0430\u0440\u044b \u0442\u0438\u043a\u0435\u0440\u0430 if __name__ == '__main__':  # \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430     cerebro = bt.Cerebro(quicknotify=True)      coin_target = 'USDT'  # \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043a\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u044b     symbol = 'BTC' + coin_target  # \u0442\u0438\u043a\u0435\u0440, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 &lt;\u041a\u043e\u0434\u0422\u0438\u043a\u0435\u0440\u0430\u0411\u0430\u0437\u043e\u0432\u044b\u0439\u0422\u0438\u043a\u0435\u0440>      store = BinanceStore(         api_key=Config.BINANCE_API_KEY,         api_secret=Config.BINANCE_API_SECRET,         coin_target=coin_target,         testnet=False)  # \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Binance     broker = store.getbroker()     cerebro.setbroker(broker)      # 1. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 D1 \u0431\u0430\u0440\u044b \u0437\u0430 365 \u0434\u043d\u0435\u0439 + \u0413\u0440\u0430\u0444\u0438\u043a \u0442.\u043a. \u043e\u0444\u0444\u043b\u0430\u0439\u043d\/ \u0442\u0430\u0439\u043c\u0444\u0440\u0435\u0439\u043c D1     from_date = dt.datetime.utcnow() - dt.timedelta(days=365)  # \u0431\u0435\u0440\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 365 \u0434\u043d\u0435\u0439 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438     data = store.getdata(timeframe=bt.TimeFrame.Days, compression=1, dataname=symbol, start_date=from_date, LiveBars=False)      cerebro.adddata(data)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     cerebro.addstrategy(StrategySaveOHLCVToDF, coin_target=coin_target)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0440\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443      results = cerebro.run()  # \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b      print(results[0].df)      df = pd.DataFrame(results[0].df[symbol], columns=[\"datetime\", \"open\", \"high\", \"low\", \"close\", \"volume\"])     print(df)      tf = results[0].df_tf[symbol]      # save to file     df.to_csv(f\"{symbol}_{tf}.csv\", index=False)      # save to file     df[:-5].to_csv(f\"{symbol}_{tf}_minus_5_days.csv\", index=False)      cerebro.plot()  # \u0420\u0438\u0441\u0443\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0430\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u00a0<strong>API \u043a\u043b\u044e\u0447<\/strong>\u00a0\u0438\u00a0<strong>Secret \u043a\u043b\u044e\u0447<\/strong>, \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u0444\u0430\u0439\u043b\u0435\u00a0<strong>ConfigBinance\\Config.py:<\/strong><\/p>\n<pre><code class=\"python\"># content of ConfigBinance\\Config.py  class Config:     BINANCE_API_KEY = \"YOUR_API_KEY\"     BINANCE_API_SECRET = \"YOUR_SECRET_KEY\"<\/code><\/pre>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f Binance API:<\/h3>\n<ol>\n<li>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430\u00a0<a href=\"https:\/\/www.binance.com\/\" rel=\"noopener noreferrer nofollow\">Binance<\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u00a0<a href=\"https:\/\/www.binance.com\/en\/my\/settings\/api-management\" rel=\"noopener noreferrer nofollow\">&#171;\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 API&#187;<\/a><\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0440\u0451\u043c &#171;\u0421\u043e\u0437\u0434\u0430\u0442\u044c API&#187; \u0438 &#171;\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439&#187;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0435\u0449\u0435 \u0438 \u0442\u043e\u0440\u0433\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0432 &#171;\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f API&#187; \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 &#171;\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u043e\u0442\u043e\u0432\u0443\u044e \u0438 \u043c\u0430\u0440\u0436\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u044e&#187;.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u00a0<strong>ConfigBinance\\Config.py<\/strong>\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435\u00a0<strong>&#171;\u041a\u043b\u044e\u0447 API&#187;<\/strong>\u00a0\u0438\u00a0<strong>&#171;\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447&#187;<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434. <\/p>\n<p>\u0412\u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0431\u0438\u0442\u043a\u043e\u0438\u043d (Bitcoin|BTC\/USDT):<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e Bitcoin<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0441\u0442\u0440\u043e\u043a\u0435 92 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 pandas.dataframe \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0435 (\u0441\u0442\u0440\u043e\u043a\u0430 64-65) \u0432 csv \u0444\u0430\u0439\u043b.<\/p>\n<pre><code class=\"python\">    # save to file     df.to_csv(f\"{symbol}_{tf}.csv\", index=False)<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code>datetime,open,high,low,close,volume ... 2023-03-20,27972.87,28472.0,27124.47,27717.01,477378.23373 2023-03-21,27717.01,28438.55,27303.1,28105.47,420929.7422 2023-03-22,28107.81,28868.05,26601.8,27250.97,224113.41296 2023-03-23,27250.97,28750.0,27105.0,28295.41,128649.60818 2023-03-24,28295.42,28374.3,27000.0,27454.47,86242.06544 2023-03-25,27454.46,27787.33,27156.09,27462.95,50844.08102 2023-03-26,27462.96,28194.4,27417.76,27968.05,49671.70353 2023-03-27,27968.05,28023.86,26508.14,27124.91,88039.46898 2023-03-28,27124.9,27520.0,26631.78,27261.07,78602.44341 2023-03-29,27261.06,28650.0,27240.1,28348.6,89486.16008 2023-03-30,28348.6,29184.68,27686.0,28028.53,98865.43256<\/code><\/pre>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u0430\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c: <strong>+1<\/strong>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/732126\/\"> https:\/\/habr.com\/ru\/articles\/732126\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-394982","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/394982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=394982"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/394982\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=394982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=394982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=394982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}