Navigation

    Backtrader Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

    MA Cross Over & FibonacciPivotPoint

    Indicators/Strategies/Analyzers
    2
    2
    146
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      kk7134 last edited by

      Hi All

      I am trying to create a strategy, where whenever the MA's crossover I have to check the FibonacciPivotPoint() to see at what range (s1, r1 etc) the closing price is before I make the decision to Buy or Sell

      For MA I am using '1Day' data for the period of 1 Year and for Fibonacci I am using '1Month' data.

      The problems I am facing are

      1. I am not sure how to pass the "month" data name (the one that I am planning to use for Fibonacci) to the FibonacciPivotPoint() and get the computed values

      2. I also want to check the MA cross over with previous month Fibonacci Values. Meaning, if the trade signal is generated based on MA for say 23.06.22. I need to check the previous month(01.05.2022) fibonacci calculated values to see whether the close price is in support range or resistance range

      If someone can help me here or modify the code to accomplish the functionality that I am looking for, that would be great

      I am pasting some data point for review

      1 Day Data
      2021-06-23,402.8999938964844,404.95001220703125,396.6000061035156,397.54998779296875,397.54998779296875,1824603
      2021-06-24,398.20001220703125,400.8999938964844,394.0,395.20001220703125,395.20001220703125,1888424
      2021-06-25,396.0,399.95001220703125,394.3999938964844,396.95001220703125,396.95001220703125,642550
      2021-06-28,398.3500061035156,409.70001220703125,397.54998779296875,404.1499938964844,404.1499938964844,3019858
      2021-06-29,406.8999938964844,411.0,402.0,407.54998779296875,407.54998779296875,2239813
      2021-06-30,408.75,411.0,403.54998779296875,404.45001220703125,404.45001220703125,1217199

      1 Month Data

      2021-05-01,380.95001220703125,393.6499938964844,370.1499938964844,388.20001220703125,388.20001220703125,55544400
      2021-06-01,390.70001220703125,420.25,382.8500061035156,404.45001220703125,404.45001220703125,60320960
      2021-07-01,404.5,414.3999938964844,376.70001220703125,386.3500061035156,386.3500061035156,59979772
      2021-08-01,387.29998779296875,392.45001220703125,327.54998779296875,358.8500061035156,358.8500061035156,42858605
      2021-09-01,360.0,394.1499938964844,350.04998779296875,362.70001220703125,362.70001220703125,58722361
      2021-10-01,362.0,370.6000061035156,314.79998779296875,351.1000061035156,351.1000061035156,55033772

      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 pandas as pd
      
      # Import the backtrader platform
      import backtrader as bt
      
      '''
      Pending issuse
      1. When a trade is booked it is using the next days closing price, need to change it to next days opening price
      2. Fibonacci pivot points data are yet to be brought in to the equation
      '''
      
      
      # Create a Stratey
      class TestStrategy(bt.Strategy):
          params = (
              ('sl_maperiod', 10),
              ('ft_maperiod', 12)
          )
      
          def log(self, txt, dt=None):
              ''' Logging function fot this strategy'''
              dt = self.dnames.days.datetime.date(0)
              self.fib_dt = self.dnames.month.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.dnames.days.close
              #self.dataclose_m = self.dnames.month.close
      
              #self.fb_close = self.datas[1][0].close
              #print(self.fb_close[0])
              #print(self.dataclose[0])
      
              # To keep track of pending orders and buy price/commission
              self.order = None
      
              # for d in self.getdatanames():
              #     if d == "days":
              #         # Add a MovingAverageSimple indicator
              self.sl_sma = bt.indicators.ExponentialMovingAverage(self.dnames.days, period=self.params.sl_maperiod)
              self.ft_sma = bt.indicators.ExponentialMovingAverage(self.dnames.days, period=self.params.ft_maperiod)
              #self.regime = self.ft_sma - self.sl_sma
      
                  # else:
              self.Fib = bt.indicators.FibonacciPivotPoint(self.dnames.month)
      
          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))
                      pass
      
                  elif order.issell():  # Sell
                      # self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                      #          (order.executed.price,
                      #           order.executed.value,
                      #           order.executed.comm))
                      pass
      
                  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])
              self.log(self.fib_dt.isoformat())
              #self.log('Close, %.2f' % self.dataclose_m[0])
      
              #self.log('Close, %.2f' % self.data1.close[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
              for d in self.getdatanames():
                  #print(d)
                  pos = self.getpositionbyname(d).size
                  if d == "days" and pos == 0:
                      print(d, pos)
                      if self.sl_sma[0] > self.ft_sma[0]:
                          #print(self.regime[0], self.sl_sma[0], self.ft_sma[0])
                          self.log('BUY CREATE, %.2f, %.2f ,%.2f' % (self.dataclose[0],self.sl_sma[0], self.ft_sma[0]))
                          self.order = self.buy()
      
                      elif self.sl_sma[0] < self.ft_sma[0]:
                          print(d, pos)
      
                          #print(self.regime[0], self.sl_sma[0], self.ft_sma[0])
                          self.log('SELL CREATE, %.2f, %.2f ,%.2f' % (self.dataclose[0],self.sl_sma[0], self.ft_sma[0]))
                          self.order = self.sell()
                  elif d == "days" and pos !=0:
                      if pos > 0:
                          if self.sl_sma[0] < self.ft_sma[0]:
                              self.log('BUY CLOSE, %.2f, %.2f ,%.2f' % (self.dataclose[0],self.sl_sma[0], self.ft_sma[0]))
                              self.order = self.close()
                      else:
                          if self.sl_sma[0] > self.ft_sma[0]:
                              self.log('SELL CLOSE, %.2f, %.2f ,%.2f' % (self.dataclose[0],self.sl_sma[0], self.ft_sma[0]))
                              self.order = self.close()
      
      if __name__ == '__main__':
          cerebro = bt.Cerebro()
          cerebro.addstrategy(TestStrategy)
      
          modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
          datapath = os.path.join(modpath, "data", "BIOCON.NS1YR.csv")
          datapath1 = os.path.join(modpath, "data", "BIOCON.NS1MO.csv")
      
          #pv_datapath = os.path.join(modpath, "data", "BIOCON.NS1YR.csv")
      
      
          cerebro.broker.set_cash(100000.00)
          cerebro.addsizer(bt.sizers.FixedSize, stake=10)  # Quantity
          cerebro.broker.setcommission(commission=0.001)
      
          data = bt.feeds.YahooFinanceCSVData(
              dataname=datapath,
              fromdate=datetime.datetime(2021, 6, 23 ),
              todate=datetime.datetime(2022, 6, 24),
              reverse=False)
      
          fib_data = bt.feeds.YahooFinanceCSVData(
              dataname=datapath1,
              fromdate=datetime.datetime(2021, 5, 1),
              todate=datetime.datetime(2022, 5, 31),
              reverse=False)
      
          # data1 = bt.feeds.YahooFinanceCSVData(
          #     dataname=pv_datapath,
          #     fromdate=datetime.datetime(2021, 7, 1),
          #     todate=datetime.datetime(2022, 6, 1),
          #     reverse=False)
      
          #fib_resample_data = cerebro.resampledata(fib_data, timeframe = bt.TimeFrame.Months)
      
          cerebro.adddata(data, name="days")
          cerebro.adddata(fib_data, name="month")
      
          print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
      
          cerebro.run()
      
          print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
      
          #cerebro.plot()[link text]([link url](link url))```
      1 Reply Last reply Reply Quote 0
      • Carlus Remod
        Carlus Remod last edited by

        Weather radar is a kind of technology that detects precipitation and displays it on a map to see rangefinder with binocular. There are styles of climate radars: Doppler climate radar and microwave weather radar.

        1 Reply Last reply Reply Quote 0
        • 1 / 1
        • First post
          Last post
        Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors