Ploblem for Order and execute. buy() sell()
-
I use in sample code on Quickstart and change some data to PandaData.
data it OK .
But when i run. the result stake , price , comm is 0 like result below.
And in plot is no buy or sell mark.
finally i want to know to set backtest to exit like , after 6 tick or 6 line of data then exit order . I use it for binary option .Result
Starting Portfolio Value: 1000.00 2017-01-09, Close, 15144.02 2017-01-09, BUY CREATE, 15144.02 2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00 2017-01-09, Close, 15147.62 2017-01-09, BUY CREATE, 15147.62 2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00 2017-01-09, Close, 15143.85 2017-01-09, BUY CREATE, 15143.85 2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00 2017-01-09, Close, 15149.78 2017-01-09, BUY CREATE, 15149.78 2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00 2017-01-09, Close, 15144.56 2017-01-09, Close, 15144.45 [<__main__.TestStrategy object at 0x0000017B7FDDD780>] Final Portfolio Value: 1000.00
Plot
Codefrom __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 pandas as pd #for test import json import matplotlib import matplotlib.pyplot as plt #matplotlib.style.use('seaborn-paper') with open('test/r100 (1).json','r') as f: history = json.load(f) history_pd = pd.DataFrame(columns=['open','high','low','close','volume','openinterest']) history_pd.close = pd.to_numeric(pd.Series(history['history']['prices'])) history_pd.open = history_pd.close history_pd.high = history_pd.close history_pd.low = history_pd.close history_pd.index = pd.to_datetime(pd.Series(history['history']['times']),unit='s') history_pd.index.name = 'date' #data = bt.feeds.PandasData(dataname = history_pd) # 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) # Indicators for the plotting show bt.indicators.ExponentialMovingAverage(self.datas[0], period=25) bt.indicators.WeightedMovingAverage(self.datas[0], period=25, subplot=True) bt.indicators.StochasticSlow(self.datas[0]) bt.indicators.MACDHisto(self.datas[0]) rsi = bt.indicators.RSI(self.datas[0]) bt.indicators.SmoothedMovingAverage(rsi, period=10) bt.indicators.ATR(self.datas[0], plot=False) 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 enougth cash if order.status in [order.Completed, order.Canceled, order.Margin]: 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) # Write down: no pending order 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) data = bt.feeds.PandasData(dataname = history_pd) # Add the Data Feed to Cerebro cerebro.adddata(data) # Set our desired cash start cerebro.broker.setcash(1000.0) # Add a FixedSize sizer according to the stake cerebro.addsizer(bt.sizers.FixedSize, stake=10) # Set the commission cerebro.broker.setcommission(commission=0.90) # 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()) # Plot the result cerebro.plot()
-
Your starting cash is
1000
and the value of the asset is over15000
Starting Portfolio Value: 1000.00 2017-01-09, Close, 15144.02 2017-01-09, BUY CREATE, 15144.02
It would be very difficult for the system to execute any operation, because the cash is not enough to acquire even a single item of the asset.
Options
Easiest
- Increase your cash with
cerebro.broker.set_cash(x)
(apparently you are already reducing it to1000
, because the default is10000
)
Advanced
-
Tell the system it is a
future-like
asset and reduce themargin
to1
. You will be able to have over15000
items of the asset in your portfolio -
Create your own
CommissionInfo
scheme and decide how much an item of the asset costs
- Increase your cash with
-
Thank you.
finally i want to know to set backtest to exit like , after 6 tick or 6 line of data then exit order . -
@backtrader Is it like a stock i must buy at close value , like 15144.02 Dollas and sell when it up to 16000 .. ? Cause i cannot buy at 15144.02 because i have 1000 of money.
I use forex and binary option , sorry for i'm out understanding. -
@kuuhmu check out discussion here
https://community.backtrader.com/topic/236/check-hold-period -
If the asset has a value of
15000
you cannot buy with1000
monetary units.If the value of a share of
AAPL
is600
dollar you cannot buy it with10
dollars.Your asset is obviously something you can acquire with less money, probably through leverage
-
See this post for leverage: Blog - BTFD (Buy The F... Dip)
-
And the broker docs for the call: Docs - Broker in the method
setcommission
You seem to need a leverage which goes over
15
(probably20
would be better)finally i want to know to set backtest to exit like , after 6 tick or 6 line of data then exit order .
You can always know the number of bars of a data feed by using
len(data)
and from there calculate how many bars have elapsed. -
-
@kuuhmu said in Ploblem for Order and execute. buy() sell():
And in plot is no buy or sell mark.
How did you resolve the issue with missed buy sell marks using Pandas data load? Even if we place Starting Portfolio Value to 10K (now BUY, SELL will be executed), buy-sell marks would be still missed.
-
His/Her marks were NOT missing, because no operations were executed.
In your case, you may want to share:
- Operations log
- Chart
Which would be the minimum to ascertain that you indeed are missing your marks.