let refresh_rate = 15;
let stocknum = 40;
let close_rate = 1.07;
let loss_rate = 0.93;
let rsi_rate = 1.0001;
let trade_rate = 0.5;

fn band_start(current_price) {
  if abs(current_price - 2000) < 0.000001 {
    7
  } else {
    (current_price - 2000) * (4.0 / 500.0) + 7
  }
}

fn band_end(current_price) {
  band_start(current_price) + 10
}

strategy("microcap_volume_trend_000852") {
  market("CN_A")
  benchmark("000852.SH")
  signal("000852.SH")

  rebalance.every_days(refresh_rate).at("10:18")

  universe.exclude("paused", "st", "kcb", "one_yuan", "new_listing")

  selection.limit(stocknum)
  selection.market_cap_band(
    field="market_cap",
    lower=band_start(signal_close),
    upper=band_end(signal_close)
  )

  risk.index_exposure(
    signal_ma5 > signal_ma10 * rsi_rate ? 1.0 : trade_rate
  )

  filter.stock_expr(
    stock_ma5 > stock_ma10 * rsi_rate &&
    stock_ma10 > stock_ma30 * rsi_rate &&
    rolling_mean("volume", 5) < rolling_mean("volume", 20) &&
    rolling_mean("volume", 5) < rolling_mean("volume", 60)
  )

  risk.take_profit(close_rate)
  risk.stop_loss(loss_rate)

  ordering.rank_by("market_cap", "asc")
}
