Not too sure how to show my latest (failed) backtest, but here the code snippet that's giving me problems:

 

#Variables
self.symbol = "BTCUSD"
self.fast_ma_period = 50
self.slow_ma_period = 200

#this is under def Initialize(self)


Crypto = self.AddCrypto(self.symbol, Resolution.Hour).Symbol

self.FastMA = self.SMA(Crypto, self.fast_ma_period, Resolution.Hour)
self.FastMa.Updated += self.FastMAUpdated
self.FastMAValues = RollingWindow[Decimal](2)

self.SlowMA = self.SMA(Crypto, self.slow_ma_period, Resolution.Hour)
self.SlowMA.Updated += self.SlowMAUpdated
self.SlowMAValues = RollingWindow[Decimal](2)

def SlowMAUpdated(self, sender, updated):
'''Adds updated values to rolling window'''
self.SlowMAWin.Add(updated)

def FastMAUpdated(self, sender, updated):
'''Adds updated values to rolling window'''
self.FastMAWin.Add(updated)

I'm trying to make a moving average cross algorithm, the source code is in C and I'm having a hard time translating to python

 

Source code (credit to bigbits on youtube):

namespace QuantConnect.Algorithm.CSharp
{
public class CryptoCrossover : QCAlgorithm
{
// -- User Settings
private string Symbol = "BTCUSD";
private int USDStart = 1000;
private decimal Weight = .8m;
private int StartDaysAgo = 450;
private int EndDaysAgo = 1;
private decimal TargetPercent = .05m; // 5%
private decimal StopPercent = .02m; // 2%
private Resolution AlgoResolution = Resolution.Hour;
private int FastMAPeriod = 50;
private int SlowMAPeriod = 200;

// -- Application variables
private decimal Price; // Price of BTC
private decimal Holding; // BTC held in portfolio
private string SymbolBase; // Pair base. Ex: "BTC" from "BTCUSD"
private decimal PurchasePrice;
private decimal TradeDifference;
private decimal TargetPrice;
private decimal StopPrice;
private decimal USDHolding; // USD we are holding
private RollingWindow<decimal> FastMAValues;
private RollingWindow<decimal> SlowMAValues;

// -- Indicators
SimpleMovingAverage FastMA;
SimpleMovingAverage SlowMA;

// ALGO INITIALIZATION - Configures algo before running
public override void Initialize()
{
SetStartDate(DateTime.Today.AddDays(StartDaysAgo * -1).Year,
DateTime.Today.AddDays(StartDaysAgo * -1).Month,
DateTime.Today.AddDays(StartDaysAgo * -1).Day); // Set Start Date
SetEndDate(DateTime.Today.AddDays(EndDaysAgo * -1).Year,
DateTime.Today.AddDays(EndDaysAgo * -1).Month,
DateTime.Today.AddDays(EndDaysAgo * -1).Day); // Set End Date
SetCash(USDStart); // Set Strategy Cash

var Crypto = AddCrypto(Symbol, AlgoResolution); // Saves our Crypto pair info
SymbolBase = Crypto.BaseCurrencySymbol; // Sets the SymbolBase variable
SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash); // Tells algo what brokerage model to use

FastMA = SMA(Symbol, FastMAPeriod, AlgoResolution);
SlowMA = SMA(Symbol, SlowMAPeriod, AlgoResolution);
FastMAValues = new RollingWindow<decimal>(2);
SlowMAValues = new RollingWindow<decimal>(2);
}

// ALGO RECEIVES NEW DATA - Algo logic goes here, occurs each time new data is received
public override void OnData(Slice data)
{
// Make sure our indicators are ready
if (!FastMA.IsReady) return;
if (!SlowMA.IsReady) return;

Price = data[Symbol].Price; // Saves the current price of the symbol
USDHolding = Portfolio.CashBook["USD"].Amount; // Get the USD we have currently
FastMAValues.Add(FastMA); // Saves Indicator values for later
SlowMAValues.Add(SlowMA); // Saves Indicator values for later

if (!Portfolio.Invested && USDHolding > 0) // If we are not currently invested and have cash
{
if(SlowMAValues.Count() > 1 && FastMAValues[0] > SlowMAValues[0] && FastMAValues[1] <= SlowMAValues[1]) // Our Fast MA just now crossed above the Slow MA
{
decimal CashToOrder = USDHolding * Weight;
decimal Quantity = Math.Round((CashToOrder / Price), 2);
MarketOrder(Symbol, Quantity);
Log($"Bought {SymbolBase} at {Price}. Goodluck!");

TargetPrice = Price + (Price * TargetPercent); // Set these while creating holdings to save target values
StopPrice = Price - (Price * StopPercent);
PurchasePrice = Price;
}

}
else if (Portfolio.Invested) // We are already invested
{
Holding = Portfolio.CashBook[SymbolBase].Amount; // Get the amount we are holding in Crypto

if(Price <= StopPrice) // If we are below our stop price
{
Sell(Symbol, Holding); // -- Sell, stop the losses.
TradeDifference = Price - PurchasePrice;
Log($"Sold {SymbolBase} at {Price}. Change in price of {TradeDifference} after buying.");
}
else if(Price >= TargetPrice) // If we are above our target price
{
Sell(Symbol, Holding); // -- Sell, take our profits
TradeDifference = Price - PurchasePrice;
Log($"Sold {SymbolBase} at {Price}. Change in price of {TradeDifference} after buying.");
}
}
}
}
}


namespace QuantConnect.Algorithm.CSharp
{
public class CryptoCrossover : QCAlgorithm
{
// -- User Settings
private string Symbol = "BTCUSD";
private int USDStart = 1000;
private decimal Weight = .8m;
private int StartDaysAgo = 450;
private int EndDaysAgo = 1;
private decimal TargetPercent = .05m; // 5%
private decimal StopPercent = .02m; // 2%
private Resolution AlgoResolution = Resolution.Hour;
private int FastMAPeriod = 50;
private int SlowMAPeriod = 200;

// -- Application variables
private decimal Price; // Price of BTC
private decimal Holding; // BTC held in portfolio
private string SymbolBase; // Pair base. Ex: "BTC" from "BTCUSD"
private decimal PurchasePrice;
private decimal TradeDifference;
private decimal TargetPrice;
private decimal StopPrice;
private decimal USDHolding; // USD we are holding
private RollingWindow<decimal> FastMAValues;
private RollingWindow<decimal> SlowMAValues;

// -- Indicators
SimpleMovingAverage FastMA;
SimpleMovingAverage SlowMA;

// ALGO INITIALIZATION - Configures algo before running
public override void Initialize()
{
SetStartDate(DateTime.Today.AddDays(StartDaysAgo * -1).Year,
DateTime.Today.AddDays(StartDaysAgo * -1).Month,
DateTime.Today.AddDays(StartDaysAgo * -1).Day); // Set Start Date
SetEndDate(DateTime.Today.AddDays(EndDaysAgo * -1).Year,
DateTime.Today.AddDays(EndDaysAgo * -1).Month,
DateTime.Today.AddDays(EndDaysAgo * -1).Day); // Set End Date
SetCash(USDStart); // Set Strategy Cash

var Crypto = AddCrypto(Symbol, AlgoResolution); // Saves our Crypto pair info
SymbolBase = Crypto.BaseCurrencySymbol; // Sets the SymbolBase variable
SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash); // Tells algo what brokerage model to use

FastMA = SMA(Symbol, FastMAPeriod, AlgoResolution);
SlowMA = SMA(Symbol, SlowMAPeriod, AlgoResolution);
FastMAValues = new RollingWindow<decimal>(2);
SlowMAValues = new RollingWindow<decimal>(2);
}

// ALGO RECEIVES NEW DATA - Algo logic goes here, occurs each time new data is received
public override void OnData(Slice data)
{
// Make sure our indicators are ready
if (!FastMA.IsReady) return;
if (!SlowMA.IsReady) return;

Price = data[Symbol].Price; // Saves the current price of the symbol
USDHolding = Portfolio.CashBook["USD"].Amount; // Get the USD we have currently
FastMAValues.Add(FastMA); // Saves Indicator values for later
SlowMAValues.Add(SlowMA); // Saves Indicator values for later

if (!Portfolio.Invested && USDHolding > 0) // If we are not currently invested and have cash
{
if(SlowMAValues.Count() > 1 && FastMAValues[0] > SlowMAValues[0] && FastMAValues[1] <= SlowMAValues[1]) // Our Fast MA just now crossed above the Slow MA
{
decimal CashToOrder = USDHolding * Weight;
decimal Quantity = Math.Round((CashToOrder / Price), 2);
MarketOrder(Symbol, Quantity);
Log($"Bought {SymbolBase} at {Price}. Goodluck!");

TargetPrice = Price + (Price * TargetPercent); // Set these while creating holdings to save target values
StopPrice = Price - (Price * StopPercent);
PurchasePrice = Price;
}

}
else if (Portfolio.Invested) // We are already invested
{
Holding = Portfolio.CashBook[SymbolBase].Amount; // Get the amount we are holding in Crypto

if(Price <= StopPrice) // If we are below our stop price
{
Sell(Symbol, Holding); // -- Sell, stop the losses.
TradeDifference = Price - PurchasePrice;
Log($"Sold {SymbolBase} at {Price}. Change in price of {TradeDifference} after buying.");
}
else if(Price >= TargetPrice) // If we are above our target price
{
Sell(Symbol, Holding); // -- Sell, take our profits
TradeDifference = Price - PurchasePrice;
Log($"Sold {SymbolBase} at {Price}. Change in price of {TradeDifference} after buying.");
}
}
}
}
}