docs: def make_pipeline(context):
      """
      Create our pipeline.
      """
  
      # Filter for primary share equities. IsPrimaryShare is a built-in filter.
      primary_share = IsPrimaryShare()
  
      # Equities listed as common stock (as opposed to, say, preferred stock).
      # 'ST00000001' indicates common stock.
      common_stock = morningstar.share_class_reference.security_type.latest.eq(
          'ST00000001')
  
      # Non-depositary receipts. Recall that the ~ operator inverts filters,
      # turning Trues into Falses and vice versa
      not_depositary = ~morningstar.share_class_reference.is_depositary_receipt.latest
  
      # Equities not trading over-the-counter.
      not_otc = ~morningstar.share_class_reference.exchange_id.latest.startswith(
          'OTC')
  
      # Not when-issued equities.
      not_wi = ~morningstar.share_class_reference.symbol.latest.endswith('.WI')
  
      # Equities without LP in their name, .matches does a match using a regular
      # expression
      not_lp_name = ~morningstar.company_reference.standard_name.latest.matches(
          '.* L[. ]?P.?$')
  
      # Equities with a null value in the limited_partnership Morningstar
      # fundamental field.
      not_lp_balance_sheet = morningstar.balance_sheet.limited_partnership.latest.isnull()
  
      # Equities whose most recent Morningstar market cap is not null have
      # fundamental data and therefore are not ETFs.
      have_market_cap = morningstar.valuation.market_cap.latest.notnull()
  
      # At least a certain price
      price = USEquityPricing.close.latest
      AtLeastPrice = (price >= context.MyLeastPrice)
      AtMostPrice = (price <= context.MyMostPrice)
  
      # Filter for stocks that pass all of our previous filters.
      tradeable_stocks = (
          primary_share
          & common_stock
          & not_depositary
          & not_otc
          & not_wi
          & not_lp_name
          & not_lp_balance_sheet
          & have_market_cap
          & AtLeastPrice
          & AtMostPrice
      )
  
      LowVar = 6
      HighVar = 40
  
      log.info(
          '''
  Algorithm initialized variables:
   context.MaxCandidates %s
   LowVar %s
   HighVar %s''' %
          (context.MaxCandidates, LowVar, HighVar))
  
      # High dollar volume filter.
      base_universe = AverageDollarVolume(
          window_length=20,
          mask=tradeable_stocks
      ).percentile_between(LowVar, HighVar)
  
      # Short close price average.
      ShortAvg = SimpleMovingAverage(
          inputs=[USEquityPricing.close],
          window_length=3,
          mask=base_universe
      )
  
      # Long close price average.
      LongAvg = SimpleMovingAverage(
          inputs=[USEquityPricing.close],
          window_length=45,
          mask=base_universe
      )
  
      percent_difference = (ShortAvg - LongAvg) / LongAvg
  
      # Filter to select securities to long.
      stocks_worst = percent_difference.bottom(context.MaxCandidates)
      securities_to_trade = (stocks_worst)
  
      return Pipeline(
          columns={
              'stocks_worst': stocks_worst
          },
          screen=(securities_to_trade),
      )