Quickstart
Здесь файлы с данными для образцов
На примере стратегии SimpleMovingAverage сделаем загрузку с polo
from __future__ import (absolute_import, division, print_function, unicode_literals) import datetime # For datetime objects import os.path # To manage paths import sys # To find out the script name (in argv[0])
# Import the backtrader platform import backtrader as bt
import requests
import json
import time
import math
from datetime import datetime
import pandas as pd
def get_polonix() :
time_depth = 500
start_day = 500
st_time=time.time()-start_day*24*60*60
end_time=st_time+time_depth*60*60*24
pair = 'USDT_BTC'
#resource=requests.get("https://poloniex.com/public?command=returnChartData¤cyPair=%s&start=%s&end=%s&period=1800" % (pair,st_time,end_time))
resource=requests.get("https://poloniex.com/public?command=returnChartData¤cyPair=%s&start=%s&end=%s&period=14400" % (pair,st_time,end_time))
#resource=requests.get("https://poloniex.com/public?command=returnChartData¤cyPair=%s&start=%s&end=%s&period=300" % (pair,st_time,end_time))
#resource=requests.get("https://poloniex.com/public?command=returnChartData¤cyPair=%s&start=%s&end=%s&period=86400" % (pair,st_time,end_time))
#resource=requests.get("https://poloniex.com/public?command=returnChartData¤cyPair=%s&start=%s&end=%s&period=21600" % (pair,st_time,end_time))
data=[]
chart_data={}
chart_data = json.loads(resource.text)
for elems in chart_data:
data.append(elems)
df = pd.DataFrame(data, columns=['date', 'open', 'high', 'low', 'close', 'volume'])
df['openinterest']=0
df['date'] = pd.to_datetime(df['date'], unit='s')
#df = df[(df['date'] > '2018-1-1') & (df['date'] <= '2018-2-1')]
#df = df[(df['date'] > '2017-9-1') & (df['date'] <= '2018-1-1')]
df = df[(df['date'] >= '2018-4-1')]
df = df.set_index('date')
#print(df)
return df
# Create a Stratey class TestStrategy(bt.Strategy): params = ( ('maperiod', 15), ) def log(self, txt, dt=None): ''' Logging function fot this strategy''' dt = dt or self.datas[0].datetime.date(0) #print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): # Keep a reference to the "close" line in the data[0] dataseries self.dataclose = self.datas[0].close # To keep track of pending orders and buy price/commission self.order = None self.buyprice = None self.buycomm = None # Add a MovingAverageSimple indicator self.sma = bt.indicators.SimpleMovingAverage( self.datas[0], period=self.params.maperiod) def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: # Buy/Sell order submitted/accepted to/by broker - Nothing to do return # Check if an order has been completed # Attention: broker could reject order if not enough cash if order.status in [order.Completed]: if order.isbuy(): self.log( 'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.buyprice = order.executed.price self.buycomm = order.executed.comm else: # Sell self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') self.order = None def notify_trade(self, trade): if not trade.isclosed: return self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' % (trade.pnl, trade.pnlcomm)) def next(self): # Simply log the closing price of the series from the reference self.log('Close, %.2f' % self.dataclose[0]) # Check if an order is pending ... if yes, we cannot send a 2nd one if self.order: return # Check if we are in the market if not self.position: # Not yet ... we MIGHT BUY if ... if self.dataclose[0] > self.sma[0]: # BUY, BUY, BUY!!! (with all possible default parameters) self.log('BUY CREATE, %.2f' % self.dataclose[0]) # Keep track of the created order to avoid a 2nd order self.order = self.buy() else: if self.dataclose[0] < self.sma[0]: # SELL, SELL, SELL!!! (with all possible default parameters) self.log('SELL CREATE, %.2f' % self.dataclose[0]) # Keep track of the created order to avoid a 2nd order self.order = self.sell() if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() # Add a strategy cerebro.addstrategy(TestStrategy) # Datas are in a subfolder of the samples. Need to find where the script is # because it could have been called from anywhere #modpath = os.path.dirname(os.path.abspath(sys.argv[0])) #datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt') # Create a Data Feed #data = bt.feeds.YahooFinanceCSVData( #dataname=datapath, # Do not pass values before this date #fromdate=datetime.datetime(2000, 1, 1), # Do not pass values before this date #todate=datetime.datetime(2000, 12, 31), # Do not pass values after this date #reverse=False)
df = get_polonix()
data = bt.feeds.PandasData(dataname=df)
# Add the Data Feed to Cerebro cerebro.adddata(data) # Set our desired cash start cerebro.broker.setcash(100000.0) # Add a FixedSize sizer according to the stake cerebro.addsizer(bt.sizers.FixedSize, stake=10) # Set the commission cerebro.broker.setcommission(commission=0.0) # Print out the starting conditions print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) # Run over everything cerebro.run() # Print out the final result print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
# Finally plot the end results
cerebro.plot(style='candlestick')
Доброго дня,
ОтветитьУдалитьЕсть такая задача установить и настроить БТ на впн + подпилить кое что по ТЗ. Возьметесь ?