I am totally new to the community and also a fresh user of backtrader. I am trying to develop an indicator which I found in Tradingview. However I found it a bit difficult to do so.

The logic of the indicator is as the following:

**Momentum Adjusted Moving Average (MaMA)**

The idea is to adjust the prices with the momentum and calculate the moving average using the adjusted prices.

First, we calculate the momentum and acceleration:

```
Mom = Price_now - Price_prev
Acceleration = Mom_now - Mom_prev
```

Then we calculate a probability value using a few past bars:

```
Probability = N_increase / N
```

where * N_increase* is the number of bars whose price is increased comparing to the previous one, and

Next we can calculate the adjusted price as:

```
Adj = Price_now + Probability * (Mom + 0.5 * Acceleration)
```

and finally calculate the moving average of Adj.

The strategy involving this indicator can be as simple as an MA crossover strategy.

I was wondering that if anyone would show me an example of how to implement this indicator in Backtrader ? I tried something like this but it somehow goes into an endless run...

```
class MaMA(bt.Indicator):
lines = ('MaMA', )
params = { "momLength": 34, "maLength": 55, "pLength": 13}
def __init__(self):
max_length = max(self.p.momLength*2, self.p.maLength, self.p.pLength)
self.addminperiod(max_length)
def next(self):
momentum = bt.ind.Momentum(self.datas[0].close, period=self.params.momLength)
accelerate = bt.ind.Momentum(momentum, period=self.params.momLength)
prob_change = bt.ind.Momentum(self.datas[0].close, period=1)
probability = math.fsum(prob_change.get(size=self.p.pLength) > 0) / self.p.pLength
adjusted_close = self.datas[0].close + ( momentum + accelerate*0.5 ) * probability
self.lines.MaMA = bt.ind.SMA(adjusted_close, period=self.params.maLength)
```

Highly appreciate for any advice/suggestions! Thx in adv!

]]>Note I changed the `prob_change`

and `probability`

expressions slightly.

```
class St(bt.Strategy):
params = (("momLength", 34), ("maLength", 55), ("pLength", 13))
def __init__(self) :
self.momentum = bt.ind.Momentum(self.datas[0].close, period=self.p.momLength)
self.accelerate = bt.ind.Momentum(self.momentum, period=self.p.momLength)
self.prob_change = bt.ind.Momentum(self.datas[0].close, period=1) > 0
self.probability = bt.ind.SumN(self.prob_change) / self.p.pLength
self.adjusted_close = self.datas[0].close + (self.momentum + self.accelerate*0.5 ) * self.probability
self.lines.MaMA = bt.ind.SMA(self.adjusted_close, period=self.p.maLength)
```

]]>