Hi all, I would love to share an algorithm with you guys here! This algorithm, Forex Monday CCI Trend, trades the currency pair EUR/USD on Mondays based on the trend of the CCI (Commodity Channel Index) indicator. It aims to take 100-200 base points of profit for each trade, along with trailing stop-loss. In the Initialize() method, I set up all parameters we need and the CCI indicator provided by QC:
 

def Initialize(self): self.SetStartDate(2018, 1, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash # add currency pair EUR/USD self.symbol = self.AddForex("EURUSD", Resolution.Hour, Market.FXCM).Symbol # parameters self.CCIPeriod = 30 # CCI period self.CCIupperBound = 100 # CCI upper bound line self.CCIlowerBound = -100 # CCI lower bound line self.stopLossLevel = -0.05 # stop loss percentage self.stopProfitLevel = 0.01 # stop profit percentage # Commodity Channel Index (https://en.wikipedia.org/wiki/Commodity_channel_index) self.cci = self.CCI(self.symbol, self.CCIPeriod, MovingAverageType.Simple, Resolution.Daily)

The CCI indicator is described very clearly here. In the algorithm, if the CCI indicator crosses the CCIupperBound line from the bottom upwards on the current hourly candle, a buy order with predefined stop loss level and stop profit level is opened; if the CCI indicator crosses the CCIlowerBound line downwards, a sell order with predefined stop loss level and stop profit level is opened. When the forex order is opened, we will not consider opening another until the order is closed.

The idea of this algorithm is that we trade on Mondays depending on the price movements on Fridays, so we will only calculate the CCI indicator and open order on Mondays. I use the following way in OnData() method to achieve this:
 

### On Monday if self.Time.weekday() == 0 and not self.Portfolio.Invested: # get current value of CCI CCI = self.cci.Current.Value # enter long position if CCI is over UpperBound if CCI > self.CCIupperBound: self.SetHoldings(self.symbol.Value, 1) # get buy-in price for trailing stop loss/profit self.buyInPrice = current_price # entered long position self.isLong = True self.Log(f"{self.Time} Entered Long Position at {current_price}") # enter short position if CCI is under LowerBound if CCI < self.CCIlowerBound: self.SetHoldings(self.symbol.Value, -1) # get sell-in price for trailing stop loss/profit self.sellInPrice = current_price # entered short position self.isLong = False self.Log(f"{self.Time} Entered Short Position at {current_price}")

Then, when holding an order, this algorithm detects every opportunity to stop loss/profit whenever a new Bar comes in. Here the stopProfitLevel and stopLossLevel are set arbitrarily, so feel free to adjust them to get better performance.

### Stop loss/profit if self.Portfolio.Invested: if self.isLong: condStopProfit = (current_price - self.buyInPrice)/self.buyInPrice > self.stopProfitLevel condStopLoss = (current_price - self.buyInPrice)/self.buyInPrice < self.stopLossLevel if condStopProfit: self.Liquidate(self.symbol.Value) self.Log(f"{self.Time} Long Position Stop Profit at {current_price}") if condStopLoss: self.Liquidate(self.symbol.Value) self.Log(f"{self.Time} Long Position Stop Loss at {current_price}") else: condStopProfit = (self.sellInPrice - current_price)/self.sellInPrice > self.stopProfitLevel condStopLoss = (self.sellInPrice - current_price)/self.sellInPrice < self.stopLossLevel if condStopProfit: self.Liquidate(self.symbol.Value) self.Log(f"{self.Time} Short Position Stop Profit at {current_price}") if condStopLoss: self.Liquidate(self.symbol.Value) self.Log(f"{self.Time} Short Position Stop Loss at {current_price}")

The backtest is attached below. We encourage you to explore the code, and create better algorithms based on it!

Author